choreonoid用openrtm連携プラグイン python版 チュートリアル(tankjoystick)

✏️ Edit this page on GitHub

このページではChoreonoid OpenRTM連携プラグイン Python版でTankモデルをゲームパッドで操作するまでの手順を説明します。 使用するモデル、作成するRTCはChoreonoid公式ページのチュートリアルとほぼ同じです。



#contents

RTC作成

この章ではシミュレータ上のアクチュエータ、センサなどの入出力を行うRTCの開発手順を説明します。

RTC Builder起動

まずはRTC Builderでソースコードのひな型を作成します。 RTC Builder利用のために、OpenRTM-aistをインストールしてください。

インストールが完了したらRTC Builderを起動してひな型を作成してください。 Windows 8.1の場合は「スタート」>「アプリビュー(右下矢印)」>「OpenRTM-aist 2.0.1」>「OpenRTP」をクリックすると起動できます。

作成手順は以下が参考になります。

RTCひな型作成

作成するRTCの仕様は以下のようになっています。言語はPythonを選択してください。



コンポーネント名称 **TankIoRTC_Py**
CENTER: **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()
 
 

まず、setBody関数内で制御対象のLinkオブジェクト、Lightオブジェクトを取得しています。 Link、Lightオブジェクトは名前で取得できます。

Link名はモデルに対応するアイテムを選択後、左下のビューから”“リンク”“タブを表示すれば確認できます。



Light名の確認方法は分からないのでChoreonoid公式サイトを確認してください。

 	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]

RTシステム作成

Choreonoid起動

Windows

Windowsの場合はChoreonoidを展開したフォルダのbin/chorenoid.exeをダブルクリックしてください。

Ubuntu

Ubuntuの場合はコマンドからchoreonoidと入力してください。

アイテム追加

ワールド、シミュレータ

まずはワールドアイテム、シミュレータアイテムを追加します。 ファイル、新規からワールドとAISTシミュレータを選択して追加してください。 ※表示されるアイテムの順番が変わることがあるため、この画像と違う画面になる可能性があります。



この時点でアイテムツリーは以下のようになります。

 World(ワールドアイテム)
    |-AISTSimulator(AISTシミュレータ)

アイテムツリーの概要、アイテムの移動方法は以下のページを参考にしてください。

モデル

次に環境、タンクのモデルを追加します。

ファイル、読み込みからOpenHRP モデルファイルを選択後、以下のファイルを読み込んでください。

  • {Choreonoidインストールディレクトリ}/share/model/tank/tank.wrl
  • {Choreonoidインストールディレクトリ}/share/model/Labo1/Labo1.wrl



この時点でアイテムツリーは以下のようになります。

 World(ワールドアイテム)
    |-AISTSimulator(AISTシミュレータ)
    |-Tank(model/tank/tank.wrl)
    |-Labo1(model/Labo1/Labo1.wrl)

RTコンポーネント

RTコンポーネントを追加します。 ファイル、新規からPyRTCを選択して追加してください。



Tankアイテムの下に3つのアイテムを追加して、TankIO、Controller、Joystickと名前を付けてください。

この時点でアイテムツリーは以下のようになります。

 World(ワールドアイテム)
    |-AISTSimulator(AISTシミュレータ)
    |-Tank(model/tank/tank.wrl)
      |-TankIO(PyRTC)
      |-Controller(PyRTC)
      |-Joystick(PyRTC)
    |-Labo1(model/Labo1/Labo1.wrl)

Pythonファイルの設定

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システムを追加します。 ファイル、新規からRTシステムを選択して追加してください。



表示、ビューの表示から、RTCダイアグラムを表示してください。

‘RTCリストが表示されていない場合は同様に表示してください。



RTCダイアグラム表示後、左下のRTCリストからドラッグアンドドロップすることで、RTCダイアグラム上にRTCを表示できます。



RTCダイアグラム上で以下のように接続してください。



シミュレーション実行

シミュレーションを開始する前に、時間分解能を1000fpsに設定してください。 これでシミュレーションを開始するとゲームパッドのジョイスティックでシミュレータ上のクローラー、アームの操作、ボタンでライトのオンオフを操作できるようになります。

RTCの仕様

基本はChoreonoid付属のOpenRTMプラグインのサンプルと同じですが、一部データ型の変更、コンフィギュレーションパラメータの追加を行っています。

TankJoystickControllerRTC_Py

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
説明 シミュレーションのステップ時間
CENTER: **Configuration**
パラメーター名 KP
型 double
デフォルト値 200.0
説明 比例ゲイン
**Configuration**
パラメーター名 KD
型 double
デフォルト値 50.0
説明 微分ゲイン

JoystickPySDL2

ゲームパッドのアナログスティック、ボタン等の状態を出力する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