High Level Command — C++ 예제
소스: rbq_sdk/cpp/example/src/rbq_high_level.cpp
DDS를 통해 HighLevelCommand 메시지를 50 Hz로 발행합니다.
보행 선택은 터미널 입력으로, 속도 setpoint는 조이스틱으로 제어합니다.
개요
세 가지 동시 실행 구성요소:
| 구성요소 | 주기 | 역할 |
|---|---|---|
| 제어 루프 스레드 | 50 Hz | 현재 보행 + 속도로 HighLevelCommand 발행 |
| 조이스틱 루프 스레드 | 100 Hz | 조이스틱 폴링 후 속도 전역 변수 업데이트 |
| 메인 스레드 (터미널) | 블로킹 | stdin에서 보행 이름/ID를 읽어 목표 보행 업데이트 |
시작 시 제어 루프가 switchControlMode = true를 한 번 발행하여 로봇 스택에서 EXT_JOY 모드를 활성화합니다 — 이 토픽이 발행되지 않으면 HighLevelCommand 토픽은 무시됩니다.
사전 요구사항
- RBQ SDK 빌드 및 설치 완료 — C++ SDK 개요 참조.
- Linux 조이스틱 장치
/dev/input/js*(조이스틱이 필수). - 로봇 스택이 실행 중(시뮬레이션 또는 하드웨어).
빌드
bash
bash scripts/setup.bash
bash scripts/build.bash바이너리: bin/rbq_high_level
실행
bash
./bin/rbq_high_level <networkInterface> [joystickPath]
# 예:
./bin/rbq_high_level eth0
./bin/rbq_high_level eth0 /dev/input/js1조이스틱 자동 감지는 Sport Client (조이스틱) 예제와 동일한 로직을 따릅니다.
터미널 명령
> 프롬프트에서 보행 이름 또는 숫자 보행 ID를 입력합니다.
list # 사용 가능한 모든 보행 출력
standing # STANDING으로 전환 (이름으로)
3 # TROTTING으로 전환 (ID로)
rl_trot # RL_TROT으로 전환 (이름으로)사용 가능한 보행
| 이름 | 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단위 주의:HighLevelCommand.omega_z는 도/초(deg/s) 단위로 전송됩니다.
로봇 내부 QuadWalk가 D2R을 곱해 rad/s로 변환합니다 (예: 60 deg/s ≈ 1.05 rad/s 요 속도).
사용되는 DDS 토픽
| 방향 | 토픽 | 메시지 타입 |
|---|---|---|
| 발행 | rt/rbq/cmd/highLevel | rbq_msgs::msg::dds_::HighLevelCommand_ |
| 발행 | rt/rbq/cmd/switchControlMode | std_msgs::msg::dds_::Bool_ |
주요 구현 사항
gait_transition플래그: 보행 변경 직후 단 한 틱에만true로 설정되며,std::atomic<bool>::exchange()로 정확히 한 번만 소비됩니다. QuadWalkgaitTimer가 연속으로 트리거되는 것을 방지합니다.switchControlMode: 시작 시 200 ms 딜레이 후 한 번 발행됩니다 (DDS 구독자 연결 대기). 발행하지 않으면 로봇은 조이스틱 모드를 유지하고HighLevelCommand를 무시합니다.- 타이밍: 제어 루프는
clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, ...)을 사용해 정밀한 20 ms 스케줄링을 구현합니다.
