Ubuntu 18.04にROS2 Dashingをインストール

ROS1の最新バージョンとROS2の最新バージョン、ros1_bridgeブリッジを試したいので、
MacbookProにUbuntu 18.04、ROS1 Melodic、ROS2 Dashingをインストールして見ました。
（VMではなく、直接MacbookProにインストールする理由は、パフォーマンスが速い）


Ubuntu16.04にROS2 Crystalをインストールは、[こちら](https://qiita.com/k-koh/items/08b2cba3421d59b9afd1)


# ROSとOSの対応関係
## UbuntuとROS1対応関係
| Ubuntuバージョン  | ROSバージョン  | サポート期限 |
|--:|:--|:--|
| 14.04  | Indigo Igloo  | 2019年5月 |
| 16.04  | Kinetic Kame  | 2021年5月 |
| 18.04  | Melodic Morenia  | 2023年5月 |

## UbuntuとROS2対応関係
| ROS2バージョン　　　| リリース時期| サポート期限|サポートOSバージョン|
|:-----------------|------------:|:-------:|:-------:|
| Ardent Apalone   | 2017/12     | 2018/12 |Ubuntu 16.04,Mac OS X 10.12 ,Windows 10|
| Bouncy Bolson    | 2018/07     | 2019/07 |Ubuntu 18.04,Ubuntu 16.04 ,Mac OS X 10.12,Windows 10|
| Crystal Clemmys  | 2018/12     | 2019/12 |Ubuntu 18.04,Ubuntu 16.04 ,Mac OS X 10.12,Windows 10|
| Dashing Diademata| 2019/05     | 2021/05 |Ubuntu 18.04,Mac OS X 10.12,Windows 10,Debian Stretch,OpenEmbedded Thud,webOS OSE|

#MacBookProにUbuntu 18.04をインストール
## MacBookPro仕様
MacBook Pro 13 inch "Core i5" 2.6GHz Retina (Mid 2014)

| Built-in Display  | 13.3 |
|:--|:--|
| Processor Type  | Core i5 (I5-4278U)  |
| Processor Speed  | 2.6GHz |
| Apple Model Number  | A1502 (EMC 2875) |
| Architecture  | 64-Bit |
| Model Identifier  | MacBookPro11,1 |
| Apple Subfamily  | Retina Mid 2014 |
| Standard RAM  | 8GB  |
| Video Card  | Iris 5100 |

## UbuntuのイメージをUSBスティックに書き込む
1. [Ubuntu 18.04](http://releases.ubuntu.com/18.04/)のデスクトップ版のイメージをダウンロード
2. Etcherなどを使って、USBにその.isoファイルを書き込む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386259/2dd2d126-0bb2-3915-c7a7-728ba399c7e2.png)

## Ubuntuのインストール
1. Ubuntu用パーティションを作成
2. [rEFInd](http://www.rodsbooks.com/refind/index.html)をインストールしてMacOSとUbuntuデュアルブートできるように準備
2. MacBookにUSBを挿した状態でoptionを押しながらMacBookを起動
3. rEFIndの起動選択画面でUSBを選択
3. Ubuntuの「Install Ubuntu」メニューよりインストール

## Ubuntu「インストールの種類」画面の設定
1. 「インストールの種類」画面で「それ以外」を選択
2. Ubuntu用のパーティションを選択して「ext4」で初期化、マウントポイントを「/」に設定
3. ブートローダインストールデバイスにUbuntu用パーティションを選択
4. インストール開始

## Ubuntuインストールの確認
該当ModelのMacBookProを再起動すると、
既にWiFi, Keyboard, Audio, Bluetooth, トラックパッドが正常に使用できます^-^。

＊最新ModelのMacBook ProにUbuntuインストール場合の注意点

```
MacBook Pro "Core i5" 2.3 13-Inch 
(Mid-2017 Retina Display, Two Thunderbolt 3 Ports)
(Apple Model Number: A1708 EMC 3164)
(Model Identifier: MacBookPro14,1)
の機種にUbuntu 16.04インストールには、
Keyboard & Touchpadは使用できない状態ですが（USBのmouseとKeyboard使用可能）、
インストール完了後、下記パッチを適用すると使えます。
https://github.com/Dunedan/mbp-2016-linux
https://github.com/cb22/macbook12-spi-driver

但し、Audio使用できない、USBのBluetoothを挿してBluetooth経由でAudioを使用する方法もあります。
```

# Ubuntu 18.04にROS Melodicをインストール
## PPAの追加
```
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
$ sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
$ sudo apt update
```

## ROSのインストール(melodic)
```
sudo apt install ros-melodic-desktop-full
```

## Dependencies for building packages
```
sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential
```

## 初期設定
```
$ sudo rosdep init
$ rosdep update
```

## 環境変数を追加
```
$ echo "source /opt/ros/melodic/setup.bash" >> .bashrc
```

## ワークスペースの作成
```
$ source ~/.bashrc
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_init_workspace src
$ echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
$ catkin_make && source ~/catkin_ws/devel/setup.bash
```


# Ubuntu 18.04にROS2 Dashingをインストール
## ROS1 起動環境のコメントアウト
.bashrcで設定したROS1の起動スクリプトをコメントアウトします。

```shell
# source /opt/ros/kinetic/setup.bash
# source ~/catkin_ws/devel/setup.bash
```
変更したスクリプトを適用します。

```console
$ source ~/.bashrc
```

## PPAの追加
```
$ sudo apt update && sudo apt install curl gnupg2 lsb-release
$ curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
$ sudo sh -c 'echo "deb [arch=amd64,arm64] http://packages.ros.org/ros2/ubuntu `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list'
$ sudo apt update
```

## ROSのインストール(Dashing)
```
$ sudo apt install ros-dashing-desktop
```

## colcon build インストール
```
$ sudo apt install python3-colcon-common-extensions
```

## ROS 2 command自動補完のインストール
```
$ sudo apt install python3-argcomplete
```

## 環境変数を追加
```
$ echo "source /opt/ros/dashing/setup.bash" >> ~/.bashrc
```

## ワークスペースの作成
```
$ source ~/.bashrc
$ mkdir -p ~/ros2_ws/src 
$ cd ~/ros2_ws
$ colcon build
$ echo "source install/local_setup.bash && source install/setup.bash" >> ~/.bashrc
```


## 動作テスト
１つ目のターミナルで1秒ごとにメッセージがpublish(送信)されます。

```console
$ ros2 run demo_nodes_cpp talker

[INFO] [talker]: Publishing: 'Hello World: 1'
[INFO] [talker]: Publishing: 'Hello World: 2'
[INFO] [talker]: Publishing: 'Hello World: 3'
```

２つ目のターミナルで1秒ごとにメッセージがsubscribe(受信)されます。

```console
$ ros2 run demo_nodes_cpp listener

[INFO] [listener]: I heard: [Hello World: 1]
[INFO] [listener]: I heard: [Hello World: 2]
[INFO] [listener]: I heard: [Hello World: 3]
```

# ROS 1とROS 2のメッセージ通信

ROS 1とROS 2の通信プロトコルは全く違うので、直接繋がることはできません。
しかしROS 1にあってROS 2にないフィーチャーはまだたくさんあります。
ROS 1とROS 2は一緒に利用することが望ましいです。

この問題を解決するためにROS 2がros1_bridgeというプロトコル通訳用（「ブリッジ」）のパッケージを提供します。

## ROS1 bridgeのインストール
```console
$ sudo apt update
$ sudo apt install ros-dashing-ros1-bridge
```

## ROS1 bridge 動作テスト
ROS 1を起動
Shell A (ROS 1 only):

```console
$ source /opt/ros/melodic/setup.bash
$ roscore
```

ros1_bridgeを起動
Shell B (ROS 1 + ROS 2):

```console
$ source /opt/ros/melodic/setup.bash
$ source /opt/ros/dashing/setup.bash
$ export ROS_MASTER_URI=http://localhost:11311
$ ros2 run ros1_bridge dynamic_bridge

[Shell D]を実行すると、下記メッセージが出る
created 1to2 bridge for topic '/chatter' with ROS 1 type 'std_msgs/String' and ROS 2 type 'std_msgs/msg/String'
created 2to1 bridge for topic '/rosout' with ROS 2 type 'rcl_interfaces/msg/Log' and ROS 1 type 'rosgraph_msgs/Log'
[INFO] [ros_bridge]: Passing message from ROS 1 std_msgs/String to ROS 2 std_msgs/msg/String (showing msg only once per type)
[INFO] [ros_bridge]: Passing message from ROS 2 rcl_interfaces/msg/Log to ROS 1 rosgraph_msgs/Log (showing msg only once per type)
removed 1to2 bridge for topic '/chatter'
removed 2to1 bridge for topic '/rosout'
```

ROS 1 talkerを起動
Shell C:

```console
$ source /opt/ros/melodic/setup.bash
$ rosrun rospy_tutorials talker

[INFO] [1569430196.302879]: hello world 1569430196.3
[INFO] [1569430196.403099]: hello world 1569430196.4
[INFO] [1569430196.503039]: hello world 1569430196.5
```

ROS 2 listenerを起動
Shell D:

```console
$ source /opt/ros/dashing/setup.bash
$ ros2 run demo_nodes_cpp listener

[INFO] [listener]: I heard: [hello world 1569430217.2]
[INFO] [listener]: I heard: [hello world 1569430217.3]
[INFO] [listener]: I heard: [hello world 1569430217.4]
```