ROS中TransformBroadcaster话题重映射失效的解决方案求助
解决方案:自定义TF话题发布(替代TransformBroadcaster)
tf2_ros::TransformBroadcaster(及旧版tf::TransformBroadcaster)内部硬编码绑定了默认/tf话题,节点句柄的重映射规则对其不生效。因此直接放弃使用该工具类,改为手动为每个机器人创建专属TF话题发布器,直接发布TF消息。
1. 创建每个机器人的TF发布器
参照你创建odom发布器的方式,为每个机器人初始化独立的TF发布器,话题命名为/robotX_tf:
#include <tf2_msgs/TFMessage.h> // 存储所有机器人的TF发布器 std::vector<ros::Publisher> tfPub; for (uint i = 0; i < robots.size(); i++) { std::string tf_topic = "/" + robots[i].name + "_tf"; tfPub.push_back(nh->advertise<tf2_msgs::TFMessage>(tf_topic, 1)); }
2. 构造并发布TF消息
将原本通过TransformBroadcaster发送的变换数据,打包成tf2_msgs::TFMessage格式,使用对应机器人的发布器发送:
// 示例:处理第i个机器人的里程计TF变换 tf2_msgs::TFMessage tf_msg; geometry_msgs::TransformStamped transform_stamped; // 填充TF变换的核心信息 transform_stamped.header.frame_id = "odom"; transform_stamped.child_frame_id = robots[i].name + "/base_footprint"; transform_stamped.header.stamp = ros::Time::now(); // 替换为你的里程计计算出的平移、旋转数据 transform_stamped.transform.translation.x = calculated_x; transform_stamped.transform.translation.y = calculated_y; transform_stamped.transform.translation.z = 0.0; transform_stamped.transform.rotation = calculated_quat; tf_msg.transforms.push_back(transform_stamped); // 发布到当前机器人的专属TF话题 tfPub[i].publish(tf_msg);
3. 配置AMCL订阅对应TF话题
修改AMCL的配置,让它订阅对应机器人的专属TF话题。若通过launch动态生成机器人实例,可通过参数传递实现:
<node name="amcl_$(arg robot_id)" pkg="amcl" type="amcl"> <param name="tf_topic" value="/$(arg robot_id)_tf" /> <!-- 其他AMCL参数配置 --> </node>
额外说明
- 若使用旧版
tf库(非tf2),只需将消息类型替换为tf/tfMessage,其余逻辑保持一致。 - 运行时增减机器人时,只需动态添加/删除
tfPub中的发布器实例,同时启动/停止对应机器人的AMCL节点即可,无需修改launch或重启进程。
内容的提问来源于stack exchange,提问作者Marcell
相关产品推荐
相关产品推荐

