VINS 视觉惯性 SLAM 在嵌入式 Linux 上的部署适配

2022/09/01

VINS-Mono / VINS-Fusion 这类视觉惯性 SLAM 算法,论文和开源代码都默认跑在 x86 工作站上。把它落到 ARM 嵌入式平台做成手持建图设备,算法本身基本不用动,工作量全在"适配"上。本文按部署顺序总结各环节的要点,基于 RK3588 + ROS Noetic 的实践。

平台与系统

RK3588(4×A76 + 4×A55)的 CPU 算力跑 VINS 前端特征提取 + 后端优化是可行的,但没有 GPU 加速余量,图像预处理要靠 NEON/多线程自己挤性能。系统侧用 ROS Noetic 作为框架——VINS 系列代码本身就是 ROS 包形态,沿用其原生框架比重写成裸进程省太多事。

第一步永远是传感器时间同步

VINS 是紧耦合视觉惯性融合,IMU 和相机时间戳对不齐,算法直接发散,而且现象是"轨迹慢慢飘"而不是立刻报错,很隐蔽。所以部署顺序上,先花大力气做硬件打通:

这一步没过,后面标定和调参都是白做。

标定:Kalibr

相机内参、IMU-相机外参、时间偏移都用 Kalibr 标定。嵌入式部署要注意的是标定数据采集本身就要在目标设备上做——时间偏移(td)和链路延迟强相关,在 PC 上采数据标出的参数搬到设备上不一定成立。

部署形态:ROS + Docker

设备端用 Docker 容器化部署 ROS 环境:算法包、依赖、启动脚本打进镜像,设备系统底座保持干净。好处在现场升级和回滚——算法迭代远快于系统底座,两者解耦后算法可以单独发版。这套"容器化部署 + 统一底座"的做法后来独立演化成了覆盖多款产品的软件平台,VINS 部署是它的第一个真实负载。

业务层配合:自动拍照

手持建图设备的相机不仅服务 SLAM,还要产出照片成果。两者节奏不同(SLAM 要稳定帧率,拍照要按间隔/触发),需要一个自动拍照算法在 SLAM 取流之外独立控制拍照时机,避免互相抢占传感器。

调试期的高频问题