二维激光SLAM(XTDrone)

基于双系统ubuntu20.04复现二维激光SLAM(HectorSLAM)时碰到一些问题,在此记录解决方案,希望能帮到大家。

1.TF_Tree问题

在启动HectorSLAM后,通过rqt-->plugins-->visualization-->TF Tree查看坐标系变换。
image
image
可以发现其TF_Tree与官方给出的并不一致,同时打开的Rviz中LaserScan也存在异常。这本质是由于Hector SLAM强依赖TF坐标链,而LaserScan所在的坐标系并没有正确注册到TF树中,导致SLAM无法计算位姿,从而不能建图。
正确的TF_Tree如下:
image
解决方法如下:
检查LaserScan本身是否正常,运行rostopic echo /iris_0/scan,查看其输出的frame_id是不是iris_0/laser_2d,如果不是,那么Hector会直接挂。
image
可以看到这里的frame_id是laser_2d,即这一帧的激光数据是在laser_2d这个坐标系下测量得到的,因此激光数据属于laser_2d而不是iris_0/laser_2d。(可以将TF理解成一个“坐标关系图”,它告诉系统每个坐标系之间是如何连接的,而Hector SLAM在做的事情是:把激光数据从“激光坐标系”一步步转换到“地图坐标系”)这里的iris_0/laser_2d是开始错误的TF里定义出来的,见base_link-->iris_0/laser_2d。而激光数据一开始就在laser_2d,因此系统查找不到它的位置。
前往/opt/ros/noetic/share/hector_imu_attitude_to_tf/launch/hector_imu_xtdrone.launch路径,并将其中的

点击查看代码
<node pkg="tf" type="static_transform_publisher"
      name="base_to_laser_broadcaster"
      args="0 0 0 0 0 0 base_link iris_0/laser_2d 100" />
修改为:
点击查看代码
<node pkg="tf" type="static_transform_publisher"
      name="base_to_laser_broadcaster"
      args="0 0 0 0 0 0 base_link laser_2d 100" />
从而实现”激光数据里的坐标系“和“TF里的坐标系”对齐,因此系统能够理解 "激光数据(laser_2d)-->base_link-->map" 这一条链路。

2.顺利建图喽

HectorSLAM
可以执行查看保存的地图,用于后需要运动规划使用。

点击查看代码
rosrun map_server map_saver -f ~/XTDrone/motion_planning/2d/map/indoor3
ego ~/XTDrone/motion_planning/2d/map/indoor3.pgm

Hector_SLAM_map_save

posted @ 2026-04-13 12:10  九钟  阅读(10)  评论(0)    收藏  举报