ROS报错No transform from [map] to [odom]及地图原点异常咨询
问题描述
自建节点构建turtlebot3_world地图时,因turtlebot3_world.launch默认无map坐标系,代码中设置了map_msg.header.frame_id = "odom"。基于已构建地图做定位时,使用如下launch配置出现两个问题:
- 地图原点显示异常:已设置地图原点参数为[-3,-3,0],但RVIZ中地图始终固定在[0,0,0]位置,参数不生效
- RVIZ报错:No transform from [map] to [odom]
对应launch文件内容:
<launch> <arg name="my_map" default="$(find robot_laser_grid_mapping)/maps/map.yaml"/> <node pkg="just_for_learning" type="pointstamp.py" name="position_tracker"> <param name="map_file" value="$(find robot_laser_grid_mapping)/maps/map.yaml" /> </node> <node pkg="map_server" type="map_server" name="map_server" args="$(arg my_map)"/> <node pkg="teleoperat1" type="key_to_twist.py" name="keys_to_twist" ></node> <node pkg="teleoperat1" type="keyboard_drive.py" name="keyboard_driver" ></node> <include file="$(find turtlebot3_gazebo)/launch/turtlebot3_world.launch" ></include> <include file="$(find turtlebot3_bringup)/launch/turtlebot3_model.launch"></include> </launch>
问题根因
- 地图原点不生效:建图阶段错误将地图消息的坐标系绑定为
odom,map_server发布的地图话题默认归属map坐标系,保存的地图元数据中坐标系与原点参数逻辑冲突,RVIZ加载时默认按map坐标系原点[0,0,0]渲染,不会读取配置的[-3,-3,0]偏移。 - 坐标变换缺失:ROS标准导航TF树链路为
map -> odom -> base_footprint -> 部件坐标系,当前launch仅启动了仿真、机器人模型、键盘控制、map_server节点,没有启动负责发布map到odom动态变换的定位节点,TF树中两个坐标系完全断开,触发报错。
修复步骤
- 修正建图坐标系配置
建图节点发布地图消息时,必须设置map_msg.header.frame_id = "map",禁止绑定到odom坐标系,修改后重新建图保存。检查生成的map.yaml文件,确认origin参数为[-3.0, -3.0, 0.0]。 - 补全定位节点
在launch文件中添加AMCL定位节点配置,该节点会自动订阅地图、激光、里程计数据,动态发布map到odom的坐标变换:<node pkg="amcl" type="amcl" name="amcl" output="screen"> <param name="use_map_topic" value="true"/> <param name="odom_frame_id" value="odom"/> <param name="base_frame_id" value="base_footprint"/> <param name="global_frame_id" value="map"/> </node> - 调整RVIZ配置
RVIZ中Global Options的Fixed Frame设置为map,添加Map插件订阅/map话题,此时地图会按照yaml中配置的原点参数正确显示,不会固定在[0,0,0]位置。
禁止通过发布静态TF的方式连接map和odom坐标系。静态TF为固定偏移,定位过程中AMCL需要根据激光匹配结果动态调整map到odom的变换,修正里程计累计误差,使用静态变换会完全丧失定位修正能力。
内容的提问来源于stack exchange,提问作者peyman movlani
相关产品推荐
相关产品推荐

