はじめに
自動運転やロボット開発において、Dockerによる環境構築は欠かせないものになっており、開発ではどうしてもROSを利用することが多くなります。ROSは複数のターミナル立ち上げが必然的に必要となりますが、Docker内で簡単にターミナルウィンドウを分割する環境を手に入れるにはtmuxが比較的よく使われます。しかしtmuxはショートカットキーを覚える必要があり、初心者には出力履歴をスクロールすることすら手間取ることがあります。そこでROS開発での強い味方であるTerminatorがDocker内でも利用できて、画面分割などの設定が一発で起動できる環境があれば非常に便利ではないかと思い検証してみました。
環境
- Ubuntu20.04
- Docker version: 24.0.5
- Dokcerfileビルドにてterminatorをapt install済み
- ROS2: Galactic(※本件では依存なし)
- Nvidia GPU環境使用(※本件では依存なし)
前提条件
Docker環境
- Docker内ではrootではなくdeveloperというユーザーを作成した環境で作業
- ホスト側で作業ワークスペースとしてdev_wsを作成しdocker内に同名のディレクトリにマウント
- Docker内のディレクトリ構造は/home/developer/dev_ws
home/
├ .config/terminator/config
└ developer/
└ dev_ws/
├ run_docker.sh
├ config/
│ ├ launch.sh
│ └ terminator_config
└ ros2_ws/
Docker起動オプション
下記の実行でDocker起動
$ bash run_docker.sh
#!/bin/bash
REPO=ros2_gpu_galactic
TAG=latest
IMAGE="${REPO}:${TAG}"
ROS_DOMAIN_ID=100
COMMAND="bash config/launch.sh"
docker run -ti --rm \
--net host --pid=host --privileged \
-v $HOME/.Xauthority:/root/.Xauthority:rw \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v /dev:/dev \
-v ./dev_ws:/home/developer/dev_ws \
-e DISPLAY=$DISPLAY \
-e NVIDIA_VISIBLE_DEVICES=all \
-e NVIDIA_DRIVER_CAPABILITIES=all \
-e ROS_DOMAIN_ID=$ROS_DOMAIN_ID \
${IMAGE} ${COMMAND}
上記のDocker起動ファイルの通り、Docker起動後にDocker内でconfig/launch.shが起動されることになる、ココがポイント。
Terminator基本知識
- Terminator起動は下記コマンドのみ
$ terminator
- 画面分割は
- Ctrl + Shift + o(上下分割)
- Ctrl + Shift + e(左右分割)
- Terminator起動時に分割ターミナルにしたい場合は、
- Terminator画面上で右クリック → 設定
- Layoutタブ上でaddを押すと現在の画面設定が設定ファイルに保存される → レイアウト名を設定(ここではrosとした)
- 保存した設定ファイル(分割画面)で起動したい場合は、
$ terminator -l <レイアウト名>
- ちなみに全画面終了は、
- Ctrl + Shift + q
問題点
- Terminatorの設定ファイルが保存される先が、/home/.config/terminator/configのhome直下であり、ここにいくら保存されてもDockerを終了すると設定ファイルが消えてしまう。
- 設定ファイルの保存先を指定する起動オプションを調べたが無かった
解決策
- まず画面分割後に設定ファイルをdev_ws/config/にコピー
$ cp /home/.config/Terminator/config /home/developer/dev_ws/config/terminator_config
- 次にDocker起動後に実行される処理launch.shに以下のような処理を加えた。
#!/bin/bash
if [ ! -d /home/developer/.config/terminator ]; then
mkdir -p /home/developer/.config/terminator
ln -s /home/developer/dev_ws/config/terminator_config /home/developer/.config/terminator/config
fi
terminator -l ros
要するに.configディレクトリが無ければ作成して、マウントしているdev_wsディレクトリはDockerを終了しても消えないのでdev_ws/configにterminator_configというファイルを作成してシンボリックリンクを作成した、というだけです。
結果
Docker起動スクリプトをたたくと同時にTerminatorが起動できました。その上、シンボリックリンクで更新されるため、Docker内で分割設定を変更してそのまま保存すると次回の起動時に反映することができます。