ようこそ、 名無し ID:NVJR99KH さん(ゲスト)

← ブログ一覧へ戻る
投稿日: 2026-04-02 / 投稿者: 管理者 / タグ: ROS2, Isaac Sim, 強化学習, DevContainers, Docker, VS Code, リモート開発

【第2章】ROS2×Isaac Sim 強化学習環境:リモート接続とプロジェクト構築編

全10章シリーズ | カテゴリ: 環境構築チュートリアル

前章では、TailscaleによるVPN構築や、ホストPC(GPUマシン)のNVIDIA/Docker基盤のセットアップなど、開発を支える「インフラ」を完璧に整えました。

第2章となる本記事では、いよいよノートPCからホストPCへリモート接続し、「Dev Containers」を用いたプロジェクトの作成とコンテナの起動を行います。

この章で作る Dockerfiledevcontainer.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に接続します。

  1. ノートPCでVS Codeを起動します。
  2. キーボードの F1 キー(または Ctrl+Shift+P)を押してコマンドパレットを開きます。
  3. Remote-SSH: Connect to Host... と入力して選択します。
  4. ユーザー名@ホストPCのTailscale_IP (例: ubuntu@100.x.y.z)を入力し、Enterを押します。
  5. 初回は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)

ファイルが準備できたら、いよいよコンテナを起動します。

  1. VS Codeの F1 キーを押し、Dev Containers: Reopen in Container を選択します。
  2. 右下に「Starting Dev Container (show log)」と表示され、ビルドが始まります。
⚠️ 注意: 初回の起動時は、数GBあるIsaac SimのベースイメージのダウンロードとROS2のインストールが行われるため、ネットワーク環境によっては10〜20分程度かかります。 気長にお待ちください。(2回目以降は数秒で立ち上がります)。

起動後、VS Codeのターミナルを開き、nvidia-smiros2 --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 add .
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アプリ(描画)用の表示先を渡します(環境によって必要/不要が変わります)
ポイント: ここが理解できていると「GPUが見えない」「通信が通らない」「GUIが出ない」の原因が、ホスト側かコンテナ側かを切り分けやすくなります。

補足: 本記事では remoteUserroot にしています。開発初期は手順が簡単ですが、運用が固まってきたら非rootユーザー化も検討できます。

9. 起動後の検証コマンド(ホスト/コンテナの成功条件)

コンテナが起動したら、次のコマンドで「GPU」「ROS2」が動くことを確認します。ここを最初に固めておくと、第3章以降のシミュレーション作業で迷子になりません。

9.1 コンテナ内で確認
# GPUが見えるか(コンテナ内)
nvidia-smi

# ROS2が入っているか(コンテナ内)
ros2 --version
echo $ROS_DISTRO
which ros2

# パッケージ一覧が取れるか(コンテナ内)
ros2 pkg list | head
9.2 ホスト側で確認(切り分け用)

もしコンテナ内で失敗する場合は、ホストPC側でのGPU/Docker状態を確認します。

nvidia-smi
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失敗: unauthorizedauthentication 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を増やすときにも流用できます。

  1. ノートPCからRemote-SSHでホストPCに接続
  2. ホストPC上でリポジトリをclone
  3. VS Codeでフォルダを開く
  4. Dev Containers: Reopen in Container を実行
  5. 第9節の検証コマンドでGPU/ROS2の成功を確認
# clone(ホストPC上で実行)
cd ~
git clone git@github.com:<owner>/ur_rl_workspace.git
cd ur_rl_workspace

補足: devcontainer.jsonDockerfile を更新した場合は、Dev Containers: Rebuild Container を使うと差分を反映できます。

第2章 章末チェックリスト(次章へ進む前に)

  • Remote-SSHでホストPCに安定接続できる(できれば鍵認証)
  • リポジトリがGitHubにPushされ、2人目がcloneできる
  • Dev Containersが起動でき、コンテナ内で nvidia-smi が通る
  • コンテナ内で ros2 --versionecho $ROS_DISTRO が確認できる
  • .gitignore(必要ならLFS)が整備され、巨大ファイルを誤って入れない状態になっている

ここまでできたら、第3章の「シミュレーションの起動とリモート描画」に進む準備は万全です。

13. ROS2ワークスペースの“最小ビルド”で成功を確定させる

「ROS2が入っている」だけではなく、実際にワークスペースを作って colcon build まで通しておくと、第3章以降で不具合が起きても原因が切り分けやすくなります。

以下は、リポジトリ直下にROS2ワークスペース(ros2_ws)を置く想定の例です。コンテナ内で pwdls を実行し、いま開いている場所がリポジトリのルートか確認してから進めてください。

# コンテナ内で実行(場所の確認)
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: ... と出る → そのターミナルはコンテナ内
切り分けのコツ: 迷ったら whoamipwd を実行して「どこにいるか」を確定させてから次の手を打ちましょう。

16. Dev Containers運用(Rebuild / キャッシュ / ログ)

第2章で作ったDev Containerは、今後の章で更新していきます。更新時に迷わないよう、運用コマンドを先に押さえておきます。

  • 設定変更を反映: Dev Containers: Rebuild Container
  • 一度ホストに戻る: Dev Containers: Reopen Folder in SSH(状況により表示名が異なる場合があります)
  • 問題調査: Dev Containers: Show Log

Docker側の状況(イメージが増えすぎた等)を見たい場合は、ホストPC上で次を確認できます。

# ホストPCで実行(SSH接続中のターミナル)
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で進捗を確認
# ノートPC(クライアント)側の詳細ログ例
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の画面に美麗なシミュレーション空間を描画させる手順について解説します。ついにロボットの姿を見ることができます!