［供養］ROS2Learnを使ってみた［取扱注意］

# はじめに

もはや誰得感はありますが，年末のご供養ってコトで．

## ROS2Learnとは？

ROS 2向け強化学習フレームワークです．Gazebo上でロボットアーム等の振る舞いを自律学習して，目標タスクを実行するモデルを自動生成します．[openai_ros](http://wiki.ros.org/openai_ros)のROS 2対応版という位置づけで正しいと思われます．

Acutronic Roboticsが自社ロボットアームMARAをReference Modelとして強力に開発を推し進めていて，，，というところでお察しください( ´·௰·`)

公式ドキュメントなどはWebの海に離散しましたが，幾つか情報の痕跡が残っています．
- [(ROS Discourse) Check out gym-gazebo2 and ROS2Learn!](https://discourse.ros.org/t/check-out-gym-gazebo2-and-ros2learn/8350)
- [(arXiv) ROS2Learn: a reinforcement learning framework for ROS 2](https://arxiv.org/abs/1903.06282)
- [(YouTube) MARA robotic arm : Training MARAOrient using PPO2 through ROS2learn framework and gym-gazebo2.
](https://www.youtube.com/watch?v=sdf3RI6hMKY)

GitHubリポジトリは残念ながらachivedされています．なんかあってもIssueも立てられんorz
- https://github.com/AcutronicRobotics/ros2learn

## なんでこの記事書いたの？

筆者は2019年6月頃にコレを動かして遊んでみていました．なんかいろいろできそうだな〜と夢想している間に件の事態になったわけですが，，，
せっかく動かしてみた経験があってそのメモを残していたし，また[『World MoveIt Day 2019 in Tokyo』](https://rosjp.connpass.com/event/149106/)の機会にまだちゃんと動くことが確認できたので，環境構築の整え方くらいでも[ROS2 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ros2)に放流してみようかなと考えた次第です．

なお原典がすでに存在しませんので，情報の正当性は保証しません．いろいろ関係ツールをlatest versionにするとマズい可能性は高いので，なるべくそれぞれの当時のversionは明記しておきます．
違うバージョンでも動いたとか，この手順通りにやったら動かん！とか情報ありましたらお知らせくださいませ（でもどうすんだ？？

# 前提とする環境

- Ubuntu 18.04.2 LTS
- ROS 2 Dashing
- Gazebo 9

Eloquentがリリースされましたが，さてどうでしょうか？？

# ROS2Learnの環境構築

千里の路も`git clone`からです．

```bash
cd ~ && git clone -b dashing https://github.com/acutronicRobotics/ros2learn.git 
cd ros2learn 
git submodule update --init --recursive
```

各モジュールをインストールしていきます．

## gym_gazebo2 の準備

https://github.com/AcutronicRobotics/gym-gazebo2

これもあくとろ（ry

[INSTALL.md](https://github.com/AcutronicRobotics/gym-gazebo2/blob/dashing/INSTALL.md)に従ってやっていきます．

### Gazebo のインストール

いつもどおりですね．
9.9.0以上が良いとのことで，古ければインストールし直しましょう．当方の環境では`9.11.0`で動いてます．

```bash
curl -sSL http://get.gazebosim.org | sh
```

### 依存パッケージのインストール

DDSはOpenSpliceを使ってほしいようです．今なら直っているかも．
あとTensorflow入れてます．当方の環境では当時入れた`1.14.0`ですが，最新の2.0.0でも動くかは分かりません．

```bash
sudo apt update && sudo apt install -y \
ros-dashing-action-msgs \
ros-dashing-message-filters \
ros-dashing-yaml-cpp-vendor \
ros-dashing-urdf \
ros-dashing-rttest \
ros-dashing-tf2 \
ros-dashing-tf2-geometry-msgs \
ros-dashing-rclcpp-action \
ros-dashing-cv-bridge \
ros-dashing-image-transport \
ros-dashing-camera-info-manager

# Install OpenSplice RMW implementation. Required for dashing until default FastRTPS is fixed.
sudo apt install ros-dashing-rmw-opensplice-cpp

sudo apt update && sudo apt install -y \
  build-essential \
  cmake \
  git \
  python3-colcon-common-extensions \
  python3-pip \
  python-rosdep \
  python3-vcstool \
  python3-sip-dev \
  python3-numpy \
  wget

# Install TensorFlow CPU. Feel free to get the GPU version at https://www.tensorflow.org/install/gpu.
pip3 install tensorflow

# Additional utilities
pip3 install transforms3d billiard psutil

# Fast-RTPS dependencies
sudo apt install --no-install-recommends -y \
  libasio-dev \
  libtinyxml2-dev
```

### MARA用のWorkSpace作成とビルド

```bash
mkdir -p ~/ros2_mara_ws/src
cd ~/ros2_mara_ws
wget https://raw.githubusercontent.com/AcutronicRobotics/MARA/dashing/mara-ros2.repos
vcs import src < mara-ros2.repos
wget https://raw.githubusercontent.com/AcutronicRobotics/gym-gazebo2/dashing/provision/additional-repos.repos
vcs import src < additional-repos.repos
# Avoid compiling erroneus package
touch ~/ros2_mara_ws/src/orocos_kinematics_dynamics/orocos_kinematics_dynamics/COLCON_IGNORE
```

HRIMを生成します．

```bash
cd ~/ros2_mara_ws/src/HRIM
sudo pip3 install hrim
hrim generate models/actuator/servo/servo.xml
hrim generate models/actuator/gripper/gripper.xml
```

ビルドしていきます．
ちょっとパッケージのビルド順にクセがあるようです．

```bash
source /opt/ros/dashing/setup.bash
cd ~/ros2_mara_ws
colcon build --merge-install --packages-skip individual_trajectories_bridge
# Remove warnings
touch ~/ros2_mara_ws/install/share/orocos_kdl/local_setup.sh ~/ros2_mara_ws/install/share/orocos_kdl/local_setup.bash
```

なお当方が試したときはrosidl_typesupport_openspliceにあったバグを踏み抜いたのですが，すでに修正対応されています．（[参考](https://github.com/ros2/rosidl_typesupport_opensplice/pull/33)）

### OpenAI Gymのインストール

まず`pip3 uninstall gym`してから最新版をソースからビルドしようなっ！て言ってますが，怖いですねぇ．
当方のcommit tagは`0.14.0`です．

```bash
cd ~
git clone https://github.com/openai/gym
cd gym
pip3 install -e .
```

### gym-gazebo2 のインストール

以上の操作を行ってから，`ros2learn/`内でgym-gazebo2をインストールします．

```bash
cd ~/ros2learn/environments/gym-gazebo2
pip3 install -e .
```

### 環境変数の設定

このへんはご自由に．私はこういうものは.bashrcでfunction alias拵えています．

```bash
cd ~/ros2learn/environments/gym-gazebo2
echo "source `pwd`/provision/mara_setup.sh" >> ~/.bashrc
echo "export RMW_IMPLEMENTATION=rmw_opensplice_cpp" >> ~/.bashrc
source ~/.bashrc
```


## baselines パッケージのインストール

これなんなのかよく分かっていません．誰か教えてください．
OpenAIの標準的なアルゴリズムが実装されたパッケージだと思ってます．

```bash
cd ~/ros2learn/algorithms/baselines
pip3 install -e .
```

参考：https://github.com/AcutronicRobotics/baselines

## 依存ツールのインストール

Tensorboard で可視化できるのですが，その関係ですね．

```bash
pip3 install pandas
pip3 install matplotlib
sudo apt install python3-tk
```

# QuickStart with MARA_arm

まずはGazebo連携でMARAのモデルがちゃんと動くか確認します．

```bash
source ~/ros2learn/environments/gym-gazebo2/provision/mara_setup.sh
cd ~/gym-gazebo2/examples/MARA
python3 gg_random.py -g
```

`-h`オプションでなにができるか確認してみてください．

## Train an agent

ロボットアームの姿勢制御がサンプルの学習対象のタスクのようです．

```bash
source ~/ros2learn/environments/gym-gazebo2/provision/mara_setup.sh
cd ~/ros2learn/experiments/examples/MARA
python3 train_ppo2_mlp.py -g
```

`-g`オプションを付与すれば，Gazeboが起動して学習状況を可視的に確認できます（PCはめっちゃ重くなります）
ずっと実行し続けて，やればやるほど精度が上がる（はず）です．

学習データは `/tmp/ros2learn/MARA-v0/ppo2_mlp/<timestamp>/` に順次生成されていきます．

## Run a trained policy

生成した学習データをもとに対象タスクを実行します．

```bash
$ cd ~/ros2learn/algorithms/baselines/baselines/ppo2/
$ vim default.py 
$ git diff 
$ diff --git a/baselines/ppo2/defaults.py b/baselines/ppo2/defaults.py
index cc7d4a2..4239923 100644
--- a/baselines/ppo2/defaults.py
+++ b/baselines/ppo2/defaults.py
@@ -51,7 +51,7 @@ def mara_mlp():
         # env_name = 'MARACollisionOrient-v0',
         transfer_path = None,
         # transfer_path = '/tmp/ros2learn/MARA-v0/ppo2_mlp/2019-02-19_12h47min/checkpoints/best',
-        trained_path = '/tmp/ros2learn/MARA-v0/ppo2_mlp/2019-04-02_13h18min/checkpoints/best'
+        trained_path = '/tmp/ros2learn/MARA-v0/ppo2_mlp/2019-06-12_14h37min/checkpoints/best'
     )
 
 def mara_lstm():

$ cd ~/ros2learn/experiments/examples/MARA
$ python3 run_ppo2_mlp.py -g -r -v 0.3
```

`defaults.py` を編集して，実行する学習データを指定します．
`-g` はGazebo起動で可視化
`-r` は実速度 (real speed) で実行
`-v` は速度 (velocity) の指定 （この例では 0.3 rad/sec）
という感じです．

## Visualize training data on tensorboard

tensorboard機能で学習データの各種統計情報を表示することができます．

```bash
$ tensorboard --logdir=/tmp/ros2learn/MARA-v0/ppo2_mlp --port 8008 
```

としてやって，ブラウザで http://localhost:8008/ にアクセスしてみてください．


# 所感

当時のメモをそのまま貼り付けてみます．

- Gazebo準拠に作成したモデルを用いて強化学習を実行するには非常に便利そう
  - Gazeboで学習経過／推論結果を可視的に確認できるのも良い
  - 対象のモデルとタスクを作成するのが大変ではあるかもしれない
    - 例えばTurtleBot3は，ROBOTIS公式のデモのものを流用するなど？
- 学習アルゴリズムのスクリプトを自作することもできそう
  - baseline が標準のものだが，詳細は不明（TensorFlowの一般的なもの？）
  - 様々な学習モデルやアルゴリズムの比較評価をできそう
- 自前ロボット適用には用意すべきファイルは多そう
  - 基本は，GazeboモデルとPython3スクリプトの作成になる模様

まだワカラナイことが多すぎるので，いろいろ深堀りしてみたさはありますが，はてさて，，，