ダウンロード
最新バージョン : 2.0.2-RELESE
| 2.0.2-RELESE | ダウンロードページ |
OpenRTM@Github
OpenRTM-aist GitHubサイト
ROS
Robot Operating System
Choreonoid
モーションエディタ/シミュレータ
DAQ-Middleware
ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク
産総研が提供するRTC集
東京オープンソースロボティクス協会
| 2.0.2-RELESE | ダウンロードページ |
OpenRTM-aist GitHubサイト
Robot Operating System
モーションエディタ/シミュレータ
ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク
産総研が提供するRTC集
東京オープンソースロボティクス協会
このページではOpenRTM-aistのRTC操作関数群CORBA_RTCUtil機能の利用方法に説明します。
今回使用したソースコードは以下から入手できます。
事前準備
C++
C++の場合はOpenRTM-aistとリンクしたプログラムをビルドする環境が必要です。
以下のCMakeLists.txtを作成してください。
cmake_minimum_required(VERSION 3.1) set(target CORBA_RTCUtil_test) project(${target} CXX) find_package(OpenRTM REQUIRED) add_definitions(${OPENRTM_CFLAGS}) link_directories(${OPENRTM_LIBRARY_DIRS}) add_executable(${target} ${target}.cpp) target_link_libraries(${target} ${OPENRTM_LIBRARIES}) target_include_directories(${target} SYSTEM PRIVATE ${OPENRTM_INCLUDE_DIRS})また、CORBA_RTCUtil_test.cppのソースファイルを作成してCMakeを実行します。 ソースコードからビルドしたOpenRTM-aistを使う場合は、environment-setup.omniorb.vc**.batを実行します。
CORBA_RTCUtil_test.cppには以下の内容を記述しておきます。
#include <rtm/Manager.h> #include <rtm/NamingManager.h> #include <rtm/CORBA_RTCUtil.h> #include <iostream> int main (int argc, char** argv) { RTC::Manager* manager; manager = RTC::Manager::init(argc, argv); manager->activateManager(); manager->runManager(true); RTC::RTObject_var consolein = RTC::RTObject::_nil(); RTC::RTObject_var consoleout = RTC::RTObject::_nil(); RTC::NamingManager* nm = RTC::Manager::instance().getNaming(); RTC::RTCList consoleinlist = nm->string_to_component("rtcname://localhost:2809/*/ConsoleIn0"); if (consoleinlist.length() > 0) { consolein = consoleinlist[0]; } else { std::cout << "Could not found ConsoleIn0" << std::endl; return 1; } RTC::RTCList consoleoutlist = nm->string_to_component("rtcname://localhost:2809/*/ConsoleOut0"); if (consoleoutlist.length() > 0) { consoleout = consoleoutlist[0]; } else { std::cout << "Could not found ConsoleOut0" << std::endl; return 1; } RTC::RTObject_var configsample = RTC::RTObject::_nil(); RTC::RTCList configsamplelist = nm->string_to_component("rtcname://localhost:2809/*/ConfigSample0"); if (configsamplelist.length() > 0) { configsample = configsamplelist[0]; } else { std::cout << "Could not found ConfigSample0" << std::endl; return 1; } RTC::RTObject_var myserviceprovider = RTC::RTObject::_nil(); RTC::RTCList myserviceproviderlist = nm->string_to_component("rtcname://localhost:2809/*/MyServiceProvider0"); if (myserviceproviderlist.length() > 0) { myserviceprovider = myserviceproviderlist[0]; } else { std::cout << "Could not found MyServiceProvider0" << std::endl; return 1; } RTC::RTObject_var myserviceconsumer = RTC::RTObject::_nil(); RTC::RTCList myserviceconsumerlist = nm->string_to_component("rtcname://localhost:2809/*/MyServiceConsumer0"); if (myserviceconsumerlist.length() > 0) { myserviceconsumer = myserviceconsumerlist[0]; } else { std::cout << "Could not found MyServiceConsumer0" << std::endl; return 1; } //以降の処理はここに記述する manager->terminate(); manager->join(); return 0; }Python
Pythonの場合は以下のCORBA_RTCUtil_test.pyを用意してください。
#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Python -*- import sys import OpenRTM_aist import OpenRTM_aist.CORBA_RTCUtil from omniORB import CORBA def main(): mgr = OpenRTM_aist.Manager.init(sys.argv) mgr.activateManager() mgr.runManager(True) nm = OpenRTM_aist.Manager.instance().getNaming() consoleinlist = nm.string_to_component( "rtcname://localhost:2809/*/ConsoleIn0") if consoleinlist: consolein = consoleinlist[0] else: print("Could not found ConsoleIn0") sys.exit(1) consoleoutlist = nm.string_to_component( "rtcname://localhost:2809/*/ConsoleOut0") if consoleoutlist: consoleout = consoleoutlist[0] else: print("Could not found ConsoleOut0") sys.exit(1) configsamplelist = nm.string_to_component( "rtcname://localhost:2809/*/ConfigSample0") if consoleoutlist: configsample = consoleoutlist[0] else: print("Could not found ConfigSample0") sys.exit(1) myserviceproviderlist = nm.string_to_component( "rtcname://localhost:2809/*/MyServiceProvider0") if myserviceproviderlist: myserviceprovider = myserviceproviderlist[0] else: print("Could not found MyServiceProvider0") sys.exit(1) myserviceconsumerlist = nm.string_to_component( "rtcname://localhost:2809/*/ConsoleOut0") if myserviceconsumerlist: myserviceconsumer = myserviceconsumerlist[0] else: print("Could not found ConsoleOut0") sys.exit(1) #以降の処理はここに記述する mgr.shutdown() if __name__ == "__main__": main()rtc.confの作成
以下の内容のrtc.confを作成してください。
サンプルコンポーネントの起動
ConsoleIn、ConsoleOut、ConfiguSample、MyServiceProvider、MyServiceConsumerのサンプルコンポーネントを起動しておきます。
CORBA_RTCUtilの利用
ポートの操作
ポートのオブジェクトリファレンス取得
データポートの接続のために、ポートのオブジェクトリファレンスを取得するget_port_by_name関数を使用します。
RTC::PortService_var port_in_var = CORBA_RTCUtil::get_port_by_name(consoleout.in(), "ConsoleOut0.in"); if (CORBA::is_nil(port_in_var)) { std::cout << "Could not found ConsoleOut0.in" << std::endl; return 1; } RTC::PortService_var port_out_var = CORBA_RTCUtil::get_port_by_name(consolein.in(), "ConsoleIn0.out"); if (CORBA::is_nil(port_out_var)) { std::cout << "Could not found ConsoleIn0.out" << std::endl; return 1; }port_in_var = OpenRTM_aist.CORBA_RTCUtil.get_port_by_name( consoleout, "ConsoleOut0.in") if CORBA.is_nil(port_in_var): print("Could not found ConsoleOut0.in") sys.exit(1) port_out_var = OpenRTM_aist.CORBA_RTCUtil.get_port_by_name( consolein, "ConsoleIn0.out") if CORBA.is_nil(port_out_var): print("Could not found ConsoleOut0.in") sys.exit(1)またget_port_by_url関数を使用すると、rtcname形式、rtcloc形式の文字列からオブジェクトリファレンスを取得できます。
RTC::PortService_var port_in_var = CORBA_RTCUtil::get_port_by_url("rtcname://localhost:2809/*/ConsoleOut0.in"); if (CORBA::is_nil(port_in_var)) { std::cout << "Could not found ConsoleOut0.in" << std::endl; return 1; } RTC::PortService_var port_out_var = CORBA_RTCUtil::get_port_by_url("rtcname://localhost:2809/*/ConsoleIn0.out"); if (CORBA::is_nil(port_out_var)) { std::cout << "Could not found ConsoleIn0.out" << std::endl; return 1; }port_in_var = OpenRTM_aist.CORBA_RTCUtil.get_port_by_url( "rtcname://localhost:2809/*/ConsoleOut0.in") if CORBA.is_nil(port_in_var): print("Could not found ConsoleOut0.in") sys.exit(1) port_out_var = OpenRTM_aist.CORBA_RTCUtil.get_port_by_url( "rtcname://localhost:2809/*/ConsoleIn0.out") if CORBA.is_nil(port_out_var): print("Could not found ConsoleOut0.in") sys.exit(1)コネクタ生成
取得したデータポートをconnect関数で接続します。
coil::Properties prop; prop["dataport.dataflow_type"] = "push"; prop["dataport.interface_type"] = "corba_cdr"; prop["dataport.subscription_type"] = "new"; CORBA_RTCUtil::connect("test_connector", prop, port_in_var.in(), port_out_var.in());prop = OpenRTM_aist.Properties() prop.setProperty("dataport.dataflow_type", "push") prop.setProperty("dataport.interface_type", "corba_cdr") prop.setProperty("dataport.subscription_type", "new") OpenRTM_aist.CORBA_RTCUtil.connect( "test_connector", prop, port_in_var, port_out_var)コネクタ削除
コネクタ名を指定してコネクタを削除するためにはdisconnect_connector_name関数を使用します。
OpenRTM_aist.CORBA_RTCUtil.disconnect_by_portref_connector_name( port_in_var, "test_connector")コネクタのURIからオブジェクトリファレンスを取得してコネクタを削除する場合はdisconnect_connector_name関数を使用します。
CORBA_RTCUtil::disconnect_connector_name("rtcname://localhost:2809/*/ConsoleOut0.in", "test_connector");OpenRTM_aist.CORBA_RTCUtil.disconnect_by_portname_connector_name( "rtcname://localhost:2809/*/ConsoleOut0.in", "test_connector")複数のポートを一括で接続
複数のポートを一度に接続するためにはconnect_multi関数を使用します。
RTC::PortServiceList target_ports; target_ports.length(1); target_ports[0] = RTC::PortService::_duplicate(port_out_var.in()); CORBA_RTCUtil::connect_multi("test_connector", prop, port_in_var.in(), target_ports);OpenRTM_aist.CORBA_RTCUtil.connect_multi( "test_connector", prop, port_in_var, [port_out_var])すべてのコネクタを削除
対象ポートのすべてのコネクタを削除するためにはdisconnect_all関数を使います。
CORBA_RTCUtil::disconnect_all("rtcname://localhost:2809/*/ConsoleIn0.out");OpenRTM_aist.CORBA_RTCUtil.disconnect_all_by_name( "rtcname://localhost:2809/*/ConsoleIn0.out")RTCの状態操作
アクティブ化
RTCをアクティブ化するためにはactivate関数を使用します。
RTCは状態を実行コンテキストごとに持っているため、デフォルトの実行コンテキスト(ID:0)以外で状態を変更する場合はec_idを指定します。
OpenRTM_aist.CORBA_RTCUtil.activate(consoleout, 0) OpenRTM_aist.CORBA_RTCUtil.activate(consolein, 0)非アクティブ化
RTCを非アクティブ化するためにはdeactivate関数を使用します。
OpenRTM_aist.CORBA_RTCUtil.deactivate(consoleout, 0) OpenRTM_aist.CORBA_RTCUtil.deactivate(consolein, 0)リセット
RTCをリセットするためにはreset関数を使用します。
OpenRTM_aist.CORBA_RTCUtil.reset(consoleout, 0) OpenRTM_aist.CORBA_RTCUtil.reset(consolein, 0)RTCの状態取得
RTCの現在の状態を取得するためにはget_state関数を使用します。
ret, state = OpenRTM_aist.CORBA_RTCUtil.get_state(consoleout, 0) print(state)また、is_in_inactive関数、is_in_active関数、is_in_error関数で現在の状態が非アクティブ状態、アクティブ状態、エラー状態かを判定できます。
if (CORBA_RTCUtil::is_in_inactive(consoleout.in()))
{ std::cout << "Inactive State" << std::endl; } else if (CORBA_RTCUtil::is_in_active(consoleout.in())) { std::cout << "Active State" << std::endl; } else if (CORBA_RTCUtil::is_in_error(consoleout.in())) { std::cout << "Error State" << std::endl; }if OpenRTM_aist.CORBA_RTCUtil.is_in_inactive(consoleout): print("Inactive State") elif OpenRTM_aist.CORBA_RTCUtil.is_in_active(consoleout): print("Active State") elif OpenRTM_aist.CORBA_RTCUtil.is_in_error(consoleout): print("Error State")実行コンテキストの操作
実行周期の操作
実行コンテキストの実行周期を変更するには、set_default_rate関数を使用します。
set_default_rate関数はデフォルトの実行コンテキストの実行周期を取得しますが、指定IDの実行コンテキストから実行周期を取得するためにはset_current_rate関数を使用します。
現在の実行周期を取得するためには、get_default_rate関数を使用します。
指定IDの実行コンテキストから実行周期を取得するためにはget_current_rate関数を使用します。
実行コンテキストのアタッチ、デタッチ
通常はRTCが起動時に生成する実行コンテキストが関連付け(アタッチ)されていますが、、外部の実行コンテキストをRTCにアタッチすると、アタッチした実行コンテキストでRTCを駆動できるようになります。
実行コンテキストを指定のRTCにアタッチするためにはadd_rtc_to_default_ec関数を使用します。
アタッチした実行コンテキストの関連付け解除(デタッチ)するためにはremove_rtc_to_default_ec関数を使用します。
アタッチした外部RTCの一覧を取得するためにはget_participants_rtc関数を使用します。
RTC::RTCList rtclist = CORBA_RTCUtil::get_participants_rtc(consoleout.in()); for(CORBA::ULong i=0;i < rtclist.length();i++) { std::cout << i << "\t" << CORBA_RTCUtil::get_component_profile(rtclist[i].in()) << std::endl; }i = 0 for rtc in OpenRTM_aist.CORBA_RTCUtil.get_participants_rtc(consoleout): print(i, OpenRTM_aist.CORBA_RTCUtil.get_component_profile(rtc)) i += 1コンフィギュレーションパラメータの操作
コンフィギュレーションパラメータの設定をするためにはset_active_configuration関数を使用します。 この関数では現在アクティブなコンフィギュレーションセットのパラメータが設定されます。
OpenRTM_aist.CORBA_RTCUtil.set_active_configuration( configsample, "int_param1", "100")コンフィギュレーションセットを指定してパラメータを設定する場合はset_configuration関数を使用します。 この関数を実行すると、アクティブなコンフィギュレーションセットが変更されます。
OpenRTM_aist.CORBA_RTCUtil.set_configuration( configsample, "mode0", "str_param1", "test")現在アクティブなコンフィギュレーションセットの名前を取得するにはget_active_configuration_name関数を使用します。
アクティブなコンフィギュレーションセットのパラメータ一覧を取得するにはget_active_configuration関数を使用します。
コンフィギュレーションセットを指定してパラメータ一覧を取得するにはget_configuration関数を使用します。
指定のパラメータのみを取得する場合はget_parameter_by_key関数を使用します。
print(OpenRTM_aist.CORBA_RTCUtil.get_parameter_by_key( configsample, "mode1", "int_param1"))RTC、ポートの情報取得
RTCの情報取得
コンポーネントプロファイルを取得するにはget_component_profile関数を使用します。
ポート名取得
指定のRTCが保持しているポートの名前一覧を取得するにはget_port_names関数を使用します。
coil::vstring portlist = CORBA_RTCUtil::get_port_names(consolein.in()); for (auto& port : portlist) { std::cout << port << std::endl; }for port in OpenRTM_aist.CORBA_RTCUtil.get_port_names(consolein): print(port)InPortの名前一覧を取得するにはget_inport_names関数、OutPortの名前一覧を取得するにはget_outport_names関数、サービスポートの名前一覧を取得するにはget_svcport_names関数を使用します。
coil::vstring inportlist = CORBA_RTCUtil::get_inport_names(consoleout.in()); for (auto& port : inportlist) { std::cout << port << std::endl; }coil::vstring outportlist = CORBA_RTCUtil::get_outport_names(consolein.in()); for (auto& port : outportlist) { std::cout << port << std::endl; } coil::vstring svcportlist = CORBA_RTCUtil::get_svcport_names(myserviceprovider.in()); for (auto& port : svcportlist) { std::cout << port << std::endl; }for port in OpenRTM_aist.CORBA_RTCUtil.get_inport_names(consoleout): print(port) for port in OpenRTM_aist.CORBA_RTCUtil.get_outport_names(consolein): print(port) for port in OpenRTM_aist.CORBA_RTCUtil.get_svcport_names(myserviceprovider): print(port)コネクタの名前一覧取得
指定ポートのコネクタの名前一覧を取得するにはget_connector_names関数を使用します。
coil::vstring inconlist = CORBA_RTCUtil::get_connector_names(port_in_var.in()); for (auto& connector : inconlist) { std::cout << connector << std::endl; }for connector in OpenRTM_aist.CORBA_RTCUtil.get_connector_names_by_portref(port_in_var): print(connector)ポート名を指定してコネクタの名前一覧を取得することもできます。
coil::vstring outconlist = CORBA_RTCUtil::get_connector_names(consolein.in(), "ConsoleIn0.out"); for (auto& connector : outconlist) { std::cout << connector << std::endl; }for connector in OpenRTM_aist.CORBA_RTCUtil.get_connector_names(consolein, "ConsoleIn0.out"): print(connector)