概要
ホストOS(Ubuntu 18.04 / L4T R32.7.1)はそのままにして、Dockerのベースイメージだけを dustynv/ros:humble-pytorch-l4t-r32.7.1 に差し替えることで、モーター・OLED・CSIカメラ(15fps)までHumbleで動作することを確認した。
- 対象機材: Waveshare JetBot AI Kit(0.91インチOLED、TB6612FNG、I2C接続)
- ベース環境: Jetson Nano / JetPack 4.6.x(L4T R32.7.1)/ Ubuntu 18.04
-
前提: Foxy版の手順で
dusty-nv/jetbot_rosのDocker環境が構築済み(Dockerfileの修正①〜③、モーター専用launch、csi_camera_node.py)
Jetson NanoはUbuntu 22.04が公式サポート外のため、ホストを上げるとGPUや nvarguscamerasrc が使えなくなるリスクがある。dusty-nvがJetPack 4向けにソースビルドしたHumbleコンテナを使えば、この問題を避けられる。なお、コンテナ内のPythonは3.6のまま。
Gazeboは移行対象から外した。シミュレータはIsaac Simを使う方針で、Gazeboのビルドはメモリ不足やHumbleとの不整合で落ちやすいため。
手順
手順1:事前準備
Foxy版イメージ(jetbot_ros:foxy-r32.7.1-stable)はタグが別なので上書きされない。念のため docker save のバックアップがあることを確認し、空き容量とスワップも確認する。
df -h
swapon --show
cd ~/jetbot_ros
git checkout -b humble
手順2:Dockerのデフォルトランタイムをnvidiaにする
build.sh の冒頭コメントでも推奨されている設定。ビルド中にGPUライブラリを参照するステップで失敗しないようにする。
sudo tee /etc/docker/daemon.json > /dev/null << 'EOF'
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "nvidia"
}
EOF
sudo systemctl restart docker
sudo docker info | grep -i "default runtime"
Default Runtime: nvidia と出ればOK。
手順3:launchファイルを新書式に変更
Humbleでは node_executable などの旧引数が削除されているため、置換しておく。
sed -i 's/node_executable=/executable=/; s/node_name=/name=/; s/node_namespace=/namespace=/' launch/*.py
grep -rn "node_executable" launch/
手順4:DockerfileからGazeboを除外する
Foxy版の修正①〜③(APT鍵の無効化、-j1、ros_deep_learning の除外)はそのまま残す。そのうえで、Gazebo関連の4ブロックを外す。行番号はFoxy版の修正を適用した直後のもの。
cp Dockerfile Dockerfile.bak
sed -i \
-e '52,58d' \
-e '62,64d' \
-e '65s/^ *pip3/RUN pip3/' \
-e '67s/^/#/' \
-e '73,93s/^/#/' \
-e '143,148s/^/#/' \
Dockerfile
| 対象 | 変更内容 |
|---|---|
| apt-get(Gazebo・blender等) |
nano 以外を削除 |
| py3gazebo | cloneを削除し、pynput だけ独立した RUN で残す |
ENV PYTHONPATH=/opt/py3gazebo |
コメントアウト |
gazebo_ros_pkgs のソースビルド |
丸ごとコメントアウト |
| Gazeboプラグインのcmake/make | 丸ごとコメントアウト |
apt-getの中の行はコメントアウトではなく削除にする。\ で続くRUN命令の途中に # 行を入れると、Dockerのバージョンによって挙動が変わるため。残る GAZEBO_* の ENV 3行は無害なのでそのままでよい。
手順5:net-toolsとカメラノードを追加する
Humbleのベースイメージには ifconfig が入っておらず、OLEDノードがIP取得で落ちる。apt-getに net-tools を追加する。また、カメラノードをイメージに含めておく。
sed -i 's/^\([[:space:]]*\)nano \\$/&\n\1net-tools \\/' Dockerfile
sed -i '/^COPY setup.cfg/a COPY csi_camera_node.py /root/csi_camera_node.py' Dockerfile
手順6:改行コードをLFに揃える
過去の修正でCRLF(^M)が混入していたため、ビルド前にLFに統一する。
sed -i 's/\r$//' Dockerfile
file launch/*.py
git diff Dockerfile | grep -c $'\r'
最後のコマンドで 0 と出ればOK。launchファイルに CRLF と表示されたものがあれば、同じsedで直す。
手順7:ビルド
build.sh は第1引数でROSディストリビューションを受け取り、ベースイメージを dustynv/ros:humble-pytorch-l4t-r32.7.1 に自動で切り替える。
docker/build.sh humble 2>&1 | tee ~/build_humble.log
Gazeboを外したため、Foxy版で1〜2時間かかったビルドが大幅に短くなる。Successfully tagged jetbot_ros:humble-r32.7.1 で完了。
手順8:起動(2ターミナル構成)
run.sh のデフォルトはfoxyのため、--ros humble を指定する。
ターミナルA:
docker/run.sh --ros humble
# コンテナ内で
ros2 launch jetbot_ros jetbot_motors_only.launch.py
起動ログの CONTAINER: が jetbot_ros:humble-r32.7.1、ROS_DISTRO humble になっていることを確認する。
ターミナルB:
sudo docker exec -it jetbot_ros /bin/bash
ros2 run jetbot_ros teleop_keyboard
手順9:カメラの動作確認
まず前提ライブラリを確認する。
python3 -c "from cv_bridge import CvBridge; print('cv_bridge ok')"
python3 -c "import cv2; print([l.strip() for l in cv2.getBuildInformation().splitlines() if 'GStreamer' in l])"
cv_bridge ok と GStreamer: YES (1.14.5) が出ればOK。Foxy版の csi_camera_node.py がコード変更なしで動く。
python3 ~/csi_camera_node.py
# 別ターミナルで
ros2 topic hz /jetbot/camera/image_raw
average rate: 15.0 前後で安定すれば成功。
手順10:保存
sudo docker commit jetbot_ros jetbot_ros:humble-r32.7.1-stable
sudo docker save jetbot_ros:humble-r32.7.1-stable -o ~/jetbot_ros_humble_backup.tar
git add Dockerfile csi_camera_node.py launch/ docker/
git commit -m "Migrate to ROS 2 Humble: drop Gazebo, add net-tools, include CSI camera node"
次回からは docker/run.sh -c jetbot_ros:humble-r32.7.1-stable で保存したイメージを起動できる。
つまずきポイントと対処
| 症状 | 原因 | 対処 |
|---|---|---|
Temporary failure resolving 'packages.ros.org' でapt-getが失敗 |
ビルド中の一時的なDNS解決失敗(Gazeboのパッケージ取得時) | ホストで ping packages.ros.org を確認して再実行。Gazeboを除外すればこのステップ自体がROSリポジトリに依存しなくなる |
pip実行時に setuptools>=61.0 のエラーが大量に出る |
コンテナのPythonが3.6のため、新しい evdev / spidev が入らない |
無視してよい。pipが自動で3.6対応版(evdev 1.6.1、spidev 3.5)に落としてインストールする |
OLEDノードが ifconfig: not found で落ちる |
Humbleのベースイメージに net-tools が無い |
手順5で net-tools を追加。その場しのぎならコンテナ内で apt-get install -y net-tools
|
docker/run.sh でFoxyのコンテナが起動する |
run.sh のデフォルトが ROS_DISTRO="foxy"
|
docker/run.sh --ros humble で起動する |
git diff で変更行の末尾に ^M が出る |
過去の修正でCRLF改行が混入 | 手順6で sed -i 's/\r$//' Dockerfile
|
xhost: unable to open display などの警告 |
SSH接続でXディスプレイが無い | Foxy版と同じく無視してよい |
次のステップ
RTX PC側のIsaac SimとROS 2 Humbleでつなぎ、/jetbot/camera/image_raw を受信してデジタルツインの監視に使う。両側で ROS_DOMAIN_ID とRMW実装(デフォルトのFast DDS)を揃える。