#!/usr/bin/env python3
|
"""分析每个前进档位的实际速度"""
|
import math
|
|
log_file = "python/tools/calibration_20251204_171502.log"
|
|
# 解析所有$CAL数据
|
data_points = []
|
with open(log_file, 'r', encoding='utf-8', errors='ignore') as f:
|
for line in f:
|
if line.startswith('$CAL'):
|
parts = line.strip().split(',')
|
if len(parts) >= 12:
|
data_points.append({
|
'seq': int(parts[1]),
|
'time_ms': int(parts[2]),
|
'state': parts[3],
|
'throttle': int(parts[4]),
|
'steering': int(parts[5]),
|
'x': float(parts[6]),
|
'y': float(parts[7])
|
})
|
|
print("=" * 80)
|
print("前进测试各档位平均速度分析")
|
print("=" * 80)
|
|
# 定义需要分析的cruise状态
|
cruise_states = [
|
'FWD_VLOW_C',
|
'FWD_LOW_C',
|
'FWD_MID_C',
|
'FWD_HIGH_C',
|
'FWD_VHIGH_C',
|
'FWD_MAX_C'
|
]
|
|
for state in cruise_states:
|
# 提取该状态的所有数据点
|
state_data = [d for d in data_points if d['state'] == state]
|
|
if len(state_data) < 2:
|
print(f"\n{state:15s}: 数据不足")
|
continue
|
|
# 获取起止点
|
start = state_data[0]
|
end = state_data[-1]
|
|
# 计算总距离
|
dx = end['x'] - start['x']
|
dy = end['y'] - start['y']
|
distance = math.sqrt(dx*dx + dy*dy)
|
|
# 计算总时间
|
time_s = (end['time_ms'] - start['time_ms']) / 1000.0
|
|
# 计算平均速度
|
avg_speed = distance / time_s if time_s > 0 else 0
|
|
# 获取PWM值(应该是恒定的)
|
pwm = start['throttle']
|
|
# 检查是否有GPS跳变
|
max_jump = 0
|
for i in range(1, len(state_data)):
|
dx_step = state_data[i]['x'] - state_data[i-1]['x']
|
dy_step = state_data[i]['y'] - state_data[i-1]['y']
|
jump = math.sqrt(dx_step*dx_step + dy_step*dy_step)
|
if jump > max_jump:
|
max_jump = jump
|
|
# 标记数据质量
|
quality = "✓" if max_jump < 1.0 else "⚠ GPS跳变"
|
|
print(f"\n{state:15s} (PWM={pwm}):")
|
print(f" 起点: ({start['x']:6.2f}, {start['y']:6.2f}) m")
|
print(f" 终点: ({end['x']:6.2f}, {end['y']:6.2f}) m")
|
print(f" 总距离: {distance:6.2f} m")
|
print(f" 总时间: {time_s:5.1f} s")
|
print(f" 平均速度: {avg_speed:5.3f} m/s {quality}")
|
print(f" 最大单步跳变: {max_jump:5.2f} m")
|
|
print("\n" + "=" * 80)
|
print("数据汇总(仅可信数据)")
|
print("=" * 80)
|
print(f"{'PWM':>6s} {'状态':>15s} {'速度(m/s)':>10s} {'质量':>8s}")
|
print("-" * 80)
|
|
for state in cruise_states:
|
state_data = [d for d in data_points if d['state'] == state]
|
if len(state_data) < 2:
|
continue
|
|
start = state_data[0]
|
end = state_data[-1]
|
|
dx = end['x'] - start['x']
|
dy = end['y'] - start['y']
|
distance = math.sqrt(dx*dx + dy*dy)
|
time_s = (end['time_ms'] - start['time_ms']) / 1000.0
|
avg_speed = distance / time_s if time_s > 0 else 0
|
pwm = start['throttle']
|
|
# 检查最大跳变
|
max_jump = 0
|
for i in range(1, len(state_data)):
|
dx_step = state_data[i]['x'] - state_data[i-1]['x']
|
dy_step = state_data[i]['y'] - state_data[i-1]['y']
|
jump = math.sqrt(dx_step*dx_step + dy_step*dy_step)
|
if jump > max_jump:
|
max_jump = jump
|
|
quality = "可信" if max_jump < 1.0 else "跳变"
|
marker = " ✓" if max_jump < 1.0 else " ✗"
|
|
print(f"{pwm:6d} {state:>15s} {avg_speed:10.3f} {quality:>8s}{marker}")
|
|
print("=" * 80)
|