【OpenRTM】OpenRTM-aist 2.0 (ROS transport含む)のインストール (ソースからのビルド)

# はじめに
OpenRTM-aist 2.0は[公式GitHub](https://github.com/OpenRTM/OpenRTM-aist)で開発中のOpenRTM-aistの最新版です。
自分でビルドしてインストールする必要があり、ちょっと苦戦したので残しておきます。

:::note warn
注意点
・OpenRTM-aistの旧バージョンなどは何も入っていない環境で試しました。公式サイトと前提条件が違うかもしれません。この記事の通りに実行すれば何も入っていない環境でもインストールできると思います。
・まだ公式HPのマニュアルなども整備中のようなので情報が変わるかもしれませんがご容赦ください。
:::

## OpenRTM-aistって何？
OpenRTM-aistが何か、ROS Transport機能が何かは[公式HP](https://www.openrtm.org/openrtm/ja)などを参照ください。
OpenRTM-aistについてひとことで言うと産総研が開発しているロボット用ミドルウェアです。
ROSとの通信機能がROSTransport機能になり、バージョン2.0から追加されました。

また、記事内でコンポーネントのことをRTCと言っている場合があります。

## この記事でやること

 - ROS Transport機能含むOpenRTM-aist 2.0 C++版のインストール
 - OpenRTM-aist-2.0 Python版のインストール
 - rtshellのインストール

## やらないこと

 - ROSのインストール

ROSがインストールしてある前提で話を進めます。

# 環境
Windows 10 Home上のWSL2

 - Ubuntu 18.04
 - ROS Melodic
 - OpenRTM-aist 2.0 (今回はこれをインストール)


# OpenRTM-aist 2.0 (C++版)のインストール
## ダウンロード&ビルド&インストール

参考：
[①公式ページ(OpenRTM-aist2.0のインストール)](https://www.openrtm.org/openrtm/ja/node/6339)
[②公式ページ(ROS通信機能の利用)](https://www.openrtm.org/openrtm/ja/doc/developersguide/advanced_rt_system_programming/ros_comm_use)

①のUbuntu+omniORBの部分を参考にビルド&インストールを行います。
②にあるようにROS通信機能をできるようにしておきます。 (`-DROS_ENABLE=ON`の部分)
適当なディレクトリで作業をしてください。

:::note warn
最初と最後のコマンドは①にも②にもないので注意して下さい。  
最初のコマンドを実行しなかった場合：cmakeでエラー
最後のコマンドを実行しなかった場合：コンポーネントを実行する際にエラーが出ました。
:::

```
$ sudo apt-get install libomniorb4-dev omniidl
$ git clone https://github.com/OpenRTM/OpenRTM-aist
$ cd OpenRTM-aist/
$ mkdir build
$ cd build/
$ cmake -DCORBA=omniORB -DCMAKE_BUILD_TYPE=Release -DROS_ENABLE=ON ..
$ cmake --build . --config Release -- -j$(nproc)
$ sudo cmake --build . --target install
$ sudo ldconfig -v
```

<details><summary>cmakeのエラー内容</summary>
```
-- Checking for module 'omniORB4'
--   No package 'omniORB4' found
CMake Error at /usr/share/cmake-3.10/Modules/FindPkgConfig.cmake:419 (message):
  A required package was not found
Call Stack (most recent call first):
  /usr/share/cmake-3.10/Modules/FindPkgConfig.cmake:597 (_pkg_check_modules_internal)
  CMakeLists.txt:25 (pkg_check_modules)
-- Configuring incomplete, errors occurred!
See also "/home/XXXX/temp/OpenRTM-aist/build/CMakeFiles/CMakeOutput.log".
```

</details>


これでインストールは完了です。サンプルコンポーネントを動かしてみましょう。

## サンプルコンポーネントを実行する
まず、roscoreを起動してください。

### rtc.confの作成

コンポーネントの動作に必要な`rtc.conf`というファイルをコンポーネントを実行する場所で作成します。
ここでは、`~/workspace/ros_transport_test`というディレクトリを作成しています。OpenRTM-aistではLinux系なら `~/workspace`、WindowsならCドライブ直下のworkspaceフォルダ(`C:\workspace`)で作業することが多いです。すくなくとも僕の周りでは。

```
$ cd ~/workspace
$ mkdir ros_transport_test
$ cd ros_transport_test
$ sudo nano rtc.conf
```

rtc.confの中身は以下です。入力後、エディタを終了してください。

```rtc.conf
manager.modules.load_path: /usr/local/lib/openrtm-2.0/transport/
manager.modules.preload: ROSTransport.so
manager.components.preconnect: ConsoleOut0.in?interface_type=ros&marshaling_type=ros:std_msgs/Float32&ros.topic=chatter&ros.node.name=ConsoleOut0, ConsoleIn0.out?interface_type=ros&marshaling_type=ros:std_msgs/Float32&ros.topic=chatter&ros.node.name=ConsoleIn0
manager.components.preactivation: ConsoleOut0, ConsoleIn0
```

### サンプルコンポーネントの実行①

**そのまま[このディレクトリで](#rtc.confの作成)**コンポーネントを実行します。サンプルコンポーネントは以下にたくさん入っています。
`/usr/local/share/openrtm-2.0/components/c++/examples/`

```
$ /usr/local/share/openrtm-2.0/components/c++/examples/ConsoleInComp
```

以下のような記述が出たら成功です。

```
Creating a component: "ConsoleIn"....succeed.
=================================================
 Component Profile
-------------------------------------------------
InstanceID:     ConsoleIn0
Implementation: ConsoleIn
Description:    Console input component
Version:        2.0.0
Maker:          AIST
Category:       example
  Other properties
implementation_id: ConsoleIn
type_name: ConsoleIn
description: Console input component
```

:::note warn
僕の場合では、ここでエラーが発生しました。
上記のインストールの最後のコマンドを実行していれば大丈夫でした。
:::

<details><summary>エラー内容と解決策</summary>
```
/usr/local/share/openrtm-2.0/components/c++/examples/ConsoleInComp: error while loading shared libraries: libRTC.so.2.0: cannot open shared object file: No such file or directory
```
[公式のGitHub](https://github.com/OpenRTM/OpenRTM-aist/issues/275)で言及されていました。
</details>

### サンプルコンポーネントの実行②
**[rtc.confを作成した](###rtc.confの作成)ディレクトリ**で以下を実行してください。

```
$ /usr/local/share/openrtm-2.0/components/c++/examples/ConsoleOutComp
```

これも、先ほど実行したコンポーネントと同じような表示が出ていれば成功です。

### 動作確認
①の画面

```
------------------------------
Please input number:
```

②の画面

```
------------------------------

```

のようになっていると思います。①の画面に何か数字を入れると②の画面に出てきます。
また、この時にROS関係のコマンドを打っても動作を確認することができます。

```
$ rosnode list
/ConsoleIn0
/ConsoleOut0
/rosout
```

```
$ rostopic list
/chatter
/rosout
/rosout_agg
```

以下のコマンドで、①に入力した数字を見ることができます。

```
$ rostopic echo /chatter
```

ここまでできたら、一度コンポーネントを終了してください。

### RTCの要素どこいった？
OpenRTM-aistを触ったことがある方なら気付くと思うのですが、このサンプルコンポーネント、ROSで通信しているんですよね。rtc.confのおかげみたいなのですが。

rtshellでコンポーネントの様子見るか～と思ったらインストールされていない。もはやrtm-namingも実行していない。
と、いうことでOpenRTM-aist 2.0 Python版とrtshellをダウンロードします。


# OpenRTM-aist 2.0 (Python版)のインストール
## ダウンロード&ビルド&インストール

正直に言うとPython版の方が苦労しました。前提条件が違うのかな？

参考：[公式ページ(OpenRTM2.0 Pythonのインストール)](https://www.openrtm.org/openrtm/ja/doc/installation/install_2_0/install_python_2_0/build_source_linux_python_2_0)

上記ページにも書いてありますが、インストールには、以下のものが必要です。

 - Python: ビルドツールを利用するために必要
 - omniORBpy: OpenRTM-aist のビルド (IDL コンパイル) に必要

:::note warn
OpenRTM-aist 2.0 Python版およびrtshellは最終的にPython3で動作を確認しました。
参考ページと少しコマンドが異なるので注意してください。
:::

まずは、omniORB関係を以下のコマンドで取得します。

```
$ sudo apt-get install python3-omniorb-omg omniidl-python3
$ sudo apt-get install omniorb-nameserver
```

次に、OpenRTM-aist本体をダウンロード&ビルド&インストールします。

```
$ git clone https://github.com/OpenRTM/OpenRTM-aist-Python
$ cd OpenRTM-aist-Python
$ mkdir build
$ python3 setup.py build
$ sudo python3 setup.py install
```

これで完了です。以下のコマンドでエラーが出なければ正常に動作しています。

```
$ python3 -c "import RTC"
```

これでrtm-namingは立ち上がるな～と思い実行してみましたが、rtshellがないのでコンポーネントの様子を把握できません。

rtm-naming自体は以下のコマンドで起動できました。Pythonのバージョンは環境によって変わるかと思います。

```
$  python3 /usr/local/lib/python3.6/dist-packages/OpenRTM_aist/utils/rtm-naming/rtm-naming.py
```

:::note warn
僕の場合では、ここでエラーが発生しました。
上記のインストールの最後のコマンドを実行していれば大丈夫でした。
:::

<details><summary>エラー内容</summary>
```
Starting omniORB omniNames:  LAPTOP-83EDG5N9 : 2809
Not found omniNames.
```
</details>

# rtshellのインストール
参考：[公式HP(rtshell)](https://www.openrtm.org/openrtm/ja/content/rtshell)

以下のコマンドを実行してください。
僕は上記でPython3を使用していたのでpip3にしています。

```
$ pip3 install rtshell-aist
$ sudo rtshell_post_install
```

以下のコマンドでコマンドが見つかりませんのエラーが出なければ大丈夫です。

```
$ rtfind localhost
```

# 全体の動作確認
サンプルコンポーネントを使用して、全体の動作確認をします。
どうやらこのrtc.confを使用したサンプルコンポーネントはROSノードとしてもRTCとしても動作しているみたいです。

## roscore、ネーミングサービスの起動

```
$ roscore
```

```
$ python3 /usr/local/lib/python3.6/dist-packages/OpenRTM_aist/utils/rtm-naming/rtm-naming.py
```

## コンポーネントの起動
`rtc.conf`があるディレクトリに移動してください。

①数字を入力して出力するコンポーネント

```
$ /usr/local/share/openrtm-2.0/components/c++/examples/ConsoleInComp
```

②数字を受け取って表示するコンポーネント

```
$ /usr/local/share/openrtm-2.0/components/c++/examples/ConsoleOutComp
```

## rtshellで確認
ROS系のコマンドで確認できるのは先ほど説明しました。
rtshellで動作を確認してみましょう。
`XXXXXXXXXX`の部分は環境によって変わります。

```
$ rtfind localhost
/localhost
/localhost/XXXXXXXXXX.host_cxt
/localhost/XXXXXXXXXX.host_cxt/ConsoleIn0.rtc
/localhost/XXXXXXXXXX.host_cxt/ConsoleOut0.rtc
```

以下のコマンドで①のコンポーネントで入力した数字が表示されます。

```
$ rtprint /localhost/XXXXXXXXXX.host_cxt/ConsoleIn0.rtc:out
```

`123`と入力した場合

```
rtctree.rtc.RTC.TimedLong(tm=rtctree.rtc.RTC.Time(sec=0, nsec=0), data=123)
```


# おわりに
まとめとして、

 - OpenRTM-aist 2.0をインストールしました。
 - rtshellをインストールしました。
 - この記事にあるようなrtc.confを参照させてコンポーネントを実行するとROSノードとしてもRTCとしても動作しました。

試したかったので試しました！以上

# 参考

https://www.openrtm.org/openrtm/ja/doc/toolmanuals/rostransport

https://www.openrtm.org/openrtm/ja/doc/developersguide/advanced_rt_system_programming/ros_comm_use

https://www.openrtm.org/openrtm/ja/node/6339

https://www.openrtm.org/openrtm/ja/doc/installation/install_2_0/install_python_2_0/build_source_linux_python_2_0

https://www.openrtm.org/openrtm/ja/node/6585

https://github.com/OpenRTM/OpenRTM-aist/issues/275

https://www.openrtm.org/openrtm/ja/content/rtshell

https://www.openrtm.org/openrtm/ja/doc/installation/install_1_1/python_1_1/test_linux_python_1_1

https://command-not-found.com/omniNames


# その他
## rtc.confについて

```rtc.conf
manager.modules.load_path: /usr/local/lib/openrtm-2.0/transport/
manager.modules.preload: ROSTransport.so
manager.components.preconnect: ConsoleOut0.in?interface_type=ros&marshaling_type=ros:std_msgs/Float32&ros.topic=chatter&ros.node.name=ConsoleOut0, ConsoleIn0.out?interface_type=ros&marshaling_type=ros:std_msgs/Float32&ros.topic=chatter&ros.node.name=ConsoleIn0
manager.components.preactivation: ConsoleOut0, ConsoleIn0
```

以下のような意味があるそうです。([参考](https://www.openrtm.org/openrtm/ja/doc/developersguide/advanced_rt_system_programming/ros_comm_use))

>manager.modules.load_path
シリアライザーモジュール(ROSTransport.so)を置く場所を指定します。
manager.modules.preload
ROS通信のためのシリアライザーモジュールのの指定をします。Ubuntuの場合にはROSTransport.soを指定します。
manager.components.preconnect
コネクタ生成に関する設定をしています。interface_type(インターフェース型)にros、marshaling_type(マーシャリング型)に対応シリアライザの名前、ros.topic(トピック名)に適当な任意の名前を設定します。

>OpenRTM-aistのシリアライザーモジュール(ROSTransport.so)が対応しているメッセージ型は以下のようになります。

>[シリアライザ名とROS/ROS2メッセージ型](https://www.openrtm.org/openrtm/ja/node/6585)

## rtc.confがない場所で起動したらどうなるか
普通のRTCとして動作する。
状態遷移もするため`rtact`コマンドでアクティベートをする必要がある。

## バージョン 1.Xはどうやってインストールできるか
1.1系と1.2系があります。
公式サイトのダウンロードタブからWindowsだとインストーラー、Linuxだと一括インストールスクリプトをダウンロードできます！そこからのインストールは簡単です。

例：1.2.2のダウンロードページ

https://www.openrtm.org/openrtm/ja/download/openrtm-aist-cpp/openrtm-aist-cpp_1_2_2_release