From bb5a205df1c84718679ab65942b21d6fa14bf308 Mon Sep 17 00:00:00 2001 From: robin Date: Thu, 13 Aug 2026 10:54:52 +0900 Subject: [PATCH] Fix curve-steering wheel-reversal at partial throttle Steering angular velocity (omega) was scaled by the constant max speed (max_v) instead of the actual current forward speed (v_x). This decoupled turn tightness from throttle position: at low/medium throttle, a moderate left-stick steering input already produced an omega large enough to flip the inner wheel's commanded velocity negative, causing the robot to spin/reverse/lurch forward instead of smoothly curving. Scaling by abs(v_x) keeps turn radius proportional to speed as intended, matching prior full-throttle behavior while fixing the reversal at partial throttle. Also commits the ARM binary rebuilt on-device with this fix, per the build-on-target convention for this branch. Co-Authored-By: Claude Sonnet 5 --- xbox_motor_control.cpp | 9 ++++++++- xbox_motor_control_cpp | Bin 0 -> 61936 bytes 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100755 xbox_motor_control_cpp diff --git a/xbox_motor_control.cpp b/xbox_motor_control.cpp index 6324a94..49b60f9 100644 --- a/xbox_motor_control.cpp +++ b/xbox_motor_control.cpp @@ -1078,7 +1078,14 @@ int main(int argc, char **argv) { target_rl = v_l * rpm_per_ms; target_rr = -v_r * rpm_per_ms; } else { - omega += -lx * (max_v / (effective_w / 2.0f)); + // 선회 강도(omega)는 반드시 "현재 전진 속도(v_x)"에 비례해야 커브 + // 반경이 스로틀과 무관하게 일정하게 유지된다. 이전 구현은 상수인 + // max_v(최고속도)를 기준으로 omega를 계산해서, 저속 주행 중에는 + // v_x가 작은데도 omega*k_skid 항은 고속 기준 그대로 커서 안쪽 + // 바퀴(v_l 또는 v_r) 속도 부호가 뒤집혀 후진해버리는 문제가 있었다. + // (예: 저속으로 스틱을 왼쪽으로 조금만 꺾어도 로봇이 제자리 회전 + // 하듯 튀거나 뒤로 갔다 앞으로 갔다 하는 증상) + omega += -lx * (std::abs(v_x) / (effective_w / 2.0f)); float v_l = v_x - omega * k_skid; float v_r = v_x + omega * k_skid; diff --git a/xbox_motor_control_cpp b/xbox_motor_control_cpp new file mode 100755 index 0000000000000000000000000000000000000000..de5878fa7a10d9611b69b64705b64dc947548d24 GIT binary patch literal 61936 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