Ubuntu 23.10 serverを導入
$ sudo apt install -y libcamera-dev libjpeg-dev libtiff5-dev libpng-dev
依存パッケージの導入
$ sudo apt install -y cmake libboost-program-options-dev libdrm-dev libexif-dev
$ sudo apt install -y meson ninja-build
libcamera-appsのビルド
$ cd
$ git clone https://github.com/raspberrypi/rpicam-apps.git
$ cd rpicam-apps
$ git switch v1.2.1 --detach # libcamera 0.1.0はv1.2.1でなくてはならない
$ meson setup build -Denable_libav=false -Denable_drm=false -Denable_egl=false -Denable_qt=false -Denable_opencv=false -Denable_tflite=false
$ meson compile -C build
$ sudo meson install -C build
$ sudo ldconfig
環境設定
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
導入
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
パッケージの導入
$ sudo apt-get install docker-ce-rootless-extras uidmap
rootless dockerの導入
$ sudo systemctl disable --now docker.socket
$ sudo systemctl disable --now docker
$ sudo reboot
$ dockerd-rootless-setuptool.sh install
ホストマシンでイメージをビルドしてsave & load
$ sudo docker run --privileged --rm tonistiigi/binfmt --install linux/amd64,linux/arm64/v8
$ docker buildx create --use
$ docker buildx build --platform=linux/arm64 -t tag .
$ docker save tag | bzip2 | ssh rover0.local 'bunzip2 | docker load'
libcamera & libcamera-appsを導入するイメージを作る
FROM ubuntu:23.10 AS builder
RUN apt update && \
apt install -y git meson cmake pkg-config libcamera-dev libjpeg-dev libtiff-dev libpng-dev libboost-program-options1.74-dev libdrm-dev libexif-dev ninja-build
RUN <<EOF
git clone https://github.com/raspberrypi/rpicam-apps.git
cd rpicam-apps
git switch v1.2.1 --detach
meson setup build -Denable_libav=false -Denable_drm=false -Denable_egl=false -Denable_qt=false -Denable_opencv=false -Denable_tflite=false
meson compile -C build
meson install -C build
EOF
FROM ubuntu:23.10
RUN apt update && \
apt install -y libcamera0.1 libcamera-ipa libjpeg8 libtiff6 libpng16-16 libexif12 libboost-program-options1.74.0 && \
apt clean
COPY --from=builder /usr/local/bin/* /usr/local/bin/
COPY --from=builder /usr/local/lib/aarch64-linux-gnu/libcamera_app.so.* /usr/local/lib/aarch64-linux-gnu/
RUN ldconfig
$ docker buildx build --platform=linux/arm64 -t rover0/libcamera .
$ docker save rover0/libcamera | bzip2 | ssh rover0.local 'bunzip2 | docker load'
カメラにアクセスするため、video
グループ(gid:44
)をコンテナないでも同じgidにマッピングする。
以下の設定はコンテナ内のgid 0からgid 43をホストのgid 100000から100043に、コンテナ内のgid 44をホストのgid 44に、コンテナ内のgid 45からをホストのgid 100045からにマッピングする。
$ cat /etc/subgid
argon:100000:43
argon:44:1
argon:100045:65492
再起動後、以下のコマンドでカメラの一覧を取得できる。
$ docker run -it --rm --group-add video -v /run/udev:/run/udev --device /dev/dma_heap --device /dev/v4l-subdev0 --device /dev/video10 --device /dev/video11 --device /dev/video12 --device /dev/video18 --device /dev/video31 --device /dev/media4 --device /dev/video13 --device /dev/video14 --device /dev/video15 --device /dev/video16 --device /dev/video20 --device /dev/video21 --device /dev/video22 --device /dev/video23 --device /dev/media0 --device /dev/media3 --device /dev/video0 --device /dev/media1 --device /dev/video19 --device /dev/media2 rover0/libcamera libcamera-still --list-cameras
Available cameras
-----------------
0 : ov5647 [2592x1944] (platform/soc/fe205000.i2c/i2c-22/i2c-10/10-0036 ov5647)
Modes: 'SGBRG10_CSI2P' : 640x480 [58.92 fps - (16, 0)/2560x1920 crop]
1296x972 [43.25 fps - (0, 0)/2592x1944 crop]
1920x1080 [30.62 fps - (348, 434)/1928x1080 crop]
2592x1944 [15.63 fps - (0, 0)/2592x1944 crop]
qemuを利用したlinux/arm64向けイメージビルド環境を追加
$ sudo docker run --rm --privileged tonistiigi/binfmt:latest --install linux/amd64,linux/arm64
以下のようにlinux/arm64向けにイメージをビルド
$ docker buildx build --platform=linux/arm64 -t rover0/main ./main
rootless dockerではswarm modeを利用できないため、システムのdaemonとしてdockerdを起動する。
$ dockerd-rootless-setuptool.sh uninstall
$ sudo systemctl start docker
$ unset DOCKER_HOST
$ sudo docker run hello-world
通常ユーザーからdockerを使用可能にするため、argonをdockerグループに追加する。
$ sudo usermod -aG docker argon
swarm mangaerの初期化
$ docker swarm init --advertise-addr <IP Addr>
注意 docker for macで複数ノードはうまく動かないかも??
/boot/firmware/config.txtに以下を追加
[all]
enable_uart=1
dtoverlay=uart2
overlay networkでROS2の通信を行う
swarm driverではUDP multicastが使えないため、weave pluginを利用する。
$ docker plugin install weaveworks/net-plugin:latest_release
$ docker plugin set weaveworks/net-plugin:latest_release WEAVE_MULTICAST=1
$ docker plugin enable weaveworks/net-plugin:latest_release
と思ったのだが、rp4へプラグインの導入がうまくいかないので断念。
$ sudo docker plugin install weaveworks/net-plugin:latest
Plugin "weaveworks/net-plugin:latest" is requesting the following privileges:
- network: [host]
- mount: [/proc/]
- mount: [/var/run/docker.sock]
- mount: [/var/lib/]
- mount: [/etc/]
- capabilities: [CAP_SYS_ADMIN CAP_NET_ADMIN]
Do you grant the above permissions? [y/N] y
latest: Pulling from weaveworks/net-plugin
Digest: sha256:a1f1426e9f467397362986ab85ac1fbb3f7551f02f42f2e35d7ac5b4d9cb0f7f
294e03ba5a1b: Complete
Error response from daemon: dial unix /run/docker/plugins/5322da4dd03176608f47cb4f78a025afcef9918bb04eef2383273a484d7c6a1a/weave.sock: connect: no such file or directory
以下のようにnetwork_modeとROS_DOMAIN_IDを設定する。
ROS_DOMAIN_IDは0~232までの範囲で設定しないと警告がでる。
x-base: &base
network_mode: "host"
restart: always
x-environment: &environment
ROS_DOMAIN_ID: 104
services:
ros2:
<<: *base
image: rover0/ros2
container_name: main
#command: ros2 launch rosbot_bringup bringup.launch.py
environment:
<<: *environment
foxglove/studioを利用する場合は、以下のように設定する。
$ cat docker-compose.yml
version: "3.9"
x-template: &template
network_mode: "host"
environment:
ROS_DOMAIN_ID: ${ROS_DOMAIN_ID}
services:
bridge:
<<: *template
build: .
studio:
<<: *template
image: ghcr.io/foxglove/studio
以下のようにROS_DOMAIN_IDを設定して起動する。
$ sudo ROS_DOMAIN_ID=104 docker compose up -d