【第2章】ROS2×Isaac Sim 強化学習環境:リモート接続とプロジェクト構築編
前章では、TailscaleによるVPN構築や、ホストPC(GPUマシン)のNVIDIA/Docker基盤のセットアップなど、開発を支える「インフラ」を完璧に整えました。
第2章となる本記事では、いよいよノートPCからホストPCへリモート接続し、「Dev Containers」を用いたプロジェクトの作成とコンテナの起動を行います。
この章で作る Dockerfile と devcontainer.json こそが、2人の開発者間で「全く同じROS2 × Isaac Sim環境」を瞬時に再現するための設計図となります。
- ノートPCのVS CodeからホストPCへSSH接続する
- GitHubリポジトリを作成し、プロジェクトの雛形を作る
- Dev Containersの設定ファイルを作成し、GPU対応コンテナを起動する
- 2人での共同開発に向けたGit管理のルール(.gitignore / LFS)を設定する
1. VS Code RemoteによるホストPCへの接続
まずはノートPC(クライアント)のVS Codeを開き、Tailscale経由でホストPCに接続します。
- ノートPCでVS Codeを起動します。
- キーボードの
F1キー(またはCtrl+Shift+P)を押してコマンドパレットを開きます。 Remote-SSH: Connect to Host...と入力して選択します。ユーザー名@ホストPCのTailscale_IP(例:ubuntu@100.x.y.z)を入力し、Enterを押します。- 初回はOSの種類(Linux)やフィンガープリントの確認が求められるので「Continue」を選択し、パスワードを入力します。
※ 左下の緑色のバーに「SSH: 100.x.y.z」と表示されれば接続成功です。これ以降、VS Codeのターミナル(Ctrl+`)を開くと、それはホストPCのターミナルとして動作します。
2. プロジェクトディレクトリとGitHubリポジトリの作成
ホストPCに接続した状態のVS Codeターミナルで、プロジェクトフォルダを作成し、GitHubにプッシュします。
mkdir ~/ur_rl_workspace
cd ~/ur_rl_workspace
# Gitの初期化
git init
# GitHub CLIを使ってプライベートリポジトリを作成し、リモートに紐付け
# (第1章で `gh auth login` を済ませているためスムーズに実行できます)
gh repo create ur_rl_workspace --private --source=. --remote=origin
その後、VS Codeのメニューから「ファイル」>「フォルダーを開く」を選択し、今作成した ~/ur_rl_workspace を開きます。
3. チーム開発の心臓部:Dev Containersの設計図作成
ここが最も重要なステップです。プロジェクトのルートディレクトリに .devcontainer というフォルダを作成し、その中に2つのファイルを作成します。
3.1 devcontainer.json の作成
VS Code拡張機能の自動インストール指定と、コンテナ起動時にGPUをフル活用するための引数(--gpus all や --network host)を定義します。
{
"name": "Isaac Sim & ROS2 Humble Environment",
"build": {
"dockerfile": "Dockerfile"
},
"runArgs": [
"--gpus", "all",
"--network", "host",
"--ipc", "host",
"--env", "DISPLAY=${env:DISPLAY}"
],
"customizations": {
"vscode": {
"extensions": [
"ms-python.python",
"ms-iot.vscode-ros",
"ms-vsliveshare.vsliveshare",
"mhutchie.git-graph"
]
}
},
"remoteUser": "root"
}
3.2 Dockerfile の作成
NVIDIAのIsaac Sim公式イメージに、ROS2 Humbleの環境を上乗せします。
# NVIDIA Isaac Sim 4.0.0 をベースイメージに指定
FROM nvcr.io/nvidia/isaac-sim:4.0.0
# 対話型プロンプトを無効化
ENV DEBIAN_FRONTEND=noninteractive
# ロケールのセットアップ
RUN apt-get update && apt-get install -y locales curl software-properties-common && \
locale-gen en_US en_US.UTF-8 && \
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
add-apt-repository universe
# ROS2 Humble のリポジトリ追加とインストール
RUN curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | tee /etc/apt/sources.list.d/ros2.list > /dev/null
RUN apt-get update && apt-get install -y \
ros-humble-desktop \
ros-dev-tools \
python3-colcon-common-extensions \
&& rm -rf /var/lib/apt/lists/*
# コンテナ起動時にROS2環境変数を自動読み込み
RUN echo "source /opt/ros/humble/setup.bash" >> /root/.bashrc
# コンテナに入った際の初期ディレクトリを指定
WORKDIR /workspace
4. コンテナのビルドと起動(Reopen in Container)
ファイルが準備できたら、いよいよコンテナを起動します。
- VS Codeの
F1キーを押し、Dev Containers: Reopen in Containerを選択します。 - 右下に「Starting Dev Container (show log)」と表示され、ビルドが始まります。
起動後、VS Codeのターミナルを開き、nvidia-smi と ros2 --version を実行して両方が正常に表示されれば、環境構築は成功です!
5. チーム開発のためのGit管理ルール設定
最後に、強化学習やROS2開発特有の「不要な巨大ファイル」をGitの管理から外すための設定を行います。プロジェクトのルート(.devcontainer と同じ階層)に .gitignore ファイルを作成します。
# ROS2 Workspaces build/ install/ log/ # Python, AI Models, and Isaac Sim logs __pycache__/ *.pyc *.pth *.pt runs/ logs/ *.usd
この状態を最初のコミットとしてGitHubにPushしておきましょう。
git commit -m "Initial commit: Add DevContainer and gitignore"
git push -u origin main
共同開発者のノートPCからは、このリポジトリを git clone して「Reopen in Container」するだけで、あなたが構築したのと全く同じ環境が数分で手に入ります。
6. Remote-SSHを安定化する(鍵認証 + 接続エイリアス)
本記事の手順ではパスワード入力で接続していますが、チーム開発で繰り返し接続する場合は鍵認証のほうが安定します(毎回の入力が不要で、VS Code接続も失敗しにくい)。
6.1 ノートPCでSSH鍵を作る
# ノートPCで実行(例) ssh-keygen -t ed25519 -C "your_email@example.com" # 公開鍵の確認 cat ~/.ssh/id_ed25519.pub
6.2 公開鍵をホストPCへ登録する
ホストPCの ~/.ssh/authorized_keys に公開鍵を追記します。ssh-copy-id が使える場合はそれが簡単です。
# 1) ssh-copy-id がある場合 ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu@100.x.y.z # 2) ない場合(手動で追記) cat ~/.ssh/id_ed25519.pub | ssh ubuntu@100.x.y.z "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
6.3 ~/.ssh/config に接続先を登録する(任意)
接続先をエイリアス化しておくと、コマンドもVS Codeの接続先選択も揃えられます。
# ノートPC: ~/.ssh/config(例) Host isaac-host HostName 100.x.y.z User ubuntu IdentityFile ~/.ssh/id_ed25519 IdentitiesOnly yes ServerAliveInterval 60 ServerAliveCountMax 3
これ以降は ssh isaac-host のように接続できます。Remote-SSHも同じホスト名を使えるため、接続が一気に安定します。
7. 2人開発を見据えたリポジトリ構成(最小の型)
第2章の段階で「何をGitで管理し、何を生成物として捨てるか」を決めておくと、後々の事故(巨大ファイルのPushや環境差分)を防げます。まずは最小の構成例です。
ur_rl_workspace/
.devcontainer/
devcontainer.json
Dockerfile
ros2_ws/
src/
scripts/
README.md
.gitignore
ros2_ws/: ROS2のワークスペース(colconのbuild/install/logはGit管理外)scripts/: 起動・検証・便利コマンド(2人の作業を揃える)README.md: セットアップ手順と“成功条件”を書く(オンボーディングの時短)
8. Dev Containers設計の深掘り(runArgs の意味を理解する)
第2章で作成した devcontainer.json は「開発環境の再現性」を担保する中核です。特に runArgs は、GPU/描画/ネットワークを左右するため、意図を理解しておくとトラブル時の切り分けが速くなります。
--gpus all: コンテナにGPUを割り当てます(NVIDIA Container Toolkitが前提)--network host: ホストのネットワーク名前空間を共有します(通信の問題が減る反面、セキュリティ/ポート衝突に注意)--ipc host: 共有メモリ周りの制約を減らします(重い処理で有利なことがあります)DISPLAY: GUIアプリ(描画)用の表示先を渡します(環境によって必要/不要が変わります)
補足: 本記事では remoteUser を root にしています。開発初期は手順が簡単ですが、運用が固まってきたら非rootユーザー化も検討できます。
9. 起動後の検証コマンド(ホスト/コンテナの成功条件)
コンテナが起動したら、次のコマンドで「GPU」「ROS2」が動くことを確認します。ここを最初に固めておくと、第3章以降のシミュレーション作業で迷子になりません。
9.1 コンテナ内で確認
nvidia-smi
# ROS2が入っているか(コンテナ内)
ros2 --version
echo $ROS_DISTRO
which ros2
# パッケージ一覧が取れるか(コンテナ内)
ros2 pkg list | head
9.2 ホスト側で確認(切り分け用)
もしコンテナ内で失敗する場合は、ホストPC側でのGPU/Docker状態を確認します。
docker info | head -n 40
docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
10. 典型的な失敗と対処(Dev Containers / Docker)
初回ビルドは時間がかかるうえ、外部要因(ネットワーク、認証、権限)で失敗しやすいです。代表的なパターンと切り分け観点をまとめます。
- Dockerの権限エラー:
permission denied while trying to connect to the Docker daemon socket
→ ユーザーがdockerグループに入っているか確認(groups)。追加後は再ログインが必要です。 - GPUが見えない:
nvidia-smiがコンテナ内で失敗
→ ホストでnvidia-smiが通るか、さらにdocker run ... nvidia-smiで最小確認します。 - ベースイメージのpull失敗:
unauthorizedやauthentication required
→ 環境によってはnvcr.ioにログインが必要な場合があります。必要に応じてNVIDIA NGCのAPIキーを用意し、Dockerログインを行います。 - VS Code側の原因: ビルドログが見えず止まったように見える
→Dev Containers: Show Logでログを確認し、どこで止まっているか(pull/apt/ネットワーク)を把握します。
# (必要な場合)nvcr.io へログイン # - username: $oauthtoken # - password: NGCで発行したAPI Key docker login nvcr.io
補足: 認証方式は環境や配布条件に依存します。pullできない場合はログ(Show Log)を見て原因を確認しましょう。
11. Git運用の深掘り(ブランチ戦略 / LFS / 巨大ファイル対策)
強化学習やシミュレーションは、ログやモデルが簡単に巨大化します。第2章のうちに「巨大ファイルをどう扱うか」を決めておくと、リポジトリが壊れません。
11.1 最小のブランチ戦略(2人向け)
- main: 動く状態を維持(章が進むたびにマイルストーン的に更新)
- feature/*: 作業ブランチ(小さく作って早めにマージ)
11.2 Git LFS(Large File Storage)の導入(任意)
USDアセットや学習済みモデルなど、巨大バイナリをGit管理したい場合はLFSが有効です。必要な人だけでも良いので、チームで方針を揃えましょう。
# LFS初期化 git lfs install # 追跡したい拡張子の例(必要に応じて) git lfs track "*.usd" git lfs track "*.usda" git lfs track "*.pt" git lfs track "*.onnx" # ルールファイル(.gitattributes)をコミットする git add .gitattributes git commit -m "chore: enable git lfs"
注意: 学習ログ(runs/など)や一時データは、基本的にGitに入れないほうが安全です(再現性はスクリプトと設定で担保する)。
12. 共同開発者(2人目)のオンボーディング手順
ここまでの設計ができていれば、2人目は「同じ環境」を短時間で再現できます。手順を固定化しておくと、後でPCを増やすときにも流用できます。
- ノートPCからRemote-SSHでホストPCに接続
- ホストPC上でリポジトリをclone
- VS Codeでフォルダを開く
Dev Containers: Reopen in Containerを実行- 第9節の検証コマンドでGPU/ROS2の成功を確認
cd ~
git clone git@github.com:<owner>/ur_rl_workspace.git
cd ur_rl_workspace
補足: devcontainer.json や Dockerfile を更新した場合は、Dev Containers: Rebuild Container を使うと差分を反映できます。
第2章 章末チェックリスト(次章へ進む前に)
- Remote-SSHでホストPCに安定接続できる(できれば鍵認証)
- リポジトリがGitHubにPushされ、2人目がcloneできる
- Dev Containersが起動でき、コンテナ内で
nvidia-smiが通る - コンテナ内で
ros2 --versionとecho $ROS_DISTROが確認できる - .gitignore(必要ならLFS)が整備され、巨大ファイルを誤って入れない状態になっている
ここまでできたら、第3章の「シミュレーションの起動とリモート描画」に進む準備は万全です。
13. ROS2ワークスペースの“最小ビルド”で成功を確定させる
「ROS2が入っている」だけではなく、実際にワークスペースを作って colcon build まで通しておくと、第3章以降で不具合が起きても原因が切り分けやすくなります。
以下は、リポジトリ直下にROS2ワークスペース(ros2_ws)を置く想定の例です。コンテナ内で pwd と ls を実行し、いま開いている場所がリポジトリのルートか確認してから進めてください。
# コンテナ内で実行(場所の確認) pwd ls # ROS2ワークスペース作成 mkdir -p ros2_ws/src cd ros2_ws # サンプルパッケージ作成(Python) cd src ros2 pkg create --build-type ament_python ur_sample_pkg --dependencies rclpy # ビルド cd .. colcon build # 環境を読み込み(以後のターミナルでも必要) source install/setup.bash # できたか確認 ros2 pkg list | grep ur_sample_pkg
補足: ここで詰まる場合は「ROS2の環境が読めていない(setup.bash)」「依存が入っていない」「ワークスペースの場所が想定と違う」などが原因になりやすいです。
14. rosdep で依存解決をチームで揃える(任意だが強力)
チーム開発でよくある事故が「片方のPCではビルドできるのに、もう片方ではできない」です。これを減らすには、OSパッケージ依存を rosdep で揃えるのが定石です。
# コンテナ内で実行(初回は少し時間がかかることがあります) rosdep update # 依存を自動インストール(ワークスペースのsrcを指定) cd ros2_ws rosdep install --from-paths src --ignore-src -r -y
ポイント: 依存解決は“どこで実行するか(ホストかコンテナか)”が重要です。本シリーズでは開発環境は基本的にコンテナ内に揃えます。
15. 「ホストPC」と「コンテナ内」を混同しない(超重要)
Remote-SSHとDev Containersを併用すると、VS Code上でターミナルが指している場所が変わります。ここを混同すると「dockerコマンドが見つからない」「設定したはずなのに反映されない」といった迷子が起きます。
- SSH接続中: 左下に
SSH: ...と出る → そのターミナルはホストPC上 - Dev Container中: 左下に
Dev Container: ...と出る → そのターミナルはコンテナ内
whoami と pwd を実行して「どこにいるか」を確定させてから次の手を打ちましょう。
16. Dev Containers運用(Rebuild / キャッシュ / ログ)
第2章で作ったDev Containerは、今後の章で更新していきます。更新時に迷わないよう、運用コマンドを先に押さえておきます。
- 設定変更を反映:
Dev Containers: Rebuild Container - 一度ホストに戻る:
Dev Containers: Reopen Folder in SSH(状況により表示名が異なる場合があります) - 問題調査:
Dev Containers: Show Log
Docker側の状況(イメージが増えすぎた等)を見たい場合は、ホストPC上で次を確認できます。
docker image ls | head -n 30
docker system df
17. 追加トラブルシュート(ネットワーク/鍵/ビルド)
最後に、よくある“もう一段深い”詰まりどころをまとめます。ログを見る前に、まずは最小コマンドで現象を確定させるのがポイントです。
- SSHが急に繋がらない: ノートPCから
ssh -vを試し、ホストではjournalctl -u sshを確認 - DNS/ネットワークが怪しい: コンテナ内で
apt-get updateが失敗する場合は、ホストのネットワーク/名前解決の影響を疑う - Pullが遅すぎる/止まる: 初回は数GB規模になるため、時間がかかるのは正常。止まって見える場合はShow Logで進捗を確認
ssh -v isaac-host
# ホストPC側のログ(SSH接続中に実行)
sudo journalctl -u ssh --no-pager -n 200
18. README.md テンプレ(オンボーディングを最短にする)
2人開発で最も効くのは、手順や成功条件を README.md に“1枚”で集約することです。第2章の段階で雛形を作っておくと、以降の章で更新していくだけでチームの作業が揃います。
以下はそのまま貼れるテンプレ例です(必要に応じて更新してください)。
# ur_rl_workspace ROS2 × Isaac Sim(Isaac Lab)強化学習のチーム開発用リポジトリ。 ## 前提(第2章時点) ### Host(GPUマシン) - Ubuntu - NVIDIA driver(hostで nvidia-smi が通る) - Docker + NVIDIA Container Toolkit(docker run ... nvidia-smi が通る) - Tailscale(tailnet内でホストが見える) ### Client(ノートPC) - VS Code - Remote-SSH / Dev Containers 拡張 - (推奨)SSH鍵でホストへ接続できる ## 重要: いまどこで操作しているか - VS Code左下が「SSH: ...」ならホストPC上 - VS Code左下が「Dev Container: ...」ならコンテナ内 迷ったら whoami / pwd を実行する。 ## クイックスタート(2人目の手順) 1) ノートPCから Remote-SSH でホストに接続 2) ホスト上で clone git clone git@github.com:<owner>/ur_rl_workspace.git cd ur_rl_workspace 3) VS Codeでフォルダを開き、Dev Containers: Reopen in Container 4) コンテナ内で検証(成功条件) nvidia-smi ros2 --version echo $ROS_DISTRO ## ディレクトリ - .devcontainer/ : 開発環境の設計図 - ros2_ws/ : ROS2ワークスペース(build/install/log はGit管理外) - scripts/ : 起動・検証スクリプト ## よくある問題 - Docker権限エラー: dockerグループ追加後に再ログイン - nvcr.io pull失敗: 必要なら docker login nvcr.io(NGC APIキー) - GPUが見えない: ホストで nvidia-smi → docker run ... nvidia-smi の順で切り分け ## 更新のしかた - devcontainer.json / Dockerfile を更新したら Rebuild Container - 章が進むごとにREADMEの成功条件と手順を更新する
ポイント: READMEが育つほど、オンボーディングとトラブル対応が速くなります(2人開発の“速度”を決める場所です)。
第2章のまとめと次章の予告
本章では、Tailscale経由でホストPCにアクセスし、Dev Containersを使って「GPUにフルアクセス可能なROS2 × Isaac Simコンテナ」を起動しました。さらに、チーム開発のためのGit環境も整備しました。
続く【第3章】では、いよいよIsaac Sim(Isaac Lab)を起動し、Omniverse Streaming Clientを使ってノートPCの画面に美麗なシミュレーション空間を描画させる手順について解説します。ついにロボットの姿を見ることができます!