ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

LIO-SAM 多机器人分布式 SLAM:从单机到集群的完整指南

LIO-SAM 多机器人分布式 SLAM:从单机到集群的完整指南

LIO-SAM 多机器人分布式 SLAM:从单机到集群的完整指南

【免费下载链接】LIO-SAMLIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping项目地址: https://gitcode.com/GitHub_Trending/li/LIO-SAM

一个一万平米的仓库,单台机器人以 1 m/s 的速度独自跑完要几个小时;改成 LIO-SAM 多机器人(分布式 SLAM)之后,多台并行探索,时间能压到一小时以内。本文以 LIO-SAM 为例,讲清楚 LIO-SAM 多机部署要改哪些地方:单机四模块的改造、ROS 多机通信、分布式地图融合,以及上线前的网络与标定准备。

单机为什么不够:两个硬限制

LIO-SAM 是单机器人激光惯性里程计项目,单机流水线由四个串行模块组成:imageProjection.cpp 做点云降采样与时间对齐,featureExtraction.cpp 分离角点与平面特征,imuPreintegration.cpp 预积分 IMU,mapOptmization.cpp 负责优化建图与回环。每个模块都只服务于自己这台车。

两个限制让单机难以承担大规模的多机器人建图任务:

  • 覆盖范围受行走距离约束:地图只能建在单台机器人走过的地方,大空间只能反复跑。
  • 容错没有冗余:一台车激光雷达被遮挡或 IMU 饱和,整个任务中断;单台漂移也无法被其他机器校正。
维度单机 LIO-SAM多机器人分布式 SLAM
覆盖范围受单台车活动范围限制多车并行探索,地图合并
数据无交叉验证重叠区域互相印证,漂移可互纠
容错单台故障即任务失败其余机器继续运行
计算一台机器全扛各车跑本地 SLAM,中心只做融合

多机化后四个流水线模块各自改什么

前三个模块基本只需“按车隔离”,真正的改动集中在优化端:

模块多机器人改动
imageProjection.cpp输出的关键帧带上机器人编号;TF 帧名改成该机器人的 base_link
featureExtraction.cpp基本不动,特征数据需带来源车标识
imuPreintegration.cpp按车运行不变,输出的里程计话题挂在各自命名空间下
mapOptmization.cpp改动最大:对外发布本车关键帧与位姿,并支持对齐到全局坐标系

多机 SLAM 的难度有八成压在 mapOptimization 一侧,其余模块做到“自洽、不撞名”即可。

多机系统的三层分工

🛰️ 一套 LIO-SAM 多机器人系统的整体拓扑分三层:前端是机器人集群,每台跑完整的 LIO-SAM,只管本地地图;中间是一个中央协调节点,收各车关键帧与关键帧位姿并做仲裁;底层存放融合后的全局地图。

协调节点自身不跑 SLAM,只干三件事:收关键帧、算跨机器人相对位姿、合并进全局地图。

多机命名空间怎么隔离,ROS 主从怎么配

params.yaml 里帧名怎么改

多台车发同名 TF 会直接冲突。把每台车的 config/params.yaml 中三个帧名加上机器人编号前缀,每台车各持一份配置文件,只改取值:

# robot1 的 lio_sam/(params.yaml 中的取值) lidarFrame: "robot1/base_link" baselinkFrame: "robot1/base_link" mapFrame: "robot1/map"

这样即使多车 TF 树汇到一处,robot1/base_link 与 robot2/base_link 也不会打架。

ROS 多机通信:一个 master,每台一个名字

ROS 多机通信的规则很简单:所有机器指向同一个 master,名字各自唯一。每辆机器人上:

# 每台机器人上(192.168.1.11 为本机 IP) export ROS_MASTER_URI=http://192.168.1.10:11311 export ROS_HOSTNAME=robot1 export ROS_IP=192.168.1.11

用命名空间包裹多机启动

把 launch/run.launch 包进 group 并放到自己的命名空间下,内部话题会自动带上机器人前缀:

<group ns="robot1"> <include file="$(find lio_sam)/launch/run.launch"/> </group>

每台车一个 group,协调节点按前缀订阅,就能分清各车关键帧来自谁。

分布式地图融合要做对的三件事

多车地图合并不是“点云拼接”,要依次做对三件事:

事项目的做法
跨机器人相对位姿估计让两车坐标系对齐有 GPS 先粗对齐再特征/激光精配;无 GPS 则用两车局部地图的重叠区域对齐
全局一致性优化全局地图不留缝把全部约束(车内 scan-to-map、回环、跨车约束)放进一次优化求全局位姿
增量式局部地图融合避免整体重算某车产出新关键帧即实时并入全局地图

前两条都依赖对 src/mapOptmization.cpp 的扩展:原回环检测只认本车的关键帧,多机化后需要让它也认识对方的关键帧。

网络、时间、标定:上线前三道前置检查

网络与时间同步

  • 千兆局域网:单车 10 Hz 全量点云轻松到几十 MB/s,百兆链路会成为第一瓶颈。
  • 🕒 NTP 时间同步:LIO-SAM 靠时间戳匹配激光雷达与 IMU,多车数据要落在同一条时间轴上,机器间时钟漂移需压到毫秒级。
  • 主机名解析:ROS_HOSTNAME 若用名称形式,需保证同网段可解析,写进 /etc/hosts 或直接使用 IP 最稳。

多机标定要抓的三个点

标定的权重在多机部署里比单机更高:单机时车内的误差是“本地问题”,多机时它会拖累融合结果。

  • 激光雷达与 IMU 外参:即 config/params.yaml 里的 extrinsicTrans / extrinsicRot,一台不准,该车局部地图就会漂。
  • 机器人间初始位姿:两车首次相对位姿需要较好的初值(人工摆放或 GPS 给个几米的偏差即可),否则对齐会收敛到错误解。
  • GPS 天线位置:使用 GPS 时须量出天线与车体的偏差,多车 GPS 对齐对这个量特别敏感。

带宽怎么省:点云传输的三档优化

📡 协调节点并不需要 10 Hz 的原始点云,三档优化按顺序上:

优化做法收益
点云压缩发送前先降采样,params.yaml 的 downsampleRate 可按传输需求调大单帧数据量下降
只传关键帧只上传关键帧与关键帧位姿,非关键帧丢弃带宽降一个量级
自适应调频监测时延与丢包,恶化时降低上传频率,最差只发位姿网络差时系统仍稳定,车端本地 SLAM 不受影响

实战验证与可以继续做的事

仓库巡检是 LIO-SAM 多机部署最典型的场景:把仓库划分区块,每区一台车,关键帧实时上报协调节点;某台传感器被遮挡时由邻区车辆补位。这类环境结构化程度高、回环容易,多车约束容易闭合,效果最直观。灾难救援适合多入口进车:机器人从多个入口同时进场景并行建图,全局地图直接作为救援路径规划的依据。农业大田场景思路类似,多台机器共享同一张田地图协同作业。

几个常见的坑:

  • TF 冲突:忘了帧名前缀,tf2 报重复变换,先查 params.yaml 三个帧名是否带上了机器人编号。
  • 空间错位而非位置偏移:融合结果通常是时钟问题,先查 NTP 再查标定。
  • 协调节点收不到数据:group ns 包了但 remap 没跟上,在两端跑 rostopic list 对一遍话题名。

可以继续做的事:

  • 用基于 ScanContext 的闭环检测(如 SC-LIO-SAM)替换现有回环方式,让跨机器人闭环更快更稳
  • 尝试用深度学习点云配准做跨车地图融合
  • 把全局优化放到云端,形成云边协同架构,扩大系统可承载的机器人数量

【免费下载链接】LIO-SAMLIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping项目地址: https://gitcode.com/GitHub_Trending/li/LIO-SAM

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进