Skip to content

ROS 2 토픽 레퍼런스

로봇 소프트웨어가 CycloneDDS로 노출하는 ROS 2 토픽의 전체 레퍼런스입니다.

ROS 2 호환 DDS로 직접 통신하므로 ros2 topic, rviz2, rqt가 로봇과 그대로 연동됩니다.

  • Pub — 로봇이 발행, 사용자 노드가 구독
  • Sub — 사용자 노드가 발행, 로봇이 구독

커스텀 메시지 타입(rbq_msgs/*, api/*)은 빌드된 워크스페이스 소싱 후 사용 가능합니다:

bash
source rbq_sdk/ros2/install/setup.bash

발행 주기Network/DdsBridge가 모든 Pub 상태 토픽을 하나의 ~500 Hz 루프로 재발행하므로, 아래 Hz는 그 발행 주기(ros2 topic hz로 측정)이며 센서/값의 실제 갱신 주기가 아닙니다.


모션 명령 토픽

/rbq/cmd/auto_start

항목내용
타입std_msgs/Bool
방향Sub
설명전체 초기화 시퀀스 실행: CAN 확인 → 홈 탐색 → 제어 시작. 올바른 초기 자세 필요. 진행 상황은 /rbq/robot_statuscan_check, find_home, con_start 플래그로 확인.

/rbq/cmd/switch_gait

항목내용
타입std_msgs/Int8
방향Sub
설명gait_id 값으로 목표 보행 모드로 전환. 아래 보행 상태 레퍼런스 참조.

/rbq/cmd/switch_control_mode

항목내용
타입std_msgs/Bool
방향Sub
설명true → 하이레벨 명령 모드 (/rbq/cmd/high_level 수신). false → 조이스틱 모드 (기본값).

/rbq/cmd/emergency

항목내용
타입std_msgs/Bool
방향Sub
설명즉시 전체 관절을 고감쇠 모드로 설정합니다. 로봇이 즉시 쓰러집니다. 테스트 시 먼저 앉히고 사용하세요.

/rbq/cmd/dock

항목내용
타입std_msgs/Int8MultiArray
방향Sub
설명자동 도킹 시퀀스를 시작합니다. data[0]: 보행 모드 — 0 = wave(기본값), 1 = trot. data[1]: 비전 모드 — 0 = blind(기본값), 1 = 비전 높이 피드백(trot 전용). 로봇이 서 있는(Standing) 상태여야 하며 후방 카메라가 ArUco 마커(≤ 5 m)를 봐야 합니다. robot_status.docking_state로 확인.

/rbq/ref/payload_params

항목내용
타입std_msgs/Float64MultiArray
방향Sub
설명CoM 보상을 위한 외부 페이로드 파라미터 설정. data: [mass_kg, com_x, com_y, com_z] (미터). 추가 하중을 실을 때 사용.

보행 상태 레퍼런스

명령과 상태 모두 하나의 gait enum을 사용합니다. HighLevelCommand.gait_state(switch_gait도 사용)로 보내고, robot_status.gait_id로 같은 값을 읽습니다.

gait_id이름설명
-2Fall Mode예기치 않은 균형 상실로 트리거
-1Control Off모든 제어 비활성
0Sitting낮은 자세, 지면에 착지
1Standing중립 자세, 보행 준비
2Aim Mode타게팅용 조준 자세
3Walk (Trot)트롯 보행
4Stairs계단 보행 (카메라 사용)
5Wave웨이브 보행
6Run고속 보행
30RL Trot강화학습 트롯
31RL Front WalkRL 전진 보행
33RL Left WalkRL 좌측 보행
34RL Right WalkRL 우측 보행
35RL BoundRL 바운드 보행
36RL PaceRL 페이스 보행
37RL PronkRL 프롱크 보행
3841RL 3-LegRL 3족 보행 (HR, HL, FR, FL)
42RL Trot Vision비전 연동 RL 트롯
45RL Trot RunRL 고속 트롯
46RL SilentRL 저소음 보행
47RL StairsRL 계단 보행
보행 상태 전환 다이어그램

하이레벨 제어

/rbq/cmd/high_level

항목내용
타입rbq_msgs/HighLevelCommand
방향Sub
설명속도 및 자세 명령. 동작과 유효 범위는 현재 보행 모드에 따라 다릅니다. 하이레벨 모드 필요 (switch_control_mode: true).

필드:

필드타입단위설명
headerstd_msgs/Header타임스탬프 포함 ROS 헤더
identifierstring로깅/추적용 선택 라벨
rollfloat32deg몸체 롤. Standing [-25, +25]
pitchfloat32deg몸체 피치. Standing [-20, +20], Walk (몸체 기울임 각), RL Walk [-25, +25]
yawfloat32deg몸체 요 트위스트. Standing [-25, +25]
vel_xfloat32m/s전진 속도. Walk [-1.0, +1.2] / Run [-1.0, +1.8] / RL Trot [-1.5, +2.0] / RL Walk [-1.5, +2.5] / Stairs [-1.0, +1.0]
vel_yfloat32m/s측면 속도. Walk [-0.4, +0.4] / Run [-0.6, +0.6] / RL Trot [-1.0, +1.0] / RL Walk [-1.0, +1.0] / Stairs [-0.4, +0.4]
omega_zfloat32deg/s요 각속도. Walk [-75, +75] / Stairs [-17, +17] / Wave [-20, +20] / RL Walk [-86, +86]
delta_body_hfloat32m기본 대비 몸체 높이 오프셋. Standing/Walk [-0.15, +0.05] / RL Walk [-0.25, +0.10]
delta_foot_hfloat32m스윙 발 들림 오프셋. [-0.06, +0.04]
gait_stateint8목표 보행 ID (보행 상태 레퍼런스 참조)
gait_transitionbooltrue = gait_state로 먼저 전환 후 명령 적용

예제 명령:

bash
# 0.5 m/s로 전진 (gait_state: 3 = Walk/Trot)
ros2 topic pub --once /rbq/cmd/high_level rbq_msgs/msg/HighLevelCommand \
'{header: {stamp: {sec: 0, nanosec: 0}, frame_id: "base"},
  identifier: "walk_fwd", roll: 0.0, pitch: 0.0, yaw: 0.0,
  vel_x: 0.5, vel_y: 0.0, omega_z: 0.0,
  delta_body_h: 0.0, delta_foot_h: 0.0,
  gait_state: 3, gait_transition: false}'

# 제자리 회전 30°/s
ros2 topic pub --once /rbq/cmd/high_level rbq_msgs/msg/HighLevelCommand \
'{header: {stamp: {sec: 0, nanosec: 0}, frame_id: "base"},
  identifier: "turn", roll: 0.0, pitch: 0.0, yaw: 0.0,
  vel_x: 0.0, vel_y: 0.0, omega_z: 30.0,
  delta_body_h: 0.0, delta_foot_h: 0.0,
  gait_state: 3, gait_transition: false}'

# 정지 (속도 0)
ros2 topic pub --once /rbq/cmd/high_level rbq_msgs/msg/HighLevelCommand \
'{header: {stamp: {sec: 0, nanosec: 0}, frame_id: "base"},
  identifier: "stop", roll: 0.0, pitch: 0.0, yaw: 0.0,
  vel_x: 0.0, vel_y: 0.0, omega_z: 0.0,
  delta_body_h: 0.0, delta_foot_h: 0.0,
  gait_state: 3, gait_transition: false}'

# 커스텀 서 있는 자세 (roll: 15°, pitch: 30°, yaw: 20°)
ros2 topic pub --once /rbq/cmd/high_level rbq_msgs/msg/HighLevelCommand \
'{header: {stamp: {sec: 0, nanosec: 0}, frame_id: "base"},
  identifier: "standing_pose", roll: 15.0, pitch: 30.0, yaw: 20.0,
  vel_x: 0.0, vel_y: 0.0, omega_z: 0.0,
  delta_body_h: 0.0, delta_foot_h: 0.0,
  gait_state: 1, gait_transition: true}'

/rbq/cmd/navigate_to

항목내용
타입geometry_msgs/Pose2D
방향Sub
설명절대 월드 좌표 자세로 이동. x, y는 목표 위치(미터), theta는 목표 요(라디안). Standing과 Wave 모드에서 사용 가능.

/rbq/cmd/target_go

항목내용
타입rbq_msgs/TargetGo
방향Sub
설명상대 "목표 지점 이동" 내비게이션 명령(gait, mode, x/y/theta, 오프셋, slow/wide/vision 플래그). Target-Go 예제 참조.

로봇 상태

/rbq/robot_status

항목내용
타입rbq_msgs/RobotStatus
방향Pub
Hz500
설명전반적인 로봇 상태 플래그, 보행 상태, 도킹 진행 상황.

필드:

필드타입설명
headerstd_msgs/HeaderROS 헤더
con_startbool모터 제어 활성
ready_posbool준비 자세 도달
ground_posbool지면/착지 자세
force_conbool힘 제어 모드 활성
ext_joybool외부 조이스틱 연결
is_standingbool로봇이 실제로 서 있음
can_checkboolCAN 통신 확인됨
find_homebool엔코더 홈 탐색 완료
gait_idint8현재 보행. 보행 상태 레퍼런스 참조.
is_fallbool낙상 감지
docking_stateint8도킹 진행 상황 (아래 표 참조)
imu_successboolIMU 연결·정상 동작

도킹 상태 값:

상수설명
-6DOCKING_MAX_FAIL_CNT_REACHED최대 재시도(10회) 도달 — 중단
-5DOCKING_MARKER_POS_INVALID_ROTATION마커 회전 > ±40° — 중단
-4DOCKING_MARKER_POS_INVALID_TOO_FAR마커 > 5 m — 중단
-3DOCKING_MARKER_POS_INVALID_WRONG_DIR마커가 전면에서 감지됨 — 중단
-2DOCKING_MARKER_NOT_FOUND마커 미발견 — 중단
-1DOCKING_FAILED도킹 실패 — 자동 재시도
0DOCKING_OPERATION_MODE정상 동작 (도킹 아님)
1DOCKING_APPROACH_OFFSET1단계: 오프셋 접근
2DOCKING_APPROACH2단계: 직접 접근
3DOCKING_APPROACH_WIDE3단계: 넓은 스탠스 접근
4DOCKING_SIT_DOWN연결을 위해 앉는 중
5DOCKING_SUCCESS도킹 완료 — 충전기 물리 연결
6DOCKING_SUCCESS_CHARGING도킹 및 충전 중
7DOCKING_SUCCESS_NO_CHARGING도킹됐으나 미충전

/rbq/system_log

항목내용
타입rbq_msgs/SystemLog
방향Pub
설명로봇 측 로그 스트림. 필드: header, string log_level, string log_msg.

상태 추정

/rbq/odometry

항목내용
타입nav_msgs/Odometry
방향Pub
Hz500
설명월드 좌표계에서의 몸체 자세·속도. 원점은 시작 시 리셋. IMU와 다리 오도메트리를 융합.

/rbq/foot_states

항목내용
타입rbq_msgs/FootStates
방향Pub
Hz500
설명몸체 중심 좌표 기준 4개 다리의 발 위치·속도·접촉 상태.

필드:

필드타입설명
headerstd_msgs/HeaderROS 헤더
foot_position_rt_bodygeometry_msgs/Point[4]몸체 중심 기준 발 위치. +X=전방, +Y=좌, +Z=상
foot_velocity_rt_bodygeometry_msgs/Point[4]몸체 좌표 기준 발 속도
foot_contact_estuint8[4]발별 접촉 상태: 0 = CONTACT_LOST, 1 = CONTACT_MADE
foot_force_estfloat32[4]추정 접촉력 [N]

다리 순서: [0] = 전방-좌, [1] = 전방-우, [2] = 후방-좌, [3] = 후방-우


센서 피드백

/rbq/imu

항목내용
타입sensor_msgs/Imu
방향Pub
Hz500
설명원시 IMU 데이터. 몸체 중심 대비 센서 오프셋: (0.00665, 0.0, -0.0404) m. 좌표: +X=전방, +Y=좌, +Z=상. 각속도 범위 ±2000 °/s, 가속도 범위 ±16 g.

/rbq/joint_states

항목내용
타입sensor_msgs/JointState
방향Pub
Hz500
설명표준 ROS 포맷의 12개 다리 관절 위치[rad]·속도[rad/s]·토크[Nm].

/rbq/leg_joint

항목내용
타입rbq_msgs/LegJointInfo
방향Pub
Hz500
설명12개 다리 관절의 상세 관절별 상태. LegJointInfoJointInfo[12] joint를 감쌉니다 — 관절당 JointInfo 하나 (JointStatus 메시지는 없음).

관절 순서(관례): [0]HRR [1]HRP [2]HRK [3]HLR [4]HLP [5]HLK [6]FRR [7]FRP [8]FRK [9]FLR [10]FLP [11]FLK — 단, 각 joint[i]는 자체 3글자 name을 가지며 이것이 authoritative 식별자입니다.

JointInfo 필드 (joint[12]의 각 원소):

필드타입단위설명
posfloat32rad측정 위치
velfloat32rad/s각속도
accfloat32rad/s²각가속도
torquefloat32N·m측정 토크
kpfloat32Nm/rad위치 게인
kdfloat32Nm·s/rad감쇠 게인
ownerint8관절을 소유한 프로세스 (040)
ref_ff_torquefloat32N·m기준 피드포워드 토크
ref_positionfloat32rad기준(목표) 위치
ref_velfloat32rad/s기준 속도
currentfloat32A모터 전류
temperature_boardint8°C제어 보드 온도
temperature_coilint8°C모터 코일 온도
namestring≤33글자 관절 이름, 예: "HRR"
statusstring≤33글자 라이프사이클: NON/CON/HOM/RUN
error_msgstring≤33글자 에러 코드, 예: "JAM", "OK"

토크 한계: Roll/Pitch ±104 Nm — Knee −70 / +140 Nm


전원 제어

/rbq/cmd/switch_power

항목내용
타입std_msgs/Int8MultiArray
방향Sub
설명PDU 전원 포트 토글. data: [port_id, state]state: 1=ON, 0=OFF.

포트 ID 레퍼런스:

port_id포트
0 (0x00)48 V — 다리 액추에이터
1 (0x01)48 V — 애드온 장치 (상단)
2 (0x02)48 V — 외부 포트 (상단)
16 (0x10)12 V — 비전 PC (내부)
17 (0x11)12 V — LAN 통신 포트 (상단)
18 (0x12)12 V — LiDAR 포트 (상단)
19 (0x13)12 V — CCTV 포트 (상단)
20 (0x14)12 V — 열화상 카메라 포트 (상단)
21 (0x15)12 V — IR LED (전/후면 패널)
22 (0x16)12 V — 스피커 앰프
32 (0x20)5 V — 카메라 USB 허브
33 (0x21)5 V — 오디오 / 사이드캠 USB 허브
cpp
// PDU 포트 ID enum (switch_power의 data[0]으로 사용)
enum PDU_PORT_IDs_e : unsigned char {
    PDU_PORT_48V_LEG                   = 0x00,  // 다리 액추에이터
    PDU_PORT_48V_ADD                   = 0x01,  // 애드온 장치
    PDU_PORT_48V_EXT                   = 0x02,  // 외부 포트
    PDU_PORT_12V_VisionPC              = 0x10,  // 비전 PC
    PDU_PORT_12V_COMM                  = 0x11,  // LAN 통신 포트
    PDU_PORT_12V_Lidar                 = 0x12,  // LiDAR 포트
    PDU_PORT_12V_CCTV                  = 0x13,  // CCTV 포트
    PDU_PORT_12V_THER                  = 0x14,  // 열화상 카메라
    PDU_PORT_12V_IRLed                 = 0x15,  // IR LED
    PDU_PORT_12V_Speaker               = 0x16,  // 스피커 앰프
    PDU_PORT_5V_CAMERAS                = 0x20,  // 카메라 USB 허브
    PDU_PORT_5V_AUDIO_SIDE_CAM_USBHUB  = 0x21,  // 오디오/사이드캠 USB 허브
};

예제: 12V LiDAR 포트 켜기 (PDU_PORT_12V_Lidar = 0x12 → 10진수 18)

bash
ros2 topic pub --once /rbq/cmd/switch_power std_msgs/msg/Int8MultiArray "{data: [18, 1]}"

/rbq/battery

항목내용
타입rbq_msgs/BatteryState
방향Pub
Hz500
설명듀얼 배터리 팩 상태. 모든 필드는 2-원소 배열 ([0] = 팩 0, [1] = 팩 1).

필드:

필드타입설명
headerstd_msgs/HeaderROS 헤더
identifieruint32[2]팩별 식별자
statusuint8[2]0=Unknown 1=Missing 2=Charging 3=Discharging
charge_percentageuint8[2]충전 상태 [0, 100] %
temperatureint8[2]팩 온도 [°C]
currentfloat32[2]부하 전류 [A]
voltagefloat32[2]팩 전압 [V]

비전 — 카메라 센서

모든 카메라 토픽은 로봇이 발행합니다(Pub). 센서는 숫자 id로 식별됩니다 — sensor_0sensor_5 (기존 이름 기반 sensor_bottom_N / sensor_front / sensor_rear 토픽은 사라짐). 각 스트림은 /compressed, /camera_info, 그리고 스트림별 /tf(geometry_msgs/PoseStamped)를 가집니다.

센서 id위치스트림
sensor_0sensor_3하단/몸체 깊이 센서depth, ir
sensor_4전방 RGB-Ddepth, rgb
sensor_5후방 RGB-D (ArUco 도킹에도 사용)depth, rgb

토픽 패턴: /rbq/vision/sensor_{N}/{stream}/{sub}

토픽타입설명
/rbq/vision/sensor_{N}/{stream}/compressedsensor_msgs/CompressedImage압축 프레임 (depth=PNG, ir/rgb=JPEG)
/rbq/vision/sensor_{N}/{stream}/camera_infosensor_msgs/CameraInfo내부 파라미터 + 왜곡
/rbq/vision/sensor_{N}/{stream}/tfgeometry_msgs/PoseStamped몸체 기준 센서 자세

{stream}sensor_0sensor_3에서 depth/ir, sensor_4/sensor_5에서 depth/rgb 입니다.

카메라 스레드는 구독자가 붙어 있는 동안에만 발행합니다(hasSubscribers 게이트) — 먼저 구독한 뒤 읽으세요.


TF

/tf

항목내용
타입tf2_msgs/TFMessage
방향Pub
설명런타임에 방송되는 동적 변환: odom → base_link, 몸체 → 다리 링크, 몸체 → 센서 프레임.

/tf_static(URDF 고정 변환)는 rbq_descriptionrobot_state_publisher가 발행합니다. 즉 ros2 launch rbq_description description.launch.py를 실행할 때만 나오며, 로봇 코어 소프트웨어가 내보내는 것이 아닙니다.

/rbq/joy

항목내용
타입sensor_msgs/Joy
방향Pub
설명로봇의 현재 조이스틱 입력 상태(패스스루). 축 [0–5]: 좌-X, 좌-Y, 우-X, 우-Y, L2, R2. 버튼 [0–15].

토픽 구독 예제

bash
# 로봇 상태 (50 Hz)
ros2 topic echo --once /rbq/robot_status

# 관절별 다리 상태 (50 Hz)
ros2 topic echo --once /rbq/leg_joint

# IMU 데이터 (200 Hz)
ros2 topic echo --once /rbq/imu

# 배터리 상태 (10 Hz)
ros2 topic echo --once /rbq/battery

# 발 접촉 상태 (50 Hz)
ros2 topic echo --once /rbq/foot_states

# 오도메트리 (50 Hz)
ros2 topic echo --once /rbq/odometry

This user manual is intended for RBQ users.