ダウンロード
最新バージョン : 2.1.0-RELESE
| 2.1.0-RELESE | ダウンロードページ |
OpenRTM@Github
OpenRTM-aist GitHubサイト
ROS
Robot Operating System
Choreonoid
モーションエディタ/シミュレータ
DAQ-Middleware
ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク
産総研が提供するRTC集
東京オープンソースロボティクス協会
| 2.1.0-RELESE | ダウンロードページ |
OpenRTM-aist GitHubサイト
Robot Operating System
モーションエディタ/シミュレータ
ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク
産総研が提供するRTC集
東京オープンソースロボティクス協会
NXT Python RTC化
以上で、PCからPythonを使用してNXTを制御する準備が整いました。
RtcTemplateなどを使用して、NXTのコンポーネントの雛形を生成してコーディングに取り掛かりたいところです。 NXT PythonはきれいにまとまっているPythonモジュールですが、NXT Pythonのコードを直接RTCの雛形に書き込むのはちょっと待ってください。
サンプルを見てもわかるように、NXT Pythonはロケータ、モータ、センサ等の複数のモジュールから構成されていて、モータやセンサへの細かな機能も制御できるため、アクセス方法も若干煩雑です。
ここは、NXT Python の複数のモジュールをまとめてひとつのインターフェースからアクセスするためのクラスを作ることにします。 これはソフトウエアパターンで言うところのFacadeパターンになります。
こうした便利クラスを作成すると以下の利点があります。
これは、RTCを作成する際全般に言えることです。 対象とするロボットやデバイスなどを、うまくクラス化することで、デバイスの変更や、RTC自体の変更・バージョンアップにも柔軟に対応でき、変更に強いソフトウエアを作ることができます。
決して、onExecute() などで
ioctl(xxxx, xxxx); // UNIX デバイスへの直アクセス inb(xxx); // I/O への直アクセス outb(xxx); // I/O への直アクセス
のようなプリミティブな関数呼び出しをしてはいけません。 理想的には、
onExecute(ec_id) { // 擬似コード if (m_inport.isNew()) { retval = m_myrobot.set_actuator(m_inport.read()); if (retval == fatal_error) return RTC::RTC_ERROR; } if (myrobot.get_sensor(sensor_data) == true) { m_outport.wrtie(sensor_data); } else { // リードエラーの場合の処理 if (fatal_error) return RTC::RTC_ERROR; } return RTC::RTC_OK; } のように、「InPortから値を読んで処理」する関数の呼び出しと、「何らかの処理により値を取得しOutPortから出力」する関数の呼び出しのみからなる、「抽象レベルの高い」コードにするべきです。