From d5a47881acd6ce27b3455bf9746c1bae7c7984fe Mon Sep 17 00:00:00 2001 From: robin Date: Wed, 19 Aug 2026 15:30:16 +0900 Subject: [PATCH] Fix RC steering sign inversion and throttle/steer slew-filter livelock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Steering (CH1): omega was computed with the opposite sign from the convention used everywhere else in this file (+omega=left, -omega=right, per the LiDAR avoidance comments and the prior Xbox joystick code), so pushing the stick left steered the robot right and vice versa. Flipped the sign at the single point omega is derived from the stick so curve-turn and spin-turn both inherit the fix. Throttle/steer anti-corruption filter: once a reading was rejected for exceeding max_slew_per_tick, last_raw_throttle/last_raw_steer never updated, so every subsequent real reading kept failing the same slew check against that now-permanently-stale reference — a livelock. Symptom: CH2 showing neutral (1500) on the HUD while the robot kept driving forward regardless of stick input. Added a max_reject_streak escape hatch: after a few consecutive rejections in a row, treat it as a real fast stick movement rather than a one-off corrupted frame and resync to the latest value. Verified working on hardware. Co-Authored-By: Claude Sonnet 5 --- xbox_motor_control.cpp | 77 +++++++++++++++++++++++++++++------------ xbox_motor_control_cpp | Bin 91368 -> 91368 bytes 2 files changed, 55 insertions(+), 22 deletions(-) diff --git a/xbox_motor_control.cpp b/xbox_motor_control.cpp index 057584f..4af3b35 100644 --- a/xbox_motor_control.cpp +++ b/xbox_motor_control.cpp @@ -652,6 +652,13 @@ struct RcConfig { // 손상된 프레임으로 간주해 버린다. CH5/CH6(스위치)는 원래 한 번에 크게 // 뛰는 게 정상이라 이 제한을 적용하지 않는다. int max_slew_per_tick = 200; + // 슬루레이트 거부가 연속으로 이 틱 수 이상 이어지면(=한 번의 손상 + // 프레임이 아니라 실제로 스틱이 그만큼 빠르게/멀리 움직인 상황으로 + // 판단) 그냥 최신값을 그대로 받아들여 재동기화한다. 이 escape hatch가 + // 없으면 range는 정상인데 slew만 거부된 값 하나가 last_raw_*를 그 + // 자리에 영원히 고정시켜버려서, 이후 들어오는 진짜 값들도 그 고정된 + // 기준과 계속 200 이상 차이나 버려 채널이 그 값에 영구히 멈춰버린다. + int max_reject_streak = 3; float v_max_low = 0.3f; // m/s (CH6 저속 모드) float v_max_high = 1.5f; // m/s (CH6 고속 모드) @@ -1068,6 +1075,8 @@ int main(int argc, char **argv) { rc_cfg.speed_threshold = std::stoi(argv[++i]); else if (arg == "--rc_max_slew" && i + 1 < argc) rc_cfg.max_slew_per_tick = std::stoi(argv[++i]); + else if (arg == "--rc_max_reject_streak" && i + 1 < argc) + rc_cfg.max_reject_streak = std::stoi(argv[++i]); else if (arg == "--rc_vmax_low" && i + 1 < argc) rc_cfg.v_max_low = std::stof(argv[++i]); else if (arg == "--rc_vmax_high" && i + 1 < argc) @@ -1309,11 +1318,16 @@ int main(int argc, char **argv) { // 물리적 타당성 검사로 걸러낸다: // 1) 캘리브레이션 범위(steer_min~max, throttle_min~max) 밖의 값 거부 // 2) 슬루레이트: 한 틱(~10ms) 사이에 사람이 스틱으로 낼 수 없을 만큼 - // 크게 튀는 값 거부 (예: 1227 -> 1800 같은 순간 점프) - // 두 경우 모두 그 틱은 버리고 마지막으로 유효했던 값을 그대로 사용한다. + // 크게 튀는 값 거부 (예: 1227 -> 1800 같은 순간 점프). 단, max_reject_streak + // 틱 연속으로 거부되면(=한 번의 손상 프레임이 아니라 실제 상황) 강제 + // 수락해 재동기화한다 — 그렇지 않으면 last_raw_*가 그 자리에 영구히 + // 고정되어, 이후 들어오는 진짜 값들도 계속 그 고정된 기준과 크게 + // 차이나 버려 채널이 응답 없이 멈춰버린다. + // 범위 밖 값은 항상 거부, 그 틱은 마지막으로 유효했던 값을 그대로 사용한다. int last_raw_steer = rc_cfg.steer_center_lo; int last_raw_throttle = 1500; bool steer_initialized = false, throttle_initialized = false; + int steer_reject_streak = 0, throttle_reject_streak = 0; while (g_running) { // --------------------------------------------------------------------- @@ -1329,26 +1343,41 @@ int main(int argc, char **argv) { bool steer_range_ok = raw_steer >= rc_cfg.steer_min && raw_steer <= rc_cfg.steer_max; - bool steer_slew_ok = !steer_initialized || - std::abs(raw_steer - last_raw_steer) <= - rc_cfg.max_slew_per_tick; - if (steer_range_ok && steer_slew_ok) { - last_raw_steer = raw_steer; - steer_initialized = true; + if (!steer_range_ok) { + raw_steer = last_raw_steer; // 캘리브레이션 범위 밖 -> 항상 거부 } else { - raw_steer = last_raw_steer; // 범위 밖 또는 비정상 점프 -> 손상된 프레임으로 간주 + bool steer_slew_ok = !steer_initialized || + std::abs(raw_steer - last_raw_steer) <= + rc_cfg.max_slew_per_tick; + // slew 거부가 max_reject_streak틱 연속되면 진짜 빠른 스틱 조작으로 + // 보고 강제로 재동기화한다 (아래 주석 참고: 그렇지 않으면 last_raw_*가 + // 영구히 고정되어 채널이 멈춰버림). + if (steer_slew_ok || steer_reject_streak >= rc_cfg.max_reject_streak) { + last_raw_steer = raw_steer; + steer_initialized = true; + steer_reject_streak = 0; + } else { + raw_steer = last_raw_steer; + ++steer_reject_streak; + } } bool throttle_range_ok = raw_throttle >= rc_cfg.throttle_min && raw_throttle <= rc_cfg.throttle_max; - bool throttle_slew_ok = !throttle_initialized || - std::abs(raw_throttle - last_raw_throttle) <= - rc_cfg.max_slew_per_tick; - if (throttle_range_ok && throttle_slew_ok) { - last_raw_throttle = raw_throttle; - throttle_initialized = true; - } else { + if (!throttle_range_ok) { raw_throttle = last_raw_throttle; + } else { + bool throttle_slew_ok = !throttle_initialized || + std::abs(raw_throttle - last_raw_throttle) <= + rc_cfg.max_slew_per_tick; + if (throttle_slew_ok || throttle_reject_streak >= rc_cfg.max_reject_streak) { + last_raw_throttle = raw_throttle; + throttle_initialized = true; + throttle_reject_streak = 0; + } else { + raw_throttle = last_raw_throttle; + ++throttle_reject_streak; + } } // CH1~CH8 raw 값 전체를 확인용으로 읽는다 (CH5=브레이크 값을 실시간으로 @@ -1392,18 +1421,22 @@ int main(int argc, char **argv) { v_max_now; } - // 3.4 좌우 조향 각속도 계산 (CH1) + // 3.4 좌우 조향 각속도 계산 (CH1). omega 부호 규약(코드 전역 공통, + // 자동회피 로직의 "+omega=좌회전/-omega=우회전" 주석과 일치): 스틱을 + // 왼쪽(raw 낮음)으로 밀면 +omega(좌회전), 오른쪽(raw 높음)이면 + // -omega(우회전)여야 한다. 예전엔 부호가 반대로 들어가 있어서 스틱 + // 방향과 실제 회전 방향이 뒤바뀌어 있었다. int s = std::clamp(raw_steer, rc_cfg.steer_min, rc_cfg.steer_max); if (s >= rc_cfg.steer_center_lo && s <= rc_cfg.steer_center_hi) { omega = 0.0f; } else if (s < rc_cfg.steer_center_lo) { - omega = -(static_cast(rc_cfg.steer_center_lo - s) / - static_cast(rc_cfg.steer_center_lo - rc_cfg.steer_min)) * + omega = (static_cast(rc_cfg.steer_center_lo - s) / + static_cast(rc_cfg.steer_center_lo - rc_cfg.steer_min)) * omega_max; } else { - omega = (static_cast(s - rc_cfg.steer_center_hi) / - static_cast(rc_cfg.steer_max - rc_cfg.steer_center_hi)) * - omega_max; + omega = -(static_cast(s - rc_cfg.steer_center_hi) / + static_cast(rc_cfg.steer_max - rc_cfg.steer_center_hi)) * + omega_max; } } diff --git a/xbox_motor_control_cpp b/xbox_motor_control_cpp index aa2fe86240eb7ea0cdc9825844cc5b46b2969b4f..1d5e7e7b928bb898a714d5ef892e58d751fa0b5d 100755 GIT binary patch delta 26915 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 G_5TMD$x`M3 delta 26706 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