ダウンロード
最新バージョン : 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集
東京オープンソースロボティクス協会
omniORB 4.3ではHTTP通信機能をサポートしており、GIOPメッセージをHTTPパケットで送信する仕組みを利用することができます。 HTTP通信機能の利点として、ファイアーウォールやHTTPプロキシサーバを経由した通信が容易になる事や、リバースプロキシやロードバランサー等の既存の仕組みを流用しやすくなるという事があります。 このページではomniORBのHTTP、HTTPS、WebSocket、WSS(WebSocket over SSL/TLS)通信機能OpenRTM-aistから利用する方法を説明します。 ただし、HTTP通信機能はomniORBの独自仕様のため、TAO独自仕様のHTIOP等とは互換性はありません。
以下にomniORBのHTTPパケットの一例を掲載しておきます。TAOのHTIOPでは最初にGETメソッドを呼び出しており、動作が違う事が分かります。
C++
Windows
OpenRTM-aistのビルドとインストール
まず、OpenSSLのヘッダーファイル、ライブラリを適当な場所に展開してください。
OpenRTM-aist+omniORBを以下の手順でビルド、インストールします。
ただし、CMake実行時にHTTP_ENABLE、OPENSSL_ROOT_DIRのオプションを設定する必要があります。
また、CMake実行時にOpenRTM-aistのインストールフォルダは指定してそこにインストールするようにしてください。
Ubuntu
OpenRTM-aistのビルドとインストール
OpenSSLのヘッダとライブラリをインストールします。
OpenRTM-aist+omniORBを以下の手順でビルド、インストールします。
ただし、HTTP_ENABLEのオプションを設定する必要があります。
Python
OpenRTM-aistのビルドとインストール
以下の手順でOpenRTM-aist Python版をインストールしてださい。
ただし、動作確認でOpenRTM-aist C++版付属のネームサーバーを使用するため、C++版のビルドも実行してください。
動作確認
HTTP通信
ネームサーバー起動
HTTPTransportの動作確認のためにはネームサーバーがHTTP通信に対応している必要があります。 OpenRTM-aist付属のopenrtmNamesを起動します。
RTC起動
以下のようなrtc.confを作成します。OpenRTM-aistをインストールしたパスは適宜変更してください。
C++では以下のファイルを作成します。
Pythonでは以下のファイルを作成します。
各設定項目の内容は以下のようになっています。
このrtc.confを指定してConsoleIn、ConsoleOutのRTCを起動します。
${OPENRTM_INSTALL_DIR}/share/openrtm-2.0/components/c++/examples/ConsoleOutComp -f rtc.conf${OPENRTM_INSTALL_DIR}/share/openrtm-2.0/components/c++/examples/ConsoleInComp -f rtc.confpython3 ${OpenRTMPython_INSTALL_DIR}/share/openrtm-2.0/components/python3/SimpleIO/ConsoleOut.py -f rtc.confpython3 ${OpenRTMPython_INSTALL_DIR}/share/openrtm-2.0/components/python3/SimpleIO/ConsoleIn.py -f rtc.confこれでネームサーバーに登録されますが、RTシステムエディタにHTTP通信機能はないため、OpenRTM-aistの機能かrtshellによりポートの接続やRTCのアクティブ化を実行する必要があります。
HTTPS通信
ネームサーバー起動
HTTPTransportの動作確認のためにはネームサーバーがHTTP通信に対応している必要があります。 OpenRTM-aist付属のopenrtmNamesを起動します。
rtc.names.https.confでは生成済みのルート証明書root.crtと秘密鍵とサーバー証明書を連結したファイルserver.pemを使用するため、動作確認に使用するRTCもこれらの証明書ファイルを使います。 実際にシステムを開発する際は証明書と秘密鍵を変更してください。
RTC起動
以下のようなrtc.confを作成します。OpenRTM-aistをインストールしたパスは適宜変更してください。
C++では以下のファイルを作成します。
Pythonでは以下のファイルを作成します。
各設定項目の内容は以下のようになっています。
このrtc.confを指定してConsoleIn、ConsoleOutのRTCを起動します。
${OPENRTM_INSTALL_DIR}/share/openrtm-2.0/components/c++/examples/ConsoleOutComp -f rtc.conf${OPENRTM_INSTALL_DIR}/share/openrtm-2.0/components/c++/examples/ConsoleInComp -f rtc.confpython3 ${OpenRTMPython_INSTALL_DIR}/share/openrtm-2.0/components/python3/SimpleIO/ConsoleOut.py -f rtc.confpython3 ${OpenRTMPython_INSTALL_DIR}/share/openrtm-2.0/components/python3/SimpleIO/ConsoleIn.py -f rtc.confこれでネームサーバーに登録されますが、RTシステムエディタにHTTP通信機能はないため、OpenRTM-aistの機能かrtshellによりポートの接続やRTCのアクティブ化を実行する必要があります。
WebSocket通信
ネームサーバー起動
HTTPTransportの動作確認のためにはネームサーバーがHTTP通信に対応している必要があります。 OpenRTM-aist付属のopenrtmNamesを起動します。
RTC起動
以下のようなrtc.confを作成します。OpenRTM-aistをインストールしたパスは適宜変更してください。
C++では以下のファイルを作成します。
Pythonでは以下のファイルを作成します。
IIOP(TCP)のエンドポイントを設定していますが、これはWebSocketのアドレスだけをエンドポイントに設定した場合にCORBAオブジェクトの比較(_is_equivalent)が上手く動作しないためなので、今後omniORB側で修正されたら設定は不要です。
各設定項目の内容は以下のようになっています。
このrtc.confを指定してConsoleIn、ConsoleOutのRTCを起動します。
${OPENRTM_INSTALL_DIR}/share/openrtm-2.0/components/c++/examples/ConsoleOutComp -f rtc.conf${OPENRTM_INSTALL_DIR}/share/openrtm-2.0/components/c++/examples/ConsoleInComp -f rtc.confpython3 ${OpenRTMPython_INSTALL_DIR}/share/openrtm-2.0/components/python3/SimpleIO/ConsoleOut.py -f rtc.confpython3 ${OpenRTMPython_INSTALL_DIR}/share/openrtm-2.0/components/python3/SimpleIO/ConsoleIn.py -f rtc.confこれでネームサーバーに登録されますが、RTシステムエディタにHTTP通信機能はないため、OpenRTM-aistの機能かrtshellによりポートの接続やRTCのアクティブ化を実行する必要があります。
WebSocket over SSL/TLS通信
ネームサーバー起動
HTTPTransportの動作確認のためにはネームサーバーがHTTP通信に対応している必要があります。 OpenRTM-aist付属のopenrtmNamesを起動します。
rtc.names.https.confでは生成済みのルート証明書root.crtと秘密鍵とサーバー証明書を連結したファイルserver.pemを使用するため、動作確認に使用するRTCもこれらの証明書ファイルを使います。 実際にシステムを開発する際は証明書と秘密鍵を変更してください。
RTC起動
以下のようなrtc.confを作成します。OpenRTM-aistをインストールしたパスは適宜変更してください。
C++では以下のファイルを作成します。
Pythonでは以下のファイルを作成します。
各設定項目の内容は以下のようになっています。
このrtc.confを指定してConsoleIn、ConsoleOutのRTCを起動します。
${OPENRTM_INSTALL_DIR}/share/openrtm-2.0/components/c++/examples/ConsoleOutComp -f rtc.conf${OPENRTM_INSTALL_DIR}/share/openrtm-2.0/components/c++/examples/ConsoleInComp -f rtc.confpython3 ${OpenRTMPython_INSTALL_DIR}/share/openrtm-2.0/components/python3/SimpleIO/ConsoleOut.py -f rtc.confpython3 ${OpenRTMPython_INSTALL_DIR}/share/openrtm-2.0/components/python3/SimpleIO/ConsoleIn.py -f rtc.confこれでネームサーバーに登録されますが、RTシステムエディタにHTTP通信機能はないため、OpenRTM-aistの機能かrtshellによりポートの接続やRTCのアクティブ化を実行する必要があります。
マネージャ起動時のポート接続、RTCのアクティブ化
rtc.confのmanager.components.preconnect、manager.components.preactivationでrtcname形式、rtcloc形式を指定することでポートの接続、RTCのアクティブ化ができます。 HTTP通信の場合は以下のようにプロトコルにhttp、https、ws、wssを指定することで使用可能になります。
rtshellによる操作
まず、現在インストールされるrtshellでは対応していないため、最新版のrtctree、rtshell、rtsprofileが必要です。
rtshellでHTTP通信機能を使用するためには以下の環境変数を設定する必要があります。
以下のように接続するネームサーバーのアドレスの前にhttps:を付けることでHTTPS通信でネームサーバーに接続できるようになります。
プロキシサーバーの設定
プロキシサーバーを設定するには、ORBhttpProxy、ORBhttpProxyUsername、ORBhttpProxyPasswordオプションを設定します。
corba.jsのビルドと動作確認
corba.jsはTypeScript用のCORBA実装(ORB、IDLコンパイラ)です。
現状、corba.jsはomniORBのWebsocket通信には対応していないため、当面の間はこちらで修正を加えたもので動作を確認します。
まず、node.js、npmをインストールしてください。
Ubuntu環境では以下のコマンドでインストールしてください。
現状、Linux環境でないとIDLコンパイルが実行できないようなので、corba.jsはUbuntu環境でビルドしてください。
これ以降の作業はWindowsでも実行できます。 まず、OpenRTM-aistのテスト用のプログラム(openrtm_corbajs_test)を作成したので、これをビルドします。
この時点でnode_modulesフォルダにcorba.jsも含む依存ライブラリが一式インストールされていますが、corba.jsは先ほどビルドしたものを使用するため、インストールしたcorba.jsは削除して差し替えた後にビルドします。
Webブラウザで実行する場合
Webブラウザ上で実行する場合とnode.jsで実行する場合についてソースコードの修正が必要です。 なにも修正しない場合ブラウザで操作する形式でビルドしています。
事前準備として、Websocket通信のエンドポイントでネームサーバーとConsoleOutコンポーネントを起動してください。
${OPENRTM_INSTALL_DIR}/share/openrtm-2.0/components/c++/examples/ConsoleOutComp -f rtc.conf動作確認のためにはopenrtm_corbajs_test付属のindex.htmlをWebブラウザで開きます。
ここでネームサーバーのアドレスとバインディング名を指定してexitボタンを押すとConsoleOutコンポーネントが終了します。
rollup.jsについて
Webブラウザ環境に対応したスクリプト生成のためにrollup.jsというツールを使用しています。Rollup、rollup.jsは複数のJavascriptファイルを一つのモジュールにするJavaScript 用のバンドラーです。
この設定のためにrollup.config.jsを作成しています。
node.js環境で実行する場合
node.jsで実行する場合、ネームサーバーのエンドポイントにlocalhostと設定すると正常に動作せず、ネームサーバーのエンドポイントに127.0.0.1のように直接IPアドレスを指定してcorba.js側でも127.0.0.1へアクセスする必要があります。
この変更後にネームサーバーを起動してください。
src/openrtmTest.tsを編集します。 以下の2行の1行目のコメントアウトを解除して、2行目をコメントアウトしてください。
import { WsProtocol } from "corba.js/net/ws" //import { WsProtocol } from "corba.js/net/browser"そして、以下の2行についても同様の変更をしてください。
この後、再度ビルドしてサンプルプログラムを実行します。
サンプルプログラム概要
サンプルプログラムのopenrtmTest.tsの概要について説明します。
まず最初にcorba.jsやRTCのスタブ、スケルトンファイルを読み込んでいます。
import { ORB, GIOPDecoder } from 'corba.js' import { NamingContextExtStub } from 'corba.js' //import { WsProtocol } from "corba.js/net/ws" import { WsProtocol } from "corba.js/net/browser" import * as skel from "./example_echo_skel.js" import * as stub from "./example_echo_stub.js" import * as RTC_skel from "./RTC_skel.js" import * as RTC_stub from "./RTC_stub.js" import * as RTC_interface from "./RTC.js" import * as RTC_value from "./RTC_value.js" import * as RTC_valuetype from "./RTC_valuetype.js"Webブラウザから実行しているのはexit_component関数です。
最初にスタブクラスを登録しています。実際に使用しているのは以下のRTObjectクラスだけです。
使用する通信プロトコルとしてWebSocketを追加しています。node.jsからの実行であればWebSocket over SSL/TLS通信も追加可能です。
アドレスを指定してネームサーバーのオブジェクトリファレンスを取得します。
await orb.stringToObject(address+"#NameService").then( (nameobject: any) => { let rootContext = NamingContextExtStub.narrow(nameobject)RTCのバインディング名を指定してRTCのオブジェクトリファレンスを取得しています。 この辺の記述方法はcorba.jsの対応状況で変わる可能性があります。
rootContext.resolve_str(rtcpath).then( (reference: any) => { orb.getConnection(reference.host, reference.port, reference.pathname).then( (objectConnection: any) => { let rtc = new RTC_stub.RTC.RTObject(objectConnection.orb, reference.objectKey, objectConnection);RTCのオブジェクトリファレンスからexitメソッドを呼び出して終了処理を実行します。 戻り値で終了処理の成功失敗を判定しています。
rtc.exit().then( (ret: RTC_interface.RTC.ReturnCode_t) => { if(ret === RTC_interface.RTC.ReturnCode_t.RTC_OK) { print("RTC termination process has completed successfully.") } else { print("error code:"+ret) }課題
今のところ、corba.jsの一部機能の不足や言語使用の制限などで実行できないことがいくつかあります。
これらの問題からOMG RTC仕様のIDLファイルはIDLコンパイルできなかったため、サンプルプログラム付属のTypeScriptソースファイルは多重継承やany型を削除したIDLファイルをIDLコンパイル後に修正しています。 一応、多重継承の問題とインクルードの問題は修正を加えることで対応可能ですが、any型についてはシリアライズ、デシリアライズ処理の変更が必要ですが、openrtm_corbajs_test付属のファイルでは対応できていません。
RTC_value.tsの以下の部分でNameValueのシリアライズ、デシリアライズについて記述があるので、ここに修正することで対応してください。
export interface NameValue { name: string value: any } export function initNameValue(object: NameValue, init?: Partial<NameValue> | GIOPDecoder) { if (init instanceof GIOPDecoder) { const decoder = init object.name = decoder.string() object.name = decoder.any() } else { object.name = (init === undefined || init.name === undefined) ? "" : init.name } } export function encodeNameValue(encoder: GIOPEncoder, obj: NameValue) { encoder.string(obj.name) encoder.any(obj.name) }any型などのCORBAの仕様については以下のページが参考になります。
簡単な動作確認
OpenRTM-aistをビルド、インストールすると、HTTPTransportの簡単な動作確認用の設定ファイルがインストールされます。
source ${OPENRTM_INSTALL_DIR}/etc/environment-setup.sh ${OPENRTM_INSTALL_DIR}/bin/openrtmNames -f ${OPENRTM_INSTALL_DIR}/etc/rtc.names.http.confsource ${OPENRTM_INSTALL_DIR}/etc/environment-setup.sh ${OPENRTM_INSTALL_DIR}/share/openrtm-2.0/components/c++/examples/ConsoleOutComp -f ${OPENRTM_INSTALL_DIR}/etc/http/rtc.http.confsource ${OPENRTM_INSTALL_DIR}/etc/environment-setup.sh ${OPENRTM_INSTALL_DIR}/bin/openrtmNames -f ${OPENRTM_INSTALL_DIR}/etc/rtc.names.https.confsource ${OPENRTM_INSTALL_DIR}/etc/environment-setup.sh ${OPENRTM_INSTALL_DIR}/share/openrtm-2.0/components/c++/examples/ConsoleOutComp -f ${OPENRTM_INSTALL_DIR}/etc/http/rtc.https.confsource ${OPENRTM_INSTALL_DIR}/etc/environment-setup.sh ${OPENRTM_INSTALL_DIR}/bin/openrtmNames -f ${OPENRTM_INSTALL_DIR}/etc/rtc.names.ws.confsource ${OPENRTM_INSTALL_DIR}/etc/environment-setup.sh ${OPENRTM_INSTALL_DIR}/share/openrtm-2.0/components/c++/examples/ConsoleOutComp -f ${OPENRTM_INSTALL_DIR}/etc/http/rtc.ws.confsource ${OPENRTM_INSTALL_DIR}/etc/environment-setup.sh ${OPENRTM_INSTALL_DIR}/bin/openrtmNames -f ${OPENRTM_INSTALL_DIR}/etc/rtc.names.wss.confsource ${OPENRTM_INSTALL_DIR}/etc/environment-setup.sh ${OPENRTM_INSTALL_DIR}/share/openrtm-2.0/components/c++/examples/ConsoleOutComp -f ${OPENRTM_INSTALL_DIR}/etc/wss/rtc.http.conf