High Level Command — Python 예제
소스: rbq_sdk/python/example/sport/rbq_high_level.py
rbq_high_level.cpp의 Python 포팅 버전.
DDS를 통해 HighLevelCommand를 50 Hz로 발행하고, 터미널에서 보행을 선택하며, 조이스틱으로 속도 setpoint를 제어합니다.
개요
세 가지 동시 실행 구성요소:
| 구성요소 | 주기 | 역할 |
|---|---|---|
| 제어 루프 스레드 | 50 Hz | 현재 보행 + 속도로 HighLevelCommand 발행 |
| 조이스틱 루프 스레드 | 100 Hz | 조이스틱 폴링 후 속도 setpoint 업데이트 |
| 메인 스레드 (터미널) | 블로킹 | stdin에서 보행 이름/ID를 읽어 목표 보행 업데이트 |
시작 시 제어 루프가 switchControlMode = true를 한 번 발행(200 ms 대기 후)하여 로봇 스택의 EXT_JOY 모드를 활성화합니다. 이 토픽 없이는 HighLevelCommand가 무시됩니다.
사전 요구사항
rbq_sdk_py설치 완료 — Python SDK 개요 참조.- Linux 조이스틱 장치
/dev/input/js*(필수). - 로봇 스택이 실행 중(시뮬레이션 또는 하드웨어).
설치 및 실행
bash
cd RBQ/rbq_sdk/python
pip install -e .bash
cd RBQ/rbq_sdk/python/example/high_level
python3 rbq_high_level.py <networkInterface> [joystickPath]
# 예시
python3 rbq_high_level.py eth0
python3 rbq_high_level.py eth0 /dev/input/js1조이스틱 자동 감지: 이름에 "Logitech", "gamepad", "Xbox", "wireless"가 포함된 장치를 우선 선택하고, 없으면 첫 번째 js* 노드를 사용합니다.
오버라이드: JOY=/dev/input/js1 python3 rbq_high_level.py eth0
터미널 명령
list # 전체 보행 목록 출력
standing # 이름으로 전환
3 # ID로 전환 (trotting)
rl_trot # RL 트롯으로 전환전체 보행 목록
| 이름 | ID | 설명 |
|---|---|---|
sitting | 0 | 앉기 |
standing | 1 | 서기 (시작 기본값) |
aiming | 2 | 조준 자세 |
trotting | 3 | MPC 트롯 |
trot_stairs | 4 | 계단 오르기 트롯 |
waving | 5 | 웨이브 보행 |
trot_running | 6 | 고속 트롯 |
docking | 10 | 자동 도킹 |
rl_trot | 30 | RL 트롯 |
rl_front_walk | 31 | RL 전진 보행 |
rl_left_walk | 33 | RL 좌측 보행 |
rl_right_walk | 34 | RL 우측 보행 |
rl_bound | 35 | RL 바운드 |
rl_pace | 36 | RL 페이스 |
rl_pronk | 37 | RL 프롱크 |
rl_3leg_hr | 38 | RL 3족 (후우) |
rl_3leg_hl | 39 | RL 3족 (후좌) |
rl_3leg_fl | 41 | RL 3족 (전좌) |
rl_trot_vision | 42 | RL 비전 트롯 |
rl_trot_run | 45 | RL 고속 런 |
rl_silent | 46 | RL 저소음 |
rl_stairs | 47 | RL 계단 오르기 |
rl_walk_vision | 48 | RL 워크 비전 (지형 height 피드백, height/pitch 조정 가능) |
rl_walk | 49 | RL 워크 (height/pitch 조정 가능) |
rl_end | 80 | RL 종료 상태 |
조이스틱 속도 제어
| 축 | 매핑 | 최대값 |
|---|---|---|
| 왼쪽 스틱 Y (앞/뒤) | vel_x | ±1.2 m/s |
| 왼쪽 스틱 X (좌/우) | vel_y | ±0.5 m/s |
| 오른쪽 스틱 X (요) | omega_z | ±60 deg/s |
모든 축에 0.12 데드존 적용.
omega_z단위: deg/s 단위로 전송 — QuadWalk가 내부에서 D2R을 곱합니다.
DDS 토픽
| 방향 | 토픽 | 메시지 타입 |
|---|---|---|
| 발행 | rt/rbq/cmd/highLevel | HighLevelCommand_ |
| 발행 | rt/rbq/cmd/switchControlMode | Bool_ |
주요 구현 참고
gait_transition플래그:threading.Lock으로 보호되는consume_gait_pending()메서드가 보행 변경 시 플래그를 정확히 한 번만 소비합니다 — C++의std::atomic::exchange()패턴과 동일.switchControlMode: 시작 후 200 ms 대기 후 한 번 발행. 미발행 시 로봇이HighLevelCommand를 무시.- 타이밍:
time.monotonic()과time.sleep()으로 20 ms 주기를 유지. 지연 발생 시next_tick을 현재 시간으로 재설정. - RT 스레드 불필요: C++ 버전과 달리 실시간 스레드를 사용하지 않아
sudo가 필요하지 않습니다.
