4.2 KiB
4.2 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
- 실측 확인된 시리얼 프로토콜: CRSF(Crossfire), 420000bps, 8N1.
프레임 구조
[Sync 0xC8][Length][FrameType][Payload][CRC8], FrameType0x16(RC_CHANNELS_PACKED)의 22바이트 payload에 16채널이 11비트씩 리틀엔디안으로 패킹되어 raw172~1811값이1000~2000us로 선형 변환된다. (CRC8은 이 송신기에서 표준 DVB-S2 값과 안 맞아 검증 없이 Sync+Length 프레이밍만 신뢰함.)
- 하드웨어: USB to TTL 컨버터 (
2. 하드웨어 및 채널 매핑 사양
2.1 채널별 입력 범위 및 기능 정의
| 채널 | 입력 장치 | Raw Value 범위 | 할당 기능 | 동작 설명 |
|---|---|---|---|---|
| CH1 | 롤/조향 스틱 | • 1005: 좌측 끝• 1481 ~ 1503: 중앙 (데드존)• 2000: 우측 끝 |
좌우 조향 (Steering / Angular Z) | • 중앙 데드존(1481~1503) 적용• 좌회전(-) / 우회전(+) 정규화 |
| CH2 | 피치/스로틀 스틱 | • 1005: 최대 후진• 1500: 중앙 (정지)• 2000: 최대 전진 |
전후진 (Throttle / Linear X) | • 값이 높을수록 전진, 낮을수록 후진 (CH1과 반대 방향) • CH6에서 결정된 최대 속도 기준으로 선형 매핑 |
| CH5 | 2단 스위치 | • 1012: 미작동 (OFF)• 1988: 눌림 (ON) |
전자/비상 브레이크 (Brake) | • 1988 수신 시 모든 주행 속도 즉시 0 (Stop)• 1012 수신 시 일반 주행 허용 |
| CH6 | 2단 스위치 | • 1832: 저속 위치• 1012~1090: 고속 위치 |
속도 모드 선택 (Speed Mode) | • 1832(≥1500 부근): 저속 모드 (최대 0.3 m/s)• 1012~1090(<1500): 고속 모드 (최대 1.5 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(안누름 /1012부근): 정상 주행 로직 실행
3.2 속도 제한 설정 (CH6)
\text{CH6} \ge 1500(1832부근):V_{\max} = 0.3 \text{ m/s}(저속 모드)\text{CH6} < 1500(1012~1090부근):V_{\max} = 1.5 \text{ m/s}(고속 모드)
3.3 전후진 속도 계산 (CH2)
- 데드존(Deadband):
1480 \le \text{CH2} \le 1520 \rightarrow V_x = 0.0 - 후진 구간 (
1005 \le \text{CH2} < 1480):V_x = -\left( \frac{1480 - \text{CH2}}{1480 - 1005} \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):
1481 \le \text{CH1} \le 1503 \rightarrow \omega_z = 0.0 - 좌회전 구간 (
1005 \le \text{CH1} < 1481):\omega_z = -\left( \frac{1481 - \text{CH1}}{1481 - 1005} \right) \times \Omega_{\max} - 우회전 구간 (
1503 < \text{CH1} \le 2000):\omega_z = +\left( \frac{\text{CH1} - 1503}{2000 - 1503} \right) \times \Omega_{\max}
4. 구현 요구사항 (To Claude Code)
- 기존 Xbox 입력 모듈 분리 및 교체:
- 기존의 조이스틱 라이브러리(pygame, evdev, joy 노드 등) 종속성 제거
- 시리얼 통신(PySerial 등) 기반의 RC 수신기 데이터 리더 클래스 구현
- 시리얼 패킷 디코딩 & Fail-safe 처리:
- USB-to-TTL 시리얼 포트 오픈 및 예외 처리(재연결 로직)
- 패킷 타임아웃(예: 200ms 이상 신호 미수신 시) 발생 시 자동 감속 및 긴급 정지
- 설정값 파라미터화 (Config):
- Serial Port, Baudrate, 데드존 범위, 채널별 Max/Min/Center 값을 외부 설정(YAML, JSON, ROS 파라미터 등)으로 관리 가능하도록 모듈화