このページでは物理シミュレータLaputan Blueprints上で動作する上で動作するRTCを作成して、以下のようにPython版サンプルコンポーネントのジョイスティックコンポーネントと接続して車体を操作するシステムの作成を行います。
以下からLaputan Blueprintsを入手してください。
Laputan Blueprintsを展開したフォルダにOpenRTM Lua版の各ファイルをコピーします。
以下から32bit用のOpenRTM Lua版ファイル一式(OpenRTM Lua x.y.z Lua5.1 32bit)をダウンロードしてください。
OpenRTM Lua版からLaputan Blueprintsにファイルをコピーします。
openrtm-lua-x.y.z-x86-lua5.1\lua\
以下のファイルの内idl
フォルダ以外を全てLaputan\Laputan Files\LuaModules\
以下にコピーしてください。
ファイルを上書きするかどうか聞かれますが、構わずコピーしてください。
idl
フォルダはLaputan\Laputan Files\
以下にコピーしてください。
次にopenrtm-lua-x.y.z-x86-lua5.1\clibs\
以下のファイルを全てLaputan\Laputan Files\
以下にコピーしてください。
LB.exe
を実行してLaputan Blueprintsを起動してください。
Help
->Preference
を選択して設定ウインドウを開いてください。
Lua IO Lib
、Lua OS Lib
のチェックボックスをオンにしてください。
RTC BuilderによるRTCの基本的な作成手順は以下のページを参考にしてください。
上のページの作成手順に従って、以下の仕様のRTCを作成してください。
モジュール名 | LBSample |
onExecute
を有効にしてください。
ポート名 | in |
データ型 | TimedFloatSeq |
LBSample.lua
のonExecute関数を編集します。
function obj:onExecute(ec_id)
if self._inIn:isNew() then
local data = self._inIn:read()
lb.controls.Accel.setvalue(data.data[2]/3)
lb.controls.Handle.setvalue(-data.data[1]/2)
end
return self._ReturnCode_t.RTC_OK
end
InPortのデータを読み込んで、車のアクセル、ステアリングに入力しています。
編集したLBSample.lua
をLaputan\Laputan Files\LuaModules\
以下にコピーしてください。
Laputan Blueprintsの関数については情報が少ないのですが、以下のサイトなどに少し情報があるみたいです。
Laputan Blueprintsのサンプルcar.lbd
を編集します。
Open bluprint
ボタンを押してファイルを選択してください。
car.lbd
を開いたら、Edit Controls
ボタンを押してControls
ウインドウを開いてください。
右側に表示されたControls
ウインドウの下の赤枠のタブを開いてボタンをクリックしてください。
Lubricator
ウインドウに表示されたソースコードを編集します。
以下のコードを上書きしてください。
function OnFrame()
lb.drawtext(32,32,"Welcome Laputan Blueprints world!")
lb.drawtext(32,52,string.format("FPS=%.2f",lb.getfps()))
lb.drawtext(32,72,string.format("OBJ=%d",lb.getobjectcount()))
local openrtm = require "openrtm"
local mgr = openrtm.Manager
mgr:step()
local comp = mgr:getComponent("LBSample0")
local ec = comp:get_owned_contexts()[1]
ec:tick()
end
function OnInit()
lb.print(lb.gettime(),"Init")
local openrtm = require "openrtm"
local mgr = openrtm.Manager
mgr:init({"-o","exec_cxt.periodic.type:OpenHRPExecutionContext","-o","manager.components.precreate:LBSample","-o","manager.components.preconnect:LBSample0.in?port=rtcname://localhost/TkJoyStick0.pos","-o","manager.components.preactivation:LBSample0,rtcname://localhost/TkJoyStick0","-o","corba.step.count:4"})
mgr:activateManager()
mgr:runManager(true)
end
function OnReset()
lb.print(lb.gettime(),"Reset")
local openrtm = require "openrtm"
local mgr = openrtm.Manager
mgr:createShutdownThread(1)
mgr:unload("LBSample")
mgr:unregisterFactory("LBSample")
end
基本は上記のコードのLBSample
の部分を変更すると、他のRTCにも適用できるようになります。
mgr:init
関数の引数について説明します。
-o
オプションの後にパラメータを指定します。
"-o","exec_cxt.periodic.type:OpenHRPExecutionContext"
実行コンテキストの指定をしています。
Laputan Blueprints上ではRTCをステップ実行したいのでOpenHRPExecutionContext
という実行コンテキストを指定します。
"-o","manager.components.precreate:LBSample"
起動時に生成するRTC名を指定します。
"-o","manager.components.preconnect:LBSample0.in?port=rtcname://localhost/TkJoyStick0.pos"
起動時に接続するポートを指定します。
この場合はLBSample0
というRTCのin
というデータポートを、TkJoyStick0
というRTCのpos
というポートに接続します。
ただし、TkJoyStick0
は別プロセスで起動しているため、rtcname形式
による指定が必要になります。
rtcname形式
はネームサーバーからRTCを取得する方法です。rtcname://アドレス/RTC名.ポート名
で指定します。
"-o","manager.components.preactivation:LBSample0,rtcname://localhost/TkJoyStick0"
起動時にアクティブ化するRTCを指定します。
"-o","corba.step.count:4"
ORBをステップ実行するときのみ有効なオプションです。 指定回数だけORBをステップ実行します。ORBから処理要求がない場合は、要求があるまで待ちます。 preconnect等で外部のRTCと接続する場合に必要です。
念のためにSave blueprint
ボタンを押してファイルを保存してください。
事前にネームサーバーの起動が必要です。
※OpenRTM-aist 1.2以降ではRT System Editorにネームサーバー起動ボタンがあるため、手順が簡単になっています。
TkJoyStickコンポーネントを入手して、TkJoyStickComp.exe
を実行してください。
LB上でExperiment/Design
ボタンを押すとシミュレーションを開始します。
起動時にポートの接続、アクティブ化をオプションで設定しているため、RT System Editorでの操作は不要ですが、念のためRT System Editorによる操作手順も説明します。
まずRTCの起動に成功している場合は、以下のようにネームサービスビューにRTCが表示されます。
Open New System Editor
ボタンを押してシステムダイアグラムを表示してください。
ネームサービスビューからシステムダイアグラムにRTCをドラックアンドドロップしてください。
TkJoyStick0
のpos
のOutPortを、LBSample0
のin
のInPortにドラックアンドドロップしてください。
これで通信ができるようになります。
※ステップ実行をしている側のRTC(今回はLBSample0
)のconnect
関数を呼び出すと接続に失敗します。必ず、今回の場合はTkJoyStick0
のpos
を選択してドラックアンドドロップしてください。
All Activate
ボタンを押すとTkJoyStick0
からデータが送信されるため操作ができるようになります。
今回はInPortのみを使用しましたが、OutPortを使用する場合についてはデータ転送の際に以下のようにoil.main
関数で実行する必要があります。
また、サービスポートのプロバイダ側についても同じです。
oil.main
関数で実行する必要があるのは、今回のようにORBをステップ実行した時のみです。
oil.main(function()
self._outOut:write()
end)