ダウンロード
最新バージョン : 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集
東京オープンソースロボティクス協会
주된 변경의 개요
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에 "port.connection.strictness"라고 하는 프로퍼티를 설정할 수 있게 되었다. 이 프로퍼티에는 "strict" 나 "best_effort"를 설정한다.
【그 외】 ·CorbaPort로, 접속중에 RTC를 Activate, Deactivate 해, 재차 Activate 하면 컨슈머(consumer)측으로부터 액세스 할 수 없는 문제가 해결되었다.
■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(),