はじめに
OpenRTM-aist 2.0は公式GitHubで開発中のOpenRTM-aistの最新版です。
自分でビルドしてインストールする必要があり、ちょっと苦戦したので残しておきます。
注意点
・OpenRTM-aistの旧バージョンなどは何も入っていない環境で試しました。公式サイトと前提条件が違うかもしれません。この記事の通りに実行すれば何も入っていない環境でもインストールできると思います。
・まだ公式HPのマニュアルなども整備中のようなので情報が変わるかもしれませんがご容赦ください。
OpenRTM-aistって何?
OpenRTM-aistが何か、ROS Transport機能が何かは公式HPなどを参照ください。
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のインストール)
②公式ページ(ROS通信機能の利用)
①のUbuntu+omniORBの部分を参考にビルド&インストールを行います。
②にあるようにROS通信機能をできるようにしておきます。 (-DROS_ENABLE=ON
の部分)
適当なディレクトリで作業をしてください。
最初と最後のコマンドは①にも②にもないので注意して下さい。
最初のコマンドを実行しなかった場合: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
cmakeのエラー内容
``` -- 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". ```これでインストールは完了です。サンプルコンポーネントを動かしてみましょう。
サンプルコンポーネントを実行する
まず、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の中身は以下です。入力後、エディタを終了してください。
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
サンプルコンポーネントの実行①
**そのままこのディレクトリで**コンポーネントを実行します。サンプルコンポーネントは以下にたくさん入っています。
/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
僕の場合では、ここでエラーが発生しました。
上記のインストールの最後のコマンドを実行していれば大丈夫でした。
エラー内容と解決策
``` /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)で言及されていました。サンプルコンポーネントの実行②
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のインストール)
上記ページにも書いてありますが、インストールには、以下のものが必要です。
- Python: ビルドツールを利用するために必要
- omniORBpy: OpenRTM-aist のビルド (IDL コンパイル) に必要
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
僕の場合では、ここでエラーが発生しました。
上記のインストールの最後のコマンドを実行していれば大丈夫でした。
エラー内容
``` Starting omniORB omniNames: LAPTOP-83EDG5N9 : 2809 Not found omniNames. ```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としても動作しました。
試したかったので試しました!以上
参考
その他
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
以下のような意味があるそうです。(参考)
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)が対応しているメッセージ型は以下のようになります。
rtc.confがない場所で起動したらどうなるか
普通のRTCとして動作する。
状態遷移もするためrtact
コマンドでアクティベートをする必要がある。
バージョン 1.Xはどうやってインストールできるか
1.1系と1.2系があります。
公式サイトのダウンロードタブからWindowsだとインストーラー、Linuxだと一括インストールスクリプトをダウンロードできます!そこからのインストールは簡単です。
例:1.2.2のダウンロードページ