yincheng.zhong
2 天以前 567085ead3f6adaabd884f16ab4b17c62e8f0403
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/usr/bin/env python3
"""基于可信数据段提取参数"""
import numpy as np
 
# 手动提取的可信数据点(前进测试,GPS正常)
pwm_speed_pairs = [
    (1400, 0.065),  # FWD_VLOW_C: 0.32m/5.0s
    (1300, 0.298),  # FWD_LOW_C: 1.48m/5.0s
    (1100, 0.493),  # FWD_HIGH_C: 2.44m/5.0s (跳过1200和1050因为有GPS跳变)
]
 
print("========== 基于可信数据的线性拟合 ==========\n")
print("使用数据点:")
for pwm, v in pwm_speed_pairs:
    print(f"  PWM {pwm}: {v:.3f} m/s")
 
# 线性拟合:v = k × (1500 - pwm) + bias
pwms = np.array([p[0] for p in pwm_speed_pairs])
speeds = np.array([p[1] for p in pwm_speed_pairs])
 
x = 1500 - pwms
y = speeds
 
coef = np.polyfit(x, y, 1)
k = coef[0]
bias = coef[1]
 
print(f"\n========== 拟合结果 ==========")
print(f"模型:v = {k:.6f} × (1500 - pwm) + ({bias:.6f})")
print(f"\n验证:")
for pwm, v_measured in pwm_speed_pairs:
    v_pred = k * (1500 - pwm) + bias
    print(f"  PWM {pwm}: 实测 {v_measured:.3f} m/s, 预测 {v_pred:.3f} m/s, 误差 {abs(v_measured-v_pred):.3f} m/s")
 
# 预测极限
v_1000 = k * (1500 - 1000) + bias
v_1500 = bias
 
print(f"\n========== 预测 ==========")
print(f"PWM 1500 (停止): {v_1500:.3f} m/s (应接近0)")
print(f"PWM 1000 (最大前进): {v_1000:.3f} m/s")
 
print(f"\n========== 推荐的C代码参数 ==========")
print(f"#define MC_CFG_FORWARD_K         ({k:.6f}f)")
print(f"#define MC_CFG_FORWARD_BIAS      ({bias:.6f}f)")
print(f"#define MC_CFG_MAX_FORWARD_MPS   ({v_1000:.3f}f)")
 
# 转向数据(从之前的分析结果手动提取,只用前期可信数据)
print(f"\n\n========== 转向参数(基于部分数据)==========")
print("由于后期GPS失锁,转向数据不完整")
print("建议先用保守值:")
print("#define MC_CFG_STEERING_K_LEFT   (0.00010f)  // 待更精确校准")
print("#define MC_CFG_STEERING_K_RIGHT  (0.00010f)  // 待更精确校准")
print("#define MC_CFG_STEERING_TRIM     (10)        // 向右补偿10PWM")