# [기능 명세서] 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 파라미터 등)으로 관리 가능하도록 모듈화