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体が並びます。

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 経由で実機に送る。今の双方向通信の基盤があれば、これはスムーズに実現可能です。
