📄 v1개정 이력 보기
OpenArm WowRobo 듀얼암 MuJoCo 시뮬레이션 — EGL GPU 렌더링 적용
초록
OpenArm WowRobo 듀얼암 로봇을 MuJoCo 3.7.0에서 시뮬레이션하고 RTX 5060(hb5u) EGL GPU 렌더링을 적용하여 4채널 카메라 스트리밍(Rerun)을 구현. 장기 실행 메모리 누수 3가지 원인 식별 및 수정.
개요
OpenArm WowRobo 듀얼암 로봇을 MuJoCo 3.7.0 환경에서 시뮬레이션하고,
EGL GPU 렌더링을 적용하여 실시간 카메라 스트리밍을 구현했다.
RTX 5060 (hb5u) GPU에서 MUJOCO_GL=egl 환경 변수로 하드웨어 가속을 활성화했다.
환경 구성
- 호스트: hb5u (Ubuntu 24.04, RTX 5060 8GB, CUDA 12.x)
- 시뮬레이터: MuJoCo 3.7.0
- 렌더링: EGL GPU (
MUJOCO_GL=egl) - 시각화: Rerun SDK 0.31.3 (gRPC 스트리밍, 웹뷰어)
로봇 모델
OpenArm WowRobo V4 듀얼암: - 양팔 각 7 DoF + 핑거 2 관절 = 총 18 관절 - 16 actuator - STL 메쉬 기반 시각화
카메라 구성 (4채널)
| 카메라 | 위치 | 해상도 |
|---|---|---|
| cam_top | (0.8, -0.8, 1.8) — 사선 위 | 640×480 |
| cam_front | (1.8, 0, 1.0) — 측면 | 640×480 |
| cam_left_wrist | left_link7 내부, 왼손목 추적 | 320×240 |
| cam_right_wrist | right_link7 내부, 오른손목 추적 | 320×240 |
카메라 모드: mode="targetbody" — 타겟 바디 자동 추적.
핵심 구현
import os
os.environ['MUJOCO_GL'] = 'egl'
import mujoco, rerun as rr
renderer_top = mujoco.Renderer(model, height=480, width=640)
server_uri = rr.serve_grpc(grpc_port=9876, server_memory_limit="512MB")
# 렌더링 루프
mujoco.mj_fwdPosition(model, data) # 카메라 렌더링 전 위치 계산
renderer_top.update_scene(data, camera="cam_top")
img = renderer_top.render()
rr.log("cameras/top", rr.Image(img))
del img
메모리 안정화 (장기 실행)
장기 실행 시 메모리 누수 3가지 원인을 식별하고 수정:
- Rerun gRPC 버퍼 무제한 누적 →
server_memory_limit="512MB"적용 - 타임라인 무한 증가 →
rr.set_time("sim", sequence=frame)고정 시퀀스 - NumPy 배열 미해제 →
del img,gc.collect()(300프레임마다),CAM_RENDER_EVERY=3
결과: RSS 1079MB에서 안정화 (frame=11400, t=507s 확인).
결과
- GPU VRAM: 13MB → 500MB (EGL 렌더링 확인)
- 시뮬레이션 루프: ~30fps (30ms sleep)
- 카메라 렌더링: ~10fps (3프레임마다 1회)
- Rerun 웹뷰어: http://localhost:9090
GitHub
https://github.com/moosjiny/moojoco
