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 로봇의 상태를 관리하고 서비스를 제어하는 클라이언트
프로그램입니다.
이 프로그램이 하는 일:
보고 빈도 설정 (example/src/src/go2/go2_robot_state_client.cpp:29)
서비스 제어 (example/src/src/go2/go2_robot_state_client.cpp:34-42)
서비스 목록 조회 (example/src/src/go2/go2_robot_state_client.cpp:46-59)
실행 흐름:
📝 모든 사용 가능한 예제 목록:
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
./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
./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 <모드번호>
각 모드별 동작:
| 모드 | 이름 | 동작 | 위험도 |
|---|---|---|---|
| 0 | NORMAL_STAND | 일반 서기 자세 | ✅ 안전 |
| 1 | BALANCE_STAND | 밸런스 서기 | ✅ 안전 |
| 2 | VELOCITY_MOVE | 전진(0.3m/s) + 회전(0.3rad/s) | ⚠️ 주의 - 계속 움직임 |
| 3 | STAND_DOWN | 앉기 (낮은 자세) | ✅ 안전 |
| 4 | STAND_UP | 일어서기 | ✅ 안전 |
| 5 | DAMP | 모든 제어 끄기 (힘 빠짐) | ⚠️ 주의 - 바닥에 쓰러짐 |
| 6 | RECOVERY_STAND | 복구 서기 (넘어진 후) | ✅ 안전 |
| 7 | SIT | 앉기 (한 번만 실행) | ✅ 안전 |
| 8 | RISE_SIT | 앉은 상태에서 일어서기 | ✅ 안전 |
| 9 | MOVE | 계속 전진(0.3m/s) | ⚠️ 주의 - 계속 움직임 (잘 안 되었음) |
| 10 | STOP_MOVE | 움직임 정지 | ✅ 안전 (잘 안 되었음) |
● 발견했습니다! rt/sportmodestate는 MCF(Sport) 모드가 활성화되어 있을 때만 발행됩니다!
문제:
self.sportmodesub = ChannelSubscriber("rt/sportmodestate", SportModeState)
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 버전 차이 + 네 상황에 맞는 추천 + 실제 설치 명령어까지 딱 정리해줄게.
| 항목 | CPU 버전 | GPU 버전 (CUDA) |
|---|---|---|
| 설치 난이도 | ✅ 매우 쉬움 | ❌ CUDA/cuDNN 의존성 |
| ROS2 Foxy 궁합 | ✅ 안정적 | ⚠️ 드라이버 충돌 가능 |
| 실시간 제어 (50~200Hz) | ✅ 충분 | ✅ 충분 |
| 지연 시간 (latency) | ✅ 매우 안정적 | ❌ 오히려 불안정할 수 있음 |
| Transformer / 대형 모델 | ❌ 느림 | ✅ 빠름 |
| MLP / LSTM policy | ✅ CPU가 더 유리 | ⚠️ GPU 이점 거의 없음 |
| 디버깅 | ✅ 쉬움 | ❌ 매우 빡셈 |
너 지금 하는 거 요약하면:
policy.onnx = 로봇 제어용 policy이 조건이면:
🔥 GPU 쓰면 오히려 손해인 구조다.
🔥 CPU 버전 ONNX Runtime이 지연, 안정성, 디버깅 전부 더 좋다.
특히 GPU는:
👉 MLP/LSTM 기반 로봇 정책 = CPU가 베스트 프랙티스
이건 지금 바로 써도 되는 정답 커맨드야.
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++ 바로 연동 가능
아래 3개 중 하나라도 해당되면 GPU 고려:
✅ Vision encoder가 ONNX에 포함됨 (CNN, ViT)
✅ Observation이 1,000차원 이상
✅ policy가 Transformer 기반 + head가 큼
❌ 지금 네 GO2 locomotion policy는 해당 안 됨
너 GPU 버전은 CUDA 버전까지 정확히 맞춰야 해서 리스크 있음.
nvidia-smi
nvcc --version
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 충돌 확률 있음
✅ 지금은 CPU 버전이 정답
✅ GPU는 나중에 vision + transformer 붙을 때
✅ locomotion / EKF / low-level control은 CPU가 철학적으로 맞다
지금 바로 이거 하면 가장 좋다:
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 입력/출력 차원만 알려주면 바로 맞춰준다.