You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ROS Noetic启动多TurtleBot3时TF变换缺失及地图帧问题

多TurtleBot3导航TF树缺失map帧及独立TF问题解决

在ROS Noetic环境中实现3台TurtleBot3的仿真启动,使用的Gazebo启动文件如下:

<?xml version="1.0"?>
<launch>
  <arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
  <arg name="first_tb3"  default="tb3_0"/>
  <arg name="second_tb3" default="tb3_1"/>
  <arg name="third_tb3" default="tb3_2"/>

  <arg name="first_tb3_x_pos" default="11.466219"/>
  <arg name="first_tb3_y_pos" default="-7.267796"/>
  <arg name="first_tb3_z_pos" default="-0.000"/>
  <arg name="first_tb3_yaw"   default="1.621071"/>

  <arg name="second_tb3_x_pos" default="8.143804"/>
  <arg name="second_tb3_y_pos" default="0.032318"/>
  <arg name="second_tb3_z_pos" default="-0.001064"/>
  <arg name="second_tb3_yaw"   default="-0.309337"/>

  <arg name="third_tb3_x_pos" default="18.376935"/>
  <arg name="third_tb3_y_pos" default="-1.841782"/>
  <arg name="third_tb3_z_pos" default="-0.000988"/>
  <arg name="third_tb3_yaw"   default="2.441699"/>

  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <!-- <arg name="world_name" value="$(find turtlebot3_gazebo)/worlds/tb3_worlds/turtlebot3_world.world"/> -->
    <arg name="world_name" value="$(find turtlebot3_gazebo)/worlds/scene2.world"/>
    <arg name="paused" value="false"/>
    <arg name="use_sim_time" value="true"/>
    <arg name="gui" value="true"/>
    <arg name="headless" value="false"/>
    <arg name="debug" value="false"/>
  </include>  

  <group ns = "$(arg first_tb3)">
    <param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" />

    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher0" output="screen">
      <param name="publish_frequency" type="double" value="50.0" />
      <param name="tf_prefix" value="$(arg first_tb3)" />
    </node>
    
    <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model $(arg first_tb3) -x $(arg first_tb3_x_pos) -y $(arg first_tb3_y_pos) -z $(arg first_tb3_z_pos) -Y $(arg first_tb3_yaw) -param robot_description" />
  </group>

  <group ns = "$(arg second_tb3)">
    <param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" />

    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher1" output="screen">
      <param name="publish_frequency" type="double" value="50.0" />
      <param name="tf_prefix" value="$(arg second_tb3)" />
    </node>

    <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model $(arg second_tb3) -x $(arg second_tb3_x_pos) -y $(arg second_tb3_y_pos) -z $(arg second_tb3_z_pos) -Y $(arg second_tb3_yaw) -param robot_description" />
  </group>

  <group ns = "$(arg third_tb3)">
    <param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" />

    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher2" output="screen">
      <param name="publish_frequency" type="double" value="50.0" />
      <param name="tf_prefix" value="$(arg third_tb3)" />
    </node>

    <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model $(arg third_tb3) -x $(arg third_tb3_x_pos) -y $(arg third_tb3_y_pos) -z $(arg third_tb3_z_pos) -Y $(arg third_tb3_yaw) -param robot_description" />
  </group>

</launch>

问题现象

启动后每台机器人的TF树相互独立,RVIZ中缺失map帧,出现全局状态错误与无变换错误,当前TF树仅包含各机器人自身的关节链路与base_link变换。尝试多种方式启动导航栈后,TF树仍保持独立且无map帧。

解决方案

1. 全局发布map到odom的静态变换

仿真环境中默认map与odom初始坐标系重合,需在launch文件全局空间添加静态变换节点,建立map到odom的链路:

<node pkg="tf2_ros" type="static_transform_publisher" name="map_to_odom" args="0 0 0 0 0 0 map odom" />

该节点不能放在机器人的命名空间下,需直接放在<launch>根标签内。

2. 正确配置导航栈的命名空间与帧参数

启动每台机器人的导航栈时,需在对应命名空间内明确帧参数,确保导航节点连接全局map/odom与机器人自身的base_link:

<group ns="$(arg tb3_name)">
  <param name="tf_prefix" value="$(arg tb3_name)" />
  <include file="$(find turtlebot3_navigation)/launch/turtlebot3_navigation.launch">
    <arg name="map_file" value="$(arg map_file)" />
    <arg name="odom_topic" value="odom" />
    <arg name="base_frame" value="$(arg tb3_name)/base_link" />
    <arg name="odom_frame" value="odom" />
    <arg name="map_frame" value="map" />
  </include>
</group>
  • base_frame指定为带命名空间的机器人base_link
  • map_frame与odom_frame使用全局坐标系,确保导航节点发布odom→tb3_x/base_link的变换,接入全局TF树

3. 修正RVIZ配置

  • 将RVIZ的Fixed Frame设置为map
  • 添加机器人模型时,Robot Description话题指定为/tb3_x/robot_description(x为机器人编号)
  • 启用TF显示,即可查看完整的map→odom→tb3_x/base_link链路

4. 确认机器人状态发布器配置

当前launch文件中robot_state_publisher已正确设置tf_prefix,会发布带命名空间的tb3_x/base_link到各关节的变换,无需修改,确保导航栈的base_frame正确引用该帧即可。

内容的提问来源于stack exchange,提问作者APALA PRAMANIK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:07:06