大家好,我是老唐。
做机器人底盘或者低速无人物流车的朋友,大部分都在真机上跑过基于 Lidar-IMU 的紧耦合 SLAM。在公开数据集(比如 KITTI 或 Newer College)上跑算法,轨迹基本都平滑漂亮。但一旦把传感器装到底盘上,推到地下车库、长直走廊或者开阔的大平地,定位漂移、高度发散甚至建图直接「飞掉」的情况就屡见不鲜了。
今天聊聊激光雷达与 IMU 紧耦合(以目前工业落地较多的 Fast-LIO2 / LIO-SAM 框架思路为例)在实车部署上的关键链路,重点拆解一下工程落地时最头疼的问题:几何退化(Degeneracy)该如何检测与处理。
一、 传感器底层对齐:紧耦合的物理基石
紧耦合算法假设两件事:第一,IMU 的状态递推能给点云去畸变和残差优化提供可靠的先验;第二,点云残差反过来能实时约束 IMU 的零偏(Bias)。如果底层硬件没对齐,上层算法优化越狠,死得越快。
1. 时间硬同步(Hardware Sync)
不要相信网络广播的时间戳。在真车上,推荐两个硬同步方案:
- PTP (IEEE 1588):雷达与工控机均支持 PTP 时,工控机做 Master,通过网线进行纳秒级对齐。
- PPS + GPRMC:如果是带有 GNSS/RTK 的系统,使用 PPS 触发雷达与 IMU 采样,串口输入 NMEA 语句。
自检方法:让机器人快速原地自转($\ge 1.5 \text{ rad/s}$),观察点云去畸变效果。如果边缘墙体出现明显分层或弯曲,基本是时间同步存在固定 offset,或者雷达点内时间戳(Point Timestamp)解析字段传错了。
2. 外参标定(Extrinsics)
平移外参差 5 cm 影响有限,但旋转外参差 0.5 度就会导致长时间建图切向分层。
- 离线标定:推荐使用基于点面残差联合优化的工具(如
lidar_imu_init),或者用 CAD 机械尺寸作为初值,在特征丰富的室内慢速走「8」字轨迹进行联合优化。 - 警惕浮动连接:很多团队为了减震把 IMU 粘在软硅胶垫上,这种局部相对微动会直接摧毁紧耦合的运动学假设。IMU 必须与激光雷达刚性连接在同一结构件上。
二、 点云退化场景的本质与数学检测
在狭长白色走廊(只有两面平整墙壁)或空旷厂区(地面只有平整水泥板)运动时,激光雷达测距点虽然充裕,但在平行于走廊的方向上缺乏几何约束,系统状态在这个方向上是**不可观(Unobservable)**的。
1. 退化判据:海森矩阵特征值分解
在基于高斯-牛顿(Gauss-Newton)或误差状态卡尔曼滤波(ESIKF)的残差求解中,局部点面残差对系统状态(位置与姿态)的线性化关系为:
$$ \mathbf{H} \Delta \mathbf{x} = \mathbf{b} $$
其中信息矩阵 $\mathbf{M} = \mathbf{H}^T \mathbf{H}$。 如果我们在流形上只看位置的 3 自由度部分,将对应的 $3 \times 3$ 块矩阵进行特征值分解:
$$ \mathbf{M}_{pos} = \mathbf{V} \mathbf{\Lambda} \mathbf{V}^T $$
其中 $\mathbf{\Lambda} = \text{diag}(\lambda_1, \lambda_2, \lambda_3)$,且 $\lambda_1 \ge \lambda_2 \ge \lambda_3$。
- 若 $\lambda_3 \approx 0$ 或 $\lambda_3 < \lambda_{thresh}$,说明在特征向量 $\mathbf{v}_3$ 方向上缺乏几何约束,发生了 1 自由度退化(例如长走廊)。
- 若 $\lambda_2, \lambda_3$ 都极小,说明发生了 2 自由度退化(例如只有单一平面的大开阔地)。
2. 代码实现示例:在线检测退化
在优化迭代前提取雅可比矩阵,计算退化方向与退化因子:
#include <Eigen/Dense>
#include <Eigen/Eigenvalues>
struct DegeneracyStatus {
bool is_degenerate = false;
Eigen::Vector3d degenerate_direction = Eigen::Vector3d::Zero();
double min_eigen_value = 0.0;
};
DegeneracyStatus CheckPointDegeneracy(const Eigen::MatrixXd& J_pos, double threshold = 50.0) {
DegeneracyStatus status;
// 计算位置部分的信息矩阵 M = J^T * J
Eigen::Matrix3d M = J_pos.transpose() * J_pos;
// 特征值分解
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> es(M);
if (es.info() != Eigen::Success) {
return status;
}
// 获取特征值与特征向量(升序排列)
Eigen::Vector3d eigenvalues = es.eigenvalues();
Eigen::Matrix3d eigenvectors = es.eigenvectors();
status.min_eigen_value = eigenvalues(0);
// 判断最小特征值是否低于经验阈值
if (status.min_eigen_value < threshold) {
status.is_degenerate = true;
status.degenerate_direction = eigenvectors.col(0); // 最小特征值对应的方向向量
}
return status;
}
三、 实车退化处理实践方案
检测到退化后,如果任由优化算法更新状态,病态逆矩阵会导致机器人在走廊方向上产生巨大跳变。工程上有两种常见处理路径:
方案 A:退化方向投影截断(Optimization Projection)
参考张吉团队在 LOAM 扩展论文中的经典做法:将更新量投影到良好约束的子空间,退化方向不进行激光观测更新,纯靠 IMU 积分或轮速递推。
Eigen::VectorXd delta_x = SolveGN(H, b); // 原始求得的增量
if (status.is_degenerate) {
// 构造退化方向的投影算子 P = v * v^T
Eigen::Vector3d v = status.degenerate_direction;
Eigen::Matrix3d P = v * v.transpose();
// 将位置增量中的退化分量剔除
Eigen::Vector3d delta_pos = delta_x.segment<3>(0);
delta_pos = (Eigen::Matrix3d::Identity() - P) * delta_pos;
delta_x.segment<3>(0) = delta_pos;
}
提示:在实际 ESIKF 架构(如 Fast-LIO)中,单纯截断卡尔曼增益 $\mathbf{K}$ 需要格外小心协方差矩阵的维持更新,建议直接把退化方向的观测更新噪声置为无穷大。
方案 B:引入轮速计约束作为退化兜底(推荐真机采用)
对于两轮差速或阿克曼底盘,最经济稳妥的办法是引入底盘编码器(Wheel Odometry)。
+--------------------------------+
| IMU High-Freq Propagation |
+---------------+----------------+
|
[Check Degeneracy State]
/ \
(Normal Scenario) (Degenerate: λ_min < Thresh)
| |
Lidar Point-to-Plane Lidar Constraint (Non-deg)
Residual Optimization + Wheel Odom Pre-integration
- 常规路况:完全以 Lidar 点面残差更新为主,在线估计 IMU 零偏与轮速计标定系数。
- 退化路况:当检测到水平方向退化,自动激活轮速计一维速度残差约束,作为先验项塞入因子图(Factor Graph)或者在 ESIKF 中以轮速测量方程更新:
$$ z_{odom} = v_x - \mathbf{R}_b^w (\mathbf{p}k - \mathbf{p}{k-1}) / \Delta t $$
这样能保证长走廊里即使激光点云完全「滑丝」,底盘也不会因为漂移而向前方急速窜动。
四、 实车排错 Checklist
如果你的系统在开阔地或走廊里依然发散,可以对照以下清单逐项排查:
-
IMU 标定噪声参数配置 不要盲信芯片手册上的典型值。务必使用
imu_utils等工具,静置设备 2 小时以上,实际计算 Allan 方差,提取真实的零偏不稳定性(Bias Instability)和随机游走(Random Walk)。真机震动较大的底盘,通常需要将配置文件里的噪声参数放大 5 到 10 倍填入算法。 -
激光雷达去畸变字段 检查进入 SLAM 节点的点云格式是否包含严格的
time或rel_time字段。部分 ROS 驱动把点内相对时间单位填成微秒,而算法期望的是秒,会导致点云畸变矫正严重反转。 -
IMU 坐标系与重力对齐 上车前务必静态打印出原始 IMU 读数。静止在水平地面上时,加速度 $z$ 轴理论上应当在 $+9.8 \text{ m/s}^2$(或者按照不同框架的定义为 $-9.8 \text{ m/s}^2$)。正负号反了会导致姿态优化在第一帧就发散。
-
体素降采样大小(Leaf Size)的动态调节 在开阔大场景下,如果使用固定的体素大小(例如 0.5 m),远处的有效平面点可能被过滤殆尽,人为加剧退化。针对反射点稀疏的场景,应启用自适应距离降采样策略。
工业现场没有完美的数据集。解决真机 SLAM 退化问题,核心思想永远不是指望某一个传感器在所有极端工况下都灵光,而是能快速感知到当前主传感器的失效,并平滑地将权重交接给具备运动学约束的冗余传感器(轮速计、视觉或紧耦合 GNSS)。
大家在实车调试过程中如果遇到特定的漂移曲线或发散情况,可以在评论区抛出你们的传感器配置和场景特征,咱们一起分析排坑。
License: CC BY-NC 4.0
Updated 13 hours ago
Was this article helpful? Give it a like.
0 comments


