ロボット、千葉ロッテマリーンズについていいかげんなことを書きます。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
今回はあの超人気プログラミング言語MoonScriptでRTCを作成します。
とは言ってみたものの、おそらくほとんどの人は知らないと思うので軽く説明します。
MoonScriptはLuaのトランスレータ言語です。
MoonScriptで記述したコードは、Luaに変換後に実行されます。
Luaは言語仕様を極力削減しているため軽量という特徴がありますが、クラスのようなものを定義するにはテーブルを駆使してトリッキーなコードを書く必要があります。
このためほかのプログラミング言語とは大きく違うコーディングを強いられるため可読性が悪いという難点があります。
MoonScriptを使えば、以下のように自然にクラスを定義できます。
MoonScriptでRTCを作成すると、以下のようなコードを書くことになります。
おまけですが、OpenResty上でRTCを動かした動画をあげておきました。
今まではWEBブラウザ上でRTCの情報を表示したい場合は、WEBサーバーとRTCは別々に起動して何かしらの通信を行う必要があったのですが、これで多少実装が楽になるのではないでしょうか?
RTSystem Editor on the WEB等のツールは作りやすくなりそうです。
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
とは言ってみたものの、おそらくほとんどの人は知らないと思うので軽く説明します。
MoonScriptはLuaのトランスレータ言語です。
MoonScriptで記述したコードは、Luaに変換後に実行されます。
Luaは言語仕様を極力削減しているため軽量という特徴がありますが、クラスのようなものを定義するにはテーブルを駆使してトリッキーなコードを書く必要があります。
このためほかのプログラミング言語とは大きく違うコーディングを強いられるため可読性が悪いという難点があります。
MoonScriptを使えば、以下のように自然にクラスを定義できます。
class BaseClass
new: (v1) =>
self.v1 = v1
print_func: =>
print(self.v1)
class SubClass extends BaseClass
new: (v1,v2) =>
super v1
self.v2 = v2
print_func: =>
super!
self.v2 += 1
print(self.v2)
test_func = (bc) ->
bc\print_func!
obj = SubClass(1,2)
test_func(obj)
test_func(obj)
test_func(obj)
MoonScriptでRTCを作成すると、以下のようなコードを書くことになります。
---------------------------------
--! @file ConsoleIn.moon
--! @brief アウトポート出力のRTCサンプル
---------------------------------
openrtm_ms = require "openrtm_ms"
-- RTCの仕様をテーブルで定義する
consolein_spec = {
["implementation_id"]:"ConsoleIn",
["type_name"]:"ConsoleIn",
["description"]:"Console input component",
["version"]:"1.0",
["vendor"]:"Nobuhiko Miyamoto",
["category"]:"example",
["activity_type"]:"DataFlowComponent",
["max_instance"]:"10",
["language"]:"MoonScript",
["lang_type"]:"script"}
-- @class ConfigSample
class ConsoleIn extends openrtm_ms.RTObject
-- コンストラクタ
-- @param manager マネージャ
new: (manager) =>
super manager
-- データ格納変数
self._d_out = openrtm_ms.RTCUtil.instantiateDataType("::RTC::TimedLong")
-- アウトポート生成
self._outOut = openrtm_ms.OutPort("out",self._d_out,"::RTC::TimedLong")
-- 初期化時のコールバック関数
-- @return リターンコード
onInitialize: =>
-- ポート追加
@addOutPort("out",self._outOut)
return self._ReturnCode_t.RTC_OK
-- アクティブ状態の時の実行関数
-- @param ec_id 実行コンテキストのID
-- @return リターンコード
onExecute: (ec_id) =>
io.write("Please input number: ")
data = tonumber(io.read())
-- 出力データ格納
self._d_out.data = data
-- 出力データにタイムスタンプ設定
openrtm_ms.setTimestamp(self._d_out)
-- データ書き込み
self._outOut\write()
return self._ReturnCode_t.RTC_OK
-- ConsoleInコンポーネントの生成ファクトリ登録関数
-- @param manager マネージャ
ConsoleInInit = (manager) ->
prof = openrtm_ms.Properties({defaults_map:consolein_spec})
manager\registerFactory(prof, ConsoleIn, openrtm_ms.Factory.Delete)
-- ConsoleInコンポーネント生成
-- @param manager マネージャ
MyModuleInit = (manager) ->
ConsoleInInit(manager)
comp = manager\createComponent("ConsoleIn")
-- ConsoleIn.luaを直接実行している場合はマネージャの起動を行う
-- ロードして実行している場合はテーブルを返す
--if openrtm_ms.Manager.is_main()
-- manager = openrtm_ms.Manager
-- manager\init(arg)
-- manager\setModuleInitProc(MyModuleInit)
-- manager\activateManager()
-- manager\runManager()
--else
-- obj = {}
-- obj.Init = ConsoleInInit
-- return obj
manager = openrtm_ms.Manager
manager\init(arg)
manager\setModuleInitProc(MyModuleInit)
manager\activateManager()
manager\runManager()
おまけですが、OpenResty上でRTCを動かした動画をあげておきました。
今まではWEBブラウザ上でRTCの情報を表示したい場合は、WEBサーバーとRTCは別々に起動して何かしらの通信を行う必要があったのですが、これで多少実装が楽になるのではないでしょうか?
RTSystem Editor on the WEB等のツールは作りやすくなりそうです。
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
PR
この記事にコメントする