前提
SkyWay x ROS 2 クックブックを参考に、Azure VM(GPU なし)上で Gazebo Harmonic を headless で起動し、TurtleBot3 のカメラ映像を SkyWay 経由でブラウザに配信するデモを構築中に遭遇した問題です。
環境
- Gazebo Harmonic(headless:
-sフラグ) - ROS 2 Jazzy
- Azure VM Standard_D4s_v3(4 vCPU / GPU なし)
- Docker コンテナ上で実行
- ロボットモデル: TurtleBot3 Burger(デフォルト)
現象
Gazebo を headless で起動したところ、Real-Time Factor(RTF)が 0.0015(実時間の 0.15%)。カメラトピックにメッセージが流れず、映像が届かない。
gz stats
# real_time_factor: 0.0015
試したこと: VM スケールアップ
VM を D4s_v3(4 vCPU)→ D16s_v3(16 vCPU)にスケールアップ。
結果: RTF 0.0015 → 0.0023。ほぼ変わらず。
原因
TurtleBot3 デフォルトモデルの wideanglecamera センサー。このカメラタイプは内部でキューブマップ(6 面レンダリング)を行うため、GPU なしの CPU-only 環境では処理が追いつかない。Ogre2 のレンダリングは GPU 前提の設計なので、CPU コアを増やしても効果が薄い。
解決
TurtleBot3 の model.sdf をコピーして軽量版を作成し、volume mount でデフォルトモデルを差し替えた。主な変更点はカメラセンサーの種類とフレームレートの削減。
| パラメータ | デフォルト | 軽量版 |
|---|---|---|
| カメラタイプ |
wideanglecamera(キューブマップ) |
camera(通常レンダリング) |
| 解像度 | 320x240 | 160x120 |
| フレームレート | 30 FPS | 1 Hz |
| LiDAR | 5 Hz | 1 Hz |
| IMU | 200 Hz | 50 Hz |
# docker-compose.yml での差し替え
volumes:
- ./models/turtlebot3_burger_cam/model.sdf:/root/turtlebot3_ws/install/turtlebot3_gazebo/share/turtlebot3_gazebo/models/turtlebot3_burger_cam/model.sdf:ro
結果: RTF 0.0015 → 0.978。VM スケールアップより 600 倍以上の効果。
まとめ
GPU なしの headless 環境で Gazebo を動かすなら、まず疑うべきはセンサーの重さ。wideanglecamera → camera への変更とフレームレート・解像度の削減が最も効果的だった。