"""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")
|