Experience / Project
ROS 2 激光 SLAM 调研与复现实验
上海苦芽科技有限公司 · 线上实习 · 2026.07.15 起
项目简介
项目围绕机器人二维激光建图与导航,搭建并测试 ROS 2 仿真流程。
工作内容
我使用 ROS 2 Jazzy、Gazebo、TurtleBot3、slam_toolbox 和 Nav2 搭建实验环境,检查激光扫描、里程计、坐标变换、地图和导航接口。实验包括方形房间与仓库场景:我编写导航目标脚本,检查 world 与 map 坐标的转换,并记录地图、机器人路径、扫描数据和运行日志。
项目背景
移动机器人在未知环境中行驶时,需要估计自身位置并建立环境地图。二维激光 SLAM 使用激光扫描作为主要观测,在机器人移动过程中积累环境信息。导航系统则需要结合地图、机器人位姿和目标点,规划并执行运动路径。
实习期间,我围绕这条流程开展开源工具调研与仿真实验。实验使用 TurtleBot3 模拟移动机器人,以 Gazebo 构建场景,以 ROS 2 连接传感器、建图与导航模块,并使用 RViz2 查看机器人状态和地图。测试环境运行在 WSL2 Ubuntu 24.04 中。
环境搭建与检查
实验从官方 TurtleBot3 仿真开始。启动后依次检查节点、话题、坐标变换以及导航 action,确认激光扫描、里程计和地图能够在同一流程中使用。激光数据通过 /scan 提供,里程计信息通过 /odom 提供,/map 用于查看建图结果。
坐标变换是贯穿建图与导航的基础。机器人运动状态、激光扫描和地图都需要在相应坐标系中关联。测试时记录 TF 信息,并结合地图和机器人路径检查坐标是否一致;导航目标的位置也需要与导航系统使用的地图坐标相匹配。
自定义场景与实验
在官方示例之外,我搭建了方形室内场景和仓库场景。方形场景用于测试房间建图、目标点导航和地图保存;仓库场景包含更复杂的内部结构,用于观察机器人沿预设路线移动时的建图与导航过程。
方形场景先后尝试开环扫图、逐步发送导航目标以及组合路线。不同路线对应不同的地图覆盖和导航情况,实验分别保存地图、目标执行记录及可视化结果。覆盖率用于记录机器人经过区域的自由空间覆盖情况,地图本身还可与场景基准进行对照查看。
开环扫图通过预设运动覆盖空间;渐进式路线逐步发送导航目标,观察地图随着机器人移动而扩展的过程。组合路线在同一轮实验中检查目标执行与扫图覆盖。每种路线都留下独立记录,便于比较目标成功情况和地图变化。
仓库场景中,第一版路线完成 2/7 个目标。排查时发现脚本混用了 world 和 map 坐标;结合机器人初始位姿换算目标点后,第二版路线完成 10/10 个目标并保存地图。后续采集进一步记录了激光扫描、里程计、坐标变换和事件日志。
这次坐标问题出现在导航目标进入系统的环节。世界坐标描述目标在仿真场景中的位置,导航过程则使用地图坐标解释目标。两者之间的关系需要结合机器人初始位姿确定;目标点换算后,路线脚本才能把场景中设计的位置交给导航系统执行。
结果记录按场景和实验轮次组织。除了最终地图,项目还保存地图生成日志、各目标的执行信息、实验结束前后的话题状态,以及部分扫描和里程计数据。这些记录将机器人运行过程与最终地图联系起来,也方便定位路线或坐标配置中的问题。
结果与进展
方形房间完成 6 次导航,自由空间覆盖率为 0.9291。仓库场景在修正目标坐标后完成 10/10 个导航目标并保存地图,后续实验记录了 378 帧激光扫描。上述结果来自仿真环境;代码、实验记录和复现说明已整理至 GitHub。
方形场景的组合路线将自动导航与扫图过程放在同一轮实验中,六个保守目标均成功。实验资料中还保存了不同阶段的地图、对比图、路径与日志,方便回看目标点执行情况和地图变化。
当前记录来自仿真环境。建图结果仍可见扫描拖影和局部错位;覆盖率描述经过区域的情况,地图质量还需要结合墙体边界和位姿估计进一步评价。仓库中的实验记录保留了不同版本路线的结果和排查过程。
地图保存后,项目使用地图的分辨率和原点信息,将生成结果与场景基准投影到共同坐标系。对照图可以帮助观察房间轮廓、自由空间和局部错位。实验资料还包括场景截图和地图可视化,用于复查机器人路径及建图过程。