使Terminator在Docker环境中可用
首先
在自动驾驶和机器人开发中,使用Docker进行环境搭建变得不可或缺,开发中常常需要使用ROS。ROS需要同时启动多个终端窗口,而在Docker内可以使用tmux来轻松分割终端窗口的环境相对常用。然而,tmux需要记住快捷键,对于初学者来说,甚至滚动输出历史记录都有些麻烦。因此,我尝试验证了在Docker内使用Terminator作为ROS开发的有力伙伴,如果能够有一个可以一键启动设置屏幕分割等环境的设定,将会非常方便。
环境 : 请将以下内容用中文进行重新表达,只需要一个选项: 环境。
-
- 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启动后,config/launch.sh将在Docker内部启动,这是关键。
终结者的基本知识
- 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目录不存在,则创建它,并且即使停止Docker,也不会删除挂载的dev_ws目录。因此,我们创建了一个名为terminator_config的文件,并在dev_ws/config下创建了一个符号链接。
结果
当我运行Docker启动脚本时,Terminator也同时启动了。而且,由于符号链接的更新,我可以在Docker内部修改并保存分割配置,下次启动时将会反映出来。
链接
- 推荐给Ubuntu初学者在使用ROS时使用的终端应用程序是”terminator”。