第二章:车载传感器与信号处理
各位同学,咱们今天聊聊车载传感器和信号处理。说实话,这部分是车道保持系统的“眼睛”和“耳朵”。眼睛看不清,耳朵听不准,那后面的控制算法再牛也白搭。我在项目里见过太多因为传感器选型不当或者信号处理不到位,导致系统在关键时刻掉链子的案例。嗯,咱们一个一个来看。
2.1 视觉传感器(摄像头)选型
摄像头选型,说白了就是给车选一双合适的眼睛。不是像素越高越好,也不是帧率越快越好。你得考虑实际场景。
我个人习惯,先看三个核心参数:
- 分辨率:一般车道保持用 1280x720 就够。太高了,处理器扛不住,功耗也上去了。我做过一个项目,客户非要上 4K 摄像头,结果算法跑起来延迟 200ms,车都偏出去了才反应过来。
- 帧率:30fps 是底线。低于这个,高速上车道线变化太快,容易丢帧。我建议用 60fps,留点余量。
- 动态范围:这个容易被忽略。隧道出入口、逆光场景,动态范围不够,画面一片白或者一片黑。我吃过这个亏,后来选型时专门加了 HDR 要求。
重要提醒:摄像头安装位置也很关键。挡风玻璃后面,雨刮器能刮到的区域。别装在雨刮刮不到的地方,下雨天你就知道有多坑了。
另外,镜头焦距决定了视野范围。车道保持一般用 30°-60° 的视角。太窄了,弯道看不到内侧车道线;太宽了,远处车道线像素太少,检测不准。
2.2 CAN总线信号读取
摄像头看的是路,但车自己的状态——车速、横摆角速度——这些得从 CAN 总线上读。CAN 总线,你可以理解成车的神经系统,所有传感器和执行器都在上面发消息。
读取 CAN 信号,核心就三步:
- 找到信号 ID:每个信号都有唯一的 CAN ID。比如车速可能是 0x1A0,横摆角速度可能是 0x2B0。这个得看整车厂的 DBC 文件。
- 解析数据格式:CAN 报文里,信号是按位和字节排列的。比如车速可能占 16 位,分辨率 0.01 km/h,偏移量 0。你得按 DBC 定义去解析。
- 校验和过滤:CAN 总线有 CRC 校验,但软件层最好再做一次合理性检查。车速突然从 60 跳到 200?那肯定是错误数据。
小技巧:我习惯在代码里加一个“信号超时检测”。如果某个信号超过 100ms 没收到新报文,就标记为无效。CAN 总线偶尔会丢帧,你不能让系统用过期数据做决策。
下面是一个简单的 CAN 信号读取代码示例:
// 车速信号解析示例
typedef struct {
uint32_t can_id;
uint8_t data[8];
} CanMessage_t;
float parseVehicleSpeed(CanMessage_t *msg) {
// 假设车速在字节0-1,小端模式,分辨率0.01
if (msg->can_id != 0x1A0) return -1.0f;
uint16_t raw = (uint16_t)msg->data[0] | ((uint16_t)msg->data[1] << 8);
float speed = raw * 0.01f;
// 合理性检查
if (speed < 0.0f || speed > 250.0f) {
return -1.0f; // 无效数据
}
return speed;
}
2.3 车速与横摆角速度信号预处理
从 CAN 总线读到的原始信号,不能直接用。为什么?因为噪声、量化误差、时间戳不同步。你想想看,车速信号和横摆角速度信号如果时间不对齐,算出来的曲率半径就是错的。
我常用的预处理手段:
- 低通滤波:车速信号用一阶低通滤波就够了。横摆角速度噪声大一些,我用二阶巴特沃斯。别用滑动平均,延迟太大。
- 时间戳对齐:每个信号进来都打上本地时间戳。做融合时,按时间戳插值到同一时刻。我踩过坑,直接用最新值,结果弯道里算出来的曲率忽大忽小。
- 异常值剔除:横摆角速度如果超过物理极限(比如乘用车一般不超过 30°/s),直接丢弃。我曾经遇到过 CAN 总线受到干扰,横摆角速度跳到了 100°/s,差点让系统误判为紧急避让。
注意:滤波器的截止频率要跟控制周期匹配。控制周期 10ms,滤波器截止频率设 5Hz 比较合适。设低了,信号太滞后;设高了,噪声滤不干净。
2.4 传感器数据融合基础
摄像头看到车道线,CAN 总线读到车速和横摆角速度。怎么把它们结合起来?这就是数据融合要干的事。
说白了,融合的目的是“取长补短”。摄像头在弯道里容易丢线,但横摆角速度可以帮你推算车辆姿态。车速不准时,摄像头看到的车道线变化可以帮你修正。
我常用的融合策略:
- 卡尔曼滤波:这是最经典的。状态量包括横向偏差、航向角偏差、曲率。观测量来自摄像头和横摆角速度。我建议用扩展卡尔曼滤波(EKF),因为车辆运动模型是非线性的。
- 加权平均:简单场景下够用。根据信号质量动态调整权重。比如摄像头置信度高时,多信摄像头;摄像头丢线时,多信横摆角速度积分。
- 冗余校验:两个传感器算出来的曲率如果差太多,说明至少有一个出问题了。这时候系统应该降级,而不是盲目相信某一个。
核心原则:永远不要完全依赖单一传感器。摄像头被泥巴糊住了怎么办?CAN 总线断了怎么办?融合的目的就是让系统在部分传感器失效时,还能安全运行一段时间。
嗯,这一章的内容就这些。传感器选型、信号读取、预处理、融合,每一步都有坑。我当年做第一个车道保持项目时,光信号预处理就调了两周。但基础打好了,后面的控制算法就顺了。下一章咱们聊聊车道线检测算法,那又是另一番天地。