RTM-Lua

View the Project on GitHub Nobu19800/RTM-Lua

Laputan Blueprints上で動作するRTCの作成方法

概要

このページでは物理シミュレータLaputan Blueprints上で動作する上で動作するRTCを作成して、以下のようにPython版サンプルコンポーネントのジョイスティックコンポーネントと接続して車体を操作するシステムの作成を行います。

Laputan Blueprintsの入手

以下からLaputan Blueprintsを入手してください。

Laputan BlueprintsにOpenRTM Lua版をインストール

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\以下にコピーしてください。 ファイルを上書きするかどうか聞かれますが、構わずコピーしてください。

openrtmlua260

idlフォルダはLaputan\Laputan Files\以下にコピーしてください。

openrtmlua290

次にopenrtm-lua-x.y.z-x86-lua5.1\clibs\以下のファイルを全てLaputan\Laputan Files\以下にコピーしてください。

openrtmlua270

Laputan Blueprintsの設定

LB.exeを実行してLaputan Blueprintsを起動してください。 Help->Preferenceを選択して設定ウインドウを開いてください。

openrtmlua140

Lua IO LibLua OS Libのチェックボックスをオンにしてください。

openrtmlua150

RTC作成

RTC BuilderによるRTCの基本的な作成手順は以下のページを参考にしてください。

上のページの作成手順に従って、以下の仕様のRTCを作成してください。

基本プロファイル

   
モジュール名 LBSample

アクティビティ

onExecuteを有効にしてください。

インポート

   
ポート名 in
データ型 TimedFloatSeq

LBSample.luaの編集

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.luaLaputan\Laputan Files\LuaModules\以下にコピーしてください。 openrtmlua370

Laputan Blueprintsの関数については情報が少ないのですが、以下のサイトなどに少し情報があるみたいです。

LB-Dataファイルの編集

Laputan Blueprintsのサンプルcar.lbdを編集します。 Open bluprintボタンを押してファイルを選択してください。 openrtmlua160

car.lbdを開いたら、Edit Controlsボタンを押してControlsウインドウを開いてください。 openrtmlua170

右側に表示されたControlsウインドウの下の赤枠のタブを開いてボタンをクリックしてください。 openrtmlua180

Lubricatorウインドウに表示されたソースコードを編集します。 openrtmlua190

以下のコードを上書きしてください。

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オプションの後にパラメータを指定します。

実行コンテキストの指定をしています。 Laputan Blueprints上ではRTCをステップ実行したいのでOpenHRPExecutionContextという実行コンテキストを指定します。

起動時に生成するRTC名を指定します。

起動時に接続するポートを指定します。 この場合はLBSample0というRTCのinというデータポートを、TkJoyStick0というRTCのposというポートに接続します。

ただし、TkJoyStick0は別プロセスで起動しているため、rtcname形式による指定が必要になります。 rtcname形式はネームサーバーからRTCを取得する方法です。rtcname://アドレス/RTC名.ポート名で指定します。

起動時にアクティブ化するRTCを指定します。

ORBをステップ実行するときのみ有効なオプションです。 指定回数だけORBをステップ実行します。ORBから処理要求がない場合は、要求があるまで待ちます。 preconnect等で外部のRTCと接続する場合に必要です。

念のためにSave blueprintボタンを押してファイルを保存してください。 openrtmlua200

動作確認

ネームサーバー起動

事前にネームサーバーの起動が必要です。

※OpenRTM-aist 1.2以降ではRT System Editorにネームサーバー起動ボタンがあるため、手順が簡単になっています。

TkJoyStickコンポーネントの起動

TkJoyStickコンポーネントを入手して、TkJoyStickComp.exeを実行してください。

RTC起動

LB上でExperiment/Designボタンを押すとシミュレーションを開始します。 openrtmlua210

RTSystem作成

起動時にポートの接続、アクティブ化をオプションで設定しているため、RT System Editorでの操作は不要ですが、念のためRT System Editorによる操作手順も説明します。

まずRTCの起動に成功している場合は、以下のようにネームサービスビューにRTCが表示されます。

openrtmlua460

Open New System Editorボタンを押してシステムダイアグラムを表示してください。

openrtmlua470

ネームサービスビューからシステムダイアグラムにRTCをドラックアンドドロップしてください。

openrtmlua480

TkJoyStick0posのOutPortを、LBSample0inのInPortにドラックアンドドロップしてください。 これで通信ができるようになります。

openrtmlua450

※ステップ実行をしている側のRTC(今回はLBSample0)のconnect関数を呼び出すと接続に失敗します。必ず、今回の場合はTkJoyStick0posを選択してドラックアンドドロップしてください。

All Activateボタンを押すとTkJoyStick0からデータが送信されるため操作ができるようになります。

openrtmlua490

注意事項

今回はInPortのみを使用しましたが、OutPortを使用する場合についてはデータ転送の際に以下のようにoil.main関数で実行する必要があります。 また、サービスポートのプロバイダ側についても同じです。 oil.main関数で実行する必要があるのは、今回のようにORBをステップ実行した時のみです。

oil.main(function()
	self._outOut:write()
end)