Unityで10台のmechArmを5×2配列で同時制御する|マルチロボットシミュレーション実験
LOG73R2R2R2026/2/19

Unityで10台のmechArmを5×2配列で同時制御する|マルチロボットシミュレーション実験

まずは10台のロボットアーム(5×2)を一斉に動かすというアイデアを実現してみます。

単なるデジタルツインを超えて、「ロボットフリート(群管理)」のシミュレーションへと一気にレベルが上がります。これが実現できれば、壮観なデモ動画になること間違いなしです。

ただし、一斉に動かすには「物理演算」と「通信」の負荷を賢くさばく必要があります。実現のための戦略を整理しました。

※注釈:デジタルツイン学習(R2R2R)の検証プロセス 本プロジェクトは、AIの判断を物理的動作へ変換する設計を検証するものです。現実空間をデジタルツイン化し、仮想空間での大量試行(Real-to-Render)から得た最適解を、実世界のモーター駆動(to-Real)へ還元する「R2R2Rパイプライン」の実装過程を記録・考察します。

10台同時稼働のための戦略

物理演算の「軽量化」(重要)

10台すべてに Articulation Body を乗せてフル物理演算をすると、MacBookにかなり負荷がかかる可能性があります。

  • 対策: 1台だけを「親(Master)」として物理演算し、残りの9台は「見た目(Transform)」だけを同期させる「インスタンシング」的な手法をClineに提案します。

通信の「オフセット(ズレ)」演出

「各々違う動き」をさせるために、ROS 2からの1つの指令に対して、各アームが数ミリ秒ずつ遅れて動いたり、回転角に $0.9x 〜 $1.1x の倍率をかけたりするスクリプトをClineに書かせます。

  • 効果: まるで10台が独立して意思を持っているような、有機的な群舞に見えます。

3DGSとの共存

10台のアームを表示しながら3DGSを描画するのはGPUへ負荷をかけます。

  • 対策: まずは「平地」で10台の動作を安定させ、最後に Low Load モードの3DGSを重ねる順番が安全です。

Clineへの「10台計画」指示プロンプト

ROS2の「ONLINE」状態をコミットし終えたら、Clineにこう切り出してみます。

新ミッション:ロボットアーム・オーケストラ

1.プレハブ化: 今の firefighter(設定済み)を Assets/Prefabs にプレハブとして保存して。
2.大量配置スクリプト: 10×10(計100台)のアームを 2m 間隔でグリッド状に配置するスクリプトを書いて実行して。
3.動きの多様化: ROSKinematicSync.cs を改造し、各アームが自身の座標(Index)に応じて、受信した角度にわずかな「時間差」や「角度の微差」を加えるようにして。
4.負荷対策: 動作が重い場合は、各関節の Collision Detection を Discrete に下げ、不要な物理判定をオフにして。

プレハブ(Prefab)による一括管理

「ONLINE成功アーム」をマスター(プレハブ)に設定します。

  • 理由: 1台ずつ設定するとミスが出ますが、プレハブなら1箇所直せば10体すべてに反映されます。

  • Clineへの指示: 「今の firefighter をプレハブ化して。特に Articulation Body の設定と ROSKinematicSync スクリプトを保持した状態で Assets/Prefabs/Robot_Master.prefab として保存して」。

個体差(バリエーション)の演出

全員が全く同じ動きをするよりも、少しずつズレがある方が「デジタルツインの群管理」感が出ます。

  • 戦略: ROSKinematicSync.cs に「ID(または座標)」に応じた微小な遅延(Delay)や振幅の倍率(Multiplier)を加えるプロパティを追加します。

  • 視覚効果: サイン波が横から流れていくような「ウェーブ」を10体で表現できます。

描画負荷の分散(GPU対策)

3DGSと10体のアームを同時に描画するため、以下の設定を徹底します。

  • SH Orderを0に固定: 3DGS側の負荷を最小限(Low Loadモード)に維持します。

  • 影の設定: アームの影が10体分あると重いため、重要な1〜2体以外は Cast Shadows をオフにするようClineに指示します。

Clineへの指示:

クローン作成 「Robot_Master プレハブを使って、5体×2列(間隔1.5m)で計10体のロボットを配置して。名前は firefighter_0 から firefighter_9 にして。」

個性を持たせる 「ROSKinematicSync.cs を改造し、public float waveDelay という変数を追加して。firefighter_N の N が大きいほど、ROS2からの受信データに対して 0.1秒 ずつ遅れて動くように計算して。」

3DGSの召喚 「10体が並んだら、Tools → 3DGS → Add GaussianSplat (Low Load) で実写背景を呼び出して。10体のアームが部屋の中に整列するように全体の座標を整えて。」

Clineからの指示を行い10体が並びます。

Unity画面-ロボットアーム10体

10体並ぶ前のClineの指示です。

## ✅ 3ステップ実装完了!(commit: 4dbb923)
### 実装内容
#### ステップ1: ROSKinematicSync.cs に waveDelay 追加
- public float waveDelay = 0f; を追加
- リングバッファ方式で過去のスナップショットを保持(最大200フレーム)
- targetTime = Time.time - waveDelay で N×0.1秒前のデータを適用
- デモモード時も waveDelay 分だけ位相をずらして波状に動く
#### ステップ2: SpawnRobotArmy.cs(Editor ツール)
- Tools → Robot Army → Spawn 10 Robots (5x2 Grid) で自動配置
- firefighter_0〜9 を 5体×2列、間隔1.5m で配置
- waveDelay を自動設定(firefighter_N → N×0.1秒)
#### ステップ3: 3DGS 背景 + フォーメーション調整
---
### Unity での操作手順
```
Step 1: Tools → Robot Army → Spawn 10 Robots (5x2 Grid)
→ firefighter_0〜9 が 5×2 グリッドで配置される
Step 2: Tools → 3DGS → Add GaussianSplat (Low Load)
→ 実写背景が追加される
Step 3: Tools → Robot Army → Adjust Formation (Room Center)
→ 10体を部屋の中心に整列(GaussianSplat に合わせて調整)
Step 4: Ctrl+S → ▶ Play
→ 10体が 0.1秒ずつ遅れて波状に動く!
```
### waveDelay の効果
| ロボット | 遅延 | 動き |
|---|---|---|
| firefighter_0 | 0.0秒 | リアルタイム |
| firefighter_1 | 0.1秒遅れ | |
| firefighter_5 | 0.5秒遅れ | |
| firefighter_9 | 0.9秒遅れ | 最後に動く |

10台のロボットアームが並ぶ様子を1つの画角におさめるために間隔を狭めます。

Clineへの指示:

配置の間隔調整
以下のプロンプトをそのまま Cline に送ってみてください。
「10台の配置をギュッと凝縮して」
1.配置の再計算: 現在 1.5m 間隔で並んでいる firefighter_0 〜 firefighter_9 の間隔を 0.6m(60cm) に狭めて。5体×2列の構成は維持して。
2.物理設定の凍結: 移動させるのは各ロボットの親オブジェクト(Transform)の Position だけにして。Articulation Body の Stiffness や Damping、および各 Joint の角度設定には絶対に触れないで。
3.カメラの自動調整: 10体全員が Game ビューの画角に収まるように、Main Camera の位置(Transform)を少し後ろに下げて調整して。
4.完了後の確認: 配置が終わったら、Play モードで「ONLINE」のまま全員が滑らかに動いているか確認して報告して。

動きはまだまだですが10体同時に表示することが可能になりました。

事業フェーズの確認と現在の立ち位置

「実世界のタスクをデジタルで解析・最適化し、再び現実へフィードバックする」という、純粋なデジタルツイン・エンジニアリングというのが基盤になります。

高精度な物体認識(3DGS)

  • 背景は不要ですが、「カップやコーヒーメーカー自体の3DGSモデル」は、アームが掴む・置くための「衝突判定(Collision)」や「位置把握」の基準として不可欠です。

現実の動きのキャプチャ(モーション解析)

  • 「カップを置く動き」を動画から抽出し、それを Unity のアームに流し込む。

  • ROS 2 経由で 10 台が「ONLINE」で同期できていることは、その動きをアームに「真似させる」ためのインフラが完成したことを意味します。

デジタル空間での最適化(シミュレーション)

  • 10体並べたのは、まさにこのためですね。異なるパラメータ(速度、軌道、関節の Stiffnes 等)を同時にシミュレートし、「どの動きが最もこぼさず、速く、安全か」を並列で解くための「実験場」が今、目の前にあります。

リアル実装(フィードバック)

  • Unityで最適化した軌道(joint_states)を再び ROS 2 経由で実機に送る。今の双方向通信の基盤があれば、これはスムーズに実現可能です。