Skip to content

Commit 7d05d57

Browse files
authored
[Feature Proposal] Add map to odom TF publishing capability (#62)
* 変更:PCDマップ読み取りの場所で、PLYファイルも読み取れるようにした * 追加:map->odomのTF変換モードを追加
1 parent 0436207 commit 7d05d57

File tree

3 files changed

+39
-9
lines changed

3 files changed

+39
-9
lines changed

include/lidar_localization/lidar_localization_component.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ class PCLLocalization : public rclcpp_lifecycle::LifecycleNode
122122
double last_odom_received_time_;
123123
bool use_imu_{false};
124124
bool enable_debug_{false};
125+
bool enable_map_odom_tf_{false};
125126

126127
int ndt_num_threads_;
127128
int ndt_max_iterations_;

param/localization.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
use_odom: false
2525
use_imu: false
2626
enable_debug: true
27+
enable_map_odom_tf: false
2728
global_frame_id: map
2829
odom_frame_id: odom
2930
base_frame_id: base_link

src/lidar_localization_component.cpp

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)