Skip to content

Commit b7d4153

Browse files
committed
Fix IMU transform
Also fixes transformed twist covariance not being used in differential mode when using the twist covariance.
1 parent 0fd8207 commit b7d4153

File tree

4 files changed

+74
-81
lines changed

4 files changed

+74
-81
lines changed

fuse_models/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ find_package(
1111
fuse_publishers
1212
fuse_variables
1313
geometry_msgs
14+
imu_transformer
1415
message_generation
1516
nav_msgs
1617
pluginlib

fuse_models/package.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
<depend>fuse_publishers</depend>
2525
<depend>fuse_variables</depend>
2626
<depend>geometry_msgs</depend>
27+
<depend>imu_transformer</depend>
2728
<depend>nav_msgs</depend>
2829
<depend>pluginlib</depend>
2930
<depend>roscpp</depend>

fuse_models/src/imu_2d.cpp

Lines changed: 71 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include <geometry_msgs/AccelWithCovarianceStamped.h>
4141
#include <geometry_msgs/PoseWithCovarianceStamped.h>
4242
#include <geometry_msgs/TwistWithCovarianceStamped.h>
43+
#include <imu_transformer/tf2_sensor_msgs.h>
4344
#include <pluginlib/class_list_macros.h>
4445
#include <ros/ros.h>
4546
#include <sensor_msgs/Imu.h>
@@ -105,47 +106,61 @@ void Imu2D::process(const sensor_msgs::Imu::ConstPtr& msg)
105106
auto transaction = fuse_core::Transaction::make_shared();
106107
transaction->stamp(msg->header.stamp);
107108

109+
// Transform to target frame
110+
sensor_msgs::Imu imu_transformed;
111+
try
112+
{
113+
tf_buffer_.transform(*msg, imu_transformed, params_.twist_target_frame);
114+
}
115+
catch (const tf2::TransformException& ex)
116+
{
117+
ROS_WARN_STREAM_THROTTLE(5.0, "Cannot transform IMU message with stamp " << msg->header.stamp << " to target frame "
118+
<< params_.twist_target_frame
119+
<< ". Error: " << ex.what());
120+
return;
121+
}
122+
108123
// Handle the orientation data (treat it as a pose, but with only orientation indices used)
109-
auto pose = std::make_unique<geometry_msgs::PoseWithCovarianceStamped>();
110-
pose->header = msg->header;
111-
pose->pose.pose.orientation = msg->orientation;
112-
pose->pose.covariance[21] = msg->orientation_covariance[0];
113-
pose->pose.covariance[22] = msg->orientation_covariance[1];
114-
pose->pose.covariance[23] = msg->orientation_covariance[2];
115-
pose->pose.covariance[27] = msg->orientation_covariance[3];
116-
pose->pose.covariance[28] = msg->orientation_covariance[4];
117-
pose->pose.covariance[29] = msg->orientation_covariance[5];
118-
pose->pose.covariance[33] = msg->orientation_covariance[6];
119-
pose->pose.covariance[34] = msg->orientation_covariance[7];
120-
pose->pose.covariance[35] = msg->orientation_covariance[8];
124+
geometry_msgs::PoseWithCovarianceStamped pose;
125+
pose.header = imu_transformed.header;
126+
pose.pose.pose.orientation = imu_transformed.orientation;
127+
pose.pose.covariance[21] = imu_transformed.orientation_covariance[0];
128+
pose.pose.covariance[22] = imu_transformed.orientation_covariance[1];
129+
pose.pose.covariance[23] = imu_transformed.orientation_covariance[2];
130+
pose.pose.covariance[27] = imu_transformed.orientation_covariance[3];
131+
pose.pose.covariance[28] = imu_transformed.orientation_covariance[4];
132+
pose.pose.covariance[29] = imu_transformed.orientation_covariance[5];
133+
pose.pose.covariance[33] = imu_transformed.orientation_covariance[6];
134+
pose.pose.covariance[34] = imu_transformed.orientation_covariance[7];
135+
pose.pose.covariance[35] = imu_transformed.orientation_covariance[8];
121136

122137
geometry_msgs::TwistWithCovarianceStamped twist;
123-
twist.header = msg->header;
124-
twist.twist.twist.angular = msg->angular_velocity;
125-
twist.twist.covariance[21] = msg->angular_velocity_covariance[0];
126-
twist.twist.covariance[22] = msg->angular_velocity_covariance[1];
127-
twist.twist.covariance[23] = msg->angular_velocity_covariance[2];
128-
twist.twist.covariance[27] = msg->angular_velocity_covariance[3];
129-
twist.twist.covariance[28] = msg->angular_velocity_covariance[4];
130-
twist.twist.covariance[29] = msg->angular_velocity_covariance[5];
131-
twist.twist.covariance[33] = msg->angular_velocity_covariance[6];
132-
twist.twist.covariance[34] = msg->angular_velocity_covariance[7];
133-
twist.twist.covariance[35] = msg->angular_velocity_covariance[8];
138+
twist.header = imu_transformed.header;
139+
twist.twist.twist.angular = imu_transformed.angular_velocity;
140+
twist.twist.covariance[21] = imu_transformed.angular_velocity_covariance[0];
141+
twist.twist.covariance[22] = imu_transformed.angular_velocity_covariance[1];
142+
twist.twist.covariance[23] = imu_transformed.angular_velocity_covariance[2];
143+
twist.twist.covariance[27] = imu_transformed.angular_velocity_covariance[3];
144+
twist.twist.covariance[28] = imu_transformed.angular_velocity_covariance[4];
145+
twist.twist.covariance[29] = imu_transformed.angular_velocity_covariance[5];
146+
twist.twist.covariance[33] = imu_transformed.angular_velocity_covariance[6];
147+
twist.twist.covariance[34] = imu_transformed.angular_velocity_covariance[7];
148+
twist.twist.covariance[35] = imu_transformed.angular_velocity_covariance[8];
134149

135150
const bool validate = !params_.disable_checks;
136151

137152
if (params_.differential)
138153
{
139-
processDifferential(*pose, twist, validate, *transaction);
154+
processDifferential(pose, twist, validate, *transaction);
140155
}
141156
else
142157
{
143158
common::processAbsolutePoseWithCovariance(
144159
name(),
145160
device_id_,
146-
*pose,
161+
pose,
147162
params_.pose_loss,
148-
params_.orientation_target_frame,
163+
params_.twist_target_frame,
149164
{},
150165
params_.orientation_indices,
151166
tf_buffer_,
@@ -171,17 +186,17 @@ void Imu2D::process(const sensor_msgs::Imu::ConstPtr& msg)
171186

172187
// Handle the acceleration data
173188
geometry_msgs::AccelWithCovarianceStamped accel;
174-
accel.header = msg->header;
175-
accel.accel.accel.linear = msg->linear_acceleration;
176-
accel.accel.covariance[0] = msg->linear_acceleration_covariance[0];
177-
accel.accel.covariance[1] = msg->linear_acceleration_covariance[1];
178-
accel.accel.covariance[2] = msg->linear_acceleration_covariance[2];
179-
accel.accel.covariance[6] = msg->linear_acceleration_covariance[3];
180-
accel.accel.covariance[7] = msg->linear_acceleration_covariance[4];
181-
accel.accel.covariance[8] = msg->linear_acceleration_covariance[5];
182-
accel.accel.covariance[12] = msg->linear_acceleration_covariance[6];
183-
accel.accel.covariance[13] = msg->linear_acceleration_covariance[7];
184-
accel.accel.covariance[14] = msg->linear_acceleration_covariance[8];
189+
accel.header = imu_transformed.header;
190+
accel.accel.accel.linear = imu_transformed.linear_acceleration;
191+
accel.accel.covariance[0] = imu_transformed.linear_acceleration_covariance[0];
192+
accel.accel.covariance[1] = imu_transformed.linear_acceleration_covariance[1];
193+
accel.accel.covariance[2] = imu_transformed.linear_acceleration_covariance[2];
194+
accel.accel.covariance[6] = imu_transformed.linear_acceleration_covariance[3];
195+
accel.accel.covariance[7] = imu_transformed.linear_acceleration_covariance[4];
196+
accel.accel.covariance[8] = imu_transformed.linear_acceleration_covariance[5];
197+
accel.accel.covariance[12] = imu_transformed.linear_acceleration_covariance[6];
198+
accel.accel.covariance[13] = imu_transformed.linear_acceleration_covariance[7];
199+
accel.accel.covariance[14] = imu_transformed.linear_acceleration_covariance[8];
185200

186201
// Optionally remove the acceleration due to gravity
187202
if (params_.remove_gravitational_acceleration)
@@ -190,7 +205,7 @@ void Imu2D::process(const sensor_msgs::Imu::ConstPtr& msg)
190205
accel_gravity.z = params_.gravitational_acceleration;
191206
geometry_msgs::TransformStamped orientation_trans;
192207
tf2::Quaternion imu_orientation;
193-
tf2::fromMsg(msg->orientation, imu_orientation);
208+
tf2::fromMsg(imu_transformed.orientation, imu_orientation);
194209
orientation_trans.transform.rotation = tf2::toMsg(imu_orientation.inverse());
195210
tf2::doTransform(accel_gravity, accel_gravity, orientation_trans); // Doesn't use the stamp
196211
accel.accel.accel.linear.x -= accel_gravity.x;
@@ -203,7 +218,7 @@ void Imu2D::process(const sensor_msgs::Imu::ConstPtr& msg)
203218
device_id_,
204219
accel,
205220
params_.linear_acceleration_loss,
206-
params_.acceleration_target_frame,
221+
params_.twist_target_frame,
207222
params_.linear_acceleration_indices,
208223
tf_buffer_,
209224
validate,
@@ -218,60 +233,36 @@ void Imu2D::processDifferential(const geometry_msgs::PoseWithCovarianceStamped&
218233
const geometry_msgs::TwistWithCovarianceStamped& twist, const bool validate,
219234
fuse_core::Transaction& transaction)
220235
{
221-
auto transformed_pose = std::make_unique<geometry_msgs::PoseWithCovarianceStamped>();
222-
transformed_pose->header.frame_id =
223-
params_.orientation_target_frame.empty() ? pose.header.frame_id : params_.orientation_target_frame;
224-
225-
if (!common::transformMessage(tf_buffer_, pose, *transformed_pose))
226-
{
227-
ROS_WARN_STREAM_THROTTLE(5.0, "Cannot transform pose message with stamp " << pose.header.stamp
228-
<< " to orientation target frame "
229-
<< params_.orientation_target_frame);
230-
return;
231-
}
232-
233236
if (!previous_pose_)
234237
{
235-
previous_pose_ = std::move(transformed_pose);
238+
previous_pose_ = std::make_unique<geometry_msgs::PoseWithCovarianceStamped>();
239+
*previous_pose_ = pose;
236240
return;
237241
}
238242

239243
if (params_.use_twist_covariance)
240244
{
241-
geometry_msgs::TwistWithCovarianceStamped transformed_twist;
242-
transformed_twist.header.frame_id =
243-
params_.twist_target_frame.empty() ? twist.header.frame_id : params_.twist_target_frame;
244-
245-
if (!common::transformMessage(tf_buffer_, twist, transformed_twist))
246-
{
247-
ROS_WARN_STREAM_THROTTLE(5.0, "Cannot transform twist message with stamp " << twist.header.stamp
248-
<< " to twist target frame "
249-
<< params_.twist_target_frame);
250-
}
251-
else
252-
{
253-
common::processDifferentialPoseWithTwistCovariance(
254-
name(),
255-
device_id_,
256-
*previous_pose_,
257-
*transformed_pose,
258-
twist,
259-
params_.minimum_pose_relative_covariance,
260-
params_.twist_covariance_offset,
261-
params_.pose_loss,
262-
{},
263-
params_.orientation_indices,
264-
validate,
265-
transaction);
266-
}
245+
common::processDifferentialPoseWithTwistCovariance(
246+
name(),
247+
device_id_,
248+
*previous_pose_,
249+
pose,
250+
twist,
251+
params_.minimum_pose_relative_covariance,
252+
params_.twist_covariance_offset,
253+
params_.pose_loss,
254+
{},
255+
params_.orientation_indices,
256+
validate,
257+
transaction);
267258
}
268259
else
269260
{
270261
common::processDifferentialPoseWithCovariance(
271262
name(),
272263
device_id_,
273264
*previous_pose_,
274-
*transformed_pose,
265+
pose,
275266
params_.independent,
276267
params_.minimum_pose_relative_covariance,
277268
params_.pose_loss,
@@ -281,7 +272,7 @@ void Imu2D::processDifferential(const geometry_msgs::PoseWithCovarianceStamped&
281272
transaction);
282273
}
283274

284-
previous_pose_ = std::move(transformed_pose);
275+
*previous_pose_ = pose;
285276
}
286277

287278
} // namespace fuse_models

fuse_models/test/test_imu_2d.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ TEST_F(Imu2DTestFixture, BaseFrameYawAngularVelocity)
134134
std::this_thread::sleep_for(3s);
135135

136136
// Confirm the last transaction has the expect number of variables and constraints generated by the imu sensor model
137-
// source
137+
// source; if no transaction was received, the last transaction would not have any added variables
138138
const auto last_transaction = getLastTransaction();
139139

140140
// That is:

0 commit comments

Comments
 (0)