开源移动机器人规划框架:ROS Noetic + Gazebo SLAM导航、多算法规划与 Go2W Bonus
从课程设计到开源移动机器人规划框架:ROS Noetic + Gazebo SLAM导航、多算法规划与 Go2W Bonus
本文介绍一个面向移动机器人仿真、SLAM、定位导航、传统路径规划、覆盖路径规划和实验性学习规划的 ROS Noetic 开源仓库:mobile-robot-planning。
项目最初来源于 **MEE5115 Autonomous Robotic Systems(自主机器人系统)**课程设计,随后在课程基线之上进行了结构整理、功能扩展和文档补充,逐步形成了一个适合学习、课程实践、算法验证与二次开发的移动机器人工作区。
一、项目地址与演示视频
GitHub 仓库
https://github.com/Mingyang-Sheep/mobile-robot-planning
B 站演示视频
《MEE5115自主机器人系统课设|Gazebo SLAM导航、规划与Go2W Bonus》
项目包含较完整的中英文 README、模块说明、启动参数、故障排查文档以及多组运行 GIF。本文中的演示素材均可以在仓库的docs/assets/目录中找到。
二、为什么要整理这个仓库
很多 ROS 移动机器人项目能够完成某一个单独功能,例如:
- 在 Gazebo 中加载机器人;
- 使用 gmapping 建图;
- 使用 AMCL 定位;
- 通过 move_base 完成导航;
- 单独运行 A* 或 Dijkstra 算法;
- 在 RViz 中显示路径。
但对于刚接触自主移动机器人的同学来说,真正困难的往往不是“找到一个算法文件”,而是把下面这些环节完整串联起来:
机器人模型 ↓ Gazebo 仿真与传感器 ↓ /scan、/odom 与 TF ↓ SLAM 或地图服务器 ↓ AMCL 定位 ↓ 全局路径规划 ↓ 局部规划与避障 ↓ 速度指令 /cmd_vel ↓ 机器人执行因此,这个仓库的目标并不是只展示某一个算法,而是尽量保留一条完整、可观察、可替换的移动机器人导航链路。
在此基础上,仓库进一步加入了:
- 多种移动机器人模型;
- 多种全局路径规划算法;
- 路径平滑模块;
- 覆盖路径规划;
- 基础 DQN 学习演示;
- Go2W 轮足机器人导航 Bonus;
- 中英文文档与统一启动入口。
项目整体效果如下:
三、技术栈与运行环境
项目主分支面向以下环境:
| 项目 | 版本或说明 |
|---|---|
| 操作系统 | Ubuntu 20.04 |
| ROS | ROS Noetic |
| 仿真器 | Gazebo 11 |
| 可视化 | RViz |
| 构建方式 | Catkin /catkin_make |
| 主要语言 | C++、Python、Shell、CMake |
| 定位导航 | map_server、AMCL、move_base |
| 局部规划 | DWAPlannerROS |
| SLAM | gmapping、hector |
| 全局规划 | Navfn、A*、Dijkstra、D*、D* Lite、Theta*、RRT* |
| 覆盖规划 | BCD、STC |
| 学习模块 | 基础 DQN 实验 |
| Bonus | Go2W + RL-SAR + ROS Navigation |
从工程组织上看,C++ 主要承担 ROS 插件接入、nav_core::BaseGlobalPlanner适配和导航主执行链路;Python 更适合用于算法教学、快速验证、调试可视化以及实验性学习模块。
四、仓库整体架构
仓库中的核心 ROS 包按照功能进行划分:
mobile-robot-planning/ ├── README.md ├── README_zh.md ├── docs/ │ ├── index.md │ ├── zh/ │ └── assets/ ├── src/ │ ├── mr_description/ │ ├── mr_gazebo/ │ ├── mr_maps/ │ ├── mr_slam/ │ ├── mr_navigation/ │ ├── mr_traditional_planner/ │ ├── mr_learning/ │ └── mr_msgs/ ├── tools/ └── refer/各模块的主要作用如下。
1.mr_description
用于管理机器人模型、URDF/Xacro、传感器位置以及机器人外形描述。
2.mr_gazebo
用于管理 Gazebo 世界、机器人生成、仿真插件以及激光、里程计、IMU、相机等传感器接口。
3.mr_maps
用于统一管理地图文件及对应的 YAML 配置。
4.mr_slam
提供 gmapping 和 hector 的统一启动接口,主要用于:
- 基础 SLAM 建图;
- 课程实验验证;
/scan、/odom、TF 等 ROS 数据链路学习。
5.mr_navigation
负责整合:
- map_server;
- AMCL;
- move_base;
- 全局与局部代价地图;
- 全局规划器;
- DWAPlannerROS;
- 不同机器人和不同场景的导航参数。
6.mr_traditional_planner
包含多种传统路径规划算法以及 ROS 导航适配接口,是仓库中算法扩展最集中的模块。
7.mr_learning
包含一个基础 DQN 训练与 Gazebo 交互示例,用于展示学习型规划的基本流程。
8.mr_msgs
用于存放仓库内部需要的自定义消息定义。
仓库还给出了一张整体系统结构图,用于说明机器人、感知、地图、规划、执行和可视化之间的关系:
五、SLAM 建图:从激光数据到二维地图
仓库在mr_slam中提供了 gmapping 和 hector 的统一入口。
典型启动方式如下:
roslaunch mr_slam slam.launch slam_method:=gmapping或者:
roslaunch mr_slam slam.launch slam_method:=hector在仿真环境中,也可以使用:
roslaunch mr_slam slam_sim.launch slam_method:=gmapping这一部分的重点不仅是“生成一张地图”,更重要的是理解 ROS SLAM 中几个关键数据之间的关系:
激光雷达 /scan + 里程计 /odom + 机器人 TF ↓ SLAM 节点 ↓ /map 与 map 坐标系对于移动机器人入门来说,能够真正理解map、odom、base_footprint、base_link和激光雷达坐标系之间的关系,比单纯运行一个 launch 文件更加重要。
需要说明的是,当前仓库中的 SLAM 模块主要用于基础教学、课程验证和导航链路搭建,并不是一个复杂的多传感器融合 SLAM 框架。
六、定位与自主导航:AMCL + move_base + DWA
完成建图后,机器人需要在已有地图中完成定位和自主导航。
仓库中的基本导航链路为:
Gazebo ├── /scan ├── /odom └── TF ↓ map_server 发布 /map ↓ AMCL 估计机器人位姿 ↓ move_base ├── 全局代价地图 ├── 局部代价地图 ├── 全局规划器 └── DWAPlannerROS ↓ /cmd_vel ↓ 机器人底盘其中:
map_server负责加载并发布已有地图;- AMCL 负责估计机器人在地图中的位置;
- 全局规划器负责从起点到目标点生成参考路径;
- DWA 负责在局部范围内选择可执行速度,并完成避障和路径跟踪;
/cmd_vel最终传递给仿真机器人。
默认导航入口为:
roslaunch mr_navigation navigation_sim.launch启动后,可以在 RViz 中使用:
2D Pose Estimate设置或修正初始位姿;2D Nav Goal发送导航目标。
下面是仓库中的 DWA 基线导航效果:
七、多种传统全局路径规划算法
除了 ROS 默认的 Navfn 规划器,仓库还接入了多种常见路径规划算法。
当前支持的全局规划器包括:
| 算法 | 主要特点 | 当前定位 |
|---|---|---|
| Navfn | ROS Navigation 默认基线之一 | 基线 |
| A* | 使用启发函数加速搜索 | 可用 |
| Dijkstra | 经典最短路径搜索 | 可用 |
| D* | 面向路径修正思想 | 当前为静态代价地图适配 |
| D* Lite | 增量式路径重规划 | 已接入,动态障碍效果仍需继续评估 |
| Theta* | 允许视线连接,路径通常更平滑 | 可用 |
| RRT* | 基于采样并具有渐近最优性 | 可用 |
| Cubic Spline | 对已有路径进行平滑 | 路径平滑器,不是独立全局规划器 |
1. Dijkstra + DWA
Dijkstra 在全局代价地图上计算路径,DWA 负责局部轨迹选择和运动控制。
2. D* + DWA
D* 相关算法常用于讨论环境变化下的路径修正问题。当前仓库中的 D* 更适合作为静态代价地图上的适配与教学实现,不应直接等同于完整的动态障碍在线重规划系统。
3. RRT* + DWA
RRT* 通过随机采样逐步扩展搜索树,适合用于学习采样规划的基本思想。仓库中将其接入全局规划链路,再由 DWA 执行局部运动。
4. 规划器统一接入
不同规划算法不仅可以单独显示调试路径,也可以通过 C++GlobalPlannerAdapter接入move_base。
例如:
roslaunch mr_navigation navigation_sim.launch\global_planner:=theta_star\path_smoother:=cubic_spline这种结构使得算法研究与 ROS 工程链路能够结合:
自定义全局规划算法 ↓ GlobalPlannerAdapter ↓ move_base ↓ DWAPlannerROS ↓ 机器人执行仓库同时区分了“实际参与控制的路径”和“仅用于可视化调试的路径”,避免在 RViz 中看到多条路径时无法判断机器人究竟跟踪哪一条。
八、覆盖路径规划:从“到达目标”到“遍历区域”
普通点到点导航解决的是:
如何从当前位置安全到达目标点?
覆盖路径规划解决的则是:
如何尽可能完整地遍历一个指定区域?
这类功能可以用于:
- 扫地机器人;
- 巡检机器人;
- 消毒机器人;
- 农业作业机器人;
- 仓储盘点;
- 区域搜索。
仓库当前接入了 BCD 和 STC 两类覆盖规划器。
1. BCD 覆盖规划
BCD,即 Boustrophedon Cellular Decomposition,可以先将自由空间分解为若干单元,再按照往复式方式生成覆盖路径。
2. STC / Spiral-STC 覆盖规划演示
STC 基于生成树思想组织覆盖路径,适合用于栅格化环境中的完整遍历。
覆盖模式下,规划器会订阅地图与触发目标,发布覆盖路径,并通过/move_baseaction 将路径点依次交给导航系统执行。
地图 /map ↓ 覆盖规划器 ↓ 覆盖路径 ↓ move_base 路径点 ↓ DWA ↓ 机器人执行启动示例:
roslaunch mr_navigation navigation_sim.launch\planning_mode:=coverage\coverage_planner:=stc需要注意的是,在覆盖模式中,RViz 的2D Nav Goal更接近“启动覆盖任务的触发器”,点击位置并不一定代表覆盖路径的最终终点。
九、实验性 DQN 学习规划
除了传统算法,仓库还提供了一个基础 DQN 学习模块。
当前模块包含:
- DQN 网络;
- 经验回放缓冲区;
- 目标网络更新;
- epsilon-greedy 探索;
.pth模型保存;.json训练状态记录;- Gazebo 环境重置;
- 激光与里程计观测;
/cmd_vel控制输出。
该模块更适合用于理解:
环境观测 ↓ 策略网络 ↓ 动作输出 ↓ Gazebo 执行 ↓ 奖励与下一状态 ↓ 经验回放与网络更新目前它仍然属于阶段 1 的实验性演示,并不是成熟的强化学习导航平台。仓库暂未完整覆盖复杂动态障碍、标准化评估、多阶段训练、严格的训练/测试分离以及 Navigation 插件化部署。
这种明确标注能力边界的方式,也是我在整理仓库时比较重视的一点:展示已经完成的内容,同时避免将实验模块包装成完整解决方案。
十、多机器人模型支持
主分支目前支持多种移动机器人模型:
| 机器人 | Gazebo | SLAM | Navigation | 说明 |
|---|---|---|---|---|
| TurtleBot3 Burger | ✅ | ✅ | ✅ | 默认快速上手模型 |
| TurtleBot3 Waffle | ✅ | ✅ | ✅ | 较大尺寸差速底盘 |
| TurtleBot3 Waffle Pi | ✅ | ✅ | ✅ | 保留相机话题,导航主要依赖激光 |
| WPB Home | ✅ | ✅ | ✅ | 官方模型加仿真适配层 |
| WPB Home Mani | ✅ | ✅ | ✅ | 当前按移动底盘使用 |
WPB Home 的迁移不仅是复制 URDF,还补充了:
- Gazebo 差速驱动;
- 激光雷达;
- RGB/深度相机接口;
- IMU;
- footprint;
- 代价地图参数;
- DWA 参数;
- 仿真适配层。
需要说明的是,WPB Home Mani 当前只作为移动底盘参与导航,仓库尚未实现机械臂 MoveIt 规划、抓取和移动操作任务。
模型切换示例:
roslaunch mr_navigation navigation_sim.launch\model:=waffle\robot_model:=waffle或者:
roslaunch mr_navigation navigation_sim.launch\model:=wpb_home\robot_model:=wpb_home十一、课程 Bonus:Go2W 轮足机器人自主导航
本项目中比较有特点的一部分,是将课程中的 ROS 导航链路进一步迁移到 Go2W 轮足机器人仿真中。
Go2W Bonus 并不直接放在主分支,而是保留在:
go2w-navigation分支中。
分支地址:
https://github.com/Mingyang-Sheep/mobile-robot-planning/tree/go2w-navigation
这一分支将以下模块串联起来:
- Go2W 仿真模型;
- Gazebo;
- 激光雷达;
- 里程计与 TF;
- map_server;
- AMCL;
- move_base;
- NavfnROS;
- DWAPlannerROS;
- 速度指令滤波;
- RL-SAR 运动控制;
- TorchScript 策略;
- 关节控制器;
- RViz 目标点输入。
演示效果如下:
Go2W 导航的数据流
RViz 2D Nav Goal ↓ map_server + AMCL ↓ NavfnROS ↓ DWAPlannerROS ↓ /move_base_cmd_vel ↓ cmd_vel_filter.py ↓ /cmd_vel ↓ RL-SAR / rl_sim ↓ policy.pt ↓ robot_joint_controller ↓ Gazebo Go2W传统差速机器人通常可以直接将/cmd_vel发送给底盘插件。
但对于 Go2W 这类轮足机器人,导航系统输出的速度指令不能直接等价为各关节控制量。因此,该分支增加了一个中间层:
导航速度指令 ↓ 速度限制与平滑 ↓ RL-SAR 运动策略 ↓ 轮足关节动作这部分展示了一个比较重要的系统集成思路:
高层导航不需要直接理解机器人每个关节如何运动,而是输出期望速度;底层学习控制器负责将速度命令转换为机器人可以执行的轮足动作。
Go2W 分支的定位是课程 Bonus 展示和可复现实验链路;后续通用功能开发仍建议从main分支开始。
十二、快速运行主分支
1. 克隆仓库
gitclone https://github.com/Mingyang-Sheep/mobile-robot-planning.gitcdmobile-robot-planning2. 加载 ROS 环境
source/opt/ros/noetic/setup.bash3. 检查环境
bashtools/check_environment.sh4. 安装依赖
sudobashtools/install_dependencies.sh5. 编译
catkin_makesourcedevel/setup.bash6. 启动默认导航示例
roslaunch mr_navigation navigation_sim.launch默认配置为:
| 项目 | 默认值 |
|---|---|
| 机器人 | burger |
| 世界 | turtlebot3_world.world |
| 地图 | turtlebot3_world.yaml |
| 初始位置 | x=-2.0, y=-0.5, yaw=0.0 |
| 启动入口 | mr_navigation/navigation_sim.launch |
十三、快速运行 Go2W Bonus
切换到 Go2W 分支:
gitcheckout go2w-navigation下载推理运行时并编译:
source/opt/ros/noetic/setup.bashbashscripts/download_inference_runtime.sh libtorch catkin_make-DBUILD_RL_REAL_TARGETS=OFFsourcedevel/setup.bash启动 Go2W 导航:
roslaunch mr_navigation go2w_navigation_sim.launch启动完成后,在 RViz 中:
- 等待 Gazebo、RL-SAR 起身流程、AMCL 和 move_base 完成初始化;
- 必要时使用
2D Pose Estimate修正初始位姿; - 使用
2D Nav Goal发送目标点。
常用检查命令:
rostopic hz /scan rostopic hz /odom rostopicecho/move_base_cmd_vel rostopicecho/cmd_vel rosrun tf tf_echo map base_footprint十四、这个仓库适合哪些人
我认为这个仓库比较适合以下几类读者。
1. ROS 移动机器人初学者
可以从机器人模型、Gazebo、SLAM、AMCL、move_base、DWA 和 TF 入手,理解一个完整导航系统的基本组成。
2. 正在做机器人课程设计的同学
仓库保留了课程基线的思路,同时补充了结构化 ROS 包、算法扩展、文档和运行演示,适合作为课程项目的参考框架。
3. 想学习路径规划算法的同学
仓库同时包含 A*、Dijkstra、D*、D* Lite、Theta*、RRT* 等算法,并提供 C++/Python 调试和 ROS 导航接入方式。
4. 想学习覆盖规划的同学
可以通过 BCD 和 STC 了解普通点到点导航与全覆盖任务的差别。
5. 想了解学习控制与导航结合的同学
Go2W Bonus 展示了:
ROS 高层导航 + 强化学习底层运动控制之间的一种分层组合方式。
6. 需要迁移自定义机器人模型的开发者
仓库中的多机器人配置和 WPB Home 迁移过程,可以作为 URDF、Gazebo 插件、传感器、costmap 和 DWA 参数适配的参考。
十五、项目亮点总结
与只包含单个算法脚本的项目相比,这个仓库更重视“系统链路”和“工程组织”。
主要特点可以概括为:
1. 从课程基线扩展为模块化工作区
保留 MEE5115 课程项目的 SLAM 与导航基础,同时重新组织为多个可复用 ROS 包。
2. 不止有算法,还接入真实导航链路
自定义规划器可以通过GlobalPlannerAdapter接入 move_base,由 DWA 负责局部执行,而不是只在图片上画一条路径。
3. 同时覆盖点到点规划与覆盖路径规划
既可以完成普通导航,也可以学习巡检、清扫等全覆盖任务。
4. 支持多种机器人模型
从 TurtleBot3 到 WPB Home,再到 Go2W 轮足机器人,体现了不同底盘和控制接口下的适配过程。
5. 加入实验性学习模块
虽然 DQN 模块仍处于基础阶段,但保留了从观测、动作、奖励到训练和模型保存的基本流程。
6. Go2W Bonus 体现分层控制思想
ROS Navigation 负责目标、定位和路径,RL-SAR 负责把速度指令变成轮足运动,实现高层导航与底层学习控制的衔接。
7. 文档和演示素材相对完整
仓库提供:
- 中英文 README;
- 安装与快速上手;
- Launch 参数说明;
- SLAM 与导航文档;
- 规划算法说明;
- 机器人模型迁移说明;
- 故障排查;
- 多组 GIF 演示。
十六、当前边界与后续方向
这个仓库定位为学习、课程实践和算法验证工作区,而不是完整的工业级自主机器人平台。
目前仍有一些可以继续扩展的方向:
- 增加更系统的规划算法评估指标;
- 对不同算法统计路径长度、规划时间、平滑度和成功率;
- 加入动态障碍场景;
- 完善 D* Lite 的动态重规划验证;
- 建立更规范的强化学习训练与测试流程;
- 增加视觉感知与视觉 SLAM;
- 增加 Nav2 / ROS 2 版本;
- 将更多自定义机器人接入统一启动框架;
- 增加真实机器人部署与 Sim2Real 验证;
- 探索全局导航与学习型局部规划的结合。
十七、结语
mobile-robot-planning最初只是一次自主机器人系统课程设计,但在后续整理中,我希望它不只是一份“能够运行的作业代码”,而是成为一个可以继续学习和开发的移动机器人工作区。
从 TurtleBot3 的 Gazebo 仿真、SLAM 建图、AMCL 定位和 DWA 导航,到 A*、Dijkstra、D*、Theta*、RRT* 等传统规划算法,再到 BCD、STC 覆盖路径规划、基础 DQN 实验以及 Go2W 轮足机器人导航,这个仓库尝试把移动机器人中的多个核心环节放在同一套 ROS 工程中展示出来。
项目仍在持续完善中,也欢迎对 ROS、SLAM、自主导航、路径规划、覆盖规划和轮足机器人感兴趣的同学交流。
如果这个项目对你有帮助,欢迎:
- 给仓库点一个Star;
- 提交 Issue;
- Fork 后进行二次开发;
- 分享给正在学习移动机器人和 ROS 的同学。
GitHub
https://github.com/Mingyang-Sheep/mobile-robot-planning
B 站演示
《MEE5115自主机器人系统课设|Gazebo SLAM导航、规划与Go2W Bonus》