Skip to content

Latest commit

 

History

History
1215 lines (863 loc) · 54 KB

STARTUP_GUIDE.md

File metadata and controls

1215 lines (863 loc) · 54 KB

Startup Guide of burger_war

burger_warの開発環境をDocker上に構築する手順について説明します。

目次


0. Dockerとは

Dockerとは仮想化技術の1つです。

必要なツールなどをコンテナと呼ばれるホストOSから独立した仮想空間として起動し、それをホストOSから利用することができます。

コンテナを作成するには、Dockerイメージというコンテナのもとになる仮想ファイルイメージが必要になります。

burger_war_kitでは、burger_warに最低限必要なツールとライブラリをインストールしたDockerイメージを提供しています。

このリポジトリでは、burger_war_kitのDockerイメージをもとに、開発者が必要なライブラリやツールをインストールしたDockerイメージを用意して開発を進める形になります。

もし、Dockerを使ったことがない人は、以下のサイトに目を通しておくと概要と基本的な用語を把握できるかと思います。

もっと深くDockerについて学びたい場合は、以下のサイトを参考にされると良いでしょう。

1. ホストPCで必要なツールのインストール

burger_warの開発に必要なツールをインストールします。

1.1 このリポジトリのクローン


まずは、gitとcurlをインストールします。

sudo apt-get update
sudo apt-get install -y git curl

次にワークスペースディレクトリを作成し、本リポジトリと開発ツール用のリポジトリをクローンします。

mkdir -p ~/catkin_ws/src && cd ~/catkin_ws/src
git clone https://github.com/p-robotics-hub/burger_war_dev
git clone https://github.com/p-robotics-hub/burger_war_kit

実際に大会用のプログラムを開発する場合は、本リポジトリ(burger_war_dev)をフォークした各自のリポジトリで開発を進めて下さい。
フォークするには、GitHubにログインしてから本ページ右上にある「Fork」をクリックして、フォーク先のユーザ or 組織を選択して下さい。

フォーク手順

フォークしたご自分のburger_war_devリポジトリからクローンする場合は、以下のようにp-robotics-hubの部分を、ご自分のGitHubユーザ名に変更して下さい。

git clone https://github.com/<GitHubユーザー名>/burger_war_dev

実行後のディレクトリ構成は以下となります。

~/catkin_ws/src/
|-- burger_war_dev/
|-- burger_war_kit/

1.2 Dockerのインストール


docker engineとdocker-composeをインストールします。

既にインストール済みの方は、本手順はスキップして下さい。 ただし、もしdockerコマンドの実行にsudoが必要な状態でしたら、以下の何れかの対応をしてから本手順書を読み進めて下さい。

まずは、以下のコマンドでディレクトリを移動して下さい。

cd ~/catkin_ws/src/burger_war_dev

開発用パソコンのOSがUbuntuで、CPUがx86_64かamd64の場合、コマンドを実行して下さい。

bash commands/docker-install.sh amd64

もし、CPUが ARM32bit か ARM64bit の環境にインストールする場合は、amd64の代わりに以下の引数を指定して下さい。

bash commands/docker-install.sh armhf       # ARM32bit環境の場合
bash commands/docker-install.sh arm64       # ARM64bit環境の場合

Ubuntu以外のLinuxディストリビューションの場合は、以下の公式の手順を参照して下さい。


インストール完了後、一度パソコンを再起動して下さい。


2. 開発用のDockerイメージの作成

必要なツールのインストールが終わったら、開発環境用のDockerイメージを作成します。

以下のコマンドでディレクトリを移動してから、以降の手順を実施して下さい。

cd ~/catkin_ws/src/burger_war_dev

2.1 Dockerfileのビルド


まずは、cloneした素の状態でDockerイメージを作成してみましょう。

具体的には、以下の2つのDockerfileをビルドします。

burger_war_dev
|-- docker
|   |-- core
|   |   |-- Dockerfile    シミュレーション対戦/実機環境で使用したいライブラリ追加用
|   |-- dev
|   |   |-- Dockerfile    開発用パソコンに必要なドライバやツール追加用

ビルドするには、以下のコマンドを実行します。

bash commands/docker-build.sh

ビルドに成功したら、以下のように2つのDockerイメージが生成されます。

#--------------------------------------------------------------------
# 以下のイメージを作成しました
# カスタマイズ用: burger-war-core:latest
# 開発環境用  : burger-war-dev:latest
#--------------------------------------------------------------------

上記ではburger-war-dev:latestというDockerイメージが作成されたことが確認できます。

:より前がDockerのイメージ名、:以降はDockerイメージのバージョンになっていて、バージョンはデフォルトでは最新であることを示す「latest」になります。
(別のバージョンでイメージを作成する方法は後述します)

ビルドが終わったら、3. 開発用のdockerコンテナの起動の手順に従って、コンテナを起動して動作確認をして下さい。


2.2 バージョンを指定したDockerfileのビルド


もし、バージョンを変えたDockerイメージを作成したい場合は、以下のように-vオプションでバージョンを指定して下さい。

bash commands/docker-build.sh -v test

ビルドに成功したら以下のようなメッセージが出力され、testというバージョンののDockerイメージが作成されたことが確認できます。

#--------------------------------------------------------------------
# 以下のイメージを作成しました
# カスタマイズ用: burger-war-core:test
# 開発環境用  : burger-war-dev:test
#--------------------------------------------------------------------

2.3 burger-war-kitイメージのバージョンを指定したDockerfileのビルド


もし、最新のburger-war-kitイメージを利用して動かなくなったなど、古いburger-war-kitイメージを利用したい場合があるかもしれません。

その場合は、以下のように-kオプションで利用するバージョンを指定して下さい。

bash commands/docker-build.sh -k 4.1.0

配布されているburger-war-kitのバージョンはこちらのページから確認できます。


3. 開発用のDockerコンテナの起動

Dockerイメージのビルドができたら、Dockerコンテナを起動しましょう。
Dockerコンテナとして起動することで、Dockerイメージにインストールしたツールなどを使うことができます。

以下のコマンドでディレクトリを移動してから、以降の手順を実施して下さい。

cd ~/catkin_ws/src/burger_war_dev

3.1 バージョンを指定せずにコンテナを起動


以下のコマンドで、バージョンがlatestのDockerイメージからDockerコンテナを起動します。

bash commands/docker-launch.sh

以下のメッセージが表示されれば、コンテナの起動は成功です。

#--------------------------------------------------------------------
# 開発用のコンテナを起動しました
# USE IMAGE NAME: burger-war-dev:latest
# CONTAINER NAME: burger-war-dev
#--------------------------------------------------------------------

試しに以下のコマンドで、開発用のDockerコンテナにインストールされたGazeboを起動してみましょう。

bash commands/kit.sh -c gazebo

以下のようなGazeboの画面が表示されれば成功です。
右上の×ボタンからGazeboを終了して下さい。

※Gazeboの初回立ち上げには数分かかることもあります(その間、画面は黒いままです)

gazebo起動


補足)もし、Gazeboが起動しない場合...

お使いのパソコンによっては、以下のようなエラーが表示されて、Gazeboが起動しないかもしれません。

libGL error: No matching fbConfigs or visuals found
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
libGL error: failed to load driver: swrast
X Error of failed request:  GLXBadContext
  X Error of failed request:  GLXBadContext
  Major oパソコンode of failed request:  152 (GLX)
Major oパソコンode of failed request:  152 (GLX)
  Minor oパソコンode of failed request:  6  Minor oパソコンode of failed request:  6 (X_GLXIsDirect) (X_GLXIsDirect)

    Serial number of failed request:  44Serial number of failed request:  44
  
  Current serial number in output stream:  43Current serial number in output stream:  43

その場合は、以下の2つの対策があります。

  1. グラフィックボードドライバをインストール ⇒ 7.カスタマイズしたDockerイメージの作成
  2. VNC版コンテナの利用 ⇒ 8.VNC版コンテナの作成と接続

ドライバのインストールには、Linuxやグラフィックボードについての知識が必要となるため、難易度が高いかもしれません。

一方、VNC版コンテナは、このリポジトリで予め用意した手順でビルドするだけで環境は整いますが、シミュレーション速度がやや遅くなります。

ご自分にあった対策を実施して、開発環境を整えて下さい。


3.2 バージョンを指定してコンテナを起動


もし、バージョンを指定したDockerイメージからコンテナを起動する場合は、以下のコマンドを実行して下さい。

bash commands/docker-launch.sh -v test

もし、存在しないバージョンを指定した場合、以下のようなメッセージを出力して起動処理を中断します。

指定のイメージ burger-war-dev:test は存在しません

注意点としては、起動する開発用のコンテナ名はどのバージョンのDockerイメージから作成しても、burger-war-devとなります。

その為、別バージョンのイメージからコンテナを起動しようとした場合でも、既存のburger-war-devコンテナが存在すれば、削除するか確認するメッセージが表示される。

詳細は次節の3.3 既にコンテナが存在する場合を確認して下さい。


3.3 既にコンテナが存在する場合


既に同じ名前のコンテナが起動中の場合、既存のコンテナの停止を自動で行います。

具体的にはbash commands/docker-launch.sh実行時に、以下のようなメッセージが表示されます。

起動中の burger-war-dev コンテナを停止します...
起動中の burger-war-dev コンテナを停止しました

また、同じ名前の停止中のコンテナが存在する場合は、以下のメッセージが表示されます。
1〜3のいずれかの番号を入力して、Enterを押して下さい。

前回起動していた burger-war-dev コンテナが存在します
コンテナを起動する方法を以下から選択できます
---------------------------------------------------------
  1: 既存のコンテナを再起動する
  2: 既存のコンテナを保存して新しいコンテナを起動する
  3: 既存のコンテナを削除して新しいコンテナを起動する
----------------------------------------------------------
選択肢の番号を入力して下さい(1〜3): 

1を選択した場合、既存のコンテナをdocker startコマンドで再起動します。

2を選択した場合、既存のコンテナをdocker commitコマンドでDockerイメージとして保存後、新しいコンテナを起動します。

3を選択した場合、既存のコンテナを保存せずに削除して、docker runコマンドで新しいコンテナを起動します。

1〜3以外を入力した場合は、1を選択したことになり、既存のコンテナを再起動します。

13の選択肢については、コマンドオプションでも指定できるようになっています。
以下のオプションを指定した場合は、選択肢が表示されません。

bash commands/docker-launch.sh -r     # 既存のコンテナを再起動(`1`選択時と同様)
bash commands/docker-launch.sh -f     # 既存のコンテナを削除して新しいコンテナを起動(`3`選択時と同様)

補足)Dockerイメージとして保存する場合

2を選択した場合は、以下のような追加のメッセージが表示されます。
保存するイメージのバージョン名を入力して下さい。

既存のコンテナをイメージとして保存します
保存するバージョン名を入力して下さい: 

下の例ではbackupというバージョンで、イメージを保存しています。

既存のコンテナをイメージとして保存します
保存するバージョン名を入力して下さい: backup
#--------------------------------------------------------------------
# 既存のコンテナを以下のイメージとして保存しました
# SAVE IMAGE NAME: burger-war-dev:backup
#
# 保存したイメージからコンテナを起動するには、以下のコマンドを実行して下さい
# RUN COMMAND    : bash commands/docker-launch.sh -t dev -v backup
#--------------------------------------------------------------------

以下のコマンドで、イメージが保存されていることを確認できます。

docker images burger-war-dev

例えば、出力は以下のようになり、2列目のTAGという項目が、指定したイメージのバージョンとなっています。

REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
burger-war-dev   backup    6a31a929ee60   12 minutes ago   4.18GB
burger-war-dev   latest    025983ca7e90   25 hours ago     4.18GB

4. ワークスペースのビルド

コンテナの起動ができたら、ワークスペースをビルドしてみましょう。
以下のように、kit.sh -cの引数にビルド用のコマンドcatkin buildを渡して実行します。

bash commands/kit.sh -c catkin build

もし、catkin buildコマンドに引数を渡したい場合は、以下のようにして下さい。

bash commands/kit.sh -c catkin build -j8 -DCMAKE_CXX_FLAGS=-O0

コマンドの出力結果はcatkin buildの出力そのままになります。


5. シミュレーションの実行

ワークスペースのビルドができたら、Gazeboによる対戦シミュレーションを実行できます。

5.1 審判サーバーとロボットを立ち上げる場合


以下のコマンドで、シミュレータ、ロボット(turtle_bot)、審判サーバー、観戦画面が起動します。

bash commands/kit.sh -s sim_with_judge.sh

以下のようなフィールドが現れ、ロボットが2台出現し、審判画面も表示されます。

sim_with_judge

フィールドとロボットが立ち上がったら、別のターミナルで以下のマンドを実行して下さい。
ロボットが動き出します。

bash commands/kit.sh -s start.sh

敵プログラムはレベル1−3まで3種類用意しています。(デフォルトではレベル1)
下記のように -l 引数によって変更できます。

level 2

bash commands/kit.sh -s start.sh -l 2

level 3

bash commands/kit.sh -s start.sh -l 3

5.2 審判サーバーを立ち上げずにロボットのみ立ち上げる場合


bash commands/kit.sh roslaunch burger_war setup_sim.launch

フィールドとロボットが立ち上がったら、別のターミナルで以下のマンドを実行して下さい。

bash commands/kit.sh -s start.sh

審判サーバーが必要ない場合は直接launchファイルを実行しても走行可能です。
上記と同様にレベル設定も可能です。(defaunt 1)

bash commands/kit.sh roslaunch burger_war sim_robot_run.launch enemy_level:=1

6. その他のDocker操作

6.1 起動したコンテナの中で操作をしたい場合

起動した開発用コンテナの中で何か操作をしたいことがあるかもしれません。

その場合は、以下のコマンドを実行して下さい。

bash commands/kit.sh 

以下のように開発用コンテナの中で対話モードでbashが起動します。

#--------------------------------------------------------------------
# 以下のコンテナでbashを起動します
# CONTAINER NAME: burger-war-dev
# EXEC COMMAND  : bash 
#--------------------------------------------------------------------
developer@hostname:~/catkin_ws$ 

対話的に起動する必要がない場合は、以下のように-cの後に実行したいコマンドを渡して下さい。

bash commands/kit.sh -c gazebo

6.2 コンテナの停止方法

コンテナはPCシャットダウン時に自動で停止します。

起動しているコンテナを今すぐ停止したい場合は、以下のコマンドを実行して下さい。

docker stop burger-war-dev      # docker-launch.sh で`-t`を指定しなかった場合(もしくは`-t dev`を指定)
docker stop burger-war-vnc      # docker-launch.sh で`-t vnc`を指定した場合

全てのコンテナを停止したい場合は、以下のコマンドを実行して下さい。

docker stop $(docker ps -q)

起動しているコンテナの一覧は、以下のコマンドで確認できます。

docker ps

例えば、コンテナが1つも起動していない場合は以下のような出力になります。

CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

6.3 コンテナの削除方法

commands/docker-launch.shによるコンテナ起動時に既に同名のコンテナがある場合は、既存のコンテナを削除するか選択できます。

もし、それ以外でコンテナを削除したい場合は、以下のコマンドを実行して下さい。

docker rm burger-war-dev      # docker-launch.sh で`-t`を指定しなかった場合(もしくは`-t dev`を指定)
docker rm burger-war-vnc      # docker-launch.sh で`-t vnc`を指定した場合

停止中の全てのコンテナを削除したい場合は、以下のコマンドを実行して下さい。

docker rm $(docker ps -a -q)

6.4 イメージの削除方法

commands/docker-build.shは、内部ではdocker buildを実行しています。
docker buildを実行により新しいイメージが作成されていきます。

何度もDockerfileの修正とdocker buildを繰り返していくと、多くのストレージを消費することになります。
その為、定期的に不要なイメージは削除した方が良いでしょう。

存在するイメージの確認

作成済みのイメージは、以下のコマンドで確認できます。

docker images

例えば、以下のような出力になります。

REPOSITORY                                      TAG                    IMAGE ID       CREATED        SIZE
burger-war-dev                                  test                   bb3e892790c6   3 hours ago    4.09GB
burger-war-vnc                                  test                   4b8407915ae1   3 hours ago    4.06GB
<none>                                          <none>                 29aa17c79487   3 hours ago    3.51GB
burger-war-core                                 test                   a8b2cdb5fbdd   4 hours ago    3.45GB

REPOSITORYの列が<None>となっているものは、既に使用されていないイメージです。

使用されていないイメージの削除

使用されていないイメージを全て削除したい場合は、以下のコマンドを実行して下さい。

docker image prune -f

任意のイメージを削除する

任意のイメージを削除したい場合は、以下のコマンドを実行して下さい。
引数には、削除したいイメージ名:バージョンか、docker imagesの出力の3列目に表示されるIMAGE IDを指定します。

docker rmi burger-war-dev:test          # イメージ名:バージョンによる指定
docker rmi bb3e892790c6                 # IMAGE IDによる指定

引数には複数のイメージを指定することができます。

docker rmi bb3e892790c6 4b8407915ae1

他のイメージから参照されているイメージは、以下のようなエラーが出て削除できません。

Error response from daemon: conflict: unable to delete 8185511cd5ad (cannot be forced) - image has dependent child images

-fオプションを追加して削除できる場合もあります。

docker rmi -f bb3e892790c6

それでも削除できない場合は、参照元のコンテナやイメージから先に削除して下さい。

参照されているイメージの確認

参照元のイメージは以下のコマンドで確認できます。
"IMAGE ID"は、削除したいイメージのIMAGE IDに置き換えてください。

for i in $(docker images -q); do docker history $i | grep -q "IMAGE ID" && echo $i; done | sort -u

長いため、シェルスクリプトとして保存しておくと良いでしょう。

for i in $(docker images -q)
do
  docker history $i | grep -q $1 && echo $i
done | sort -u

全てイメージを削除する

もし、全てのイメージを削除したい場合は、以下のコマンドを実行して下さい。

docker rmi $(docker images -aq)

全てのイメージを削除した場合、次回のdocker buildに時間がかかる点にご注意下さい。

7. カスタマイズしたDockerイメージの作成

Gazeboの起動に失敗したり、ロボコンで使用したい追加ライブラリなどがある場合、カスタマイズしたDockerイメージの作成が必要になります。

具体的には、以下の3つのDockerfileを修正します。

burger_war_dev
|-- docker
|   |-- core
|   |   |-- Dockerfile    シミュレーション対戦/実機環境で使用したいライブラリのインストールなどを追記する
|   |-- dev
|   |   |-- Dockerfile    開発用パソコンに必要なドライバやツールのインストール、設定などを追記する
|   |-- vnc
|   |   |-- Dockerfile    開発用パソコンに必要なドライバやツールのインストール、設定などを追記する(VNCを使用したい場合)

7.1 対戦環境でも必要なライブラリをインストールする場合


ロボコン用に作成するプログラムで使いたいライブラリがある場合、docker/core/Dockerfileに必要なインストール処理を追加して下さい。

例1)apt-getでインストールする場合

apt-getでインストールする場合の例は、以下になります。
ros-${ROS_DISTRO}-dwa-local-planner \などを、必要なパッケージ名に置き換えて下さい。
${ROS_DISTRO}の実際の値はmelodicとなります。

# apt-getで必要なパッケージをインストールする例
#-------------------------------------------------
RUN apt-get update -q && apt-get install -y --no-install-recommends \
    ros-${ROS_DISTRO}-dwa-local-planner \
    ros-${ROS_DISTRO}-global-planner \
    libarmadillo-dev \
    libarmadillo8 \
    && rm -rf /var/lib/apt/lists/*

Dockerfileを変更したらファイルを保存後、ビルドしてコンテナを起動して下さい。

bash commands/docker-build.sh
bash commands/docker-launch.sh

インストールできているか確認するには、以下のコマンドを実行して下さい。

bash commands/kit.sh -c apt list インストールしたパッケージ名

例えば「ros-${ROS_DISTRO}-dwa-local-planner」がインストールされたか確認する場合は、以下となります。
最後の行から、バージョンは「1.16.7」であることが分かります。

$ bash commands/kit.sh -c apt list ros-*-global-planner
#--------------------------------------------------------------------
# 以下のコンテナでコマンドを実行します
# CONTAINER NAME: burger-war-dev
# EXEC COMMAND  : bash -l -c apt list ros-*-global-planner
#--------------------------------------------------------------------
++ id -u
+ docker exec -it --user 1000 burger-war-dev bash -l -c 'apt list ros-*-global-planner'
Listing... Done
ros-melodic-global-planner/now 1.16.7-1bionic.20201103.003153 amd64 [installed,local]

例2)pipでインストールする場合

pipでインストールする場合の例は、以下となります。
transitions \などを、必要なパッケージ名に置き換えて下さい。(最後の行には\は不要です)

# pipで必要なパッケージをインストールする例
#-------------------------------------------------
RUN yes | pip install \
    transitions \
    pygraphviz

Dockerfileを変更したらファイルを保存後、ビルドしてコンテナを起動して下さい。

bash commands/docker-build.sh
bash commands/docker-launch.sh

インストールできているか確認するには、以下のコマンドを実行して下さい。

bash commands/kit.sh -c pip list | grep transitions

インストールされている場合、以下のようにパッケージ名とバージョンが出力されます。

++ id -u
+ docker exec -it --user 1000 burger-war-dev bash -l -c 'pip list'
transitions                   0.8.6

例3) ホストPCで用意した実行ファイルをインストールする場合

ホストPCで用意した実行ファイルやスクリプトなどをインストールするには、DockerfileのCOPY命令でPATHが通ったディレクトリにコピーして下さい。

例えば、docker/core/myexec以下にコピーする実行ファイルを用意した場合、以下のような記載になります。 (インストール先の/usr/local/bin/myexecは、必要であれば置き換えて下さい)

COPY core/myexec /usr/local/bin/myexec
RUN chmod +x /usr/local/bin/myexec

Dockerfileを変更したらファイルを保存後、ビルドしてコンテナを起動して下さい。

bash commands/docker-build.sh
bash commands/docker-launch.sh

動作確認はインストールしたものに合わせて実施して下さい。 PATHが通った場所にインストールできていれば、以下のような形で実行できます。

bash commands/kit.sh -c myexec

7.2 開発環境に必要なパッケージ(ドライバなど)をインストールする場合


開発用のパソコンでのみ使いたいツールや、ドライバがある場合、docker/dev/Dockerfileに必要なインストール処理を追加して下さい。

ここでは、Gazeboが起動しなかった為、グラフィックボードのドライバをインストールする場合を想定して説明します。

Ubuntuには対応するドライバを自動で検出してインストールするubuntu-driversというツールが用意されています。
Gazeboが起動しないときは、まずはこれを試してみましょう。

docker/dev/Dokcerfileの以下の箇所から行頭の#を削除して下さい。

# ubuntu-driversによる自動インストールの例
#-------------------------------------------------
RUN apt-get update -q && apt-get install -y --no-install-recommends \
    ubuntu-drivers-common \
    && rm -rf /var/lib/apt/lists/* \
    && ubuntu-drivers autoinstall

Dockerfileの修正が終わったらファイルを保存し、以下のコマンドでビルドして下さい。

bash commands/docker-build.sh

ビルドが終わったら、3.1 バージョンを指定せずにコンテナを起動の手順に従って、コンテナを起動してが起動するか確認をして下さい。

もしGazeboが起動しない場合は、B グラフィックボードのドライバのインストール手順補足を参考に、ホストPCと同じドライバをインストールして試して下さい。


8. VNC版コンテナの作成と接続

docker/vncディレクトリには、VNCサーバーを起動したコンテナを作成するためのファイルが入っています。

※VNC上で日本語入力ができない制約がありますのでご注意下さい

8.1 VNC版のDockerイメージのビルド

VNC版コンテナのDockerイメージをビルドするには、以下のコマンドを実行して下さい。

bash commands/docker-build.sh -t vnc

ビルドに成功すれば、以下のメッセージが表示されます。
通常の開発版と違い、イメージ名がburger-war-vncとなっていることが分かります。

#--------------------------------------------------------------------
# 以下のイメージを作成しました
# カスタマイズ用: burger-war-core:latest
# 開発環境用  : burger-war-vnc:latest
#--------------------------------------------------------------------

8.2 VNC版のDockerイメージの起動

VNC版のDockerイメージからコンテナを起動するには、以下のコマンドを実行して下さい。

bash commands/docker-launch.sh -t vnc

起動に成功すれば、以下のメッセージが表示されます。
この例では、VNCの接続先がlocalhost:5900であることが分かります。

#--------------------------------------------------------------------
# 開発用のコンテナを起動しました
# USE IMAGE NAME: burger-war-vnc:latest
# CONTAINER NAME: burger-war-vnc
# VNC ADDR:PORT : localhost:5900
#--------------------------------------------------------------------

8.3 VNCで接続

デフォルトのVNCの設定は以下になります。 各自、お使いのクライアントソフトで接続して下さい。

 ユーザ名 :指定なし  パスワード:指定なし  接続先  :localhost:5900  解像度  :1280x800

VNCクライアントソフトの1つであるRemminaの場合、設定例は以下になります。

vnc_remmina


8.4 VNCでのシミュレーション実行

VNC接続後、burger_war_kitの手順書に記載された操作でビルドやシミュレータの起動などを行うことができます。

また、ホストPCから任意のコマンドを実行することもできます。
以下のように、kit.shの引数に-t vncをつけて、その後ろに-c 任意のコマンド-s スクリプト名を指定して下さい。

bash commands/kit.sh -t vnc -c catkin build         # 任意のコマンドの実行
bash commands/kit.sh -t vnc -s sim_with_judge.sh    # シミュレータの起動
bash commands/kit.sh -t vnc -s start.sh             # シミュレーションの開始

コマンド実行後、VNCの画面上にGazeboなどが表示されます。


8.5 VNCの設定

commands/config.shにVNCに関連する設定を変更することができます。
必要であれば変更して下さい。

# VNCサーバのポート番号
VNC_PORT=5900
# VNCログイン時のパスワード(空文字の場合はパスワードなし)
VNC_PASSWORD=${VNC_PASSWORD:-}
# VNC接続の解像度
VNC_RESOLUTION=1280x800
# VNCのx11vncへの
VNC_X11VNC_ARGS=
# VNCのOpenBoxへの引数
VNC_OPENBOX_ARGS=

設定が反映されるのは、commands/docker-launch.shを実行してコンテナを起動したときになります。


9. GitHub Actionsによる自動ビルドとテスト

本リポジトリでは、GitHub Actionsで動作するDockerイメージの自動ビルドとロボットプログラムの自動テストを用意しています。

詳細は、以下のファイルをご参照下さい。

CI/CD Guide (by GitHub Actions)

その他

A 短縮コマンドの設定例


Dockerコンテナの中でコマンドを実行する場合、以下のようにコマンドが長くなり入力が大変です。
また、現在のディレクトリの位置にも配慮しなければなりません。

bash commands/kit.sh -s sim_with_judge.sh

そこで、エイリアスというbashの機能でコマンドの別名を$HOME/.bashrcに定義しておけば、実行が楽になります。

以下は設定例です。

# robocon aliases
kitsh=$HOME/catkin_ws/src/burger_war_dev/commands/kit.sh
alias kit="bash ${kitsh} $@"
alias kitc="bash ${kitsh} -c $@"
alias ws-build="bash ${kitsh} -c catkin build"
alias sim-launch="bash ${kitsh} -s sim_with_judge.sh"
alias sim-start="bash ${kitsh} -s start.sh"

$HOME/.bashrcを修正後、以下のコマンドで設定を反映させて下さい。
(修正後に新しく起動したbashには自動で反映されます)

source ~/.bashrc

上記サンプルの設定後は、以下のように短いコマンドでそれぞれ実行できるようになります。

kit         # コンテナの中のbashを対話モードで起動
kitc        # コンテナの中の"bash -c 引数"でコマンドを実行(kitc envなど)
ws-build    # ワークスペースのビルド
sim-launch  # シミュレータの起動
sim-start   # シミュレーションの開始

エイリアスは、既存のコマンドと名前が被らないように注意して下さい。


B グラフィックボードのドライバのインストール手順補足


Gazeboを起動しようとしたときに、以下のようなエラーメッセージが出てGazeboが起動しない場合、ドライバのインストールが必要です。

libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
X Error of failed request:  GLXBadContext
  Major opcode of failed request:  152 (GLX)
  Minor opcode of failed request:  6 (X_GLXIsDirect)
  Serial number of failed request:  44
  Current serial number in output stream:  43

その場合は、以下の順番でGazeboが動くか試しながら、環境構築をされるのが良いでしょう。

  1. ubuntu-driversによる自動インストールを試す
  2. ホストPCのドライバを調べて、同じドライバをインストールを試す

ドライバのインストール方法は、お使いのグラフィックボードによって変わってきます。
お使いのグラフィックボード用の手順を参考に、ドライバをインストールして下さい。

いずれの手順でも、Dockerfileの修正が終わったら、以下のDockerイメージを再作成し、Gazeboが起動するか確認して下さい。

bash commands/docker-build.sh
bash coomands/docker-launch.sh
bash commands/kit.sh -c gazebo

B.1 ホストPCが利用中のドライバの確認方法


以下のコマンドで、使用しているホストPCがどのドライバを使っているか確認して下さい。

software-properties-gtk

表示されたウィンドウの「追加のドライバー」タブを選択すると、以下のように現在利用しているドライバが選択されている状態になっており、この例では「nvidia-driver-450」というパッケージのドライバを使用していることが分かります。

software-properties-gtk


B.2 NVIDIAのドライバのインストール手順


NVIDIAのドライバの場合、以下のいずれかの方法でインストールして下さい。

例1) Ubuntuの標準バージョンのドライバのインストール

docker/dev/Dokcerfileを以下の部分の行頭の#を削除して、nvidia-driver-450の部分をB.1 ホストPCが利用中のドライバの確認方法で調べたドライバのパッケージ名に書き換えて下さい。

# NVIDIAのドライバをインストールする例1) Ubuntのデフォルトバージョンをインストール
#-------------------------------------------------
RUN apt-get update -q && apt-get install -y \
    nvidia-driver-450 \
    && rm -rf /var/lib/apt/lists/* \

Dockerfileの修正が終わったら、Dockerイメージを再作成し、Gazeboが起動するか確認して下さい。


例2) 詳細なバージョンを指定してインストール

もし、例1) Ubuntuの標準バージョンのドライバのインストールで動かない場合、ホストPCにインストールされているドライバのマイナーバージョンの違いが原因かもしれません。

以下のコマンドで詳細なバージョンを確認して下さい。

apt list --installed nvidia-driver-*                    # NVIDIAの場合
apt list --installed xserver-xorg-video-intel*          # Intel(内蔵)の場合
apt list --installed xserver-xorg-video-radeon*         # AMD/ATI(Radeon)の場合

例えば、以下のような出力になります。

一覧表示... 完了
nvidia-driver-440/bionic-updates,bionic-security,now 450.102.04-0ubuntu0.18.04.1 amd64 [インストール済み]
nvidia-driver-450/bionic-updates,bionic-security,now 450.102.04-0ubuntu0.18.04.1 amd64 [インストール済み、自動]

この例では、「450.102.04」というバージョンであることが分かります。

docker/dev/Dokcerfileの以下の箇所から行頭の#を削除して、ARG DRIVER_VERSION=450.80.02の部分を調べたバージョンに変更して下さい。

# NVIDIAのドライバをインストールする例2) バージョンを指定してインストール
# 参考:https://gitlab.com/nvidia/container-images/driver/-/blob/master/ubuntu18.04/Dockerfile
#-------------------------------------------------
ARG BASE_URL=https://us.download.nvidia.com/tesla
ARG DRIVER_VERSION=450.80.02
ENV DRIVER_VERSION=$DRIVER_VERSION

RUN cd /tmp && \
    curl -fSsl -O $BASE_URL/$DRIVER_VERSION/NVIDIA-Linux-x86_64-$DRIVER_VERSION.run && \
    sh NVIDIA-Linux-x86_64-$DRIVER_VERSION.run -x && \
    cd NVIDIA-Linux-x86_64-$DRIVER_VERSION* && \
    ./nvidia-installer --silent \
                       --no-kernel-module \
                       --install-compat32-libs \
                       --no-nouveau-check \
                       --no-nvidia-modprobe \
                       --no-rpms \
                       --no-backup \
                       --no-check-for-alternate-installs \
                       --no-libglx-indirect \
                       --no-install-libglvnd \
                       --x-prefix=/tmp/null \
                       --x-module-path=/tmp/null \
                       --x-library-path=/tmp/null \
                       --x-sysconfig-path=/tmp/null && \
    rm -rf /tmp/*

Dockerfileの修正が終わったら、Dockerイメージを再作成し、Gazeboが起動するか確認して下さい。


B.3 Intelのインストール手順


追加のグラフィックボードがないPCの場合、Intelのデフォルトドライバで動くかと思います。
ただし、Intel GPUのハードウェアアクセラレーションを有効にする場合は、追加でドライバをインストールします。
(もし、追加のグラフィックボードがないIntel CPUのパソコンでGazeboが起動しない場合も、本手順を試してみて下さい)

docker/dev/Dokcerfileの以下の箇所から行頭の#を削除して下さい。

# Intel(VAAPI)のドライバをインストールする例
#-------------------------------------------------
RUN apt-get update -q && apt-get install -y \
    i965-va-driver \
    && rm -rf /var/lib/apt/lists/*

Dockerfileの修正が終わったら、Dockerイメージを再作成し、Gazeboが起動するか確認して下さい。


B.4 AMD/ATIのインストール手順


AMD/ATIのグラフィックボードを載せている場合、標準でインストールされるオープンソース版のドライバで動く可能性が高いようです。
※本リポジトリでは、AMD/ATIのグラフィックボード搭載環境での動作確認は実施できておりません

もしGazeboが起動しない場合は、B.1 ホストPCが利用中のドライバの確認方法の手順でホストPCのドライバを確認して、以下のサイトなどを参考にDockerfileでドライバをインストールして下さい。


B.5 グラフィックスドライバ関連の参考サイト



C PROXYの設定について


PROXY環境下では、ホストPCで必要な環境変数の設定を行って下さい。

ホストPCで以下の環境変数が定義されていた場合、docker build(--build-arg)とdocker run(-e)コマンドに渡すようになっています。

  • http_proxy
  • https_proxy
  • ftp_proxy
  • HTTP_PROXY
  • HTTPS_PROXY
  • FTP_PROXY

また、PROXY対象外のアドレスは下記設定になっています。

export no_proxy=127.0.0.1,localhost,${HOSTNAME}
export NO_PROXY=${no_proxy}

上記の2変数は、Dockerコンテナ内の以下2つのファイルで設定しています。

  • /home/developer/.bashrc
  • /home/developer/.bash_profile

もし必要であれば、docker/dev/Dockerfileで以下のようにして設定を上書いて下さい。
XXXXは必要な設定に置き換えて下さい)

RUN sed -i'' 's/no_proxy=.*$/no_proxy=XXXX/' /home/developer/.bashrc
RUN sed -i'' 's/no_proxy=.*$/no_proxy=XXXX/' /home/developer/.bash_profile

D dockerコマンドの実行にsudoが必要な場合

D.1 ユーザをdockerグループに追加する

sudo不要でdockerコマンドを実行したい場合は、以下のコマンドでユーザをdockerグループに追加して、パソコンを再起動して下さい。

sudo usermod -aG docker ${USER}

所属しているグループを確認するには以下のコマンドを実行して下さい。

groups

以下のように、出力にdockerが含まれていればdockerグループに所属できいます。

username adm cdrom sudo dip plugdev lpadmin sambashare docker

※「commands/docker-install.sh」を使用してインストールした場合は、自動でdockerグループへの追加も行う為、本手順は不要になります

D.2 各コマンドにsudoをつけて実行する

何かしらの理由でdockerグループに所属させたくない場合は、本手順書に記載している以下のスクリプトには、sudoを付けて実行して下さい。

  • commands/docker-build.sh
  • commands/docker-launch.sh
  • commands/kit.sh

また、docker 各サブコマンドを実行するときも同様にsudoを付けて実行するようにして下さい。