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
まず、OpenSSLのヘッダーファイル、ライブラリを適当な場所に展開してください。
OpenRTM-aist+omniORBを以下の手順でビルド、インストールします。
ただし、CMake実行時にHTTP_ENABLE、OPENSSL_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
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
以下の手順でOpenRTM-aist Python版をインストールしてださい。
ただし、動作確認でOpenRTM-aist C++版付属のネームサーバーを使用するため、C++版のビルドも実行してください。
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.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のアクティブ化を実行する必要があります。
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.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のアクティブ化を実行する必要があります。
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.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のアクティブ化を実行する必要があります。
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.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.confのmanager.components.preconnect、manager.components.preactivationでrtcname形式、rtcloc形式を指定することでポートの接続、RTCのアクティブ化ができます。 HTTP通信の場合は以下のようにプロトコルにhttp、https、ws、wssを指定することで使用可能になります。
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では対応していないため、最新版の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
プロキシサーバーを設定するには、ORBhttpProxy、ORBhttpProxyUsername、ORBhttpProxyPasswordオプションを設定します。
corba.args:-ORBserverTransportRule "* http" -ORBclientTransportRule "* http" -ORBendPoint giop:http:https:///call -ORBhttpProxy http://localhost:3128 -ORBhttpProxyUsername username -ORBhttpProxyPassword pass
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ブラウザ上で実行する場合と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ブラウザで開きます。
ここでネームサーバーのアドレスとバインディング名を指定してexitボタンを押すとConsoleOutコンポーネントが終了します。
Webブラウザ環境に対応したスクリプト生成のためにrollup.jsというツールを使用しています。Rollup、rollup.jsは複数のJavascriptファイルを一つのモジュールにするJavaScript 用のバンドラーです。
この設定のためにrollup.config.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の一部機能の不足や言語使用の制限などで実行できないことがいくつかあります。
これらの問題から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