デジタルツイン学習-R2R2R デモ動画撮影用ミッション
Claude Code Agent Team(Cline)に以下の「デモ動画撮影用ミッション」を命じます。
※注釈:デジタルツイン学習(R2R2R)の検証プロセス 本プロジェクトは、AIの判断を物理的動作へ変換する設計を検証するものです。現実空間をデジタルツイン化し、仮想空間での大量試行(Real-to-Render)から得た最適解を、実世界のモーター駆動(to-Real)へ還元する「R2R2Rパイプライン」の実装過程を記録・考察します。
Clineへの指示:デモ動画用スムーズ同期モードの実装
物理演算(Articulation Body)のガクつきは一旦無視する。まずは『ROS2とUnityが完璧に連動している証拠映像』を撮るために、以下の設定を行って。
1. 物理の無効化:firefighter以下の全リンクのArticulation Bodyを、一時的にImmovableにするか、またはスクリプトでisKinematic = trueのような挙動(物理計算をせず、座標指定だけで動く状態)に変更して。
2. 完璧な同期スクリプトの作成: ROS2からのJointStateメッセージを受け取ったら、それを物理演算を介さず直接Transform.localRotationに反映させる軽量な同期スクリプトを作成・適用して。
3. デモ用UIの表示: 画面上のHUDに『ROS 2 Connection: ONLINE』と『Sync Mode: KINEMATIC (DEMO)』と大きく表示させて。
4. 導通テスト: Docker側のブリッジからテスト用の角度データを送り、Unityのアームがカクつかずに『スーッ』と動くことを確認して。
準備ができたら教えて。15秒の画面収録を開始する!

「ROS 2 Connection: OFFLINE」 と 「Sync Mode: KINEMATIC」 の文字が出ました。デモ用の画面が組み上がりました。
現在は「OFFLINE」になっていますが、これは想定内です。これからDocker側のブリッジと接続して、この文字を 「ONLINE」 に変え、アームを動かす最終工程に入ります。
Unityはいつでも指示を受け取れる待機状態です。Clineに以下の手順で 指示します。
Dockerブリッジの起動確認
Clineに以下の確認を命じます。
Dockerの
ros2_simコンテナで、unity_ros_bridge.pyがポート10000で待機しているか確認して。止まっていたら再起動して。
UnityとROS 2を「ONLINE」にする
Unityの再生ボタンは押したままで大丈夫です。Clineがブリッジを立てれば、画面の表示が自動で 「ONLINE」 に切り替わります。
テスト用のサイン波を流す
Clineに動画撮影用の滑らかな動きを作らせます。
接続が ONLINE になったら、ROS 2側から link2 や link3 をゆらゆらと往復させるテスト用のサイン波データをパブリッシュして。動画を撮るから、ガクつかずにスムーズに動くように調整して!
Cline は 「Docker に繋がらない!」 と言って困っています。ターミナルに赤文字で failed to connect to the docker API と出ているのは、Cline(Mac本体)が Docker への入り口を見失っている状態なので新しく指示を出します。
Cline への「接続復旧&デモ実行」指示
Cline のチャット欄に、以下の手順をそのまま送ります。
「Docker への接続エラーが出ているね。まずはインフラを立て直して、デモ動画の撮影準備を完了させよう。以下の手順を順番に実行して:
1. Docker の生存確認:
docker ps -aでros2_simコンテナの状態を確認して。もし Docker 自体が立ち上がっていないなら、指示を出すから教えて。2. ブリッジの強制起動: コンテナが動いたら、
docker execでunity_ros_bridge.pyをポート 10000 で起動して。起動ログにStarting Bridgeと出るのを確実に確認して。3. スクリプトの最終確認: Unity 側の
ROSKinematicSync.csにエラーが残っていないか再点検して。もしエラーがあれば、さっきのimmovableプロパティを使う方法で修正して。4. サイン波のパブリッシュ: 準備ができたら、映像撮影用に
link2がゆっくり往復するテストデータを ROS 2 側から流し始めて。」
docker exec コマンドで送った数値に従って、アームの角度が変化します。

通信の貫通: Docker内のROS 2から放たれたパケットが、Pythonブリッジを抜け、Unityの
ROSKinematicSyncまで1ミリ秒の狂いもなく到達しています。物理の克服: あれほど悩ませた「ガクガク」や「バラバラ」が嘘のように消え、指定した座標へスッと移動する「制御可能なアーム」が完成しました。
次はROS2の「OFFLINE」を「ONLINE」に変えて、15秒動画を撮れる状態にするための最終チェックを Cline とします。
OFFLINE を ONLINE に変えるためのチェックリスト
ブリッジの生存確認: Docker内で
unity_ros_bridge.pyが今この瞬間も動いている必要があります。Clineに以下のコマンドを確認します。
docker exec ros2_sim ps aux | grep python
Unity側の接続先設定: Unityの
ROSConnectionコンポーネントで、IP Address が127.0.0.1(またはMacのIP)、Port が10000になっているか再確認が必要です。KinematicSyncの接続待機:
ROSKinematicSyncスクリプトが、ブリッジからの「接続完了メッセージ」を正しく受け取れる状態か Cline にコードを点検させます。
Clineへ新しい指示:
単発でアームは動いたが、画面の表示はまだ「OFFLINE」のままです。これでは証拠映像として不完全なので、以下の対応をして。
ブリッジの常時起動: Docker内の
unity_ros_bridge.pyが、単発命令の後に終了していないか確認し、常時稼働させて。
接続ステータスの同期: Unity側のROSKinematicSync.csが、実際のネットワーク接続状態を反映して「ONLINE」に切り替わるようにコードを修正して。
疎通の再確認: UnityのPlayモード中に、再度サイン波データを送り、画面が『ONLINE』に変わるかテストして。
緑色の ONLINE が出たら教えて。そこから動画を撮るよ!」
ROS 2 Connection: ONLINEになりました。

映像を撮影
撮影範囲の設定:
Command + Shift + 5を押し、UnityのGame画面 と、隣で数値が動いている VS Codeのターミナル の両方が入るように範囲を広げます。
ドラマを動かす:
Clineに最後の一押しをお願いします:
「ONLINEになった!最高だ。今から録画するから、link1からlink3までをサイン波でゆっくり動かすデモスクリプトをDocker側で回し始めて!」
録画スタート:
ターミナルに数値が流れ、mechArmが「スーッ……スーッ……」と動き始めたら録画開始!
そのまま15秒間、その動画を撮影します。
ROS 2とUnityの完全同期のテスト用デモ動画が撮れました。
ロボットアームの角度は修正する必要がありますが、UnityとROS2、Clineが連携してロボットアームを動かす様子を撮影することが出来ました。
狙った通りには動かなかったけれど、通信は完璧に通っている。
ROS 2の数字が変われば、Unityのアームも(横を向きながら)必死に追従している。
