yincheng.zhong
3 天以前 26db5e14522173c274ac954c867d2ebe5d8ca3ac
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
"""Debug desired_heading calculation"""
from math import atan2, pi
 
def wrap_angle(a):
    while a > pi:
        a -= 2 * pi
    while a < -pi:
        a += 2 * pi
    return a
 
# From log at t=10s
x, y = -0.282, -0.638
heading = -0.470
tx, ty = 0.000, 0.000
xte = 0.573
heading_err_log = -0.095
 
# Calculate path_heading
path_heading = atan2(ty - y, tx - x)
print(f"path_heading = atan2({ty} - {y}, {tx} - {x}) = atan2({ty-y:.3f}, {tx-x:.3f}) = {path_heading:.3f}")
 
# Calculate xte_correction
k_xte = 1.2
max_xte = 1.0
xte_gain_scale = 1.0
xte_normalized = max(-1.0, min(1.0, xte / max_xte))
xte_correction = -k_xte * xte_normalized * xte_gain_scale
print(f"xte_correction = -k_xte * xte_normalized * xte_gain_scale")
print(f"               = -{k_xte} * {xte_normalized:.3f} * {xte_gain_scale}")
print(f"               = {xte_correction:.3f}")
 
# Calculate desired_heading
desired_heading_raw = path_heading + xte_correction
desired_heading = wrap_angle(desired_heading_raw)
print(f"desired_heading = wrap_angle({path_heading:.3f} + {xte_correction:.3f})")
print(f"                = wrap_angle({desired_heading_raw:.3f})")
print(f"                = {desired_heading:.3f}")
 
# Calculate heading_err
heading_err_calc = wrap_angle(desired_heading - heading)
print(f"\nheading_err = wrap_angle({desired_heading:.3f} - {heading:.3f})")
print(f"            = wrap_angle({desired_heading - heading:.3f})")
print(f"            = {heading_err_calc:.3f}")
 
print(f"\n heading_err from log: {heading_err_log:.3f}")
print(f"heading_err calculated: {heading_err_calc:.3f}")
print(f"           Difference: {abs(heading_err_log - heading_err_calc):.3f}")
 
if abs(heading_err_log - heading_err_calc) > 0.1:
    print("\n⚠️ WARNING: Significant difference detected!")
    print("Either:")
    print("1. xte_correction is not being applied")
    print("2. Different target point is being used")
    print("3. Log data is from a different code path")