acsl_infra

README for Docker system

First read README_SYSTEM.md and complete the setup section

Terminology

Refer to README_SYSTEM.md for the common terminologies.

https://docs.docker.jp/engine/reference/commandline/compose.html

Term Meaning
image docker image (preserve on a HDD)
container instance build up from image
docker-compose.yml blueprint for Docker image/contaier
- env setting for build image
- env and mount setting for container up
dockerfile blueprint for docker image
イメージ構築に必要なaptやROSパッケージのインストールコマンドが記述されている
docker ディレクトリ Dockerコンテナ内にバインドされるdirectory.
ROSのセットアップファイルやコンテナを起動するときに最初に呼び出されるスクリプトが格納されている

フォルダ構成

.
|- common/              :DOCKERイメージ共通の設定フォルダ
|- ros2_autoware/       :Autoware用DOCKER設定フォルダ
|- docker-compose.yml   :DOCKERイメージ構築・起動時の設定(フォルダのバインドなど)
|- README.md       :このファイル
|- env.**               :ROSパッケージ毎の設定ファイル

実行方法

systemdの設定が済んでいれば電源投入で自動的に起動する。

以下のコマンドでdevコンテナを作り、その中に入れる

  cd ~/ros2/docker/
  docker compose up common -d
  docker compose exec common bash

Docker system セットアップ

Docker JP ドキュメンテーション に従ってDocker engineまたはDocker desktopをインストールする.

Docker 運用

docker-compose.yml に従ってイメージを作成する。

docker-compose内に渡せる環境変数とその意味

環境変数 意味 デフォルト値
TARGET_STAGE dockerfile内のstage (asで指定しているもの)。 できあがるイメージのタグ base: ros2_py3
    common: realsense_ros2
HOSTNAME containerのホスト名 base: [base]  common: 無し
BASE_IMAGE buildの元となるイメージ base:arm64v8/ros
    common:kasekiguchi/acsl-base:ros2_py3
CONTAINER_NAME コンテナの名前 base: 無効  common: dev
TARGET_FILE dockerfile名 base: dockerfile.baseで固定  common:dockerfile.common
ROS_LAUNCH コンテナ起動時に実行するファイル base:無効  common:launch-void.sh
ID ROS_DOMAIN_ID 9

Docker image の build

docker compose build base
docker compose build drone
docker compose build vehicle
TARGET_TAG=drone_ros2 TAG=drone_build docker compose build common
TARGET_TAG=vehicle_ros2 TAG=vehicle_build docker compose build common
docker login
docker push kasekiguchi/acsl-base:ros2_py3
docker push kasekiguchi/acsl-common:drone_ros2
docker push kasekiguchi/acsl-common:drone_build --no-cache
docker push kasekiguchi/acsl-common:vehicle_build --no-cache

Build 時の文法

docker compose --env-file <envfile> build <service_name> --no-cache
  # <envfile> : 環境設定ファイル
  # <service_name> : docker-compose.yml で設定しているservice
  # --no-cache : キャッシュを使わず1からビルド

共通プログラムでは2段階のイメージを作成している。 イメージ毎にdocker-compose内でserviceを作り、対応したdockerfileを用意

  1. base イメージ作成
:無し (--env-fileから不要) : base 生成されるイメージ名 : kasekiguchi/acsl-base 2. common イメージの作成 : 無し (--env-fileから不要) : common 生成されるイメージ名 : kasekiguchi/acsl-common ### Docker image のdocker hubへのpush ```bash docker login docker push <イメージ名> ``` ### Docker container の起動・中に入る 文法 ```bash # 起動 docker compose --env-file up # 中に入る docker compose --env-file exec bash ``` baseイメージの例(buildイメージの中を確認するくらい) ```bash # 起動 docker compose --env-file env.dev up base -d # コンテナに入る docker compose --env-file env.dev exec base bash ``` commonイメージはentrypointとしてdocker/common/scripts/entrypoint.shを指定しており その中で任意のコマンドが呼べるようになっており(docker-compose内のcommandで指定)、 /common/ros_launcher/内のファイルをROS_LAUNCH変数経由で指定できる。 以下を実行することで対応したROS packageを実行できる ```bash docker compose --env-file env.realsense up common -d docker compose --env-file env.estimator up common -d docker compose --env-file env.mavlink up common -d ``` [setup.sh](../systemd_files/setup.sh)では複数機対応するためnamespaceを指定する記述を追加している。 ### その他のDocker コマンド ```bash # image一覧 docker images -a # コンテナ一覧 docker ps -a # log 確認 docker logs # 設定の確認 docker compose --env-file= config # docker hubからイメージを入手 docker pull kasekiguchi/acsl-common:realsense-ros2 #実行時変数 COMPOSE_DOCKER_CLI_BUILD=1 : multi stage build を許可 # 使われていない image container 全て削除 docker system prune # container 全削除 docker container prune ``` ## コンテナ内の共通設定 docker-composeで指定 ```bash tty: true privileged: true # 特権モード environment: - HOST_USER=$LOGNAME # ホストのユーザーをDocker内の環境変数に出力 - ROS_DOMAIN_ID=${ID:-9} network_mode: host ipc: host device_cgroup_rules: # a (all), c (char), or b (block) # https://www.kernel.org/doc/Documentation/admin-guide/devices.txt # Realsenseを使うためのおまじない - 'c 81:* rmw' # video4linux - 'c 189:* rmw' # USB serial converters - alternate devices volumes: 次節で説明 ``` ### コンテナ内のフォルダ構成 volumes 以下となるようにdocker-compose内でマウント設定(volumes)している ``` / |- dev : HOST:/dev |- common : HOST:~/ros2/docker/common |- root/ros2_ws/src/ : ROS2パッケージフォルダ(realsenseなど他のgitプロジェクトはこちらに入っている) |- ros_packages : HOST:~/ros2/ros_packages |- root/.vscode-server : 名前付きvolume ``` #### フォルダ構成詳細 | フォルダ名 | 目的 | | :-- | :-- | |/dev | すべてのデバイスにアクセスできるようにマウント| |/common | コンテナ内で利用するスクリプトをマウント| |/root/.vscode-server | VScodeのインストールデータを永続化(VScode拡張機能を保持する為)| |/root/ros2_ws/src/ros_packages | rosパッケージをコンテナ内で使えるようにする| |/etc/udev/rules.d/90-custom.rules | デバイスのカスタム設定をマウント| ### 構成されているもの(未整理) コンテナによって内容は異なる。 * 基本的なツール(git, nano, tzdataなど) * 外部に情報をつなぐツール(ssh, xserver, udev) * [ROS2 Humble Hawksbill](https://docs.ros.org/en/humble/index.html) * [librealsense](https://github.com/IntelRealSense/librealsense) * バージョン v2.53.1 * (2023/6/10)最新バージョンv2.54.1でビルドが失敗するバグを確認しています. * T265の生産終了により最新バージョンで実行できなくなる可能性があります. * [turtlebot3](https://emanual.robotis.com/docs/en/platform/turtlebot3/overview/) * Python3 package * 数値計算パッケージ [numpy](https://numpy.org/) * 科学技術計算パッケージ [scipy](https://scipy.org/) * データ解析パッケージ [pandas](https://pandas.pydata.org/) * WHILL制御パッケージ [pywhill](https://github.com/WHILL/pywhill) * UART通信パッケージ [pyserial](https://pythonhosted.org/pyserial/) * MAVLINK通信パッケージ [pymavlink](https://github.com/ArduPilot/pymavlink) * グラフ描画パッケージ [matplotlib](https://matplotlib.org/) * 3D 描画のためにv3.1.0以降である必要があります. * ROS2ワークスペースのパッケージ依存関係のインストール * この部分はros2_wsの内容に依存します. * ビルドする前にROSのソースファイルを格納しておいてください. ## 拡張方法 ### Docker imageの拡張 1. 上述のdevコンテナに入り必要な拡張(apt installなど)をする。 2. 拡張内容が確定したらdockerfileに反映 内容に応じて dockerfile.base か dockerfile.commonに分けて反映 2'. realsense-ros2をbase imageにして拡張するdockerfileと、docker-compose上のserviceを追加 3. buildし直す 4. docker hubにアップロード 5'. ros2_launch_sh のservice名を変更 6. HOST上でgit登録 ### 1. 上述のdevコンテナに入る 2. DOCKER上でros2_ws/src/ros_packages/内でパッケージを開発 3. 各種起動ファイルを追加 3.1 ROSパッケージを起動するコマンドを書いたlaunch_***.shを docker/common/ros_launcherに追加 3.2 対応するenv.*** をdocker/内に追加 3.3 systemd_files/ros2_launch_shに3.1のファイルの起動を追加 4. HOST上でgitに登録 5. systemd_files/setup.sh を実行し自動起動の設定をする