基础导航系统

基于 ROS2 Humble 的四足机器人建图与自主导航系统

背景

工业巡检、园区安防和物流运输等场景需要机器人在无磁条、无二维码的环境中自主移动。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 GO2ROS2 HumbleLivox Mid-360 + Wheel Encoder(室外 + RTK)已支持
Unitree B2ROS2 HumbleRoboSense Helios + Wheel Encoder(室外 + RTK)已支持

功能说明

系统架构

系统采用四层模块化架构,各能力通过 launch profile 和 RCM 接口组合:

能力接口层:RCM Manager / Capability Action / Navigation Action / 管理 Service
导航与建图层:FAST-LIO2 / Scan Context / GTSAM / Wheel Encoder / RTK / Navigation2
启动编排层:bringup launch / YAML profile / robot-lidar-mapping 参数组合
硬件与仿真层:Unitree 驱动 / Livox / RoboSense / Hesai / Gazebo

数据流

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 完成建图全流程:

  1. 启动底盘和对应雷达 capability
  2. 启动 mapping,指定 fast_lio2 profile、室内/室外模式及地图保存路径;室外模式同时启用 RTK
  3. 运行键盘遥控节点,使用 W/A/S/D 移动,Space 停止,缓慢覆盖目标区域
  4. 停止 mapping;系统完成 GTSAM 图优化并调用 /map_save 保存优化点云,再停止建图进程
  5. 使用 pcd_to_pgm.py 将 PCD 转换为 Navigation2 使用的 PGM + YAML

导航操作

准备好地图后,通过 RCM 启动导航:

  1. map.yamlmap.pgm 放入地图目录并检查图像路径
  2. 启动 navigation action,并通过 launch_args 传入地图 YAML 路径
  3. 通过 /initialpose 设置机器人在地图中的初始位置和朝向
  4. 发送单点或多点导航目标,系统使用 SmacPlannerHybrid 与 MPPI 执行导航
  5. 运行中可调用暂停、恢复或停止接口,并通过 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 listros2 topic hz 检查点云和 IMU 话题。