Download
latest Releases : 2.0.0-RELESE
| 2.1.0-RELESE | Download page |
| 2.0.1-RELESE | Download page |
Number of Projects
| RT-Component | 154.5 |
| RT-Middleware | 35 |
| Tools | 25 |
| Documentation | 2 |
Choreonoid
Motion editor/Dynamics simulator
OpenHRP3
Dynamics simulator
OpenRTP
Integrated Development Platform
AIST RTC collection
RT-Components collection by AIST
TORK
Tokyo Opensource Robotics Association
DAQ-Middleware
Middleware for DAQ (Data Aquisition) by KEK
Release note: 1.0.0-RELEASE
coil
IDL
RTObject_impl
ポートの登録に関するメンバ関数の追加
データポートの読み書きに関するメンバ関数の追加
class DataIn: public RTC::DataFlowComponentBase { RTC::TimedLong input_data1_; RTC::InPort<RTC::TimedLong> inport1_; RTC::TimedLong input_data2_; RTC::InPort<RTC::TimedLong> inport2_; public: explicit DataIn(RTC::Manager* manager): RTC::DataFlowComponentBase(manager), input_data1_(), inport1_("inport1", input_data1_), input_data2_(), inport2_("inport2", input_data2_) { } virtual RTC::ReturnCode_t onInitialize() { registerInPort("inport1", inport1_); registerInPort("inport2", inport2_); return RTC::RTC_OK; } virtual RTC::ReturnCode_t onExecute(RTC::UniqueId exec_handle) { // inport1_とinport2_に対してreadを呼び出す const bool is_read_success = readAll(); if (is_read_success) { std::cout << input_data1_.data << std::endl; std::cout << input_data2_.data << std::endl; } return RTC::RTC_OK; } }; bool writeAll();class DataOut: public RTC::DataFlowComponentBase { RTC::TimedLong output_data1_; RTC::OutPort<RTC::TimedLong> outport1_; RTC::TimedLong output_data2_; RTC::OutPort<RTC::TimedLong> outport2_; public: explicit DataOut(RTC::Manager* manager): RTC::DataFlowComponentBase(manager), output_data1_(), outport1_("outport1", output_data1_), output_data2_(), outport2_("outport2", output_data2_) { } virtual RTC::ReturnCode_t onInitialize() { registerOutPort("outport1", outport1_); registerOutPort("outport2", outport2_); return RTC::RTC_OK; } virtual RTC::ReturnCode_t onExecute(RTC::UniqueId exec_handle) { output_data1_.data += 2; output_data2_.data += 3; // outport1_とoutport2_に対してwriteを呼び出す const bool is_write_success = writeAll(); if (!is_write_success) { std::cout << "write fail" << std::endl; } return RTC::RTC_OK; } }; void setReadAll(bool read=true, bool completion=false);class DataIn: public RTC::DataFlowComponentBase { RTC::TimedLong input_data1_; RTC::InPort<RTC::TimedLong> inport1_; RTC::TimedLong input_data2_; RTC::InPort<RTC::TimedLong> inport2_; public: explicit DataIn(RTC::Manager* manager): RTC::DataFlowComponentBase(manager), input_data1_(), inport1_("inport1", input_data1_), input_data2_(), inport2_("inport2", input_data2_) { } virtual RTC::ReturnCode_t onInitialize() { registerInPort("inport1", inport1_); registerInPort("inport2", inport2_); setReadAll(); // ★ return RTC::RTC_OK; } virtual RTC::ReturnCode_t onExecute(RTC::UniqueId exec_handle) { // onExecuteが呼び出される直前にinport1_とinport2_のreadが呼ばれている std::cout << input_data1_.data << std::endl; std::cout << input_data2_.data << std::endl; return RTC::RTC_OK; } };class DataOut: public RTC::DataFlowComponentBase { RTC::TimedLong output_data1_; RTC::OutPort<RTC::TimedLong> outport1_; RTC::TimedLong output_data2_; RTC::OutPort<RTC::TimedLong> outport2_; public: explicit DataOut(RTC::Manager* manager): RTC::DataFlowComponentBase(manager), output_data1_(), outport1_("outport1", output_data1_), output_data2_(), outport2_("outport2", output_data2_) { } virtual RTC::ReturnCode_t onInitialize() { registerOutPort("outport1", outport1_); registerOutPort("outport2", outport2_); setWriteAll(); // ★ return RTC::RTC_OK; } virtual RTC::ReturnCode_t onExecute(RTC::UniqueId exec_handle) { output_data1_.data += 2; output_data2_.data += 3; return RTC::RTC_OK; // onExecuteを抜けた直後にoutport1_とoutport2_のwriteが呼ばれる } };その他処理タイミング等の変更
ポート全般
コールバック関連
class MyDataListener : public ConnectorDataListenerT<RTC::TimedLong> { public: virtual void operator()(const ConnectorInfo& info, const TimedLong& data) { // コールバックの処理 }; };class MyConnectorListener : public ConnectorListener { public: virtual void operator()(const ConnectorInfo& info) { // コールバックの処理 }; };ミューテックスがロックされているため、コールバック内で、 コールバックを設定したポートに対してget_connector_profilesや get_port_profileなどを呼び出すとデッドロックすることに注意。 コールバックを設定したポート以外のポートに対しては ミューテックスがロックされていないため、get_port_profileなどの 呼び出しは可能。 例えば、ポート1とポート2を接続することを考える。 ポート1にsetOnConnectedでコールバックを設定しておく。 このコールバック内からポート1に対してget_port_profileなどの 呼び出しを行うとデッドロックする。ポート2に対しては get_port_profileなどを呼び出せる。ミューテックスがロックされているため、コールバック内で、 接続対象ポートのget_connector_profilesやget_port_profileなどを 呼び出すとデッドロックすることに注意。 setOnConnectedと違い、コールバックを設定していないポートに 対してもget_port_profileなどを呼び出せないことに注意。 例えば、ポート1とポート2を接続することを考える。 ポート1にsetOnConnectedでコールバックを設定しておく。 このコールバック内からはポート1、ポート2ともに get_port_profileなどの呼び出しを行うとデッドロックする。切断処理の途中に何らかのエラーがあってもコールバックは 呼び出されることに注意。 また、ミューテックスのロックされているため、 setOnUnsubscribeInterfacesと同様、デッドロックに注意。ただし、このコールバックに関しては、PortBaseでは処理の実装を しておらず、派生クラス側で実装するようになっている。 現在は、OutPortのみに実装されており、InPortとCorbaPortでは コールバックを設定しても呼び出されることはない。その他
subscribeInterfacesの呼び出しについて、途中で1つでも失敗した場合、 即座にエラー復帰するsubscribeInterfacesの呼び出しについて、途中で失敗しても、 そのまま処理は続行する。接続対象ポート全てに対して処理を 行った後、発生したエラーに対応するエラー戻り値を返す。・PortBaseのprotectedメンバ関数eraseConnectorProfileが
・PortBaseの以下のメンバ関数を呼び出した際、
・ポートのプロパティ"connection_limit"を指定すると、
■データポート 【コールバック関連】 ・InPortの以下のコールバック設定関数が削除された。
・OutPotの以下のメンバ関数が削除された。
【接続時のポリシ設定】 ・RT System Editorでデータポートを接続する際、
・データポートの接続時のプロパティに"dataport.serializer.cdr.endian"
【その他】 ・DataPortStatusにBUFFER_ERRORが追加された。
・データポートでCORBAの代わりにTCP/IPを用いて通信を行うことが
・InPort::readの戻り値の型が変更された。
・Timed*のデータに対して現在時刻を付与する関数setTimestamp()が追加された。
・OutPort::write()で、タイムスタンプを付与しなくなった。
・OutPotに以下のメンバ関数が追加された。
・データポートのpullの動作
[pushの場合] RTC::ReturnCode_t ConsoleOut::onExecute(RTC::UniqueId ec_id) { if (m_inport.isNew()) { m_inport.read(); // データを利用した処理 } return RTC::RTC_OK; }[pullの場合] RTC::ReturnCode_t ConsoleOut::onExecute(RTC::UniqueId ec_id) { bool ret = m_inport.read(); if (ret == true) { // データを利用した処理 } return RTC::RTC_OK; }■サービスポート 【接続時のポリシ設定】 ・CorbaPortの接続において、ConnectorProfile::propertiesに
【その他】 ・CorbaPortで、接続中にRTCをActivate、Deactivateし、再度Activateすると
■Manager関係 Managerにマスターとスレーブという関係ができた。 詳細は[openrtm-users 01099]の安藤様の解説を参照のこと。
【rtc.confに与えるプロパティの変更】 ・Managerのプロパティ(rtc.confに与えるプロパティ)に変更があった。
【RTC起動時のコマンドライン引数のオプションの追加】
-a 指定すると、ManagerのCORBAオブジェクトを生成しない。 ただし、ManagerConfig::parseArgs()にバグがあるため、 このオプションを指定してもManagerのCORBAオブジェクトの 生成が有効になる。("maanger.corba_servant"でスペルミス) SVNの最新ソースでは修正されている模様。 -d 指定すると、Managerがマスターになる。 -o Managerのプロパティを追加できる。 このオプションに続けて (プロパティのキー):(プロパティの値)と書く。 例えば、-o test.property:100 -p Managerのプロパティ"corba.endpoints"にポート番号を追加する。 例えば、-p 50000【Managerの内部実装の変更】 ・RC1では未実装だったModuleManager::getLoadableModules()が実装された。
・Manager::setModuleInitProc()で設定した関数が実行される
・ManagerにRTCのガベージコレクションのような機能が追加された。
・ManagerがRTCを削除する際、deleteを直接使うのではなく、
・Manager::load()で、第2引数の初期化関数名が空の場合の処理が追加された。
・Manager::createComponentで、指定したRTCを生成するFactoryが
【IDLインタフェースの変更】 ・IDLインタフェースRTM::Managerが変更された。
・ManagerServant::get_loadable_modules()、