共计 1664 个字符,预计需要花费 5 分钟才能阅读完成。
典型技术指标要求
2024 年电赛对自动驾驶小车的基础要求通常包括:

- 循迹精度:偏差控制在±2cm 内(基于标准赛道宽度 30cm)
- 障碍物识别率:静态障碍物识别距离≥50cm,动态障碍响应时间≤0.5s
- 行驶速度:直道稳定速度≥0.8m/s
- 系统延迟:从传感器输入到电机响应的全链路延迟≤100ms
硬件方案对比
主控选择
- STM32 方案
- 优点:实时性强(可配置硬件中断),功耗低(典型工作电流 <50mA)
-
缺点:图像处理能力有限(需外接 OpenMV 等模块)
-
树莓派方案
- 优点:原生支持 Python 和 ROS,方便部署视觉算法
- 缺点:实时性依赖软件优化,USB 接口可能成为带宽瓶颈
传感器组合
- 红外对管阵列(5- 8 路)
-
成本低(整套 <100 元),但易受环境光干扰
-
摄像头 +OpenCV
-
可识别复杂路径(如十字路口),需要 200 万像素以上摄像头
-
超声波 +IMU 融合
- 适合障碍物测距,推荐 HC-SR04 模块(检测角度 15°)
核心实现
ROS 节点架构
flowchart LR
A[摄像头节点] --> D[融合节点]
B[红外节点] --> D
C[超声波节点] --> D
D --> E[控制节点]
E --> F[电机驱动]
PID 控制实现(C++)
// 位置式 PID 控制器
class PIDController {
public:
PIDController(float Kp, float Ki, float Kd) :
kp(Kp), ki(Ki), kd(Kd),
last_error(0), integral(0) {}
float update(float error, float dt) {
integral += error * dt;
float derivative = (error - last_error) / dt;
last_error = error;
return kp*error + ki*integral + kd*derivative;
}
private:
float kp, ki, kd;
float last_error, integral;
};
传感器融合示例(Python)
# 加权融合红外和摄像头数据
def sensor_fusion(ir_data, cam_data):
# 红外置信度(近距离更可靠)ir_weight = 0.7 if min(ir_data) < 20 else 0.3
# 摄像头置信度(远距离更可靠)cam_weight = 1 - ir_weight
return ir_weight*np.mean(ir_data) + cam_weight*cam_data
性能优化
实时性保障
-
STM32 中断优先级配置(以 HAL 库为例):
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); // 最高优先级 HAL_NVIC_EnableIRQ(TIM2_IRQn); -
ROS 节点 CPU 绑定(需安装 taskset):
taskset -c 0 rosrun my_pkg control_node
电源管理
- 电机驱动单独供电(建议 7.4V 锂电池)
- 主控板添加 1000μF 电容缓冲
- 使用 TPS63000 升降压模块(效率 >90%)
新手避坑指南
电机驱动问题
- 症状:上坡时电机抖动
- 解决方案:
- 检查电源电压(负载时不应低于 6V)
- 增加 PWM 频率(建议 10-20kHz)
- 使用 MOSFET 驱动(如 DRV8871)替代 L298N
图像处理延迟
- 调试步骤:
- 使用
rqt_graph查看节点通信延迟 - 对 OpenCV 代码进行性能分析:
import cv2 import time start = time.time() # 图像处理代码 print(f"处理耗时: {time.time()-start:.3f}s") - 降低分辨率(推荐 320×240)或改用灰度处理
进阶思考
- 如何通过自适应阈值处理应对反光赛道?
- 当超声波和红外数据冲突时,该采用哪种融合策略?
- 怎样设计状态机来处理起跑线 / 终点线识别?
实践体会
在最近一次实测中,我们发现 STM32+ROS 的组合既保证了控制实时性,又能利用 ROS 丰富的视觉算法。建议新手先用现成的 PID 库(如【开源库名】)快速验证基础功能,再逐步替换为自己的算法实现。电源问题往往是初期最大的坑,务必在组装阶段就做好分电测试。
正文完
发表至: 未分类
近两天内
