Windows Docker DesktopにおけるUbuntuコンテナの作成方法とROSの環境設定

# 0⃣ Windows Docker Desktopを起動

# 1⃣ コンテナの作成準備

1. Windows Power Shellを開き、Dockerコンテナを作成したいディレクトリに移動する。
2. 新規のコンテナを、ホストPCが内臓しているGPUを付属した状態で起動する。GPUをつけないとコンテナ内でGUIアプリケーションを動かした際に負荷がかかってPCがフリーズする可能性が高まってしまう。

以下はubuntu20.04で起動した例である。

```docker
# 新しいコンテナの起動
PS C:\Users\hamchan\Ubuntu20.04> docker run --gpus all -it --name v2 ubuntu:20.04
root@a7e0b835c8bf:/# apt update
```

“root”の表示は、すでにUbuntu20.04のコンテナにスーパーユーザとしてログインしている状態を指す。

以降の手順はすべて、Dockerコンテナ内での作業となる。

# 2⃣ コンテナ内の環境設定

```docker
# 環境設定
root@83ec67676497:/# apt update
root@83ec67676497:/# apt install -y locales
root@83ec67676497:/# locale-gen ja_JP.UTF-8
root@83ec67676497:/# update-locale LANG=ja_JP.UTF-8
root@83ec67676497:/# export LANG=ja_JP.UTF-8
```

# 3⃣ ROSのインストール

ここではROS Noeticをインストールする手順を述べる。ROSのバージョンやディストリビューションに関わらず、インストール手順は基本どのROSでも同じである。

```docker
# ROSのインストール
root@83ec67676497:/# apt install -y curl gnupg lsb-release
root@a7e0b835c8bf:/# sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
root@83ec67676497:/# curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | apt-key add -
root@a7e0b835c8bf:/# apt update
root@83ec67676497:/# apt install -y ros-noetic-desktop-full

# ROSの初期設定
root@83ec67676497:/# echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
root@83ec67676497:/# source ~/.bashrc

# 追加パッケージのインストール
root@83ec67676497:/# apt install -y python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential

#TurtleBot3のインストール
root@83ec67676497:/# apt install -y ros-noetic-turtlebot3
root@83ec67676497:/# apt install -y ros-noetic-turtlebot3-gazebo
root@83ec67676497:/# echo "export TURTLEBOT3_MODEL=waffle" >> ~/.bashrc
root@83ec67676497:/# source ~/.bashrc

```

rosのインストールには30分ほどかかる。

# 4⃣ GUIの環境設定

WindowsホストのXmingというアプリケーションを利用してDockerコンテナ内のGUIを動かせるようにするため、下記のコマンドを実行する。

GUIを起動するには、予めWindowsホスト側でXmingを起動しておく必要がある。

```docker
# Xサーバの設定
root@83ec67676497:/# apt install -y x11-apps

# DISPLAY環境変数の設定 
# export DISPLAY=<ホストPCのIPアドレス>:0.0
root@83ec67676497:/# export DISPLAY=1xx.xx.xx.x:0.0
root@a7e0b835c8bf:/# echo "export DISPLAY=1xx.xx.xx.x:0.0" >> ~/.bashrc
root@a7e0b835c8bf:/# source ~/.bashrc
root@a7e0b835c8bf:/# apt update
```

DISPLAY環境変数におけるIPアドレスは、ホストPCの**WSLのIPアドレス**を使用する。

ここで使用しているWindowsホストPCのIPアドレスは1xx.xx.xx.xである(各自のIPアドレスに置き換える)。WSLアドレスはホストマシンの起動のたびに変わる可能性があるので、ipconfigコマンドなどで逐一確認する必要がある。

以下の**イーサネット アダプター vEthernet（WSL）項目のIPアドレス**を使用する。ホストPCのIPアドレスではない。



上記と全く同じ設定をしているのにも関わらずGUIが起動しない場合は、WindowsホストPCのファイアウォール設定でXming X Serverのアクセスが許可されていない可能性がある。

コントロールパネルを開き、システムとセキュリティ > Windows Defender ファイアウォール > 許可されたアプリ > 設定の変更 の順にクリックして以下のような画面が表示されたら、リストから”Xming X Server”を探し、”プライベート”と”パブリック”の両方にチェックを入れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836547/40b185fb-31ba-ba9e-361a-2fca7420b8c6.png)


# 5⃣ ROSの動作確認

同じコンテナに接続したターミナルを3つ用意する。

１．一つ目のターミナルで

```docker
root@83ec67676497:/# roscore
```

２． 二つ目のターミナルで

```docker
# コンテナの起動
PS C:\Users\hamchan\Ubuntu20.04> docker exec -it a7e0b835c8bf /bin/bash

# Gazeboの起動
root@83ec67676497:/# roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch
```

GUIが正しく作動していれば、下図のようなGazeboアプリケーションが起動する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836547/a9988101-906f-6aa2-afa6-4c08f7cc6ff0.png)



３．三つ目のターミナルで

```docker
# コンテナの起動
PS C:\Users\hamchan\Ubuntu20.04> docker exec -it a7e0b835c8bf /bin/bash

# teleopノードの起動
root@83ec67676497:/# roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
```

TurtleBot3モデルの移動制御ができる。


４．操作手順

三つ目のターミナル(teleopコマンドを実行したターミナル)の画面をアクティブにした状態で該当キーボードを押すと、Gazebo画面上のモデルを動かすことができる。

使用キーはw,a,s,d,x,spaceである。

動画のようにGazebo上のモデルをキーボード操作できれば、rosは正しく動作しているといえる。

![Gazebo2024-07-2320-49-27-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836547/00ede324-5ec7-0051-f22e-6af99246cab0.gif)