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),仅供参考