Choreonoid OpenRTM連携プラグイン Python版はChoreonoid上のロボットとPythonで開発したRTCを連携させるためのプラグインです。 主に以下の機能が利用可能です。
Choreonoidに標準で付属しているOpenRTM連携プラグインはC++によるRTCの開発ができるようになっていますが、ビルド環境の構築が難しく、またコンパイルに時間を要するため効率的ではないという問題がありました。 そこでビルド済みのChoreonoid+OpenRTM連携プラグイン Python版を配布することで、ダウンロードしてすぐにChoreonoid上のシミュレータと連携するRTCが開発可能です。
本プラグインにはChoreonoid上で動作するPythonエディタが付属しています。
RTCを一覧に表示してボタン一つで起動化可能なランチャーがChoreonoid上で動作します。 本プラグインにはサンプルコンポーネントとして73種類のRTCが付属しており、Choreonoid上で様々なRTシステムを開発できます。
Choreonoidインストールディレクトリのshare/rtc以下に適当な名前のフォルダ(例:TestRTC)を作成します。
その下にRTC.xmlとRTCを実行するためのPythonファイル、もしくは実行ファイル、dllを置くと完了です。 Pythonファイル、実行ファイル、dllについては、TestRTCフォルダ直下でなくとも検索で見つけることができます。
※C++のRTCを登録する場合、本プラグインがVisual Studio 2015(64bit)で開発しているため、dllは同じVisual Studioでビルドしたものでないとロードできません。実行ファイルからの起動はできますが、その場合は必要なdll(RTC120_vc12.dll等)のフォルダをPATHに追加する必要があります。
choreonoid |-share |-rtc |-TestRTC |-RTC.xml |-TestRTC.py(もしくはTestRTCComp.exe、TestRTC.dll)
インストール手順やチュートリアルは以下のページに記載してあります。
動作環境は以下の通りです。
Windowsの場合はビルド済みバイナリを配布してあります。
Python 2.7(64bit)をインストールしてください。
ビルド済みChoreonoid+OpenRTM連携プラグインは以下からダウンロードできます。
このファイルをLhaplus等で適当な場所に展開すればインストール完了です。
何らかの事情によりソースコードからビルドせざる得ない場合は、以下のページの手順でビルドしてください。
Choreonoidのインストール手順についてはChoreonoid ホームページに詳しく記載されているようなのですが、一応こちらでも説明します。
Choreonoidのソースコードですが、以下の理由により独自の変更を加えてあります。
このため、オリジナルのChoreonoidではなくフォークしたものをクローンしてください。
git clone https://github.com/Nobu19800/choreonoid.git
gitをインストールしていない場合は以下のコマンドを入力してください。
sudo apt-get install git
Choreonoidには必要ライブラリをインストールするスクリプトが付属しているようなので、このスクリプトを起動してください。
cd choreonoid sh misc/script/install-requisites-ubuntu-14.04.sh
wget http://svn.openrtm.org/OpenRTM-aist/tags/RELEASE_1_1_2/OpenRTM-aist/build/pkg_install_ubuntu.sh
以下のコマンドを入力してください。
wget http://svn.openrtm.org/OpenRTM-aist-Python/tags/RELEASE_1_1_2/OpenRTM-aist-Python/installer/install_scripts/pkg_install_python_ubuntu.sh sudo sh pkg_install_python_ubuntu.sh
cd sample git clone https://github.com/Nobu19800/OpenRTMPythonPlugin.git cd .. mkdir build cd build cmake .. -DENABLE_PYTHON=ON -DBUILD_PYTHON_PLUGIN=ON -DBUILD_OPENRTM_PYTHON_PLUGIN=ON make sudo make install
cmakeコマンドのオプションを変更してビルドしてください。
cmake .. -DENABLE_PYTHON=ON -DBUILD_PYTHON_PLUGIN=ON -DBUILD_OPENRTM_PYTHON_PLUGIN=ON -DENABLE_CORBA=ON -DBUILD_CORBA_PLUGIN=ON -DBUILD_OPENRTM_PLUGIN=ON
動作確認のためにゲームパッドのRTCを使用しますが、このRTCの動作にはPySDL2がインストールされている必要があります。
動作確認用のRTCに必要というだけなので、次ページの動作確認を行わない場合はインストールの必要はありません。
以下のコマンドを入力してください。
wget https://bitbucket.org/marcusva/py-sdl2/downloads/PySDL2-0.9.5.tar.gz tar xf PySDL2-0.9.5.tar.gz cd PySDL2-0.9.5 sudo python setup.py install
さらにSDL2のインストールが必要なので、以下のコマンドでインストールしてください。
sudo apt-get install libsdl2-2.0-0 libsdl2-image-2.0-0
これで準備完了です。
このページではChoreonoid OpenRTM連携プラグイン Python版でTankモデルをゲームパッドで操作するまでの手順を説明します。 使用するモデル、作成するRTCはChoreonoid公式ページのチュートリアルとほぼ同じです。
この章ではシミュレータ上のアクチュエータ、センサなどの入出力を行うRTCの開発手順を説明します。
まずはRTC Builderでソースコードのひな型を作成します。 RTC Builder利用のために、OpenRTM-aistをインストールしてください。
インストールが完了したらRTC Builderを起動してひな型を作成してください。 Windows 8.1の場合は「スタート」>「アプリビュー(右下矢印)」>「OpenRTM-aist 2.0.1」>「OpenRTP」をクリックすると起動できます。
作成手順は以下が参考になります。
作成するRTCの仕様は以下のようになっています。言語はPythonを選択してください。
コンポーネント名称 | TankIoRTC_Py |
InPort | |
ポート名 | velocities |
型 | TimedVelocity2D |
説明 | 車体の目標速度 |
InPort | |
ポート名 | torques |
型 | TimedDoubleSeq |
説明 | 砲塔部分の関節トルク |
InPort | |
ポート名 | lightSwitch |
型 | TimedBooleanSeq |
説明 | ライトのオンオフ |
OutPort | |
ポート名 | angles |
型 | PanTiltAngles |
説明 | 砲塔部分の関節角度 |
言語 | |
Python |
生成したソースコードにRTCのモジュール名のクラス(TankIoRTC_Pyならばclass TankIoRTC_Py)が記述されているので、そのクラスに以下の関数を追加してください。
関数名 | 引数 | 内容 |
setBody | body | Bodyオブジェクトを設定する関数 |
inputFromSimulator | センサの計測値などをアウトポートから出力する処理等を記述する関数。シミュレーションステップ後に実行される | |
outputToSimulator | アクチュエータのトルクなどをインポートから入力する処理等を記述する関数。シミュレーションステップ前に実行される |
具体的には以下のソースコードを記載します。
class TankIoRTC_Py(OpenRTM_aist.DataFlowComponentBase): (省略) #ボディオブジェクト設定関数 def setBody(self, body): self.ioBody = body #Linkオブジェクト取得 self.cannonY = self.ioBody.link("CANNON_Y") self.cannonP = self.ioBody.link("CANNON_P") self.crawlerL = self.ioBody.link("CRAWLER_TRACK_L") self.crawlerR = self.ioBody.link("CRAWLER_TRACK_R") #Lightオブジェクト取得 self.light = self.ioBody.getLight("MainLight") #センサの計測値などをアウトポートから出力する処理等を記述する関数 #シミュレーションステップ後に実行される def inputFromSimulator(self): if self.ioBody: #砲台の角度取得、格納 self._d_angles.pan = self.cannonY.q self._d_angles.tilt = self.cannonP.q #砲台の角度出力 OpenRTM_aist.setTimestamp(self._d_angles) self._anglesOut.write() #アクチュエータのトルクなどをインポートから入力する処理等を記述する関数 #シミュレーションステップ前に実行される def outputToSimulator(self): if self.ioBody: #砲台のトルク入力 if self._torquesIn.isNew(): data = self._torquesIn.read() self.cannonY.u = data.data[0] self.cannonP.u = data.data[1] #車体の速度入力 if self._velocitiesIn.isNew(): data = self._velocitiesIn.read() vx = data.data.vx va = data.data.va rms = (vx + va*self._wheel_distance[0])/self._wheel_radius[0] lms = (vx - va*self._wheel_distance[0])/self._wheel_radius[0] #クローラーの速度入力 self.crawlerL.dq = lms self.crawlerR.dq = rms #ライトのオンオフ入力 if self._lightSwitchIn.isNew(): data = self._lightSwitchIn.read() self.light.on(data.data[0]) self.light.notifyStateChange()
Link名はモデルに対応するアイテムを選択後、左下のビューから""リンク""タブを表示すれば確認できます。
def setBody(self, body): self.ioBody = body self.cannonY = self.ioBody.link("CANNON_Y") (省略) self.light = self.ioBody.getLight("MainLight")
関節の角度の取得q変数により取得できます。
self._d_angles.pan = self.cannonY.q
関節の速度の入力はdq、トルクの入力はu変数に格納することでシミュレータに反映できます。
self.crawlerL.dq = lms
self.cannonY.u = data.data[0]
ライトのオンオフはon変数にbool変数を格納します。
self.light.on = data.data[0]
Windowsの場合はChoreonoidを展開したフォルダのbin/chorenoid.exeをダブルクリックしてください。
Ubuntuの場合はコマンドからchoreonoidと入力してください。
まずはワールドアイテム、シミュレータアイテムを追加します。 ファイル、新規からワールドとAISTシミュレータを選択して追加してください。 ※表示されるアイテムの順番が変わることがあるため、この画像と違う画面になる可能性があります。
World(ワールドアイテム) |-AISTSimulator(AISTシミュレータ)
アイテムツリーの概要、アイテムの移動方法は以下のページを参考にしてください。
次に環境、タンクのモデルを追加します。
ファイル、読み込みからOpenHRP モデルファイルを選択後、以下のファイルを読み込んでください。
World(ワールドアイテム) |-AISTSimulator(AISTシミュレータ) |-Tank(model/tank/tank.wrl) |-Labo1(model/Labo1/Labo1.wrl)
RTコンポーネントを追加します。 ファイル、新規からPyRTCを選択して追加してください。
この時点でアイテムツリーは以下のようになります。
World(ワールドアイテム) |-AISTSimulator(AISTシミュレータ) |-Tank(model/tank/tank.wrl) |-TankIO(PyRTC) |-Controller(PyRTC) |-Joystick(PyRTC) |-Labo1(model/Labo1/Labo1.wrl)
TankIO、Controller、JoystickのプロパティからRTC moduleという項目を設定してください。
アイテム名 | ファイル名 |
TankIO | TankIoRTC_Py.py |
Controller | TankJoystickControllerRTC_Py.py |
Joystick | JoystickPySDL2.py |
Pythonファイルを設定するとRTCが起動します。 ※本プラグインではChoreonoidに付属しているC++版OpenRTMプラグインのようにControllerRTC、BodyIoRTC、RTCという区別はありません。RTCのソースコードにシミュレータ上のロボットの制御、センサ値の取得等の処理を書けばそれでBodyIoRTCと同じ動作ができます。
RTシステムを追加します。 ファイル、新規からRTシステムを選択して追加してください。
'RTCリストが表示されていない場合は同様に表示してください。
シミュレーションを開始する前に、時間分解能を1000fpsに設定してください。 これでシミュレーションを開始するとゲームパッドのジョイスティックでシミュレータ上のクローラー、アームの操作、ボタンでライトのオンオフを操作できるようになります。
基本はChoreonoid付属のOpenRTMプラグインのサンプルと同じですが、一部データ型の変更、コンフィギュレーションパラメータの追加を行っています。
Tankロボットの制御を行うためのRTCです。
コンポーネント名称 | TankJoystickControllerRTC_Py |
InPort | |
ポート名 | angles |
型 | PanTiltAngles |
説明 | 砲塔部分の関節角度 |
InPort | |
ポート名 | axes_1 |
型 | TimedVector2D |
説明 | 右アナログスティックの状態。傾けると0.0~1.0の範囲で値を出力する。傾けた方向で右が正、左が負、下が正、上が負の値になります。 |
InPort | |
ポート名 | axes_2 |
型 | TimedVector2D |
説明 | 左アナログスティックの状態 |
InPort | |
ポート名 | buttons |
型 | TimedBooleanSeq |
説明 | ボタンのオンオフ |
OutPort | |
ポート名 | velocities |
型 | TimedVelocity2D |
説明 | 車体の目標速度 |
OutPort | |
ポート名 | torques |
型 | TimedDoubleSeq |
説明 | 砲塔部分の関節トルク |
OutPort | |
ポート名 | lightSwitch |
型 | TimedBooleanSeq |
説明 | ライトのオンオフ |
Configuration | |
パラメーター名 | timeStep |
型 | double |
デフォルト値 | 0.001 |
説明 | シミュレーションのステップ時間 |
Configuration | |
パラメーター名 | KP |
型 | double |
デフォルト値 | 200.0 |
説明 | 比例ゲイン |
Configuration | |
パラメーター名 | KD |
型 | double |
デフォルト値 | 50.0 |
説明 | 微分ゲイン |
ゲームパッドのアナログスティック、ボタン等の状態を出力するRTCです。
コンポーネント名称 | TankJoystickControllerRTC_Py |
OutPort | |
ポート名 | axes_1 |
型 | TimedVector2D |
説明 | 右アナログスティックの状態。傾けると0.0~1.0の範囲で値を出力する。傾けた方向で右が正、左が負、下が正、上が負の値になります。 |
OutPort | |
ポート名 | axes_2 |
型 | TimedVector2D |
説明 | 左アナログスティックの状態 |
OutPort | |
ポート名 | buttons |
型 | TimedBooleanSeq |
説明 | ボタンのオンオフ |
OutPort | |
ポート名 | hats |
型 | TimedBooleanSeq |
説明 | 十字キーの状態 |
OutPort | |
ポート名 | balls |
型 | TimedVector2D |
説明 | ジョイボールの移動量 |
Configuration | |
パラメーター名 | index |
型 | int |
デフォルト値 | 0 |
説明 | ゲームパッドのID |
このページではRTCEditorアイテム、ComponentListアイテムの利用方法を四足歩行ロボットのシミュレータ作成を例にして解説します。
まずはワールドアイテム、シミュレータアイテムを追加します。 ファイル、新規からワールドとAISTシミュレータを選択して追加してください。
この時点でアイテムツリーは以下のようになります。
World(ワールドアイテム) |-AISTSimulator(AISTシミュレータ)
次に地面、四足歩行ロボットのモデルを追加します。
ファイル、読み込みからOpenHRP モデルファイルを選択後、以下のファイルを読み込んでください。
すると以下のように3Dモデルが表示されます。 表示されない場合はアイテムツリー上の該当アイテムのチェックボタンをオンにしてください。
World(ワールドアイテム) |-AISTSimulator(AISTシミュレータ) |-QuadrupedRobot(model/QuadrupedRobot/QuadrupedRobot.yaml) |-floor(model/house/floor.body)
RTコンポーネントを追加します。 ファイル、新規からPyRTCItemを選択して追加してください。
QuadrupedRobotアイテムの下にアイテムを追加して、QuadrupedRobotIOと名前を付けてください。
この時点でアイテムツリーは以下のようになります。
World(ワールドアイテム) |-AISTSimulator(AISTシミュレータ) |-QuadrupedRobot(model/QuadrupedRobot/QuadrupedRobot.yaml) |-QuadrupedRobotIO(PyRTCItem) |-floor(model/house/floor.body)
QuadrupedRobotIOのプロパティからRTC moduleという項目を設定してください。
ファイル名にQuadrupedRobot_Choreonoid.pyを設定してください。 これで四足歩行ロボット用の入出力RTCが起動します。
RTCランチャーを起動します。ファイル、アイテムからComponentListItemを選択して追加してください。
実行(rtcd、周期実行)ボタンを押すだけで起動できます。
※本来はトリガー駆動の実行コンテキストを使用したいのですが、OpenRTM-aist C++版のバグにより実現できていません。
RTCエディタを起動します。ファイル、アイテムからRTCEditorItemを選択してワールドアイテムの下に追加してください。
四足歩行ロボットの目標速度を設定するアウトポートを追加します。 右側のウインドウから以下の設定を行ってください。
ポート名 | out |
ポート | DataOutPort |
データ型 | RTC::TimedVelocity2D |
作成ボタンを押すとデータポートを作成します。
ソースコードの編集を行います。
先ほど作成したデータポートにかかわる変数名については、右側のデータポート変数名タブからコピーできます。
左側のコード編集ウインドウは各アクティビティ+α(setBody、inputFromSimulator、outputToSimulator、グローバル)で実行する処理が記述できます。
onExecute関数の処理に以下を記述してください。
self._d_out.data.vx = 0.03 self._d_out.data.va = 0 self._outOut.write() return RTC.RTC_OK
変更した内容は更新ボタンを押すと反映されます。
World(ワールドアイテム) |-AISTSimulator(AISTシミュレータ) |-QuadrupedRobot(model/QuadrupedRobot/QuadrupedRobot.yaml) |-QuadrupedRobotIO(PyRTCItem) |-floor(model/house/floor.body) |-ComponentList |-RTCEditor
RTシステムアイテム追加後、表示、ビューの表示からRTCダイアグラムを表示してください。
RTCの各ポートを以下のように接続してください。
World(ワールドアイテム) |-AISTSimulator(AISTシミュレータ) |-QuadrupedRobot(model/QuadrupedRobot/QuadrupedRobot.yaml) |-QuadrupedRobotIO(PyRTCItem) |-floor(model/house/floor.body) |-ComponentList |-RTCEditor |-RTSystem
最後にシミュレーションを開始すると四足歩行ロボットが前進します。
シミュレータ起動中に例えば以下のようにRTCEditorのonExecute関数のコードを変更して更新ボタンを押すと、シミュレーション実行中に四足歩行ロボットが前進から旋回する運動に変化することが確認できます。
self._d_out.data.vx = 0 self._d_out.data.va = 0.8 self._outOut.write() return RTC.RTC_OK
以下の原因が考えられます。
まずPython 2.7の64bit版がインストールされていることを確認してください。
それでも起動しない場合は、PYTHONHOMEをPythonインストールディレクトリに設定してください。
set PYTHONHOME=C:\python27
これで動かない場合は下のコメント欄でお知らせください。
Choreonoid内部のライブラリの問題でOpenGL 1.1にしか対応していないPCでは起動できません。 以下のサイトでOpenGLバージョンチェックプログラムを入手して確認してください。
現在、調査中です。
パスに日本語が含まれているとロードできません。
これはChoreonoid自体の問題なので、こちらでは対処しません。
この問題についても調査中です。
Choreonoid標準で付属しているOpenRTM連携プラグインには以下の機能がありません。
これらの機能は近いうちに追加される予定らしいですが、現状ではコンフィギュレーションパラメータの設定はRTShell等で外部から実行してください。
コネクタ接続時にデータ型が違っても接続するため注意が必要です。
RTCEditorでPythonモジュールが読み込めない環境が存在するらしいです。 原因は調査中です。
ComponentListアイテムで起動したRTCをシミュレータがtickで実行する機能は現在のところ未実装です。
使用したライブラリは以下の通りです。
また、サンプルコンポーネントに以下のライブラリを使用しています。
Pluginルートディレクトリ |-po |-ja.po
ja.poの中身には以下のように翻訳前と翻訳後の文字を羅列する。
msgid "RTC directory" msgstr "RTCディレクトリ"
これで自動的にPOファイルをMOファイルにコンパイルするはずですが、Choreonoidはプラグイン名に対応するファイルをロードするため、プラグイン名は正しく設定する必要がある。