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
0 commit comments