@@ -9,6 +9,7 @@ PCLLocalization::PCLLocalization(const rclcpp::NodeOptions & options)
99 declare_parameter (" global_frame_id" , " map" );
1010 declare_parameter (" odom_frame_id" , " odom" );
1111 declare_parameter (" base_frame_id" , " base_link" );
12+ declare_parameter (" enable_map_odom_tf" , false );
1213 declare_parameter (" registration_method" , " NDT" );
1314 declare_parameter (" score_threshold" , 2.0 );
1415 declare_parameter (" ndt_resolution" , 1.0 );
@@ -174,6 +175,7 @@ void PCLLocalization::initializeParameters()
174175 get_parameter (" global_frame_id" , global_frame_id_);
175176 get_parameter (" odom_frame_id" , odom_frame_id_);
176177 get_parameter (" base_frame_id" , base_frame_id_);
178+ get_parameter (" enable_map_odom_tf" , enable_map_odom_tf_);
177179 get_parameter (" registration_method" , registration_method_);
178180 get_parameter (" score_threshold" , score_threshold_);
179181 get_parameter (" ndt_resolution" , ndt_resolution_);
@@ -202,6 +204,7 @@ void PCLLocalization::initializeParameters()
202204 RCLCPP_INFO (get_logger ()," global_frame_id: %s" , global_frame_id_.c_str ());
203205 RCLCPP_INFO (get_logger ()," odom_frame_id: %s" , odom_frame_id_.c_str ());
204206 RCLCPP_INFO (get_logger ()," base_frame_id: %s" , base_frame_id_.c_str ());
207+ RCLCPP_INFO (get_logger ()," enable_map_odom_tf: %d" , enable_map_odom_tf_);
205208 RCLCPP_INFO (get_logger ()," registration_method: %s" , registration_method_.c_str ());
206209 RCLCPP_INFO (get_logger ()," ndt_resolution: %lf" , ndt_resolution_);
207210 RCLCPP_INFO (get_logger ()," ndt_step_size: %lf" , ndt_step_size_);
@@ -501,15 +504,40 @@ void PCLLocalization::cloudReceived(const sensor_msgs::msg::PointCloud2::ConstSh
501504 corrent_pose_with_cov_stamped_ptr_->pose .pose .orientation = quat_msg;
502505 pose_pub_->publish (*corrent_pose_with_cov_stamped_ptr_);
503506
504- geometry_msgs::msg::TransformStamped transform_stamped;
505- transform_stamped.header .stamp = msg->header .stamp ;
506- transform_stamped.header .frame_id = global_frame_id_;
507- transform_stamped.child_frame_id = base_frame_id_;
508- transform_stamped.transform .translation .x = static_cast <double >(final_transformation (0 , 3 ));
509- transform_stamped.transform .translation .y = static_cast <double >(final_transformation (1 , 3 ));
510- transform_stamped.transform .translation .z = static_cast <double >(final_transformation (2 , 3 ));
511- transform_stamped.transform .rotation = quat_msg;
512- broadcaster_.sendTransform (transform_stamped);
507+ geometry_msgs::msg::TransformStamped map_to_base_link_stamped;
508+ map_to_base_link_stamped.header .stamp = msg->header .stamp ;
509+ map_to_base_link_stamped.header .frame_id = global_frame_id_;
510+ map_to_base_link_stamped.child_frame_id = base_frame_id_;
511+ map_to_base_link_stamped.transform .translation .x = static_cast <double >(final_transformation (0 , 3 ));
512+ map_to_base_link_stamped.transform .translation .y = static_cast <double >(final_transformation (1 , 3 ));
513+ map_to_base_link_stamped.transform .translation .z = static_cast <double >(final_transformation (2 , 3 ));
514+ map_to_base_link_stamped.transform .rotation = quat_msg;
515+ if (!enable_map_odom_tf_) {
516+ broadcaster_.sendTransform (map_to_base_link_stamped);
517+ } else {
518+ tf2::Transform map_to_base_link_tf;
519+ tf2::fromMsg (map_to_base_link_stamped.transform , map_to_base_link_tf);
520+
521+ geometry_msgs::msg::TransformStamped odom_to_base_link_msg;
522+ try {
523+ odom_to_base_link_msg = tfbuffer_.lookupTransform (
524+ odom_frame_id_, base_frame_id_, msg->header .stamp , rclcpp::Duration::from_seconds (0.1 ));
525+ } catch (tf2::TransformException & ex) {
526+ RCLCPP_WARN (
527+ this ->get_logger (), " Could not get transform %s to %s: %s" ,
528+ base_frame_id_.c_str (), odom_frame_id_.c_str (), ex.what ());
529+ return ;
530+ }
531+ tf2::Transform odom_to_base_link_tf;
532+ tf2::fromMsg (odom_to_base_link_msg.transform , odom_to_base_link_tf);
533+
534+ tf2::Transform map_to_odom_tf = map_to_base_link_tf * odom_to_base_link_tf.inverse ();
535+ geometry_msgs::msg::TransformStamped map_to_odom_stamped;
536+ map_to_odom_stamped.header .frame_id = global_frame_id_;
537+ map_to_odom_stamped.child_frame_id = odom_frame_id_;
538+ map_to_odom_stamped.transform = tf2::toMsg (map_to_odom_tf);
539+ broadcaster_.sendTransform (map_to_odom_stamped);
540+ }
513541
514542 geometry_msgs::msg::PoseStamped::SharedPtr pose_stamped_ptr (new geometry_msgs::msg::PoseStamped);
515543 pose_stamped_ptr->header .stamp = msg->header .stamp ;
0 commit comments