本工具包含两个Python脚本,用于采集和分析车辆运动模型校准数据。
从串口实时读取MCU输出的$CAL校准数据,保存到日志文件。
# 基本用法
python tools/calibration_logger.py -p COM5
# 指定输出文件
python tools/calibration_logger.py -p COM5 -o my_calibration.log
# 指定波特率(默认115200)
python tools/calibration_logger.py -p COM5 -b 115200
| 参数 | 说明 | 默认值 |
|---|---|---|
-p, --port |
串口号(必填) | 无 |
-b, --baudrate |
波特率 | 115200 |
-o, --output |
输出文件路径 | calibration_YYYYMMDD_HHMMSS.log |
设备管理器,Linux: ls /dev/ttyUSB*)启动记录:bash python tools/calibration_logger.py -p COM5
触发校准:
$CAL数据Ctrl+C 手动停止串口: COM5
波特率: 115200
串口已打开: COM5
[0001] $CAL,0,1234,WARMUP,1500,1500,39.831867,116.280907,47.50,90.00,0.10,-0.05,12,-5,3,0,1,-1000
[0002] $CAL,1,1284,WARMUP,1500,1500,39.831867,116.280907,47.50,90.01,0.11,-0.06,13,-4,2,1,2,-999
...
[0960] $CAL,959,49234,FINISHED,1500,1500,39.832145,116.281234,47.52,135.23,0.15,-0.08,2,-1,1,0,0,-998
=============================================================
=============================================================
记录完成
总行数: 1024
$CAL数据行数: 960
下一步:
python tools/calibration_analyzer.py calibration_20251126_143000.log
```
解析校准日志文件,提取运动模型参数,生成可视化图表和JSON配置文件。
pip install numpy scipy matplotlib
# 基本用法
python tools/calibration_analyzer.py calibration_20251126_143000.log
# 指定输出目录
python tools/calibration_analyzer.py calibration_20251126_143000.log -o results
| 参数 | 说明 | 默认值 |
|---|---|---|
log_file |
校准日志文件路径(必填) | 无 |
-o, --output |
输出目录 | calibration_results |
分析工具会在输出目录中生成以下文件:
文件名: calibration_parameters.json
包含完整的运动模型参数和推荐配置:
{
"metadata": {
"log_file": "calibration_20251126_143000.log",
"total_samples": 960,
"duration_seconds": 48.0,
"origin": {
"latitude": 39.831867,
"longitude": 116.280907,
"altitude": 47.50
},
"states": {
"WARMUP": 40,
"ACCEL_LOW": 60,
"CRUISE_LOW": 100,
...
}
},
"differential_drive_model": {
"forward_model": {
"pwm_to_velocity": {
"model": "linear",
"k": 0.012345,
"bias": 0.001,
"formula": "v = 0.012345 * (pwm - 1500) + 0.001"
},
"acceleration": {
"ACCEL_LOW": 0.523,
"ACCEL_MID": 0.687,
"ACCEL_HIGH": 0.845
},
"deceleration": -1.234
},
"steering_model": {
"pwm_to_yaw_rate": {
"model": "linear",
"k": 0.00234567,
"formula": "ω = 0.00234567 * (steering_pwm - 1500)"
}
},
"delays": {
"throttle_response_delay_ms": 150
}
},
"recommended_config": {
"MC_CFG_FORWARD_K": 0.012345,
"MC_CFG_FORWARD_BIAS": 0.001,
"MC_CFG_STEERING_K": 0.00234567,
"MC_CFG_MAX_ACCELERATION": 0.845,
"MC_CFG_MAX_DECELERATION": 1.234,
"MC_CFG_RESPONSE_DELAY_MS": 150
}
}
velocity_time.png - 速度与油门PWM随时间变化
- 蓝色实线:车辆速度 (m/s)
- 红色虚线:油门PWM
- 灰色区域:不同测试状态
trajectory.png - 车辆运动轨迹(ENU坐标)
- 不同颜色代表不同测试状态
- 显示车辆实际行驶路径
pwm_relationships.png - PWM关系图
- 左图:油门PWM与速度关系
- 右图:舵机PWM偏移与角速度关系
acceleration.png - 加速/制动特性
- 不同PWM档位的加速度曲线
- 制动减速度曲线
解析日志文件: calibration_20251126_143000.log
成功解析 960 条数据点
ENU原点: lat=39.831867, lon=116.280907, alt=47.50
计算ENU坐标和速度...
数据分组完成,共 19 个状态
WARMUP: 40 个点
ACCEL_LOW: 60 个点
CRUISE_LOW: 100 个点
...
=== 分析前向运动模型 ===
CRUISE_LOW: PWM=1600, 速度=1.23 m/s
CRUISE_MID: PWM=1700, 速度=2.45 m/s
CRUISE_HIGH: PWM=1800, 速度=3.67 m/s
PWM-速度模型: v = 0.012345 * (pwm - 1500) + 0.001
ACCEL_LOW: 加速度 = 0.523 m/s²
ACCEL_MID: 加速度 = 0.687 m/s²
ACCEL_HIGH: 加速度 = 0.845 m/s²
制动减速度: -1.234 m/s²
=== 分析转向模型 ===
TURN_LEFT_LIGHT: 舵机PWM=1600 (+100), 角速度=0.235 rad/s, 速度=1.23 m/s, 转向半径=5.23 m
TURN_RIGHT_LIGHT: 舵机PWM=1400 (-100), 角速度=-0.234 rad/s, 速度=1.22 m/s, 转向半径=5.21 m
TURN_LEFT_HEAVY: 舵机PWM=1700 (+200), 角速度=0.469 rad/s, 速度=1.24 m/s, 转向半径=2.64 m
TURN_RIGHT_HEAVY: 舵机PWM=1300 (-200), 角速度=-0.470 rad/s, 速度=1.23 m/s, 转向半径=2.62 m
转向模型: ω = 0.00234567 * (steering_pwm - 1500)
=== 分析响应延迟 ===
油门响应延迟: 150 ms
=== 生成可视化图表 ===
保存: calibration_results\velocity_time.png
保存: calibration_results\trajectory.png
保存: calibration_results\pwm_relationships.png
保存: calibration_results\acceleration.png
=== 生成JSON参数报告 ===
JSON报告已保存: calibration_results\calibration_parameters.json
============================================================
============================================================
分析完成!
---
## 完整工作流程
### 步骤1:准备工作
pip install pyserial numpy scipy matplotlib
### 步骤2:现场测试
python tools/calibration_logger.py -p COM5
### 步骤3:离线分析
python tools/calibration_analyzer.py calibration_20251126_143000.log
### 步骤4:应用参数
1. 打开生成的 `calibration_parameters.json`
2. 复制 `recommended_config` 中的参数
3. 粘贴到 `STM32H743/FML/motion_config.h`
4. 根据需要调整PID增益等控制参数
5. 重新编译、烧录固件
6. 测试闭环控制效果
---
## 故障排查
### 记录工具问题
| 问题 | 可能原因 | 解决方法 |
|------|----------|----------|
| 无法打开串口 | 串口号错误或被占用 | 检查串口号,关闭其他串口程序 |
| 无数据输出 | MCU未启动校准 | 检查CH7/CH8位置,查看MCU调试信息 |
| 数据乱码 | 波特率不匹配 | 确认波特率为115200 |
### 分析工具问题
| 问题 | 可能原因 | 解决方法 |
|------|----------|----------|
| 未找到$CAL数据 | 日志文件为空或格式错误 | 检查日志文件内容 |
| 拟合失败 | 数据点太少或质量差 | 重新测试,确保GPS定位良好 |
| 图表异常 | GPS/IMU数据跳变 | 过滤异常数据,重新测试 |
---
## 数据质量检查
好的校准数据应满足:
1. **采样数量充足**:
- 总样本数 > 800(20Hz × 40秒以上)
- 每个状态至少20个点
2. **GPS信号良好**:
- 定位质量 ≥ 4(固定解)
- 卫星数 ≥ 8
- 位置无跳变
3. **速度数据合理**:
- 巡航速度稳定(方差 < 0.1 m/s)
- 加速度连续(无突变)
- 转向角速度平滑
4. **环境条件记录**:
- 地面材质(水泥/草地/土地)
- 天气(干燥/潮湿)
- 坡度(平地/上坡/下坡)
---
## 高级用法
### 批量分析多次测试
python tools/calibration_logger.py -p COM5 -o test1.log
python tools/calibration_logger.py -p COM5 -o test2.log
python tools/calibration_logger.py -p COM5 -o test3.log
python tools/calibration_analyzer.py test1.log -o results1
python tools/calibration_analyzer.py test2.log -o results2
python tools/calibration_analyzer.py test3.log -o results3
```
可以直接修改 calibration_analyzer.py,添加自定义分析逻辑:
- 非线性模型拟合
- 滤波算法
- 统计分析
- 自定义可视化
STM32H743/APL/运动模型校准使用说明.md