HTTPTransportの使用方法

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メソッドを呼び出しており、動作が違う事が分かります。

 POST /call HTTP/1.1
 Host: localhost:2809
 User-Agent: omniORB
 Connection: keep-alive
 Content-Type: application/octet-stream
 Content-Length: 103
 
 GIOP\x01\x02\x01\x00[\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00NameService\x00\x06\x00\x00\x00_is_a\x00\x00\x00\x00\x00\x00\x00+\x00\x00\x00IDL:omg.org/CosNaming/NamingContextExt:1.0\x00

C++

Windows

OpenRTM-aistのビルドとインストール

まず、OpenSSLのヘッダーファイル、ライブラリを適当な場所に展開してください。

OpenRTM-aist+omniORBを以下の手順でビルド、インストールします。

ただし、CMake実行時にHTTP_ENABLEOPENSSL_ROOT_DIRのオプションを設定する必要があります。

設定項目 内容 設定例
HTTP_ENABLE HTTPTransportプラグインの生成の有無 ON
OPENSSL_ROOT_DIR OpenSSLの各種ファイルを配置したパス C:/work/OpenSSL/x64

また、CMake実行時にOpenRTM-aistのインストールフォルダは指定してそこにインストールするようにしてください。

 set OPENRTM_INSTALL_DIR=C:/work/openrtm_install
 set OMNIORB_SOURCE_DIR=C:/workspace/omniORB-4.3.0-x64-vc16-py310
 set OPENSSL_ROOT_DIR=C:/work/OpenSSL/x64
 cmake .. -DORB_ROOT=%OMNIORB_SOURCE_DIR% -DHTTP_ENABLE=ON -DOPENSSL_ROOT_DIR=%OPENSSL_ROOT_DIR% -DCMAKE_INSTALL_PREFIX=%OPENRTM_INSTALL_DIR%
 cmake --build . --config Release
 cmake --build . --config Release --target install

Ubuntu

OpenRTM-aistのビルドとインストール

OpenSSLのヘッダとライブラリをインストールします。

 sudo apt install libssl-dev

OpenRTM-aist+omniORBを以下の手順でビルド、インストールします。

ただし、HTTP_ENABLEのオプションを設定する必要があります。

設定項目 内容 設定例
HTTP_ENABLE HTTPTransportプラグインの生成の有無 ON

 set OPENRTM_INSTALL_DIR=~/work/openrtm_install
 cmake .. -DHTTP_ENABLE=ON -DCMAKE_INSTALL_PREFIX=$OPENRTM_INSTALL_DIR
 cmake --build . --config Release -- -j$(nproc)
 cmake --build . --config Release --target install

Python

OpenRTM-aistのビルドとインストール

以下の手順でOpenRTM-aist Python版をインストールしてださい。

ただし、動作確認でOpenRTM-aist C++版付属のネームサーバーを使用するため、C++版のビルドも実行してください。

動作確認

HTTP通信

ネームサーバー起動

HTTPTransportの動作確認のためにはネームサーバーがHTTP通信に対応している必要があります。 OpenRTM-aist付属のopenrtmNamesを起動します。

 %OPENRTM_INSTALL_DIR%\2.0.0\bin\vc16\openrtmNames.exe -f %OPENRTM_INSTALL_DIR%/2.0.0/ext/rtc.names.http.conf

 $OPENRTM_INSTALL_DIR/bin/openrtmNames -f $OPENRTM_INSTALL_DIR/etc/rtc.names.http.conf

RTC起動

以下のようなrtc.confを作成します。OpenRTM-aistをインストールしたパスは適宜変更してください。

C++では以下のファイルを作成します。

 manager.modules.load_path: C:/work/openrtm_install/2.0.0/ext/vc16/http
 manager.preload.modules: HTTPTransport.dll
 
 corba.args:-ORBserverTransportRule "* http" -ORBclientTransportRule "* http" -ORBendPoint giop:http:http:///call
 corba.nameservers: http://localhost:2809/call
 corba.master_manager: http:http://localhost:2810/call

Pythonでは以下のファイルを作成します。

 manager.modules.load_path: C:/Python37/Lib/site-packages/OpenRTM_aist/ext/http
 manager.preload.modules: HTTPTransport.py
 
 corba.args:-ORBserverTransportRule "* http" -ORBclientTransportRule "* http" -ORBendPoint giop:http:http:///call
 corba.nameservers: http://localhost:2809/call
 corba.master_manager: http:http://localhost:2810/call

各設定項目の内容は以下のようになっています。

項目名 説明
corba.args CORBAライブラリの初期化関数に渡す引数。ここでHTTP通信のエンドポイントを設定する必要がある。
corba.nameservers ネームサーバーのアドレス。ここでHTTP通信でネームサーバーに接続するように設定する。
corba.master_manager マスターマネージャのエンドポイント。マスターマネージャの場合は自身のエンドポイントを設定し、スレーブマネージャの場合は接続先のマスターマネージャのアドレスを設定する。

このrtc.confを指定してConsoleIn、ConsoleOutのRTCを起動します。

 %OPENRTM_INSTALL_DIR%\2.0.0\Components\C++\Examples\vc16\ConsoleInComp.exe -f rtc.conf

 %OPENRTM_INSTALL_DIR%\2.0.0\Components\C++\Examples\vc16\ConsoleOutComp.exe -f rtc.conf

 ${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.conf

 python %OpenRTMPython_INSTALL_DIR%\Lib\site-packages\ConsoleIn.py -f rtc.conf

 python %OpenRTMPython_INSTALL_DIR%\Lib\site-packages\ConsoleOut.py -f rtc.conf

 python3 ${OpenRTMPython_INSTALL_DIR}/share/openrtm-2.0/components/python3/SimpleIO/ConsoleOut.py -f rtc.conf

 python3 ${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を起動します。

 %OPENRTM_INSTALL_DIR%\2.0.0\bin\vc16\openrtmNames.exe -f %OPENRTM_INSTALL_DIR%/2.0.0/ext/rtc.names.https.conf
 $OPENRTM_INSTALL_DIR/bin/openrtmNames -f $OPENRTM_INSTALL_DIR/etc/rtc.names.https.conf

rtc.names.https.confでは生成済みのルート証明書root.crtと秘密鍵とサーバー証明書を連結したファイルserver.pemを使用するため、動作確認に使用するRTCもこれらの証明書ファイルを使います。 実際にシステムを開発する際は証明書と秘密鍵を変更してください。

RTC起動

以下のようなrtc.confを作成します。OpenRTM-aistをインストールしたパスは適宜変更してください。

C++では以下のファイルを作成します。

 manager.modules.load_path: C:/work/openrtm_install/2.0.0/ext/vc16/http
 manager.preload.modules: HTTPTransport.dll
 
 corba.http.certificate_authority_file:C:/work/openrtm_install/2.0.0/ext/ssl/root.crt
 corba.http.key_file:C:/work/openrtm_install/2.0.0/ext/ssl/server.pem
 corba.http.key_file_password:password
 corba.args:-ORBserverTransportRule "* http" -ORBclientTransportRule "* http" -ORBendPoint giop:http:https:///call
 corba.nameservers: https://localhost:2809/call
 corba.master_manager: http:https://localhost:2810/call

Pythonでは以下のファイルを作成します。

 manager.modules.load_path: C:/Python37/Lib/site-packages/OpenRTM_aist/ext/http
 manager.preload.modules: HTTPTransport.py
 
 corba.http.certificate_authority_file:C:/Python37/Lib/site-packages/OpenRTM_aist/ext/ssl/root.crt
 corba.http.key_file:C:/Python37/Lib/site-packages/OpenRTM_aist/ext/ssl/server.pem
 corba.http.key_file_password:password
 corba.args:-ORBserverTransportRule "* http" -ORBclientTransportRule "* http" -ORBendPoint giop:http:https:///call
 corba.nameservers: https://localhost:2809/call
 corba.master_manager: http:https://localhost:2810/call

各設定項目の内容は以下のようになっています。

項目名 説明
corba.http.certificate_authority_file ルート証明書
corba.http.key_file 秘密鍵+サーバー証明書兼クライアント証明書の連結ファイル
corba.http.key_file_password 秘密鍵のパスフレーズ
corba.args CORBAライブラリの初期化関数に渡す引数。ここでHTTPS通信のエンドポイントを設定する必要がある。
corba.nameservers ネームサーバーのアドレス。ここでHTTPS通信でネームサーバーに接続するように設定する。
corba.master_manager マスターマネージャのエンドポイント。マスターマネージャの場合は自身のエンドポイントを設定し、スレーブマネージャの場合は接続先のマスターマネージャのアドレスを設定する。

このrtc.confを指定してConsoleIn、ConsoleOutのRTCを起動します。

 %OPENRTM_INSTALL_DIR%\2.0.0\Components\C++\Examples\vc16\ConsoleInComp.exe -f rtc.conf

 %OPENRTM_INSTALL_DIR%\2.0.0\Components\C++\Examples\vc16\ConsoleOutComp.exe -f rtc.conf

 ${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.conf

 python %OpenRTMPython_INSTALL_DIR%\Lib\site-packages\ConsoleIn.py -f rtc.conf

 python %OpenRTMPython_INSTALL_DIR%\Lib\site-packages\ConsoleOut.py -f rtc.conf

 python3 ${OpenRTMPython_INSTALL_DIR}/share/openrtm-2.0/components/python3/SimpleIO/ConsoleOut.py -f rtc.conf

 python3 ${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を起動します。

 %OPENRTM_INSTALL_DIR%\2.0.0\bin\vc16\openrtmNames.exe -f %OPENRTM_INSTALL_DIR%/2.0.0/ext/rtc.names.ws.conf

 $OPENRTM_INSTALL_DIR/bin/openrtmNames -f $OPENRTM_INSTALL_DIR/etc/rtc.names.ws.conf

RTC起動

以下のようなrtc.confを作成します。OpenRTM-aistをインストールしたパスは適宜変更してください。

C++では以下のファイルを作成します。

 manager.modules.load_path: C:/work/openrtm_install/2.0.0/ext/vc16/http
 manager.preload.modules: HTTPTransport.dll
 
 corba.args:-ORBserverTransportRule "* http,tcp" -ORBclientTransportRule "* http,tcp" -ORBendPoint giop:http:ws:///ws -ORBendPoint giop:tcp::
 corba.nameservers: ws://localhost:2809/ws
 corba.master_manager: giop:http:ws://localhost:2810/ws

Pythonでは以下のファイルを作成します。

 manager.modules.load_path: C:/Python37/Lib/site-packages/OpenRTM_aist/ext/http
 manager.preload.modules: HTTPTransport.py
 
 corba.args:-ORBserverTransportRule "* http,tcp" -ORBclientTransportRule "* http,tcp" -ORBendPoint giop:http:ws:///ws -ORBendPoint giop:tcp::
 corba.nameservers: ws://localhost:2809/ws
 corba.master_manager: giop:http:ws://localhost:2810/ws

IIOP(TCP)のエンドポイントを設定していますが、これはWebSocketのアドレスだけをエンドポイントに設定した場合にCORBAオブジェクトの比較(_is_equivalent)が上手く動作しないためなので、今後omniORB側で修正されたら設定は不要です。

各設定項目の内容は以下のようになっています。

項目名 説明
corba.args CORBAライブラリの初期化関数に渡す引数。ここでHTTP通信のエンドポイントを設定する必要がある。
corba.nameservers ネームサーバーのアドレス。ここでWebSocket通信でネームサーバーに接続するように設定する。
corba.master_manager マスターマネージャのエンドポイント。マスターマネージャの場合は自身のエンドポイントを設定し、スレーブマネージャの場合は接続先のマスターマネージャのアドレスを設定する。

このrtc.confを指定してConsoleIn、ConsoleOutのRTCを起動します。

 %OPENRTM_INSTALL_DIR%\2.0.0\Components\C++\Examples\vc16\ConsoleInComp.exe -f rtc.conf

 %OPENRTM_INSTALL_DIR%\2.0.0\Components\C++\Examples\vc16\ConsoleOutComp.exe -f rtc.conf

 ${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.conf

 python %OpenRTMPython_INSTALL_DIR%\Lib\site-packages\ConsoleIn.py -f rtc.conf

 python %OpenRTMPython_INSTALL_DIR%\Lib\site-packages\ConsoleOut.py -f rtc.conf

 python3 ${OpenRTMPython_INSTALL_DIR}/share/openrtm-2.0/components/python3/SimpleIO/ConsoleOut.py -f rtc.conf

 python3 ${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を起動します。

 %OPENRTM_INSTALL_DIR%\2.0.0\bin\vc16\openrtmNames.exe -f %OPENRTM_INSTALL_DIR%/2.0.0/ext/rtc.names.wss.conf

 $OPENRTM_INSTALL_DIR/bin/openrtmNames -f $OPENRTM_INSTALL_DIR/etc/rtc.names.https.conf

rtc.names.https.confでは生成済みのルート証明書root.crtと秘密鍵とサーバー証明書を連結したファイルserver.pemを使用するため、動作確認に使用するRTCもこれらの証明書ファイルを使います。 実際にシステムを開発する際は証明書と秘密鍵を変更してください。

RTC起動

以下のようなrtc.confを作成します。OpenRTM-aistをインストールしたパスは適宜変更してください。

C++では以下のファイルを作成します。

 manager.modules.load_path: C:/work/openrtm_install/2.0.0/ext/vc16/http
 manager.preload.modules: HTTPTransport.dll
 
 corba.http.certificate_authority_file:C:/work/openrtm_install/2.0.0/ext/ssl/root.crt
 corba.http.key_file:C:/work/openrtm_install/2.0.0/ext/ssl/server.pem
 corba.http.key_file_password:password
 corba.args:-ORBserverTransportRule "* http,tcp" -ORBclientTransportRule "* http,tcp" -ORBendPoint giop:http:wss:///ws -ORBendPoint giop:tcp::
 corba.nameservers: wss://localhost:2809/ws
 corba.master_manager: giop:http:wss://localhost:2810/ws

Pythonでは以下のファイルを作成します。

 manager.modules.load_path: C:/Python37/Lib/site-packages/OpenRTM_aist/ext/http
 manager.preload.modules: HTTPTransport.py
 
 corba.http.certificate_authority_file:C:/Python37/Lib/site-packages/OpenRTM_aist/ext/ssl/root.crt
 corba.http.key_file:C:/Python37/Lib/site-packages/OpenRTM_aist/ext/ssl/server.pem
 corba.http.key_file_password:password
 corba.args:-ORBserverTransportRule "* http,tcp" -ORBclientTransportRule "* http,tcp" -ORBendPoint giop:http:wss:///ws -ORBendPoint giop:tcp::
 corba.nameservers: wss://localhost:2809/ws
 corba.master_manager: giop:http:wss://localhost:2810/ws

各設定項目の内容は以下のようになっています。

項目名 説明
corba.http.certificate_authority_file ルート証明書
corba.http.key_file 秘密鍵+サーバー証明書兼クライアント証明書の連結ファイル
corba.http.key_file_password 秘密鍵のパスフレーズ
corba.args CORBAライブラリの初期化関数に渡す引数。ここでWSS通信のエンドポイントを設定する必要がある。
corba.nameservers ネームサーバーのアドレス。ここでWSS通信でネームサーバーに接続するように設定する。
corba.master_manager マスターマネージャのエンドポイント。マスターマネージャの場合は自身のエンドポイントを設定し、スレーブマネージャの場合は接続先のマスターマネージャのアドレスを設定する。

このrtc.confを指定してConsoleIn、ConsoleOutのRTCを起動します。

 %OPENRTM_INSTALL_DIR%\2.0.0\Components\C++\Examples\vc16\ConsoleInComp.exe -f rtc.conf

 %OPENRTM_INSTALL_DIR%\2.0.0\Components\C++\Examples\vc16\ConsoleOutComp.exe -f rtc.conf

 ${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.conf

 python %OpenRTMPython_INSTALL_DIR%\Lib\site-packages\ConsoleIn.py -f rtc.conf

 python %OpenRTMPython_INSTALL_DIR%\Lib\site-packages\ConsoleOut.py -f rtc.conf

 python3 ${OpenRTMPython_INSTALL_DIR}/share/openrtm-2.0/components/python3/SimpleIO/ConsoleOut.py -f rtc.conf

 python3 ${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.preconnectmanager.components.preactivationでrtcname形式、rtcloc形式を指定することでポートの接続、RTCのアクティブ化ができます。 HTTP通信の場合は以下のようにプロトコルにhttphttpswswssを指定することで使用可能になります。

 manager.components.preconnect: ConsoleIn0.out?port=rtcname.http://localhost:2809/call#*/ConsoleOut0.in
 manager.components.preactivation: ConsoleIn0, rtcname.http://localhost:2809/call#*/ConsoleOut0

 naming.type: corba, manager
 manager.components.preconnect: ConsoleIn0.out?port=rtcloc.http://localhost:2810/call#*/ConsoleOut0.in
 manager.components.preactivation: ConsoleIn0, rtcloc.http://localhost:2810/call#*/ConsoleOut0

 manager.components.preconnect: ConsoleIn0.out?port=rtcname.https://localhost:2809/call#*/ConsoleOut0.in
 manager.components.preactivation: ConsoleIn0, rtcname.https://localhost:2809#call/*/ConsoleOut0

 naming.type: corba, manager
 manager.components.preconnect: ConsoleIn0.out?port=rtcloc.https://localhost:2810/call#*/ConsoleOut0.in
 manager.components.preactivation: ConsoleIn0, rtcloc.https://localhost:2810/call#*/ConsoleOut0

 manager.components.preconnect: ConsoleIn0.out?port=rtcname.ws://localhost:2809/ws#*/ConsoleOut0.in
 manager.components.preactivation: ConsoleIn0, rtcname.ws://localhost:2809/ws#*/ConsoleOut0

 naming.type: corba, manager
 manager.components.preconnect: ConsoleIn0.out?port=rtcloc.ws://localhost:2810/call#*/ConsoleOut0.in
 manager.components.preactivation: ConsoleIn0, rtcloc.ws://localhost:2810/call#*/ConsoleOut0

 manager.components.preconnect: ConsoleIn0.out?port=rtcname.wss://localhost:2809/ws#*/ConsoleOut0.in
 manager.components.preactivation: ConsoleIn0, rtcname.wss://localhost:2809/ws#*/ConsoleOut0

 naming.type: corba, manager
 manager.components.preconnect: ConsoleIn0.out?port=rtcloc.wss://localhost:2810/ws#*/ConsoleOut0.in
 manager.components.preactivation: ConsoleIn0, rtcloc.wss://localhost:2810/ws#*/ConsoleOut0

rtshellによる操作

まず、現在インストールされるrtshellでは対応していないため、最新版のrtctree、rtshell、rtsprofileが必要です。

rtshellでHTTP通信機能を使用するためには以下の環境変数を設定する必要があります。

環境変数名 設定例 意味
RTCTREE_HTTP_ENABLE YES YES:rtctreeでHTTP通信機能を有効にする。
RTCTREE_NAMESERVERS http://localhost:2809/call 接続するネームサーバー
ORBhttpsCAFile root.crt ルート証明書
ORBhttpsKeyFile server.pem 秘密鍵+サーバー証明書兼クライアント証明書の連結ファイル
ORBhttpsKeyPassword password 秘密鍵のパスフレーズ
ORBserverTransportRule "* http" サーバー側の通信プロトコル選択のルール
ORBclientTransportRule "* http" クライアント側の通信プロトコル選択のルール
ORBendPoint giop:http:http:///call omniORBのエンドポイント

 set RTCTREE_HTTP_ENABLE=YES
 set ORBhttpsCAFile=%RTM_ROOT%/ext/ssl/root.crt
 set ORBhttpsKeyFile=%RTM_ROOT%/ext/ssl/server.pem
 set ORBhttpsKeyPassword=password
 set RTCTREE_NAMESERVERS=https://localhost:2809/call
 set ORBserverTransportRule=* http
 set ORBclientTransportRule=* http
 set ORBendPoint=giop:http:https:///call

以下のように接続するネームサーバーのアドレスの前にssliop:を付けることでSSLIOP通信でネームサーバーに接続できるようになります。

 rtcon /https:localhost:2809/call#test.host_cxt/ConsoleIn0.rtc:out /https:localhost:2809/call#est.host_cxt/ConsoleOut0.rtc:in
 rtact /https:localhost:2809/call#test.host_cxt/ConsoleIn0.rtc /https:localhost:2809/call#test.host_cxt/ConsoleOut0.rtc
 rtdeact /https:localhost:2809/call#test.host_cxt/ConsoleIn0.rtc /https:localhost:2809/call#test.host_cxt/ConsoleOut0.rtc
 rtexit /https:localhost:2809/call#test.host_cxt/ConsoleOut0.rtc
 rtcryo /https:localhost:2809/call -o sys.rtsys

プロキシサーバーの設定

プロキシサーバーを設定するには、ORBhttpProxyORBhttpProxyUsernameORBhttpProxyPasswordオプションを設定します。

 corba.args:-ORBserverTransportRule "* http" -ORBclientTransportRule "* http" -ORBendPoint giop:http:https:///call -ORBhttpProxy http://localhost:3128 -ORBhttpProxyUsername username -ORBhttpProxyPassword pass

corba.jsのビルドと動作確認

corba.jsはTypeScript用のCORBA実装(ORB、IDLコンパイラ)です。

現状、corba.jsはomniORBのWebsocket通信には対応していないため、当面の間はこちらで修正を加えたもので動作を確認します。

まず、node.js、npmをインストールしてください。

Ubuntu環境では以下のコマンドでインストールしてください。

 sudo apt-get install nodejs nodejs-dev node-gyp libssl1.0-dev npm
 sudo npm install -g n
 sudo n latest

現状、Linux環境でないとIDLコンパイルが実行できないようなので、corba.jsはUbuntu環境でビルドしてください。

 git clone https://github.com/Nobu19800/corba.js
 cd corba.js
 npm install
 npm run build

これ以降の作業はWindowsでも実行できます。 まず、OpenRTM-aistのテスト用のプログラム(openrtm_corbajs_test)を作成したので、これをビルドします。

 cd ..
 git clone https://github.com/Nobu19800/openrtm_corbajs_test
 cd openrtm_corbajs_test
 npm install

この時点でnode_modulesフォルダにcorba.jsも含む依存ライブラリが一式インストールされていますが、corba.jsは先ほどビルドしたものを使用するため、インストールしたcorba.jsは削除して差し替えた後にビルドします。

 rm -rf node_modules/corba.js
 cp -r ../corba.js/ node_modules/
 npm run build

Webブラウザで実行する場合

Webブラウザ上で実行する場合とnode.jsで実行する場合についてソースコードの修正が必要です。 なにも修正しない場合ブラウザで操作する形式でビルドしています。

事前準備として、Websocket通信のエンドポイントでネームサーバーとConsoleOutコンポーネントを起動してください。

 %OPENRTM_INSTALL_DIR%\2.0.0\bin\vc16\openrtmNames.exe -f %OPENRTM_INSTALL_DIR%/2.0.0/ext/rtc.names.ws.conf

 %OPENRTM_INSTALL_DIR%\2.0.0\Components\C++\Examples\vc16\ConsoleOutComp.exe -f rtc.conf

 $OPENRTM_INSTALL_DIR/bin/openrtmNames -f $OPENRTM_INSTALL_DIR/etc/rtc.names.ws.conf

 ${OPENRTM_INSTALL_DIR}/share/openrtm-2.0/components/c++/examples/ConsoleOutComp -f rtc.conf

動作確認のためにはopenrtm_corbajs_test付属のindex.htmlをWebブラウザで開きます。

corbajstest1.png

ここでネームサーバーのアドレスとバインディング名を指定して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へアクセスする必要があります。

 corba.args:-ORBserverTransportRule "* http" -ORBclientTransportRule "* http" -ORBendPoint giop:http:ws://127.0.0.1:2809/ws

この変更後にネームサーバーを起動してください。

src/openrtmTest.tsを編集します。 以下の2行の1行目のコメントアウトを解除して、2行目をコメントアウトしてください。

 import { WsProtocol } from "corba.js/net/ws"
 //import { WsProtocol } from "corba.js/net/browser"

そして、以下の2行についても同様の変更をしてください。

 let print = console.log
 //let print = alert

この後、再度ビルドしてサンプルプログラムを実行します。

 npm run build
 node lib/openrtmTestMain.js

サンプルプログラム概要

サンプルプログラムの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クラスだけです。

    orb.registerStubClass(RTC_stub.RTC.RTObject)

使用する通信プロトコルとしてWebSocketを追加しています。node.jsからの実行であればWebSocket over SSL/TLS通信も追加可能です。

    orb.addProtocol(new WsProtocol())

アドレスを指定してネームサーバーのオブジェクトリファレンスを取得します。

    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の一部機能の不足や言語使用の制限などで実行できないことがいくつかあります。

  • Typescriptは多重継承をサポートしない
  • corba.jsのIDLコンパイラは他のIDLファイルのインクルードについて未対応
  • corba.jsがany型に非対応

これらの問題から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の簡単な動作確認用の設定ファイルがインストールされます。

 %RTM_ROOT%\ext\environment-setup.omniorb.vc16.bat
 %RTM_ROOT%\bin\vc16\openrtmNames.exe -f %RTM_ROOT%\ext\rtc.names.http.conf

 %RTM_ROOT%\ext\environment-setup.omniorb.vc16.bat
 %RTM_ROOT%\Components\C++\Examples\vc16\ConsoleOutComp.exe -f %RTM_ROOT%\ext\http\rtc.http.conf

 source ${OPENRTM_INSTALL_DIR}/etc/environment-setup.sh
 ${OPENRTM_INSTALL_DIR}/bin/openrtmNames -f ${OPENRTM_INSTALL_DIR}/etc/rtc.names.http.conf

 source ${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.conf

 %RTM_ROOT%\ext\environment-setup.omniorb.vc16.bat
 %RTM_ROOT%\bin\vc16\openrtmNames.exe -f %RTM_ROOT%\ext\rtc.names.https.conf

 %RTM_ROOT%\ext\environment-setup.omniorb.vc16.bat
 %RTM_ROOT%\Components\C++\Examples\vc16\ConsoleOutComp.exe -f %RTM_ROOT%\ext\http\rtc.https.conf

 source ${OPENRTM_INSTALL_DIR}/etc/environment-setup.sh
 ${OPENRTM_INSTALL_DIR}/bin/openrtmNames -f ${OPENRTM_INSTALL_DIR}/etc/rtc.names.https.conf

 source ${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.conf

 %RTM_ROOT%\ext\environment-setup.omniorb.vc16.bat
 %RTM_ROOT%\bin\vc16\openrtmNames.exe -f %RTM_ROOT%\ext\rtc.names.ws.conf

 %RTM_ROOT%\ext\environment-setup.omniorb.vc16.bat
 %RTM_ROOT%\Components\C++\Examples\vc16\ConsoleOutComp.exe -f %RTM_ROOT%\ext\http\rtc.ws.conf

 source ${OPENRTM_INSTALL_DIR}/etc/environment-setup.sh
 ${OPENRTM_INSTALL_DIR}/bin/openrtmNames -f ${OPENRTM_INSTALL_DIR}/etc/rtc.names.ws.conf

 source ${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.conf

 %RTM_ROOT%\ext\environment-setup.omniorb.vc16.bat
 %RTM_ROOT%\bin\vc16\openrtmNames.exe -f %RTM_ROOT%\ext\rtc.names.wss.conf

 %RTM_ROOT%\ext\environment-setup.omniorb.vc16.bat
 %RTM_ROOT%\Components\C++\Examples\vc16\ConsoleOutComp.exe -f %RTM_ROOT%\ext\http\rtc.wss.conf

 source ${OPENRTM_INSTALL_DIR}/etc/environment-setup.sh
 ${OPENRTM_INSTALL_DIR}/bin/openrtmNames -f ${OPENRTM_INSTALL_DIR}/etc/rtc.names.wss.conf

 source ${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

ダウンロード

最新バージョン : 2.0.1-RELESE

統計

Webサイト統計
ユーザ数:2160
プロジェクト統計
RTコンポーネント307
RTミドルウエア35
ツール22
文書・仕様書2

Choreonoid

モーションエディタ/シミュレータ

OpenHRP3

動力学シミュレータ

OpenRTP

統合開発プラットフォーム

産総研RTC集

産総研が提供するRTC集

TORK

東京オープンソースロボティクス協会

DAQ-Middleware

ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク