背景
工业巡检、园区安防和物流运输等场景需要机器人在无磁条、无二维码的环境中自主移动。HelioBot 基础导航系统面向 Unitree 四足机器人,将底盘、激光雷达、建图、定位和 Navigation2 导航能力统一到 ROS2 Humble 工作空间中。
系统通过激光惯性里程计构建三维点云地图,再生成 Navigation2 可使用的二维栅格地图;运行时由 RCM 管理器统一启停底盘、雷达、建图和导航能力,并提供状态查询、暂停、恢复和全局停止接口。
核心优势
- 融合建图定位:FAST-LIO2 + Scan Context + GTSAM + Wheel Encoder,室外增加 RTK 全局约束
- Navigation2 导航:AMCL 定位、Smac Hybrid 全局规划、MPPI 控制与动态代价地图
- 统一能力管理:RCM action/service 统一管理各模块启停、状态和导航任务
- 多硬件适配:支持 Unitree GO2 / B2,以及 Livox、RoboSense、Hesai 雷达
- 可交付运行:支持 amd64 / arm64 Docker 镜像和硬件指纹 License 授权
适用平台
| 平台 | 系统 | 传感器组合 | 状态 |
|---|---|---|---|
| Unitree GO2 | ROS2 Humble | Livox Mid-360 + Wheel Encoder(室外 + RTK) | 已支持 |
| Unitree B2 | ROS2 Humble | RoboSense Helios + Wheel Encoder(室外 + RTK) | 已支持 |
功能说明
系统架构
系统采用四层模块化架构,各能力通过 launch profile 和 RCM 接口组合:
数据流
LiDAR + IMU → FAST-LIO2 前端 → 激光惯性里程计 + 注册点云
Wheel Encoder → 运动约束 ┐
Scan Context → 回环约束 ├→ GTSAM 因子图优化 → 优化位姿 + 三维点云地图
室外 RTK → 全局约束 ┘
PCD 点云地图 → map_tools → PGM + YAML → Navigation2 Map Server
点云 → pointcloud_to_laserscan → 全局/局部 costmap → Smac + MPPI
RCM action/service → 能力控制器 → 底盘 / 雷达 / 建图 / 导航进程
SLAM 建图
系统采用统一的融合建图方案:FAST-LIO2 处理 LiDAR 与 IMU 数据并输出高频里程计;Wheel Encoder 提供独立运动约束;Scan Context 检测历史回环;GTSAM 将里程计、轮速和回环约束纳入因子图联合优化。室外模式进一步加入 RTK 全局位置约束。
- FAST-LIO2 前端:实时输出激光惯性位姿和注册点云,支持按指定路径保存 PCD
- Wheel Encoder:在快速运动、弱几何和短时点云退化场景中补充运动约束
- Scan Context:通过全局描述符检索回环候选,为长期运行提供闭环约束
- GTSAM 后端:联合优化激光惯性里程计、轮速、回环和室外 RTK 因子
- 地图输出:保存优化后的 PCD,并通过 map_tools 转换为 PGM + YAML 导航地图
导航引擎
导航系统基于 ROS2 Navigation2,使用 AMCL 在二维地图上定位,并通过 Behavior Tree 协调规划、控制和恢复行为。
- 全局规划:SmacPlannerHybrid 在静态地图和障碍物代价上生成可行路径
- 路径控制:MPPI Controller 根据局部代价地图滚动优化速度指令
- 环境感知:全局 costmap 使用静态层、障碍物层和膨胀层,局部 costmap 实时更新障碍物
- 恢复行为:支持旋转、后退、直行、辅助遥控和等待等 Behavior Server 行为
路点编辑
RCM Navigation Action 对单点和路径点序列提供统一控制:
- 单点导航:提交 map 坐标系下的目标位置和朝向
- 序列导航:通过
navigate_points依次执行多个目标位姿 - 运行控制:支持导航启动、停止、暂停和恢复
- 状态反馈:Action 持续返回阶段、进度、当前目标与错误信息
RCM 能力管理
- 能力启停:分别管理 base、lidar、gazebo、mapping 和 navigation
- 状态查询:通过
/query_state查询全部 capability 状态 - 故障收敛:通过
/shutdown_all统一停止所有受管进程 - 配置驱动:通过 YAML 修改驱动、雷达、建图和导航 profile
授权机制
- 硬件指纹:使用设备指纹和
/etc/machine-id绑定运行设备 - RSA 验签:验证 fingerprint 与 license 的 RSA-2048 签名,防止内容篡改
- 有效期校验:授权未过期且 device_id 匹配后才启动 RCM 管理器
安装部署
系统要求
- Ubuntu 22.04 LTS(Jammy)+ ROS2 Humble Hawksbill
- GCC 11+、C++17、colcon 与 ament_cmake
- Navigation2、PCL、OpenCV、GTSAM、yaml-cpp 与 OpenSSL
部署方式
源码环境可执行 ./setup.sh 安装依赖,并通过 ./build.sh 完整编译。交付环境支持 amd64 和 arm64 Docker 镜像,运行时仅包含编译产物;容器需使用 host 网络并挂载四个授权文件及宿主机 /etc/machine-id。
网络配置
ROS2 节点、机器人底盘和雷达需要处于可互通网络:
| 组件 | 网络要求 | 说明 |
|---|---|---|
| 机器人主机 | 连接机器人与雷达网段 | 运行 ROS2、RCM、建图和导航 |
| Docker 容器 | --network host | 共享 DDS 与硬件通信网络 |
# 安装依赖并编译
./setup.sh
./build.sh
# 加载 ROS2 与项目环境
source /opt/ros/humble/setup.bash
source install/setup.bash
使用
启动系统
# 加载环境并启动 RCM 管理器
source /opt/ros/humble/setup.bash
source install/setup.bash
ros2 launch bringup rcm_manager.launch.py
RCM 管理器启动后,可通过 ROS2 Action/Service 或 src/bringup/scripts/rcm_test_client.py 控制底盘、雷达、建图和导航。
SLAM 建图
通过 RCM 完成建图全流程:
- 启动底盘和对应雷达 capability
- 启动 mapping,指定
fast_lio2profile、室内/室外模式及地图保存路径;室外模式同时启用 RTK - 运行键盘遥控节点,使用 W/A/S/D 移动,Space 停止,缓慢覆盖目标区域
- 停止 mapping;系统完成 GTSAM 图优化并调用
/map_save保存优化点云,再停止建图进程 - 使用
pcd_to_pgm.py将 PCD 转换为 Navigation2 使用的 PGM + YAML
导航操作
准备好地图后,通过 RCM 启动导航:
- 将
map.yaml与map.pgm放入地图目录并检查图像路径 - 启动 navigation action,并通过 launch_args 传入地图 YAML 路径
- 通过
/initialpose设置机器人在地图中的初始位置和朝向 - 发送单点或多点导航目标,系统使用 SmacPlannerHybrid 与 MPPI 执行导航
- 运行中可调用暂停、恢复或停止接口,并通过 Action feedback 查看执行状态
路点巡航
Navigation Action 支持多目标序列:
- 使用
navigate_point发送单个目标位姿 - 使用
navigate_points发送有序目标位姿列表 - Waypoint Follower 到达路点后按顺序推进,并可配置路点等待任务
地图管理与切换
- 地图格式:导航地图由 YAML 元数据和 PGM 栅格图组成,点云定位也可加载 PCD / PLY 全局地图
- 地图切换:停止当前导航后,使用新的地图路径重新启动 navigation capability
异常汇总
Q: RCM 管理器启动失败?
A: 确认已加载 ROS2 和项目环境;检查 fingerprint.json、fingerprint.sig、license.dat、license.sig 是否位于同一目录,并确认授权未过期且与本机 machine-id 匹配。
Q: 导航启动超时?
A: 检查地图 YAML/PGM 路径和 License;调用 /query_state 查看 base、lidar、navigation 状态,并确认 navigation action 的 map 参数有效。
Q: 建图出现重影?
A: 降低机器人移动和转向速度;检查 LiDAR、IMU、Wheel Encoder 的时间同步与外参,确认 Scan Context 回环和 GTSAM 优化状态正常;室外还需检查 RTK 固定解和天线状态。
Q: 导航偏移严重 / 定位不准?
A: 重新通过 /initialpose 设置初始位姿;检查地图分辨率、AMCL 参数和 TF 树。如果使用点云全局定位,检查 PCD/PLY 路径及 ICP fitness 阈值。
Q: 导航中机器人不移动?
A: 检查底盘 capability 是否运行、机器人是否处于可接收速度指令的模式,并查看 local costmap 是否被近距离障碍物完全占据。
Q: ROS2 接口无法发现?
A: 检查各终端的 ROS_DOMAIN_ID、RMW_IMPLEMENTATION 和网络配置是否一致;Docker 部署需使用 host 网络,并确认防火墙未阻断 DDS 通信。
Q: RCM capability 启动后立即失败?
A: 调用 /query_state 查看错误信息;检查 launch_profiles.yaml 中的 package、launch_file 和 profile 参数,并确认对应 ROS2 包已编译安装。
Q: 需要立即停止所有模块?
A: 调用 /shutdown_all 统一停止受 RCM 管理的 capability;必要时同时使用机器人本体急停,并在重新启动前排查底盘和环境状态。
Q: 激光雷达无数据?
A: 检查雷达供电、网线和主机网卡地址;确认 lidar profile 与实际型号一致,并使用 ros2 topic list、ros2 topic hz 检查点云和 IMU 话题。