第四章 传感器与状态估计:IMU、轮速传感器、GPS/INS组合导航、卡尔曼滤波基础

各位同学,欢迎来到第四章。这一章我们聊聊底盘控制的眼睛和大脑——传感器与状态估计。

说实话,我在刚入行那会儿,总觉得算法是核心,传感器嘛,买好的就行了。后来被现实狠狠教育了一顿——再牛的算法,喂进去的是垃圾数据,吐出来的只能是更垃圾的结果。嗯,传感器融合这件事,说白了就是让车知道自己到底在哪儿、跑得多快、姿态怎么样。

4.1 IMU:惯性测量单元

IMU,全称Inertial Measurement Unit,一般包含三轴加速度计和三轴陀螺仪。有些高级货还会带磁力计,但咱们做底盘控制的,主要用前两个。

加速度计测量的是比力,也就是物体受到的惯性力与重力的合力。你想想看,车停在平地上,加速度计读出来的是(0, 0, -9.8) m/s²——它其实测的是重力在Z轴的分量。

陀螺仪测量的是角速度,单位是rad/s或者°/s。它能告诉你车在横摆、俯仰、侧倾三个方向上的转动快慢。

关键点:IMU的原始数据不能直接用。加速度计有零偏,陀螺仪有漂移。我见过一个项目,陀螺仪零偏没校准,积分10秒后横摆角误差就超过了5度——这要是做ESP,车早就转圈了。

IMU的坐标系定义,行业内一般遵循右手定则:

  • X轴:车辆前进方向
  • Y轴:车辆左侧方向
  • Z轴:车辆上方方向

绕X轴的转动叫侧倾角(Roll),绕Y轴的叫俯仰角(Pitch),绕Z轴的叫横摆角(Yaw)。

4.2 轮速传感器

轮速传感器,底盘控制的老朋友了。ABS、TCS、ESC,哪个离得开它?

目前主流的是霍尔式和磁阻式。霍尔式便宜但低速性能差,磁阻式精度高但贵一点。我个人习惯在量产项目中用磁阻式,尤其是做低速泊车辅助的时候,霍尔式在3km/h以下基本没法看。

轮速传感器能直接给出的是每个车轮的转速,单位一般是rpm或者脉冲数/秒。但我们要的是车速和轮加速度,这就涉及到一些处理技巧:

  • 车速估计:非驱动轮的速度更接近真实车速。前驱车就看后轮,后驱车就看前轮。当然,制动时所有轮子都会滑移,这时候需要结合IMU来修正。
  • 轮加速度:直接对轮速差分会放大噪声。我建议用一阶低通滤波,截止频率设在10-20Hz左右,既能保留动态响应,又能滤掉齿圈振动带来的毛刺。

避坑指南:我曾经在一个项目中,轮速传感器信号线上有共模干扰,导致ABS在干燥路面上误触发。排查了三天,最后发现是线束屏蔽层接地不良。所以,传感器信号处理,硬件和软件都要看,别只盯着算法。

4.3 GPS/INS组合导航

GPS精度高但更新慢(10Hz左右),而且容易丢星。INS(惯性导航)更新快(100Hz以上)但误差会累积。两者组合,取长补短,这就是组合导航的基本思路。

组合导航的模式主要有三种:

模式 原理 适用场景
松耦合 GPS和INS各自独立解算,然后用GPS结果修正INS 城市道路,GPS信号较好
紧耦合 GPS的原始观测值(伪距、载波相位)直接参与INS滤波 隧道、高架桥下等弱信号场景
深耦合 INS辅助GPS跟踪环路,抗干扰能力最强 军事、特种车辆

做底盘控制,松耦合基本够用。但如果你要做L3以上的自动驾驶,紧耦合是底线。为什么?你想想看,车在隧道里丢了GPS,松耦合的INS误差会迅速发散,等出隧道再重新收敛,黄花菜都凉了。

4.4 卡尔曼滤波基础

终于到了卡尔曼滤波。说实话,这是状态估计的基石,也是很多同学觉得最难啃的骨头。别怕,咱们一步步来。

卡尔曼滤波解决的是这样一个问题:我有两个信息来源,一个是模型预测(比如根据上一时刻车速和加速度,预测这一时刻车速),另一个是传感器测量(比如轮速传感器测到的车速)。两个都有误差,怎么融合才能得到最准的结果?

核心公式就五个,我习惯分成两步:

预测步(时间更新):

x_pred = A * x_prev + B * u      // 状态预测
P_pred = A * P_prev * A^T + Q     // 误差协方差预测

更新步(测量更新):

K = P_pred * H^T * (H * P_pred * H^T + R)^(-1)  // 卡尔曼增益
x_est = x_pred + K * (z - H * x_pred)            // 状态估计
P_est = (I - K * H) * P_pred                     // 误差协方差更新

看着公式多,其实逻辑很简单:

  • 先根据模型猜一个值(预测)
  • 再根据传感器测一个值(测量)
  • 然后算一个权重K,谁更准就信谁多一点
  • 最后得到融合后的最优估计

调参经验:Q是过程噪声协方差,R是测量噪声协方差。Q越大,说明模型越不可信,滤波会更依赖测量值;R越大,说明传感器越不可信,滤波会更依赖模型预测。我刚开始调的时候,总想把Q和R调得特别精确,后来发现,工程上大致合理就行,关键是看滤波后的残差是否白噪声化。

举个实际例子,用卡尔曼滤波估计车速:

// 状态量:车速 v
// 观测量:轮速传感器测得的车速 v_wheel
// 模型:匀加速模型,加速度由IMU提供

// 初始化
float x = 0.0;  // 初始车速
float P = 1.0;  // 初始误差协方差
float Q = 0.1;  // 过程噪声
float R = 0.5;  // 测量噪声

// 每个时间步执行
void KalmanFilter(float acc_imu, float v_wheel, float dt) {
    // 预测
    float x_pred = x + acc_imu * dt;
    float P_pred = P + Q;
    
    // 更新
    float K = P_pred / (P_pred + R);
    x = x_pred + K * (v_wheel - x_pred);
    P = (1 - K) * P_pred;
}

这段代码虽然简单,但已经能应付大部分车速估计场景了。当然,实际项目中还要考虑加速度零偏、轮速滑移等因素,需要扩展状态量。

注意:卡尔曼滤波假设噪声是高斯白噪声。如果实际噪声不满足这个条件(比如GPS多路径效应导致的非高斯噪声),滤波效果会变差。这时候可以考虑扩展卡尔曼滤波(EKF)或无迹卡尔曼滤波(UKF)。

4.5 传感器融合实战要点

最后,分享几个我在项目中踩过的坑:

  1. 时间同步:IMU、轮速、GPS的数据频率不同,到达时间也不同。不做时间同步,融合出来的结果就是错的。我一般用硬件触发或者软件插值来解决。
  2. 坐标系对齐:IMU的安装角度和车辆坐标系不一定完全重合。需要做标定,把IMU数据旋转到车体坐标系下。差个几度,长期积分下来误差就大了。
  3. 传感器失效检测:任何传感器都可能坏。卡尔曼滤波里要加一个检测逻辑,当残差超过3倍标准差时,认为传感器失效,暂时不用它的数据。
  4. 初始化:GPS刚启动时精度很差,IMU需要预热。我习惯等GPS收敛到10米以内,IMU零偏稳定后,再开始融合。

好了,这一章的内容就到这里。传感器与状态估计,说白了就是让车知道自己在哪里、状态怎么样。下一章我们会聊执行器与控制分配,看看怎么把估计出来的状态变成实实在在的刹车和转向指令。

记住一句话:好的状态估计,是底盘控制的地基。地基不稳,楼盖得再高也是白搭。