unitree - go2 - ros2

전찬욱·2025년 12월 8일

SportMode 상태 (위치, 속도, 발 위치 등):

ros2 topic echo /sportmodestate

저수준 상태 (모터, 배터리, IMU 등):

ros2 topic echo /lowstate

무선 컨트롤러:

ros2 topic echo /wirelesscontroller

ros2 topic echo /utlidar/imu
header:
  stamp:
    sec: 1765195428
    nanosec: 414778232
  frame_id: utlidar_imu
orientation:
  x: 0.08814125508069992
  y: -0.985966145992279
  z: 0.10396084934473038
  w: 0.0769527405500412
orientation_covariance:
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
angular_velocity:
  x: 0.009360745549201965
  y: -0.0036753048188984394
  z: -0.009370050393044949
angular_velocity_covariance:
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
linear_acceleration:
  x: 1.623710036277771
  y: -1.9568161964416504
  z: -9.400725364685059
linear_acceleration_covariance:
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0

source unitree_ros2/example
colcon build --...

cd install/unitree_ros2_example/bin
./go2_robot_sport_client

● ./go2_robot_state_client는 Unitree GO2 로봇의 상태를 관리하고 서비스를 제어하는 클라이언트
프로그램입니다.

이 프로그램이 하는 일:

  1. 보고 빈도 설정 (example/src/src/go2/go2_robot_state_client.cpp:29)

    • SetReportFreq(3, 30) 호출하여 로봇 상태 데이터를 30Hz로 보고하도록 설정
  2. 서비스 제어 (example/src/src/go2/go2_robot_state_client.cpp:34-42)

    • sport_mode 서비스를 끄고(0) 켜는(1) 기능 테스트
    • 5초 간격으로 서비스를 OFF → ON으로 전환
  3. 서비스 목록 조회 (example/src/src/go2/go2_robot_state_client.cpp:46-59)

    • 로봇에서 사용 가능한 모든 서비스 목록을 가져와서 출력
    • 각 서비스의 이름, 상태(status), 보호 모드(protect) 정보 표시

    실행 흐름:

  • ROS2 노드로 실행되며 로봇과 통신
  • 각 단계마다 5초씩 대기하며 순차적으로 명령 실행
  • 주로 로봇 서비스 관리 기능을 테스트하거나 데모하는 용도로 사용됩니다

📝 모든 사용 가능한 예제 목록:

cd /home/user/unitree_ros2/example

센서 읽기 (안전)

./install/unitree_ros2_example/bin/read_motion_state
./install/unitree_ros2_example/bin/read_low_state
./install/unitree_ros2_example/bin/read_wireless_controller

Go2 제어 (주의!)

./install/unitree_ros2_example/bin/go2_stand_example
./install/unitree_ros2_example/bin/go2_sport_client
./install/unitree_ros2_example/bin/go2_robot_state_client

저수준 제어 (고급)

./install/unitree_ros2_example/bin/low_level_ctrl

G1/H1 로봇용

./install/unitree_ros2_example/bin/g1_low_level_example
./install/unitree_ros2_example/bin/g1_loco_client_example


● 📊 go2_sport_client 동작 분석:

사용법:

./install/unitree_ros2_example/bin/go2_sport_client <모드번호>

각 모드별 동작:

모드이름동작위험도
0NORMAL_STAND일반 서기 자세✅ 안전
1BALANCE_STAND밸런스 서기✅ 안전
2VELOCITY_MOVE전진(0.3m/s) + 회전(0.3rad/s)⚠️ 주의 - 계속 움직임
3STAND_DOWN앉기 (낮은 자세)✅ 안전
4STAND_UP일어서기✅ 안전
5DAMP모든 제어 끄기 (힘 빠짐)⚠️ 주의 - 바닥에 쓰러짐
6RECOVERY_STAND복구 서기 (넘어진 후)✅ 안전
7SIT앉기 (한 번만 실행)✅ 안전
8RISE_SIT앉은 상태에서 일어서기✅ 안전
9MOVE계속 전진(0.3m/s)⚠️ 주의 - 계속 움직임 (잘 안 되었음)
10STOP_MOVE움직임 정지✅ 안전 (잘 안 되었음)

● 발견했습니다! rt/sportmodestate는 MCF(Sport) 모드가 활성화되어 있을 때만 발행됩니다!

문제:

test_observations.py와 robot_policy_runner.py

self.sportmodesub = ChannelSubscriber("rt/sportmodestate", SportModeState)

wait_for_robot_state()에서:

while self.latest_lowstate is None or self.latest_sportmode is None: # ← 영원히 대기!

MCF가 꺼지면 rt/sportmodestate가 발행되지 않으므로 timeout 발생!



아주 좋은 타이밍에 정확한 질문이야.
결론부터 딱 잘라 말하면:

네 환경(ROS2 Foxy + Ubuntu 20.04 + x86)에서는
→ 기본은 CPU 버전으로 시작하고,
→ 실제 추론 병목이 생기면 GPU 버전으로 전환하는 게 정석 루트다.

이유랑 함께 CPU/GPU 버전 차이 + 네 상황에 맞는 추천 + 실제 설치 명령어까지 딱 정리해줄게.


✅ 1️⃣ CPU 버전 vs GPU 버전 핵심 차이

항목CPU 버전GPU 버전 (CUDA)
설치 난이도✅ 매우 쉬움❌ CUDA/cuDNN 의존성
ROS2 Foxy 궁합✅ 안정적⚠️ 드라이버 충돌 가능
실시간 제어 (50~200Hz)✅ 충분✅ 충분
지연 시간 (latency)✅ 매우 안정적❌ 오히려 불안정할 수 있음
Transformer / 대형 모델❌ 느림✅ 빠름
MLP / LSTM policyCPU가 더 유리⚠️ GPU 이점 거의 없음
디버깅✅ 쉬움❌ 매우 빡셈

✅ 2️⃣ ✅ 네 프로젝트(GO2 Policy Runner) 기준 추천

너 지금 하는 거 요약하면:

  • policy.onnx = 로봇 제어용 policy
  • ✅ 입력 obs: 수십 차원
  • ✅ 출력 action: 12~18차원
  • ✅ 제어 주기: 50Hz
  • ✅ 실시간성 최우선
  • ✅ Python → C++ 이전 중

이 조건이면:

🔥 GPU 쓰면 오히려 손해인 구조다.
🔥 CPU 버전 ONNX Runtime이 지연, 안정성, 디버깅 전부 더 좋다.

특히 GPU는:

  • kernel launch latency 존재
  • H2D / D2H 복사 지연
  • ROS2 타이머랑 타이밍 꼬이는 경우 있음

👉 MLP/LSTM 기반 로봇 정책 = CPU가 베스트 프랙티스


✅ 3️⃣ ✅ 네 환경(x86 + 20.04 + Foxy)용 CPU 최신버전 설치 (v1.23.2)

이건 지금 바로 써도 되는 정답 커맨드야.

cd ~
wget https://github.com/microsoft/onnxruntime/releases/download/v1.23.2/onnxruntime-linux-x64-1.23.2.tgz
tar -xvzf onnxruntime-linux-x64-1.23.2.tgz
sudo mv onnxruntime-linux-x64-1.23.2 /opt/onnxruntime

환경변수:

echo 'export ONNXRUNTIME_ROOT=/opt/onnxruntime' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=$ONNXRUNTIME_ROOT/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

확인:

ls $ONNXRUNTIME_ROOT/lib | grep onnx
# libonnxruntime.so 나오면 성공

✅ 이 상태에서 ROS2 + CMake + C++ 바로 연동 가능


✅ 4️⃣ GPU 버전은 언제 쓰는 게 맞나?

아래 3개 중 하나라도 해당되면 GPU 고려:

✅ Vision encoder가 ONNX에 포함됨 (CNN, ViT)
✅ Observation이 1,000차원 이상
✅ policy가 Transformer 기반 + head가 큼

❌ 지금 네 GO2 locomotion policy는 해당 안 됨


✅ 5️⃣ 그래도 GPU 버전 써보고 싶다면 (참고용)

너 GPU 버전은 CUDA 버전까지 정확히 맞춰야 해서 리스크 있음.

확인 먼저:

nvidia-smi
nvcc --version

GPU 버전 받는 예시:

wget https://github.com/microsoft/onnxruntime/releases/download/v1.23.2/onnxruntime-linux-x64-gpu-1.23.2.tgz
tar -xvzf onnxruntime-linux-x64-gpu-1.23.2.tgz
sudo mv onnxruntime-linux-x64-gpu-1.23.2 /opt/onnxruntime

그리고 C++에서:

Ort::SessionOptions opts;
opts.AppendExecutionProvider_CUDA(0);

⚠️ 단, ROS2 Foxy + Ubuntu 20.04 + 최신 CUDA 조합은
segfault / libcuda.so 충돌 확률 있음


✅ 6️⃣ 실전 결론 (가장 중요)

지금은 CPU 버전이 정답
✅ GPU는 나중에 vision + transformer 붙을 때
✅ locomotion / EKF / low-level control은 CPU가 철학적으로 맞다


✅ 너 상황에 맞춘 최종 추천 세트

  • ✅ ONNX Runtime: v1.23.2 CPU
  • ✅ ROS2 Foxy + Ubuntu 20.04: 완전 호환
  • ✅ Control loop: 20ms(50Hz) 안정
  • ✅ 추론 지연: 보통 0.05 ~ 0.3 ms

✅ 다음 단계에서 바로 해볼 것

지금 바로 이거 하면 가장 좋다:

1️⃣ CPU 버전 v1.23.2 설치
2️⃣ C++ onnx wrapper 연결
3️⃣ policy.onnx 단독 추론
4️⃣ Python 결과랑 출력 값 비교


🔥 한 줄 요약:

GO2 로봇 제어용 ONNX는 GPU 쓰는 순간 “실시간 안정성”을 잃는다.
CPU가 정답이다.


원하면 내가 지금 네 상황에 맞게:

SessionOptions CPU 실시간 최적화 셋팅
✅ intra-op / arena / thread 수까지 딱 맞춘 코드 바로 짜줄게.

👉 policy.onnx 입력/출력 차원만 알려주면 바로 맞춰준다.



0개의 댓글