本程序实现车辆运动模型的**自动校准**,通过执行预定的测试序列(直线加速、恒速巡航、转向等),同时采集PWM控制信号、GPS位置速度、IMU惯导数据,为后续建立精确运动模型提供数据基础。
关键安全开关:SBUS CH8
- CH8 < 1500:允许运行测试
- CH8 ≥ 1500:立即紧急停止,回中PWM
重要:测试过程中,操作员应随时准备将CH8拨到≥1500位置以紧急停止车辆。
通过UART5发送命令(如果实现了命令接口)或调用MotionCalibration_Start()函数。
| 序号 | 状态名称 | 油门PWM | 舵机PWM | 持续时间 | 说明 |
|---|---|---|---|---|---|
| 1 | WARMUP | 1500 | 1500 | 2秒 | 预热,静止检查传感器 |
| 2 | ACCEL_LOW | 1600 | 1500 | 3秒 | 低速加速 |
| 3 | CRUISE_LOW | 1600 | 1500 | 5秒 | 低速巡航 |
| 4 | REST_1 | 1500 | 1500 | 1秒 | 间歇停顿 |
| 5 | ACCEL_MID | 1700 | 1500 | 3秒 | 中速加速 |
| 6 | CRUISE_MID | 1700 | 1500 | 5秒 | 中速巡航 |
| 7 | REST_2 | 1500 | 1500 | 1秒 | 间歇停顿 |
| 8 | ACCEL_HIGH | 1800 | 1500 | 3秒 | 高速加速 |
| 9 | CRUISE_HIGH | 1800 | 1500 | 5秒 | 高速巡航 |
| 10 | REST_3 | 1500 | 1500 | 1秒 | 间歇停顿 |
| 11 | TURN_LEFT_LIGHT | 1600 | 1600 | 4秒 | 轻微左转 |
| 12 | REST_4 | 1500 | 1500 | 1秒 | 间歇停顿 |
| 13 | TURN_RIGHT_LIGHT | 1600 | 1400 | 4秒 | 轻微右转 |
| 14 | REST_5 | 1500 | 1500 | 1秒 | 间歇停顿 |
| 15 | TURN_LEFT_HEAVY | 1600 | 1700 | 4秒 | 大幅左转 |
| 16 | REST_6 | 1500 | 1500 | 1秒 | 间歇停顿 |
| 17 | TURN_RIGHT_HEAVY | 1600 | 1300 | 4秒 | 大幅右转 |
| 18 | BRAKE | 1500 | 1500 | 2秒 | 制动 |
| 19 | FINISHED | 1500 | 1500 | - | 完成 |
总耗时:约 48秒
程序以20Hz频率输出数据到UART5(波特率115200),格式为ASCII字符串:
$CAL,seq,time_ms,state,throttle_pwm,steering_pwm,lat,lon,alt,hdg,pitch,roll,gx,gy,gz,ax,ay,az
seq:采样序号(从0开始)time_ms:MCU时间戳(毫秒)state:当前测试状态名称throttle_pwm:油门PWM脉宽(微秒)steering_pwm:舵机PWM脉宽(微秒)lat:纬度(度,6位小数)lon:经度(度,6位小数)alt:高程(米,2位小数)hdg:航向角(度,2位小数)pitch:俯仰角(度,2位小数)roll:横滚角(度,2位小数)gx,gy,gz:陀螺仪角速度(毫度/秒,整数)ax,ay,az:加速度计(毫g,整数)$CAL,0,1234,WARMUP,1500,1500,39.831867,116.280907,47.50,90.00,0.10,-0.05,12,-5,3,0,1,-1000
$CAL,1,1284,WARMUP,1500,1500,39.831867,116.280907,47.50,90.01,0.11,-0.06,13,-4,2,1,2,-999
...
import serial
import datetime
port = serial.Serial('COM5', 115200) # 修改为实际端口
log_file = f"calibration_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.log"
with open(log_file, 'w') as f:
while True:
line = port.readline().decode('utf-8', errors='ignore')
print(line, end='')
f.write(line)
f.flush()
if 'FINISHED' in line or 'EMERGENCY' in line:
break
保存的.log文件可用于:
1. 绘制速度-时间曲线,拟合加速度/减速度参数
2. 分析转向半径与PWM、速度的关系
3. 识别系统延迟、死区
4. 建立差速/阿克曼转向模型
5. 优化控制器增益(PID参数)
可在motion_calibration_task.c中修改以下参数:
#define CAL_PWM_LOW_THROTTLE (1600U) // 低速
#define CAL_PWM_MID_THROTTLE (1700U) // 中速
#define CAL_PWM_HIGH_THROTTLE (1800U) // 高速
#define CAL_PWM_LIGHT_TURN (1600U) // 轻转向
#define CAL_PWM_HEAVY_TURN (1700U) // 重转向
#define CAL_DURATION_WARMUP (2000U) // 预热
#define CAL_DURATION_ACCEL (3000U) // 加速
#define CAL_DURATION_CRUISE (5000U) // 巡航
#define CAL_DURATION_TURN (4000U) // 转向
#define CAL_DURATION_BRAKE (2000U) // 制动
#define CAL_DURATION_REST (1000U) // 间歇
#define CAL_TASK_PERIOD_MS (50U) // 20Hz采样
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 无法启动(CH7>1800无反应) | CH8≥1500或SBUS信号丢失 | 检查CH8位置、SBUS连接 |
| 启动后立即停止 | CH8被误触或信号干扰 | 确保CH8<1500且信号稳定 |
| 数据LOG中GPS为0 | GPS未定位 | 等待GPS定位,检查天线 |
| 车辆不动/PWM无输出 | 电机驱动器未启动 | 检查硬件、供电 |
| 采样数据不连续 | UART5缓冲区溢出 | 降低采样频率或增大缓冲区 |
Δv/Δtv²/(|ω|·v) 或轨迹拟合motion_config.hmotion_calibration_task.c/h