Jetson Nano用のDockerfileです。
主にROS関係のDockerfileを揃えています。
TensorFlowやPyTorch関連のDockerfileはdusty-nv/jetson-containersに公開されているのでそちらをご利用ください。
- L4T R32.4.3 (JetPack 4.4)
- L4T R32.4.4 (JetPack 4.4.1)
- L4T R32.5.0 (JetPack 4.5) / R32.5.1 (JetPack 4.5.1)
- L4T R32.6.1 (JetPack 4.6.1)
以下の手順でこのDockerfileを使用できます。
詳細およびサンプルの実行方法は後述します。
Jetson NanoのOS、L4Tを含むJetPackにはあらかじめNVIDIAのドライバが有効になったDockerがインストールされているようです。
以下のページによるとDockerインストール済みなのはJetPack 4.2.1以降のようです。
https://github.com/NVIDIA/nvidia-docker/wiki/NVIDIA-Container-Runtime-on-Jetson
CUDAコンパイラを扱えるようにするため、
以下のページを見ながら/etc/docker/daemon.json
を編集し、
docker build
時にもGPUへのアクセスを有効にします。
https://github.com/dusty-nv/jetson-containers#docker-default-runtime
CUDAに依存しない一部のDockerイメージについてはJetson Nano上ではなく、より処理能力の高いPC上でクロスビルドできます。
クロスビルドしない場合はこの手順は不要です。
PCにDockerをインストールします。
UbuntuにDockerをインストールする場合、Docker社が用意しているインストールスクリプトを使うのが簡単だと思いますので、おすすめします。
$ curl -SsfL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
$ sudo usermod -aG docker $(whoami)
以下のページに詳細があります。
https://docs.docker.com/engine/install/ubuntu/#install-using-the-convenience-script
その他のOSについても以下のページに記載があるようです。
https://docs.docker.com/engine/install/
macOSの場合はそのままビルドできます。
Linuxの場合は以下のコマンドで multiarch/qemu-user-static を使ってクロスビルドできるように設定できます。
docker build
時やdocker run
時にstandard_init_linux.go:211: exec user process caused "exec format error"
というエラーが出た場合は、以下のコマンドを再度実行してみてください。
$ sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
Unable to find image 'multiarch/qemu-user-static:latest' locally
latest: Pulling from multiarch/qemu-user-static
9758c28807f2: Pull complete
1541dc593e72: Pull complete
ed8a5179ae11: Pull complete
1ec39da9c97d: Pull complete
ebb26d08461b: Pull complete
Digest: sha256:a9944443ade713bc12ca0579c0e15a090ab43aa7a0d7b4c6883d1fbd44f6902f
Status: Downloaded newer image for multiarch/qemu-user-static:latest
Setting /usr/bin/qemu-alpha-static as binfmt interpreter for alpha
Setting /usr/bin/qemu-arm-static as binfmt interpreter for arm
Setting /usr/bin/qemu-armeb-static as binfmt interpreter for armeb
Setting /usr/bin/qemu-sparc-static as binfmt interpreter for sparc
Setting /usr/bin/qemu-sparc32plus-static as binfmt interpreter for sparc32plus
Setting /usr/bin/qemu-sparc64-static as binfmt interpreter for sparc64
Setting /usr/bin/qemu-ppc-static as binfmt interpreter for ppc
Setting /usr/bin/qemu-ppc64-static as binfmt interpreter for ppc64
Setting /usr/bin/qemu-ppc64le-static as binfmt interpreter for ppc64le
Setting /usr/bin/qemu-m68k-static as binfmt interpreter for m68k
Setting /usr/bin/qemu-mips-static as binfmt interpreter for mips
Setting /usr/bin/qemu-mipsel-static as binfmt interpreter for mipsel
Setting /usr/bin/qemu-mipsn32-static as binfmt interpreter for mipsn32
Setting /usr/bin/qemu-mipsn32el-static as binfmt interpreter for mipsn32el
Setting /usr/bin/qemu-mips64-static as binfmt interpreter for mips64
Setting /usr/bin/qemu-mips64el-static as binfmt interpreter for mips64el
Setting /usr/bin/qemu-sh4-static as binfmt interpreter for sh4
Setting /usr/bin/qemu-sh4eb-static as binfmt interpreter for sh4eb
Setting /usr/bin/qemu-s390x-static as binfmt interpreter for s390x
Setting /usr/bin/qemu-aarch64-static as binfmt interpreter for aarch64
Setting /usr/bin/qemu-aarch64_be-static as binfmt interpreter for aarch64_be
Setting /usr/bin/qemu-hppa-static as binfmt interpreter for hppa
Setting /usr/bin/qemu-riscv32-static as binfmt interpreter for riscv32
Setting /usr/bin/qemu-riscv64-static as binfmt interpreter for riscv64
Setting /usr/bin/qemu-xtensa-static as binfmt interpreter for xtensa
Setting /usr/bin/qemu-xtensaeb-static as binfmt interpreter for xtensaeb
Setting /usr/bin/qemu-microblaze-static as binfmt interpreter for microblaze
Setting /usr/bin/qemu-microblazeel-static as binfmt interpreter for microblazeel
Setting /usr/bin/qemu-or1k-static as binfmt interpreter for or1k
必要なDockerfileをダウンロードするか、このGitリポジトリをまとめてダウンロードします。
$ git clone https://github.com/Tiryoh/jetson-nano-containers.git
ビルドしたいDockerfileのあるディレクトリまで移動してdocker build
します。
例えば、JetPack 4.4.1(L4T R32.4.4)用のROS Melodicをビルドしたい場合は以下のコマンドを実行します。
$ cd jetson-nano-containers/l4t-r32.4.4/ros-melodic
$ sudo docker build -t ros:melodic-ros-base-l4t-r32.4.4 .
※docker build
時の-t
オプションは--tag
のショートオプションです。
起動したいコンテナ名(ビルド時に-t
で指定したもの)を指定してdocker run
します。
$ sudo docker run --rm -it ros:melodic-ros-base-l4t-r32.4.4
※docker run
時の-t
オプションは--tty
のショートオプションです。
CUDAを必要とするのでJetson Nano上で実行ビルドします。
ros:melodic-ros-base-l4t-r32.4.4
が必要です。
ros-deep-learning:melodic-l4t-r32.4.4
を以下のコマンドでビルドします。
$ cd jetson-nano-containers/l4t-r32.4.4/ros-deep-learning-melodic
$ sudo docker build -t ros-deep-learning:melodic-l4t-r32.4.4 .
コンテナ起動時に直接roslaunch
を実行する方法です。
以下のコマンドを実行します。
# CSIカメラを使う場合
$ sudo docker run --rm -t --network host -v /tmp/argus_socket:/tmp/argus_socket ros-deep-learning:melodic-l4t-r32.4.4 \
roslaunch ros_deep_learning video_source.ros1.launch input:=csi://0
# USBカメラを使う場合
$ sudo docker run --rm -t --network host --device /dev/video0:/dev/video0:mwr -v /tmp/argus_socket:/tmp/argus_socket ros-deep-learning:melodic-l4t-r32.4.4 \
roslaunch ros_deep_learning video_source.ros1.launch input:=v4l2:///dev/video0
コンテナを起動し、その中でコマンドを入力する方法です。
以下のように起動したDockerコンテナの中でコマンドを実行します。
# CSIカメラを使う場合
$ sudo docker run --rm -it --network host -v /tmp/argus_socket:/tmp/argus_socket ros-deep-learning:melodic-l4t-r32.4.4
# コンテナ内で
$ roslaunch ros_deep_learning video_source.ros1.launch input:=csi://0
# USBカメラを使う場合
$ sudo docker run --rm -it --network host --device /dev/video0:/dev/video0:mwr -v /tmp/argus_socket:/tmp/argus_socket ros-deep-learning:melodic-l4t-r32.4.4
# コンテナ内で
$ roslaunch ros_deep_learning video_source.ros1.launch input:=v4l2:///dev/video0
roslaunch ros_deep_learning video_source.ros1.launch
を実行すると、
/video_source/raw
と言う名前で[sensor_msgs/Image](http://docs.ros.org/en/api/sensor_msgs/html/msg/Image.html)
形式のROSトピックが配信されます。
rqt_image_view
でノートPC等から確認できます。
詳しくはこちらの公式資料を確認してください。
https://github.com/dusty-nv/ros_deep_learning#video_source-node
このリポジトリはMITライセンスに基づいて公開されています。
MITライセンスについてはLICENSEを確認してください。
MIT Licenseで公開されているdusty-nv/jetson-containersとatinfinity/jetson_ros_dockerをベースにしています。
/*
* Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
MIT License
Copyright (c) 2020 atinfinity
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.