编辑 | blame | 历史 | 原始文档

车辆运动模型自动校准程序使用说明

功能概述

本程序实现车辆运动模型的**自动校准**,通过执行预定的测试序列(直线加速、恒速巡航、转向等),同时采集PWM控制信号、GPS位置速度、IMU惯导数据,为后续建立精确运动模型提供数据基础。

安全机制

关键安全开关:SBUS CH8
- CH8 < 1500:允许运行测试
- CH8 ≥ 1500:立即紧急停止,回中PWM

重要:测试过程中,操作员应随时准备将CH8拨到≥1500位置以紧急停止车辆。

启动方式

自动启动(推荐)

  1. 将车辆放置在**完全空旷**的场地(至少50m×50m开阔区域)
  2. 确保GPS已定位、IMU正常
  3. 将遥控器CH8拨到**< 1500**位置(安全允许)
  4. 将遥控器CH7拨到**> 1800**位置
  5. 程序自动检测到触发条件,开始测试序列

手动启动(备用)

通过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
...

数据记录建议

使用上位机Python脚本记录

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中修改以下参数:

PWM档位

#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采样

注意事项

  1. 场地要求
  • 必须是完全空旷的平坦场地
  • 避免障碍物、人员
  • GPS信号良好
  • 地面摩擦力均匀
  1. 测试前检查
  • GPS已定位(卫星数≥8)
  • IMU数据正常
  • SBUS信号稳定
  • 电池电量充足
  1. 安全操作
  • 操作员全程监控
  • 随时准备拨动CH8紧急停止
  • 首次测试建议降低PWM档位
  • 建议2-3人协同(1人操作遥控器,1人监控数据,1人现场观察)
  1. 重复测试
  • 建议每种场地条件(干/湿、平/坡)测试3次以上
  • 记录环境信息(温度、风速、地面材质)

故障排查

现象 可能原因 解决方法
无法启动(CH7>1800无反应) CH8≥1500或SBUS信号丢失 检查CH8位置、SBUS连接
启动后立即停止 CH8被误触或信号干扰 确保CH8<1500且信号稳定
数据LOG中GPS为0 GPS未定位 等待GPS定位,检查天线
车辆不动/PWM无输出 电机驱动器未启动 检查硬件、供电
采样数据不连续 UART5缓冲区溢出 降低采样频率或增大缓冲区

后续数据处理流程

  1. 数据预处理
  • 提取$CAL行
  • 按state分组
  • 时间戳对齐
  • 滤除异常值
  1. 特征提取
  • 加速度:Δv/Δt
  • 转弯半径:v²/(|ω|·v) 或轨迹拟合
  • 响应延迟:PWM变化到速度变化的时滞
  • 死区:最小有效PWM差值
  1. 模型拟合
  • 运动学模型(差速/阿克曼)
  • 动力学模型(质量、惯性、摩擦力)
  • 执行器模型(电机响应、转向比)
  1. 参数更新
  • 将拟合参数更新到motion_config.h
  • 重新编译、测试闭环控制效果

代码占用

  • Flash: ~6KB(状态机+数据采集逻辑)
  • RAM: ~1KB(任务栈+缓冲区)
  • 任务优先级:3(低于控制任务,高于空闲任务)

作者与日期

  • 文件:motion_calibration_task.c/h
  • 创建:2025-11-25
  • 版本:v1.0