Ubuntu16.04にROS2 Crystalをインストール

Ubuntu16.04に既にROS1インストールしているので、ROS2 Crystalをインストールして試したいと思います。

Ubuntu 18.04にROS2 Dashingをインストールは、[こちら](https://qiita.com/k-koh/items/838c70004119c329c617)

# ROS2 サポートOSバージョン
| ROS2 Distro      | Release date| EOL date|Supported Platforms|
|:-----------------|------------:|:-------:|:-------:|
| 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|

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

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

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

## ROS2リポジトリ追加
```console
$ 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'
```

## ツールのインストール
```console
$ sudo apt update && sudo apt install -y build-essential cmake git python3-colcon-common-extensions python3-pip python-rosdep python3-vcstool wget
$ sudo -H python3 -m pip install -U argcomplete flake8 flake8-blind-except flake8-builtins flake8-class-newline flake8-comprehensions flake8-deprecated flake8-docstrings flake8-import-order flake8-quotes git+https://github.com/lark-parser/lark.git@0.7b pytest-repeat pytest-rerunfailures pytest pytest-cov pytest-runner setuptools
$ sudo apt install --no-install-recommends -y libasio-dev libtinyxml2-dev
```

## ROS2コードの取得
```console
$ mkdir -p ~/ros2_ws/src
$ cd ~/ros2_ws
$ wget https://raw.githubusercontent.com/ros2/ros2/release-latest/ros2.repos
$ vcs import src < ros2.repos
```

## 依存関係のインストール
```console
$ sudo apt install -y python-rosdep
$ sudo apt-get install python-rospkg
$ sudo rosdep init
$ rosdep update
$ CHOOSE_ROS_DISTRO=crystal
$ rosdep install --from-paths src --ignore-src --rosdistro $CHOOSE_ROS_DISTRO -y --skip-keys "console_bridge fastcdr fastrtps libopensplice67 libopensplice69 python3-lark-parser rti-connext-dds-5.3.1 urdfdom_headers"
```

## -std=c++11 コンパイルフラグの追加
orocos_kdlの「unique_ptr’ was not declared in this scope」コンパイルエラーを回避するため、
~/ros2_ws/src/ros2/orocos_kinematics_dynamics/orocos_kdl/CMakeLists.txtに
-std=c++11のコンパイルフラグを追加します。

```xml
set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
```

## ビルド
```console
$ colcon build --symlink-install --packages-ignore qt_gui_cpp rqt_gui_cpp
```
## .bashrcへ設定追加
```
source ~/ros2_ws/install/setup.bash
```

## 動作テスト
１つ目のターミナルで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のメッセージ通信

## ROS1 bridgeのインストール
```console
$ source /opt/ros/kinetic/setup.bash
$ source ~/ros2_ws/install/local_setup.bash
$ colcon build --symlink-install --packages-select ros1_bridge --cmake-force-configure
```

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

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

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

```console
$ export ROS_MASTER_URI=http://localhost:11311
$ ros2 run ros1_bridge dynamic_bridge
```

ROS 1 talkerを起動
Shell C:

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

ROS 2 listenerを起動
Shell D:

```console
$ ros2 run demo_nodes_cpp listener
```