当前位置: 首页 > news >正文

开源移动机器人规划框架: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 ↓ 机器人执行

因此,这个仓库的目标并不是只展示某一个算法,而是尽量保留一条完整、可观察、可替换的移动机器人导航链路。

在此基础上,仓库进一步加入了:

  1. 多种移动机器人模型;
  2. 多种全局路径规划算法;
  3. 路径平滑模块;
  4. 覆盖路径规划;
  5. 基础 DQN 学习演示;
  6. Go2W 轮足机器人导航 Bonus;
  7. 中英文文档与统一启动入口。

项目整体效果如下:


三、技术栈与运行环境

项目主分支面向以下环境:

项目版本或说明
操作系统Ubuntu 20.04
ROSROS Noetic
仿真器Gazebo 11
可视化RViz
构建方式Catkin /catkin_make
主要语言C++、Python、Shell、CMake
定位导航map_server、AMCL、move_base
局部规划DWAPlannerROS
SLAMgmapping、hector
全局规划Navfn、A*、Dijkstra、D*、D* Lite、Theta*、RRT*
覆盖规划BCD、STC
学习模块基础 DQN 实验
BonusGo2W + 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 坐标系

对于移动机器人入门来说,能够真正理解mapodombase_footprintbase_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 规划器,仓库还接入了多种常见路径规划算法。

当前支持的全局规划器包括:

算法主要特点当前定位
NavfnROS 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 插件化部署。

这种明确标注能力边界的方式,也是我在整理仓库时比较重视的一点:展示已经完成的内容,同时避免将实验模块包装成完整解决方案。


十、多机器人模型支持

主分支目前支持多种移动机器人模型:

机器人GazeboSLAMNavigation说明
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-planning

2. 加载 ROS 环境

source/opt/ros/noetic/setup.bash

3. 检查环境

bashtools/check_environment.sh

4. 安装依赖

sudobashtools/install_dependencies.sh

5. 编译

catkin_makesourcedevel/setup.bash

6. 启动默认导航示例

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 中:

  1. 等待 Gazebo、RL-SAR 起身流程、AMCL 和 move_base 完成初始化;
  2. 必要时使用2D Pose Estimate修正初始位姿;
  3. 使用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 演示。

十六、当前边界与后续方向

这个仓库定位为学习、课程实践和算法验证工作区,而不是完整的工业级自主机器人平台。

目前仍有一些可以继续扩展的方向:

  1. 增加更系统的规划算法评估指标;
  2. 对不同算法统计路径长度、规划时间、平滑度和成功率;
  3. 加入动态障碍场景;
  4. 完善 D* Lite 的动态重规划验证;
  5. 建立更规范的强化学习训练与测试流程;
  6. 增加视觉感知与视觉 SLAM;
  7. 增加 Nav2 / ROS 2 版本;
  8. 将更多自定义机器人接入统一启动框架;
  9. 增加真实机器人部署与 Sim2Real 验证;
  10. 探索全局导航与学习型局部规划的结合。

十七、结语

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》


http://www.jsqmd.com/news/1178405/

相关文章:

  • C++17 std::filesystem 跨平台文件操作实战指南
  • 数字孪生三大厂商2026年7月战略动向深度解析:AI原生化与出海竞争新格局
  • IPS Cable Simulation 2024 实战:汽车发动机线束 3 种工况动态干涉与应力仿真
  • 如何在3分钟内彻底改造Windows任务栏:TranslucentTB终极美化指南
  • 51单片机 02
  • BUUCTF MISC 隐写实战:从流量分析到坐标绘图,5类题目解题框架解析
  • 哈工大 OS 实验 4 排错指南:PCB、LDT 与内核栈指针的 3 处关键修改
  • MP2672A芯片与GD32VF103微控制器的电池管理系统设计
  • Windows 11企业版LTSC:老旧电脑性能优化与纯净系统部署指南
  • 基于YOLOv8的手语手势识别系统:从环境配置到实时检测完整指南
  • 3类主流局放监测技术对比:UHF/TEV/AE与脉冲电流法在10kV开关柜的实测差异
  • 计算机组成原理 5大核心部件:从冯·诺依曼到现代SoC的3种硬件结构演进
  • Spark 3.5.0 与 Hadoop 3.3.6 环境变量冲突排查:3 个常见配置错误与修复方案
  • 从神超局拆解竞技游戏中的决策自动化与心理博弈战术
  • Python zip()函数的工程价值:同步遍历、内存优化与数据契约
  • 你知道吗,有公司把LLM塞进了眼镜里了
  • STM32F031C6与MCP3551高精度ADC接口设计与优化
  • Fluent雾化仿真:TAB、KHRT、Wave破碎模型选择与参数优化指南
  • OpenCV RotatedRect 核心原理与实战:角度定义、顶点顺序及工程应用
  • 时光倒流器:Bilibili-Old如何让你重拾最爱的B站经典界面
  • Git 2.35.1 Windows 安装配置:3个关键选项解析与SSH密钥生成实战
  • AI编程提示词优化:为何Claude Code中少即是多
  • LL(1) 文法 vs LR(1) 文法:3 个关键差异与 2 种语法分析器实现选择
  • IntelliJ IDEA 2024.3 SSH 密钥连接:3步配置与 2 类常见权限错误排查
  • Deepseek代码生成模型:从原理到实战的完整开发指南
  • Unity组合模式实战:树形结构管理的终极解决方案
  • 基于YOLOv8的麻将识别检测系统:从数据集制作到UI开发全流程
  • Palworld Host Save Fix终极指南:简单3步解决服务器迁移角色丢失问题
  • 2026 年轻额盗窃不起诉辩护完整材料体系搭建
  • C++算法实践:从理论到工业级实现的四个维度与优化技巧