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

车辆运动模型自动校准系统

完整的运动模型校准解决方案,包含MCU自动测试程序和Python数据分析工具。

系统组成

1. MCU端(STM32H7)

核心文件
- STM32H743/APL/motion_calibration_task.c/h - 自动校准任务
- STM32H743/APL/运动模型校准使用说明.md - MCU端使用说明

功能特性
- ✅ 自动化测试序列(48秒完成)
- ✅ 多档位直线加速/巡航测试
- ✅ 多强度转向测试
- ✅ 制动响应测试
- ✅ 20Hz高频数据采集
- ✅ SBUS CH8安全保护(<1500运行,≥1500紧急停止)
- ✅ CH7自动触发(>1800启动)

测试序列
| 状态 | PWM | 时长 | 说明 |
|------|-----|------|------|
| WARMUP | 1500/1500 | 2s | 预热 |
| ACCEL_LOW | 1600/1500 | 3s | 低速加速 |
| CRUISE_LOW | 1600/1500 | 5s | 低速巡航 |
| ACCEL_MID | 1700/1500 | 3s | 中速加速 |
| CRUISE_MID | 1700/1500 | 5s | 中速巡航 |
| ACCEL_HIGH | 1800/1500 | 3s | 高速加速 |
| CRUISE_HIGH | 1800/1500 | 5s | 高速巡航 |
| TURN_LEFT_LIGHT | 1600/1600 | 4s | 轻左转 |
| TURN_RIGHT_LIGHT | 1600/1400 | 4s | 轻右转 |
| TURN_LEFT_HEAVY | 1600/1700 | 4s | 重左转 |
| TURN_RIGHT_HEAVY | 1600/1300 | 4s | 重右转 |
| BRAKE | 1500/1500 | 2s | 制动 |

2. Python工具链

核心文件
- python/tools/calibration_logger.py - 数据记录工具
- python/tools/calibration_analyzer.py - 数据分析工具
- python/tools/校准工具使用说明.md - Python工具使用说明

功能特性
- ✅ 实时串口数据记录
- ✅ 自动检测测试结束
- ✅ GPS/IMU数据解析
- ✅ ENU坐标转换
- ✅ 差速运动模型拟合
- ✅ 多维度可视化(速度曲线、轨迹图、PWM关系图等)
- ✅ JSON格式参数输出
- ✅ 推荐配置自动生成

快速开始

准备工作

  1. 安装Python依赖
    bash pip install pyserial numpy scipy matplotlib

  2. 编译烧录固件

  • 项目已集成校准任务,直接编译即可
  • 烧录到STM32H7
  1. 硬件准备
  • 将车辆放置在空旷场地(至少50m×50m)
  • 连接UART5到电脑(USB转串口)
  • 确认串口号(Windows: 设备管理器,Linux: ls /dev/ttyUSB*

步骤1:采集数据

# 启动数据记录
python python/tools/calibration_logger.py -p COM5

# 触发校准(在车辆上)
# 1. CH8拨到 < 1500
# 2. CH7拨到 > 1800
# 3. MCU自动执行48秒测试序列
# 4. 全程监控,必要时CH8≥1500紧急停止

# 记录完成后会生成:calibration_YYYYMMDD_HHMMSS.log

步骤2:分析数据

# 分析日志文件
python python/tools/calibration_analyzer.py calibration_20251126_143000.log

# 查看输出目录:calibration_results/
# - calibration_parameters.json  (JSON参数文件)
# - velocity_time.png             (速度-时间曲线)
# - trajectory.png                (运动轨迹图)
# - pwm_relationships.png         (PWM关系图)
# - acceleration.png              (加速度特性)

步骤3:应用参数

  1. 打开生成的 calibration_parameters.json
  2. 复制 recommended_config 中的参数
  3. 更新到 STM32H743/FML/motion_config.h
  4. 重新编译、烧录、测试

示例配置
c #define MC_CFG_FORWARD_K (0.13767502f) #define MC_CFG_FORWARD_BIAS (-0.23053784f) #define MC_CFG_STEERING_K (0.00698132f) #define MC_CFG_MAX_ACCELERATION (1.00000000f) #define MC_CFG_RESPONSE_DELAY_MS (50)

数据格式

MCU输出(UART5, 115200)

$CAL,seq,time_ms,state,throttle_pwm,steering_pwm,lat,lon,alt,hdg,pitch,roll,gx,gy,gz,ax,ay,az

示例
$CAL,0,1000,WARMUP,1500,1500,39.831867,116.280907,47.50,90.00,0.10,-0.05,12,-5,3,0,1,-1000 $CAL,1,1050,WARMUP,1500,1500,39.831867,116.280907,47.50,90.01,0.11,-0.06,13,-4,2,1,2,-999

JSON参数文件

{
  "metadata": { ... },
  "differential_drive_model": {
    "forward_model": {
      "pwm_to_velocity": {
        "k": 0.137675,
        "bias": -0.230538,
        "formula": "v = 0.137675 * (pwm - 1500) + -0.230538"
      },
      "acceleration": { ... }
    },
    "steering_model": {
      "pwm_to_yaw_rate": {
        "k": 0.00698132,
        "formula": "ω = 0.00698132 * (steering_pwm - 1500)"
      }
    },
    "delays": {
      "throttle_response_delay_ms": 50.0
    }
  },
  "recommended_config": { ... }
}

可视化输出

1. velocity_time.png

  • 速度-时间曲线(蓝色实线)
  • 油门PWM(红色虚线)
  • 状态标注(灰色背景区域)

2. trajectory.png

  • 车辆ENU轨迹
  • 不同状态用不同颜色表示
  • 轴等比例显示

3. pwm_relationships.png

  • 左图:油门PWM vs 速度
  • 右图:舵机PWM偏移 vs 角速度

4. acceleration.png

  • 不同PWM档位的加速度曲线
  • 制动减速度曲线

运动模型

差速驱动(Differential Drive)

前向模型
v = k_forward * (throttle_pwm - 1500) + bias

转向模型
ω = k_steering * (steering_pwm - 1500)

参数意义
- k_forward: PWM到速度的增益 (m/s per PWM)
- bias: 速度偏置(补偿死区)
- k_steering: PWM到角速度的增益 (rad/s per PWM)

数据质量要求

良好数据
- 总样本数 > 800
- GPS定位质量 ≥ 4(固定解)
- 卫星数 ≥ 8
- 巡航速度方差 < 0.1 m/s

需重新测试
- GPS跳点
- 速度突变
- 转向角速度异常

重复测试建议

建议在不同条件下测试3次以上:
- 不同地面材质(水泥/草地/土地)
- 不同天气(干燥/潮湿)
- 不同坡度(平地/上坡/下坡)
- 不同负载(空载/满载)

记录每次测试的环境信息,取平均参数。

故障排查

问题 原因 解决方法
无法启动校准 CH8≥1500或CH7<1800 检查遥控器通道位置
数据记录中断 SBUS信号丢失 检查接收器连接
分析工具报错 日志文件格式错误 确认$CAL行完整
拟合结果异常 GPS数据质量差 在GPS信号好的场地重测

文件结构

Lawnmower_STM32H7/
├── STM32H743/
│   └── APL/
│       ├── motion_calibration_task.c/h      # MCU校准任务
│       └── 运动模型校准使用说明.md          # MCU使用说明
├── python/
│   └── tools/
│       ├── calibration_logger.py            # 数据记录工具
│       ├── calibration_analyzer.py          # 数据分析工具
│       ├── 校准工具使用说明.md              # Python工具说明
│       └── test_calibration_data.log        # 测试数据示例
└── README_运动模型校准.md                   # 本文件

进阶用法

自定义PWM档位

编辑 motion_calibration_task.c
c #define CAL_PWM_LOW_THROTTLE (1600U) #define CAL_PWM_MID_THROTTLE (1700U) #define CAL_PWM_HIGH_THROTTLE (1800U)

调整测试时长

#define CAL_DURATION_ACCEL          (3000U)  // 毫秒
#define CAL_DURATION_CRUISE         (5000U)

修改采样频率

#define CAL_TASK_PERIOD_MS          (50U)    // 50ms = 20Hz

批量分析

for log in calibration_*.log; do
  python python/tools/calibration_analyzer.py "$log" -o "results_$(basename $log .log)"
done

技术支持

  • MCU程序占用:Flash ~6KB, RAM ~1KB
  • Python依赖:numpy, scipy, matplotlib
  • 推荐Python版本:3.8+

更新日志

v1.0 (2025-11-26)
- 初始版本
- 完整的MCU自动校准任务
- Python数据记录与分析工具
- 差速运动模型拟合
- 多维度可视化

作者

创建日期:2025-11-26