第三章 传感器与执行器:IMU、GPS、轮速传感器、转向电机、制动系统接口

各位同学,咱们今天聊聊车上那些「感知世界」和「动手干活」的硬件。传感器是控制系统的眼睛和耳朵,执行器就是手和脚。没有它们,算法再牛也是纸上谈兵。

我个人习惯把传感器分为两类:一类是测量自身状态的,比如IMU和轮速;另一类是测量外部环境的,比如GPS。执行器这边,转向和制动是核心,直接关系到安全。

3.1 IMU:惯性测量单元

IMU这东西,说白了就是加速度计加陀螺仪。加速度计测线加速度,陀螺仪测角速度。两者一融合,就能得到车辆的姿态和运动轨迹。

关键参数:

  • 零偏稳定性:这个指标很关键。我遇到过一款IMU,零偏漂移太大,停车时积分出来的速度都飘到天上去了。
  • 噪声密度:决定了你能分辨多小的运动变化。
  • 输出频率:一般100Hz以上才够用,太低的话控制延迟会很大。
注意:IMU数据不能直接用。加速度计有重力分量,陀螺仪有温漂。必须做标定和滤波。我见过有人直接把原始加速度积分算速度,结果越算越离谱。

数据处理流程:

// 伪代码:IMU数据预处理
raw_acc = read_accelerometer()
raw_gyro = read_gyroscope()

// 去零偏
acc = raw_acc - acc_bias
gyro = raw_gyro - gyro_bias

// 低通滤波(我习惯用截止频率20Hz)
acc_filtered = lowpass_filter(acc, 20.0)

// 姿态解算(四元数法)
quaternion = mahony_filter(acc_filtered, gyro, dt)

3.2 GPS:全球定位系统

GPS提供绝对位置信息,但精度和更新率是硬伤。普通GPS精度在2-5米,RTK(实时动态差分)可以做到厘米级,但成本也上去了。

实际使用中的坑:

  • 多路径效应:城市峡谷、隧道里信号会反射,位置跳变。我曾经在立交桥下测试,GPS位置直接跳到对面车道去了。
  • 更新率低:一般10Hz,对于高速控制来说太慢了。需要和IMU做融合。
  • 坐标系转换:GPS输出的是经纬度,要转成平面坐标(比如UTM)才能用。
我的经验:GPS和IMU做卡尔曼滤波融合是标配。GPS修正长期漂移,IMU填补短期空白。但要注意GPS延迟,一般有100-200ms的延迟,需要做时间对齐。

3.3 轮速传感器

轮速传感器测的是车轮转速,可以换算成车速。但这里有个问题——车轮会打滑。急加速或急刹车时,轮速和实际车速就不一致了。

常见类型:

类型 原理 特点
磁电式 电磁感应 简单可靠,低速信号弱
霍尔式 霍尔效应 低速性能好,需要供电
磁阻式 磁阻效应 精度高,成本也高

信号处理要点:

  • 脉冲计数要防抖动,我习惯用施密特触发器做硬件消抖。
  • 车速计算:v = (脉冲数 / 每转脉冲数) * 轮胎周长 / 时间
  • 轮胎周长会随胎压、磨损变化,需要定期校准。
警告:不要完全相信轮速算出来的车速。急刹车时轮速可能降到0,但车还在滑行。这时候必须用IMU或GPS做参考。

3.4 转向电机

转向执行器,常见的是EPS(电动助力转向)电机。控制目标就是让前轮转到目标角度。

控制架构:

// 转向控制伪代码
target_angle = path_planner.get_steering_angle()
current_angle = read_steering_angle()

// PID控制
error = target_angle - current_angle
motor_torque = Kp * error + Ki * integral(error) + Kd * derivative(error)

// 限幅保护
motor_torque = clamp(motor_torque, -MAX_TORQUE, MAX_TORQUE)

// 发送指令
send_to_motor_controller(motor_torque)

实际调试经验:

  • 转向系统有机械间隙和摩擦,PID参数要留裕量。
  • 高速时转向增益要降低,否则车会发飘。
  • 我遇到过电机过热保护导致转向失效,后来加了温度监控和降级策略。

3.5 制动系统接口

制动控制是安全关键。一般有两种方式:一种是直接控制制动踏板(线控制动),另一种是通过CAN总线发送制动请求给ESC(电子稳定控制系统)。

接口类型:

  • 模拟电压接口:0-5V对应0-100%制动压力。简单但精度一般。
  • CAN总线接口:发送制动扭矩请求。更灵活,但需要协议解析。
  • PWM接口:占空比控制制动压力。响应快,但需要硬件支持。
核心要点:制动控制必须考虑安全冗余。我参与的项目里,制动系统有独立的监控芯片,一旦主控失效,能自动进入安全制动模式。

制动控制策略:

// 制动控制伪代码
if (emergency_brake) {
    // 紧急制动:最大制动力
    brake_pressure = MAX_PRESSURE
} else {
    // 正常制动:根据目标减速度计算
    target_decel = planner.get_target_deceleration()
    brake_pressure = map_decel_to_pressure(target_decel)
}

// 防抱死保护(简单版)
if (wheel_slip > SLIP_THRESHOLD) {
    brake_pressure = brake_pressure * 0.8  // 降低制动力
}

send_brake_command(brake_pressure)

3.6 传感器融合与时间同步

多个传感器数据要融合,首先得解决时间同步问题。每个传感器有自己的时钟,数据到达时间也不一样。

我的做法:

  1. 所有传感器数据打上统一的时间戳(用主控的时钟)。
  2. 建立数据缓冲区,按时间戳排序。
  3. 融合时找时间戳最接近的数据对。
  4. 如果数据缺失,用IMU做插值预测。
小技巧:调试时把各传感器的时间戳打印出来,看看延迟差异。我见过GPS延迟200ms,IMU只有5ms,如果不做对齐,融合出来的位置会差好几米。

3.7 实车调试注意事项

最后说说实车调试的几点体会:

  • 先离线后在线:先录数据,在电脑上调试算法,再上实车。
  • 从小速度开始:第一次跑,速度控制在5km/h以内,出了问题能及时停车。
  • 监控所有信号:把传感器原始值、滤波值、控制指令都记录下来,方便事后分析。
  • 安全第一:永远有急停按钮,永远有安全员。

嗯,传感器和执行器这块就讲这么多。下一章咱们聊聊控制算法怎么和这些硬件配合,实现真正的车辆控制。