面向 RoboMaster 哨兵机器人的 ROS2 自主导航工作空间,集成双激光雷达、SLAM 建图、Nav2 自主导航、激光里程计、串口通信和比赛状态决策逻辑。
本项目主要用于哨兵机器人在场地中的自主巡航、定点导航、低血量补给点回退、局部避障和底盘控制指令下发。
rm2025_hzu_sentry_ws 是一个基于 ROS2 Humble 的机器人导航系统,适用于 RoboMaster 场景下的哨兵机器人。系统通过前后双 YDLIDAR X3 激光雷达获取环境信息,将双雷达数据融合为统一的激光扫描数据,并结合 rf2o 激光里程计、Gmapping 建图、Nav2 导航栈和自定义串口协议,实现机器人在比赛环境中的自主移动与决策。
系统主要能力包括:
- 双激光雷达数据融合
- SLAM 建图与地图保存
- 基于已有地图的 Nav2 自主导航
- rf2o 激光里程计
- 定点导航与巡航逻辑
- 根据比赛状态和机器人血量执行导航策略
- ROS2
cmd_vel到自定义串口控制协议的转换 - 局部代价地图清除
- RViz 可视化与 TF 调试
推荐环境:
- Ubuntu 22.04
- ROS2 Humble
- Nav2
- Gmapping
- YDLIDAR SDK / ydlidar_ros2_driver
- Python 3
- colcon
- gnome-terminal
建议先安装常用 ROS2 依赖:
sudo apt update
sudo apt install -y \
ros-humble-navigation2 \
ros-humble-nav2-bringup \
ros-humble-slam-toolbox \
ros-humble-rviz2 \
ros-humble-tf2-tools \
ros-humble-rqt-tf-tree \
ros-humble-rqt-reconfigure \
python3-colcon-common-extensions注意:实际依赖可能会随本地环境、雷达 SDK、串口设备和机器人底盘控制板配置而变化。
rm2025_hzu_sentry_ws/
├── src/
│ ├── bot_navigation2/ # Nav2 导航启动与参数配置
│ ├── map_tools/ # 地图、导航目标、串口封装、雷达融合等工具
│ ├── openslam_gmapping/ # Gmapping 底层实现
│ ├── slam_gmapping/ # ROS2 Gmapping 封装与启动文件
│ ├── rf2o_laser_odometry-ros2/ # rf2o 激光里程计
│ ├── rm_interfaces/ # 自定义 ROS2 消息接口
│ ├── rm_serial_python/ # Python 串口通信节点
│ └── ydlidar_ros2_driver-master/ # YDLIDAR 雷达驱动
├── 地图备份/ # 地图备份
├── slam_map.yaml # 当前导航地图配置
├── slam_map.pgm # 当前导航地图图像
├── begin.sh # 一键启动脚本
├── begin2.sh # 备用启动脚本
├── start.sh # 启动脚本
├── stop.sh # 停止脚本
└── readme.md # 原始运行说明
主要负责 Nav2 导航栈启动和参数配置,包括:
- 地图导航
- 代价地图配置
- 全局路径规划
- 局部路径规划
- RViz 可视化配置
- 测试用整合启动文件
常用启动文件:
ros2 launch bot_navigation2 test_all.launch.py
ros2 launch bot_navigation2 navigation2.launch.py use_sim_time:=False slam:=False map:=/home/dt46/rm2025_hzu_sentry_ws/slam_map.yaml项目中的导航工具包,负责连接导航层和底盘通信层,包含:
- 双雷达数据融合
- 静态 TF 发布
- 定点导航
cmd_vel转串口数据- 串口通信
- 里程计节点
- 清除局部代价地图
常用节点:
ros2 run map_tools nav2_to_goal
ros2 run map_tools cmd_vel2serial.py
ros2 run map_tools serial_port
ros2 run map_tools odo
ros2 run map_tools clear_cost_map用于 SLAM 建图。系统可以通过激光雷达数据构建占据栅格地图,并保存为 Nav2 可加载的 yaml + pgm 地图文件。
启动建图:
ros2 launch slam_gmapping test_gmapping.launch.py保存地图:
ros2 run nav2_map_server map_saver_cli -t map -f slam_map用于通过连续激光扫描匹配计算机器人位姿变化,提供激光里程计信息。
启动:
ros2 launch rf2o_laser_odometry rf2o_laser_odometry.launch.pyYDLIDAR X3 雷达驱动。项目使用两路雷达数据,分别作为前后雷达输入。
启动一号雷达:
ros2 launch ydlidar_ros2_driver x3_ydlidar_launch.py启动二号雷达:
ros2 launch ydlidar_ros2_driver x3_ydlidar_launch_2.pyPython 版本串口通信包,用于和下位机或裁判系统相关模块通信。可用于调试或替代部分 C++ 串口节点。
启动:
ros2 run rm_serial_python rm_serial_node自定义 ROS2 消息接口包,用于系统内部传递导航、决策和串口相关数据。
进入工作空间根目录:
cd ~/rm2025_hzu_sentry_ws加载 ROS2 环境:
source /opt/ros/humble/setup.bash编译全部包:
colcon build只编译指定包,例如 map_tools:
colcon build --packages-select map_tools编译完成后加载工作空间环境:
source install/setup.bash建议将环境加载命令加入 ~/.bashrc:
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
echo "source ~/rm2025_hzu_sentry_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc项目提供 begin.sh 用于启动主要导航流程。
cd ~/rm2025_hzu_sentry_ws
chmod +x begin.sh
./begin.shbegin.sh 会依次启动:
- Nav2 地图导航
- 雷达与 TF 相关整合启动
- 定点导航节点
cmd_vel串口数据封装节点- 里程计节点
- 串口通信节点
- 局部代价地图清除节点
如果你的工作空间路径不是:
/home/dt46/rm2025_hzu_sentry_ws
需要修改 begin.sh 中的路径,例如:
source /home/dt46/rm2025_hzu_sentry_ws/install/setup.bash以及地图路径:
map:=/home/dt46/rm2025_hzu_sentry_ws/slam_map.yaml改为你本机实际路径。
可以使用整合启动:
ros2 launch bot_navigation2 test_all.launch.py也可以分别启动:
ros2 launch ydlidar_ros2_driver x3_ydlidar_launch.py
ros2 launch ydlidar_ros2_driver x3_ydlidar_launch_2.py
ros2 launch map_tools merged_scan.launch.py
ros2 launch map_tools tf_static_launch.py
ros2 launch rf2o_laser_odometry rf2o_laser_odometry.launch.pyros2 launch slam_gmapping test_gmapping.launch.pyrviz2ros2 run nav2_map_server map_saver_cli -t map -f slam_map保存后会生成:
slam_map.yaml
slam_map.pgm
ros2 run map_tools odoros2 launch bot_navigation2 navigation2.launch.py use_sim_time:=False slam:=False map:=/home/dt46/rm2025_hzu_sentry_ws/slam_map.yamlros2 run map_tools nav2_to_goalros2 run map_tools cmd_vel2serial.py真串口:
ros2 run map_tools serial_portPython 串口节点:
ros2 run rm_serial_python rm_serial_node单次清除:
ros2 run map_tools clear_cost_map查看 TF 树:
ros2 run rqt_tf_tree rqt_tf_tree --force-discover打开 RViz:
rviz2动态调参:
ros2 run rqt_reconfigure rqt_reconfigure手动加载地图服务器:
ros2 run nav2_map_server map_server --ros-args --param yaml_filename:=slam_map.yaml配置地图服务器生命周期:
ros2 lifecycle set /map_server configure激活地图服务器:
ros2 lifecycle set /map_server activate查看话题:
ros2 topic list查看 TF:
ros2 run tf2_tools view_frames查看节点:
ros2 node listbegin.sh 的主要逻辑如下:
#!/bin/bash
source /opt/ros/humble/setup.bash
source /home/dt46/rm2025_hzu_sentry_ws/install/setup.bash
gnome-terminal --tab --title="navigation2_copy.launch.py" -- bash -c "ros2 launch bot_navigation2 navigation2_copy.launch.py use_sim_time:=False slam:=False map:=/home/dt46/rm2025_hzu_sentry_ws/slam_map.yaml; exec bash"
sleep 5
gnome-terminal --tab --title="test_all.launch.py" -- bash -c "ros2 launch bot_navigation2 test_all.launch.py; exec bash"
gnome-terminal --tab --title="nav2_to_goal" -- bash -c "ros2 run map_tools nav2_to_goal; exec bash"
gnome-terminal --tab --title="cmd_vel2serial.py" -- bash -c "ros2 run map_tools cmd_vel2serial.py; exec bash"
gnome-terminal --tab --title="odo" -- bash -c "ros2 run map_tools odo; exec bash"
gnome-terminal --tab --title="serial_port" -- bash -c "ros2 run map_tools serial_port; exec bash"
gnome-terminal --tab --title="clear_cost_map" -- bash -c "ros2 run map_tools clear_cost_map; exec bash"使用前请根据实际路径修改工作空间路径和地图路径。
系统整体数据流大致如下:
YDLIDAR 前雷达 YDLIDAR 后雷达
│ │
└──────┬─────────────┘
│
双雷达数据融合
│
/scan 或合并 scan
│
┌──────┴─────────┐
│ │
Gmapping 建图 rf2o 激光里程计
│ │
└──────┬─────────┘
│
Nav2
│
/cmd_vel
│
cmd_vel2serial.py
│
serial_port
│
下位机
比赛决策相关逻辑由 nav2_to_goal 等节点实现,可根据机器人状态、血量、比赛阶段等信息选择巡航点或补给点。
- 启动前确认雷达串口权限和设备名是否正确。
- 如果使用真串口,请确认下位机通信协议与节点中的数据格式一致。
begin.sh中包含固定绝对路径,换机器后需要手动修改。- 地图文件路径需要和 Nav2 启动参数一致。
- 如果导航过程中局部代价地图出现异常障碍物,可运行
clear_cost_map。 - 建图和导航不要同时混用错误地图坐标系,启动前确认 TF 树是否正常。
- 首次运行前建议单独启动各模块,确认雷达、TF、里程计、Nav2 和串口均正常后再使用一键脚本。
本项目使用 MIT License。具体内容见仓库中的 LICENSE 文件。