Skip to content

Instantly share code, notes, and snippets.

@ar90n
Last active January 14, 2024 14:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ar90n/d0a8b1ef083986ee5aabc9722cb1b0cb to your computer and use it in GitHub Desktop.
Save ar90n/d0a8b1ef083986ee5aabc9722cb1b0cb to your computer and use it in GitHub Desktop.
env setup

Picoprobeの作成

GitHubのリリースページからpicoprobe.u2を取得 & デバイスに書き込む

https://github.com/raspberrypi/picoprobe/tags

ケースの作成

以下のモデルをプリント

https://www.thingiverse.com/thing:4777983

Picoprobe用のudevルールを追加

cat /etc/udev/rules.d/99-picoprobe.rules
# udev rules for Picoprobe
ACTION=="add", SUBSYSTEM=="usb", ATTRS{product}=="Picoprobe (CMSIS-DAP)", MODE="0666"
ACTION=="add", SUBSYSTEM=="tty", ATTRS{product}=="Picoprobe (CMSIS-DAP)", SYMLINK+="ttyPicoprobe", MODE="0666"

Picoprobeを利用したプログラムの書き込み

$ openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -s tcl -c "program blink.elf verify reset exit"

PlatformIOの導入

リモート開発時はPIO Home開くことに失敗する。なので以下のように適切にポートフォーワーディングを設定する必要がある。

devcontainer.jsonの設定

{
	"forwardPorts": [45149],
	"customizations": {
		"vscode": {
			"extensions": [
				"platformio.platformio-ide",
			],
			"settings": {
  				"platformio-ide.pioHomeServerHttpPort": 45149,
			  },
		}
	},
	"runArgs": [
		"--mount",
		"type=bind,source=/dev,target=/dev",
	],
}

Proprobeの利用

PlatformIOからPicoprobeを利用するためには、libhidapi-hidraw0をインストールする必要がある。

sudo apt install libhidapi-hidraw0

OS導入

Ubuntu 23.10 serverを導入

libcameraの設定

libcameraの導入

$ sudo apt install -y libcamera-dev libjpeg-dev libtiff5-dev libpng-dev

libcamera-appsの導入

依存パッケージの導入

$ 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

dockerの導入

公式に従う

環境設定

# 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

rootlessで動かす

パッケージの導入

$ 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

arm64向けdocker imageのビルド

ホストマシンでイメージをビルドして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 & 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

Docker swarmの導入

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で複数ノードはうまく動かないかも??

uartの設定

/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

ホストネットワークでROS2の通信を行う

以下のように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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment