Files
fori_zltech_motor_test/doc/joystick.md
T
robin bb5a0adc0c Replace Xbox joystick control with RadioMaster Pocket + XR1 RC receiver
Migrates the 4WD control input from SDL2/Xbox gamepad to a serial RC
receiver per doc/joystick.md's functional spec: CH1 steering, CH2
throttle, CH5 emergency brake (highest priority), CH7 speed mode
(0.3/0.6 m/s), with a 200ms fail-safe that forces an immediate stop
on signal loss. Channel mapping, deadzones, port, and baudrate are
all configurable via --rc_* CLI flags. LiDAR avoidance, jerk-limited
motion profile, and wheel-fault detection are unchanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 12:44:51 +09:00

3.7 KiB

[기능 명세서] RadioMaster Pocket & XR1 V1.0 기반 조종 제어 전환

1. 프로젝트 개요

  • 목적: 기존 Xbox 게임패드 기반의 원격 제어 모듈을 RadioMaster Pocket RC 조종기XR1 V1.0 수신기(USB-to-TTL 시리얼 통신) 기반으로 교체/마이그레이션.
  • 통신 환경:
    • 하드웨어: USB to TTL 컨버터 (/dev/ttyUSB* 또는 COM 포트)
    • 수신기: XR1 V1.0
    • 조종기: RadioMaster Pocket

2. 하드웨어 및 채널 매핑 사양

2.1 채널별 입력 범위 및 기능 정의

채널 입력 장치 Raw Value 범위 할당 기능 동작 설명
CH1 롤/조향 스틱 1001: 좌측 끝
1480 ~ 1500: 중앙 (데드존)
2000: 우측 끝
좌우 조향 (Steering / Angular Z) • 중앙 데드존(1480~1500) 적용
• 좌회전(-) / 우회전(+) 정규화
CH2 피치/스로틀 스틱 1000: 위 끝 (전진)
1500: 중앙 (정지)
2000: 아래 끝 (후진)
전후진 (Throttle / Linear X) 1000 방향으로 이동 시 전진
2000 방향으로 이동 시 후진
• CH7에서 결정된 최대 속도 기준으로 선형 매핑
CH5 2단 스위치 1011: 미작동 (OFF)
1988: 눌림 (ON)
전자/비상 브레이크 (Brake) 1988 수신 시 모든 주행 속도 즉시 0 (Stop)
1011 수신 시 일반 주행 허용
CH7 2단 스위치 1988: 위쪽 누름
1011: 아래쪽 누름
속도 모드 선택 (Speed Mode) 1988 (위쪽): 저속 모드 (최대 0.3 m/s)
1011 (아래쪽): 고속 모드 (최대 0.6 m/s)

3. 제어 변환 알고리즘 및 로직

3.1 브레이크 최우선 로직 (CH5)

  • \text{CH5} \ge 1500 (누름 / 1988 부근): \text{Linear Velocity} = 0.0, \quad \text{Angular Velocity} = 0.0
  • \text{CH5} < 1500 (안누름 / 1011 부근): 정상 주행 로직 실행

3.2 속도 제한 설정 (CH7)

  • \text{CH7} \ge 1500 (위쪽 / 1988 부근): V_{\max} = 0.3 \text{ m/s} (저속 모드)
  • \text{CH7} < 1500 (아래쪽 / 1011 부근): V_{\max} = 0.6 \text{ m/s} (고속 모드)

3.3 전후진 속도 계산 (CH2)

  • 데드존(Deadband): 1480 \le \text{CH2} \le 1520 \rightarrow V_x = 0.0
  • 전진 구간 (1000 \le \text{CH2} < 1480): V_x = \left( \frac{1480 - \text{CH2}}{1480 - 1000} \right) \times V_{\max}
  • 후진 구간 (1520 < \text{CH2} \le 2000): V_x = -\left( \frac{\text{CH2} - 1520}{2000 - 1520} \right) \times V_{\max}

3.4 좌우 조향 각속도 계산 (CH1)

  • 데드존(Deadband): 1480 \le \text{CH1} \le 1500 \rightarrow \omega_z = 0.0
  • 좌회전 구간 (1001 \le \text{CH1} < 1480): \omega_z = -\left( \frac{1480 - \text{CH1}}{1480 - 1001} \right) \times \Omega_{\max}
  • 우회전 구간 (1500 < \text{CH1} \le 2000): \omega_z = +\left( \frac{\text{CH1} - 1500}{2000 - 1500} \right) \times \Omega_{\max}

4. 구현 요구사항 (To Claude Code)

  1. 기존 Xbox 입력 모듈 분리 및 교체:
    • 기존의 조이스틱 라이브러리(pygame, evdev, joy 노드 등) 종속성 제거
    • 시리얼 통신(PySerial 등) 기반의 RC 수신기 데이터 리더 클래스 구현
  2. 시리얼 패킷 디코딩 & Fail-safe 처리:
    • USB-to-TTL 시리얼 포트 오픈 및 예외 처리(재연결 로직)
    • 패킷 타임아웃(예: 200ms 이상 신호 미수신 시) 발생 시 자동 감속 및 긴급 정지
  3. 설정값 파라미터화 (Config):
    • Serial Port, Baudrate, 데드존 범위, 채널별 Max/Min/Center 값을 외부 설정(YAML, JSON, ROS 파라미터 등)으로 관리 가능하도록 모듈화