Skip to content

휠 제어 — C++ 예제 ​

소스: rbq_sdk/cpp/example/src/rbq/rbq_wheel.cpp

외부 앱에서 **RBQ 휠 기체(RBQ-W)**의 바퀴 네 개를 돌립니다. 바퀴 관절의 소유권만 가져오므로 다리는 로봇의 제어기가 계속 맡고 서 있는 자세도 유지됩니다. 몇 초 동안 바퀴를 굴린 뒤 놓아 줍니다.

동작 방식 ​

  1. 명령행에서 interface와 선택 인자 torque kd seconds를 읽습니다.
  2. 주어진 인터페이스로 DDS ChannelFactory를 초기화하고 앱 슬롯 21 용으로 rt/rbq/ref/motion/_21의 Publisher<MotionRef_>와 rt/rbq/cmd/motion/owner/_21의 Publisher<JointOwnershipCmd_>를 만듭니다. 로봇이 실제로 적용하는 레퍼런스인 rt/rbq/ref/motion/_0도 구독합니다.
  3. DDS 디스커버리를 ~500 ms 기다린 뒤 토크 0 레퍼런스를 먼저 보내고, whl_joint[] = true인 JointOwnershipCmd_를 보냅니다(leg_joint[]는 false 그대로).
  4. whl_joint[]를 500 Hz 로 발행합니다 — kp = 0, 주어진 kd, 0.5 초 동안 0 에서 올라가는 토크. 0.5 초마다 적용된 바퀴 레퍼런스를 출력합니다.
  5. 시간이 끝나면 토크를 0 으로 0.5 초 보낸 뒤 kp = kd = torque = 0을 보내고 종료합니다.

kp = 0이면 바퀴 보드가 torque − kd × 속도를 내므로, 떠 있는 바퀴는 속도 = torque / kd [rad/s]에 수렴합니다. 기본값이면 2 rad/s 입니다.

게인은 CAN FD 기체든 일반 CAN 기체든 물리값(Nm/rad, Nm·s/rad)으로 보냅니다. 로봇의 Network 가 보드에 맞게 바꾸므로, 일반 CAN 기체에서는 보드 게인 단위로 반올림됩니다(예: kd 0.5 → 0.5007).

rbq_low_level은 앱 슬롯 20 을 쓰므로 두 예제를 함께 돌릴 수 있습니다 — 다리는 한 앱이, 바퀴는 다른 앱이 맡습니다.

WARNING

바닥에 있으면 바퀴가 도는 동안 로봇이 굴러갑니다. 공간을 확보하고, 작은 토크부터 시작하고, 원격 비상정지를 손에 두세요.

사전 요구사항 ​

  • RBQ SDK 빌드·설치 — C++ SDK 개요 참조.
  • 로봇 스택이 실행 중이며 동일 DDS 인터페이스로 접근 가능.
  • 서 있는 RBQ 휠 기체(RBQ-W). 바퀴가 없는 기체에서는 명령이 아무 효과가 없습니다. 시뮬레이터에서는 Motion 과 MuJoCo 를 --wheel로 띄웁니다(bash scripts/sim.bash --robot wheel).

빌드 ​

rbq_sdk/cpp/example/에서:

bash
bash scripts/setup.bash
bash scripts/build.bash

바이너리: bin/rbq_wheel

실행 ​

bash
./bin-x86_64/rbq_wheel [interface] [torque] [kd] [seconds]

# 앞으로 2 rad/s, 3 초(기본값) — 인터페이스가 항상 먼저 옵니다:
./bin-x86_64/rbq_wheel eth0

# 뒤로 1 rad/s, 5 초:
./bin-x86_64/rbq_wheel eth0 -0.5 0.5 5

인자는 모두 위치 인자이므로 인터페이스를 첫 인자로 넘겨야 합니다. 로봇에 닿는 인터페이스를 쓰세요 — 로봇 PC 에서 돌리면 lo, 다른 호스트에서는 본인 NIC.

인자의미기본값
interfaceCycloneDDS 인터페이스(로봇에서는 lo / 다른 호스트에서는 NIC)—
torque바퀴 피드포워드 토크 [Nm], |torque| ≤ 101.0
kd바퀴 감쇠 [Nm·s/rad], 0 < kd ≤ 60.5
seconds바퀴를 놓기 전까지 굴리는 시간3

범위를 벗어나면 사용법을 출력하고 아무것도 보내지 않은 채 종료합니다.

예제가 끝난 뒤에도 바퀴는 게인 0 인 채로 앱 21 소유로 남아 자유롭게 돕니다. 다시 서기나 보행 전환을 해도 로봇에게 돌아가지 않습니다. 로봇의 제어기가 바퀴를 다시 써야 하면 로봇 스택을 재시작하세요.

출력 예시 ​

[rbq_wheel] wheel ownership requested (app 21)
[rbq_wheel] applied: HRW(tq=0 kd=3.5) HLW(tq=0 kd=3.5) FRW(tq=0 kd=3.5) FLW(tq=0 kd=3.5)
[rbq_wheel] applied: HRW(tq=0.996 kd=0.5) HLW(tq=0.996 kd=0.5) FRW(tq=0.996 kd=0.5) FLW(tq=0.996 kd=0.5)
[rbq_wheel] applied: HRW(tq=1 kd=0.5) HLW(tq=1 kd=0.5) FRW(tq=1 kd=0.5) FLW(tq=1 kd=0.5)
[rbq_wheel] done - wheels released (kp = kd = torque = 0)

첫 줄은 넘겨받기 전 로봇 자신의 바퀴 게인입니다. 바퀴 순서는 HRW HLW FRW FLW(관절 12–15)입니다.

This user manual is intended for RBQ users.