Sport Client (조이스틱) — C++ 예제
소스: rbq_sdk/cpp/example/src/rbq_sport_client_joy.cpp
게임패드 / 조이스틱을 사용해 SportClient API로 로봇을 제어합니다.
아날로그 스틱은 연속적인 Move 속도 명령을 전송하고, 버튼은 Damp, StandUp/Down, 보행 전환, 특수 동작 등의 이산 명령을 트리거합니다.
동작 방식
두 개의 스레드가 동시에 실행됩니다:
| 스레드 | 주기 | 역할 |
|---|---|---|
| 메인 스레드 (조이스틱) | ~100 Hz | 조이스틱 이벤트 읽기, 이산 SportCmd를 큐에 추가, 속도 setpoint 업데이트 |
| 제어 루프 스레드 | 10 Hz | 명령 큐를 소비하고, 비어있으면 sport.Move(vx, vy, vyaw) 호출 |
제어 루프는 sport.SetNoReply(true) — fire-and-forget 방식으로 RPC 응답을 기다리지 않습니다.
사전 요구사항
- RBQ SDK 빌드 및 설치 완료 — C++ SDK 개요 참조.
- Linux 조이스틱 장치 (예: Logitech F710)
/dev/input/js*. - 로봇 스택이 실행 중이며 네트워크 접근 가능.
빌드
bash
bash scripts/setup.bash
bash scripts/build.bash바이너리: bin/rbq_sport_client_joy
실행
bash
./bin/rbq_sport_client_joy <networkInterface> [joystickPath]
# 조이스틱 자동 감지:
./bin/rbq_sport_client_joy eth0
# 장치 직접 지정:
./bin/rbq_sport_client_joy eth0 /dev/input/js1조이스틱 경로가 없으면 Linux js* 장치를 자동 감지합니다 (Logitech/Xbox/Wireless 이름 우선, 이후 첫 번째 js* 노드 사용).JOY 환경 변수로도 경로를 지정할 수 있습니다.
게임패드 버튼 매핑
Logitech F710 / Xbox 레이아웃 (Linux 조이스틱 드라이버 기준).
버튼 조합 (chord) — 우선 검사
| 누르는 버튼 | 로봇 동작 |
|---|---|
| L2 + B | Damp — 고댐핑 비상 정지 |
| L2 + A (첫 번째 누름) | StandUp — 서기 자세로 관절 고정 |
| L2 + A (두 번째 누름) | StandDown — 엎드리기 |
| START | DefaultMode — 기본 보행 해제 |
| L2 + START | RunningMode — 고속 보행 |
| L2 + X | RecoveryStand — 넘어짐 후 일어서기 |
| R1 + X | Climb — 계단 오르기 보행 |
| L1 + X | 이 로봇에서는 지원하지 않음 |
| L1 + Y | 이 로봇에서는 지원하지 않음 |
| BACK | StopMove — 제자리 정지 |
더블 클릭 매핑
두 번째 누름이 첫 번째 누름으로부터 400 ms 이내에 발생해야 동작합니다.
| 버튼 | 동작 |
|---|---|
| X 더블 클릭 | LeftSideGait |
| Y 더블 클릭 | RightSideGait |
| R1 더블 클릭 | 이 로봇에서는 지원하지 않음 |
| R2 (트리거) 더블 클릭 | 이 로봇에서는 지원하지 않음 |
아날로그 스틱 속도 제어 (연속)
| 축 | 매핑 | 최대값 |
|---|---|---|
| 왼쪽 스틱 Y (앞으로) | vel_x (전진) | ±0.55 m/s |
| 왼쪽 스틱 X (왼쪽으로) | vel_y (횡방향) | ±0.35 m/s |
| 오른쪽 스틱 X | vyaw (요 속도) | ±1.0 rad/s |
주요 구현 사항
lock_toggle_to_prone:L2+A는 불리언 토글로StandUp/StandDown을 번갈아 수행합니다 (A2 로봇 기본 컨트롤러 동작과 동일).- 더블 클릭 감지:
consume_double()람다가 마지막 엣지 타임스탬프를 추적하고,kDoubleClickWindow(400ms)내에 두 번째 엣지가 도착하면 동작을 실행하고 카운터를 초기화합니다. - R2를 가상 버튼으로 처리: RT 트리거(
AXIS_RT)는 축 값을 0과 비교하여 버튼처럼 처리합니다 (유휴 = −1, 완전 누름 = +1). - 에러 누적 로깅: 연속 에러가 50번마다 한 번 출력되어 로그 스팸을 방지합니다.
