2
"改良" 改良ControllerBridge について 中岡
5
改良ControllerBridgeにてコード設計上の問題があったため、
8
また、あわせてオプションの与え方を以下のように変更しています。
10
* preference-file -> config-file
12
* component -> 廃止しました.
14
connectionでRTCインスタンス名も指定できるようにしたので問題ありません。
16
* controller -> server-name
18
ブリッジのCORBA側コンポーネントを生成するファクトリサーバの名前
19
(旧来のOpenHRPコントローラの名前)を指定します.
20
controllerだとRTCのコントローラと混乱するので変更しました。
22
* bridge-component -> robot-name
25
これはユーザ側からみてロボットのI/Oを表すことになるので、こうしました。
26
デフォルトだと "VirtualRobot" となります。
28
* without-connection -> 廃止。接続しない場合は、単にconnectionを与えなければよい。
30
* module -> 初期化関数名を省略できるようにしました。その場合、"コンポーネント名" + "Init" という関数を呼びます.
32
* mapping-in, array-mapping-in, color-camera, mono-camera, depth-camera
40
out-port ポート名:リンク名:プロパティ
43
out-port ポート名:COLOR_IMAGE:カメラid
46
* mapping-out, array-mapping-out
49
設定の仕方は out-port の場合と同様。
53
以上の設定法の詳細は、ソースの BridgeConf.cpp をみてください。
54
オプションの設定法はもうしばらくは変更があり得ます。
61
--------------------------------------------------------------------------------
69
改良されたControllerBridgeに関する説明です。改良点は別添えの報告書をご参照ください。
72
ControllerBridge.cpp ... OpenHRPのコントローラクラスを実装しています
73
ControllerBridge.hpp ... 上のヘッダファイルです
74
PreferenceManager.cpp ... オプションの解析を行います
75
PreferenceManager.hpp ... 上のヘッダファイルです
76
ControllerBridgeComp.cpp ... 内部コンポーネントです
77
ControllerBridgeComp.hpp ... 上のヘッダファイルです
78
RTCutil.cpp ... RTコンポーネントのユーティリティです
79
RTCutil.h ... 上のヘッダファイルです
80
ControllerBridgeServer.cpp ... 起動処理を行います
81
Makefile ... メークファイルです
82
Makefile.common ... メークするソースなどを記述しています
83
rtc.conf ... 内部コンポーネント用設定ファイルです
85
readme.txt ... このファイルです
89
$(OPENHRPHOME)/Controller/serverにおいて、
91
$ tar zxvf ControllerBridge.tar.gz
96
MakefileのTOP変数をOpenHRPのトップディレクトリを指すように変更してください。
99
SensorStateにdqが入っているバージョンならばControllerBridge.cppの12行め、
101
//#define OPENHRP3_HAS_VELOCITY_IN_SENSORSTATE
103
のコメントアウトを外してください。関節速度オプションがSensorStateから参照するようになります。
113
ここでは、RTC化されたコントローラ(以下コントローラコンポーネント)の作成方法について説明します。
115
コントローラコンポーネントではセンサや関節の情報をInPortから受け取り、OutPortからアクチュエータの値を出力します。また、出力する値の計算はonExecuteメソッド中で行います。
119
1. 開発するコントローラコンポーネントが入出力する情報の種類を決定する
120
まず、どのような情報を入力または出力するかを考えます。情報の種類と対応するポートのデータ形式は以下の通りです。
122
関節/センサ入力 ... TimedDoubleSeq (InPort)
123
アクチュエータ出力 ... TimedDoubleSeq (OutPort)
124
カラーカメラ ... TimedLongSeq (InPort)
125
モノクロカメラ ... TimedOctetSeq (InPort)
126
デプスカメラ ... TimedFloatSeq (InPort)
128
関節/センサ入力およびアクチュエータ出力に関しては、ひとつの関節のマッピングも全ての関節のマッピングも同じデータ形式です。
129
この対応にしたがい、コントローラコンポーネントが持つポートを決定したら、rtc-templateによってスケルトンを出力します。
132
コントローラコンポーネントの初期設定は2箇所で行うことができます。
135
コンポーネントクラスが生成される際に実行されます。
138
シミュレーションが実行される際に実行されます。
140
実行されるタイミングが違いますので、より適切な方に初期化処理を記述してください。
143
従来のcontrolメソッドに相当します。コントローラコンポーネントの制御アルゴリズムはonExecutedメソッドに記述します。
144
ここで、それぞれのInPortのupdateメソッドを呼び、データを解析した出力データをOutPortにセットした後、OutPortのwriteメソッドを呼びます。
146
添付のSamplePDコンポーネントでは、
149
アクチュエータトルクの出力ポートtorque
161
ポートangleから読み込んだ関節角度とそこから生成した関節角速度をパターンファイルの目標数値へPD制御をかけます。
166
改良コントローラブリッジでは、外部のモジュールとしてコントローラコンポーねんとをロードすることができます。
167
上記プログラミング方法でもダイナミックライブラリが生成されますが、初期化関数においてManager#createComponentを呼ばないため、問題が生じます。
168
そこで、コンポーネント起動部分である、*Comp.cppの関数MyModuleInitをコンポーネントのソースに移してコンパイルしてください。
169
この方法でコンパイルされたダイナミックライブラリにはManager#createComponentを呼ぶ初期化関数MyModuleInitが含まれるため、正常にロードすることができます。
171
また、コントローラブリッジが存在するディレクトリのrtc.confに以下の2行が適切に記述されていることを確認してください。
172
manager.modules.load_path: (ダイナミックライブラリが存在するディレクトリ)
173
manager.modules.abs_path_allowed: yes
177
example-option example1:example2
180
以上の説明があった場合、コマンドラインに対しては、
182
--example-option example1:example2
186
example-option = example1:example2
193
コマンドラインのみ有効です。オプションの一覧を出力します。
196
preference-file ファイル名
197
コマンドラインのみ有効です。設定ファイルを読み込みます。また、-pオプションでも等価です。
201
コントローラコンポーネントを指定します。-cオプションと等価です。
204
name-server ネームサーバホスト名:ポート
205
OpenHRPのCORBAネームサーバを指定します。-nオプションと等価です。デフォルトではlocalhost:2809です。
209
OpenHRPに登録されるコントローラ名を指定します。GrxUIから見える名称です。デフォルトではControllerBridgeです。
212
bridge-component コンポーネント名
213
内部コンポーネントを指定します。デフォルトではControllerBridgeCompです。
217
ControllerBridgeによるコントローラコンポーネントへの接続を行いません。RtcLinkを使用する際に指定してください。
221
起動時に外部のモジュールをロードします。モジュールのライブラリファイル名とその初期化関数を:でわけて記述してください。
224
mapping-in ポート名:関節/センサID:プロパティ
225
DynamicsSimulatorからjointIdもしくはsensorIdによって指定された関節/センサのデータを指定されたポート名のポートにマッピングします。プロパティには以下があります。
228
JOINT_VELOCITY ... 関節速度
230
RATE_GYRO ... ジャイロセンサ出力
233
例えば、ポートangleにjointId=0の関節値をマッピングするには以下のようにします。
235
mapping-in angle:0:JOINT_VALUE
238
以下のマッピング設定において、ポート名はブリッジ内部コンポーネントのポートとなります。
240
mapping-out ポート名:関節ID:プロパティ
241
関節IDの関節に指定されたプロパティの型のデータをセットします。プロパティには以下があります。
244
JOINT_VELOCITY ... 関節速度
245
JOINT_ACCELERATION ... 関節加速度
246
JOINT_TORQUE ... 関節トルク
247
EXTERNAL_FORCE ... 力, トルク
249
例えば、ポートtorqueをjointId=0の関節トルクとするには以下のように設定します。
251
mapping-out torque:0:JOINT_TORQUE
254
array-mapping-in ポート名:プロパティ
255
jointIdがついた全ての関節をポート名で指定されたポートに指定されたプロパティでマッピングします。プロパティには以下があります。
261
array-mapping-out ポート名:プロパティ
262
jointidがついた全ての関節に指定されたプロパティのデータを設定します。使用できるプロパティは以下の通りです。
270
color-camera ポート名:カメラID
271
カラーカメラの出力であるlongの配列をTimedLongSeqとしてマッピングします。
274
mono-camera ポート名:カメラID
275
モノクロカメラの出力であるoctetの配列をTimedOctetSeqとしてマッピングします。
278
depth-camera ポート名:カメラID
279
デプスカメラの出力であるfloatの配列をTimedFloatSeqとしてマッピングします。
282
port-connection コントローラブリッジポート名:コントローラコンポーネントポート名
283
コントローラブリッジのポートとコントローラコンポーネントのポートを接続します。