忍者ブログ
ロボット、千葉ロッテマリーンズについていいかげんなことを書きます。
[1]  [2]  [3]  [4]  [5]  [6
USBラズパイなるものが発売されるらしいけど、一体ラズパイエミュレータと比べて何の利点があるのだろう・・・
一本9800円も払うんだったら普通にラズパイ買うだろうし、謎です。この製品を貶したいのではなく、ただ純粋に疑問です。



それはさておき、Dynamixel XM430-W350-RをOpenCM9.04-C+OpenCM 485拡張ボードに接続して動作確認しようとしたのですが、かなり詰まる部分があったのでメモしておきます。


まず、OpenCM9.04を使うにあたりOpenCM IDEを使って動作確認しようとしたのですが、これが何故か上手くいきませんでした。サンプルコードのDXL_BUS_SERIAL1を拡張ボード用にDXL_BUS_SERIAL3に変更してもピクリとも動きません。ボーレートを変更しても関係ないようです。Dynamixel 2.0のプロトコルに対応していないのか、XMシリーズが駄目なのかは謎です。


一旦RoboPlusでOpenCM9.04のファームウェアを修復後、RoboPlus 2.0 Managerで確認してみました。

まず、Dynamixel XM430-W350-R、OpenCM9.04-C、OpenCM 485拡張ボードを以下のように接続します。USBケーブルはPCと接続してください。





拡張ボードの電源は以下のスイッチでオンオフができます。
オンにするとXM430-W350-RのLEDが一回点滅します。
点滅しなかった場合はバッテリーが壊れている可能性があります。ちなみに画像に映っているバッテリーですが、一度も使っていないのに既に壊れています。








R+ Manager 2.0を起動後、アップデートするかどうか聞かれた場合はアップデートしてください。

アップデート後は、R+ Manager 2.0起動後に以下の画面が表示されます。






ProductからDYNAMIXEL Xを選んで○を押してください。




次に以下の画面でUpdate & Testを選んでください。







Nextを選んでいくとポート番号の選択画面に移行するため、適切なポートを選択してください。
OpenCM9.04-Cを直接接続した場合はROBOTIS Virtual COM Portと表示されるのでわかるとは思いますが、USBダウンローダーLN-101で接続するとUSB Serial Port(1.0)としか表示されないので分かり辛いかもしれません。






その後Nextを押していくとOpenCM9.04-Cと接続します。
本来であればXM-430-W350も表示されるはずですが、設定を変更しないと表示されません。

Control Tableで、Dynamixel ChannelをEXP Board(XH/XM)に変更してください。




それからBand Rate (Bus)を57600bpsに変更してください。




この後に、一旦Update & Testを×ボタンで終了後、OpenCM9.04-Cをリセット、OpenCM 485拡張ボードの電源を落として再起動、再度Update & TestによりOpenCM9.04-Cと接続すると、Device一覧にXM430-W350が表示されます。




表示されない場合はOpenCM9.04-cのリセットボタンを押して再起動、拡張ボードの電源を入れ直すなどで接続できるかもしれません。



Control Table画面でXM430-W350-Rの状態を確認できます。
Torque EnableをONにした後、Goal Positionの値を操作することでモーターが動作します。










独自のプログラムでXM430-W350-Rを操作する場合は、Dynamixel Protocol 2 Libraryというライブラリがあるようなのでこれを使います。Dynamixel SDKというライブラリもあるようなのですが、XMシリーズが動くかどうかは不明です。libdynamixelは大丈夫みたいです。と言うかなんでこんなに乱立しているんだ。



とりあえず、CMake設定ファイルを以下のように作成します。ファイル名は適当に変更してください。


cmake_minimum_required(VERSION 2.8)


set(DX2LIB_ROOT ${DX2LIB_ROOT} CACHE PATH "set DX2LIB_ROOT ")

if(NOT DX2LIB_ROOT)
message(FATAL_ERROR "Please set DX2LIB_ROOT.")
endif()





project (DXLTest)

include_directories(${DX2LIB_ROOT})
link_directories(${DX2LIB_ROOT})

add_executable(DXLTest DXLTest.cpp)
target_link_libraries(DXLTest dx2lib_x32.lib)cmake_minimum_required(VERSION 2.8)


set(DX2LIB_ROOT ${DX2LIB_ROOT} CACHE PATH "set DX2LIB_ROOT ")

if(NOT DX2LIB_ROOT)
message(FATAL_ERROR "Please set DX2LIB_ROOT.")
endif()





project (DXLTest)

include_directories(${DX2LIB_ROOT})
link_directories(${DX2LIB_ROOT})

add_executable(DXLTest DXLTest.cpp)
target_link_libraries(DXLTest dx2lib_x32.lib)


















DXLTest.cppには、とりあえずライブラリを展開したフォルダのSampleCode\VC\smpl1(template).cの中身をコピーします。

ただ何故かエラーが出るので、DXDEVICEIDをTDeviceIDに変更します。



DXDEVICEID dev;

TDeviceID dev;
















後は適当にモーターを操作するコードを追加します。



TErrorCode err;

//トルクをオンにする
DX2_WriteByteData(dev, 1, 64, 1, &err);
Sleep(1000);
//90度の位置に回転
DX2_WriteLongData(dev, 1, 116, 3072, &err);
Sleep(1000);
//-90度の位置に回転
DX2_WriteLongData(dev, 1, 116, 1024, &err);
Sleep(1000);
//トルクをオフにする
DX2_WriteByteData(dev, 1, 64, 0, &err);














詳細については仕様を見ながら試すしかなさそうです。
そう考えるとlibdynamixel使った方が良かったかもしれません。
libdynamixelだと以下のようになります。



DynamixelV2 m("\\\\.\\COM3", 1000000));
m.TorqueEnable(1);
Sleep(1000);
m.MovePosition(1, 1024);
Sleep(1000);
m.MovePosition(1, 3072);
Sleep(1000);
m.TorqueDisable(1);









まあ別に何のライブラリを使っても性能的には大差はないだろうし、ライセンス次第な気もします。








にほんブログ村 科学ブログ ロボットへ
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・

人気ブログランキングへ
PR
実は今までOpenRTM-erlangを使ったことがなかったため、使い方をメモしておきます。備忘録です。このブログは首相案件ではありません。


Windowsでも試してみたのですがコンポーネントプロファイルを取得しようとした途端に落ちるため、Ubuntuで動作確認します。
まあ落ちても即座に再起動するのですが、再試行しても無駄なようなので、Windowsでの動作はとりあえず諦めます。
Windowsだからなのか、Erlang/OTPのバージョンの問題なのかは不明です。


Ubuntu 16.04でErlang/OTPはaptでインストールできます。


$ sudo apt-get install erlang




そしてOpenRTM-erlangのビルドをしますが、Erlang/OTP 18からいろいろと変わったらしく、そのままではビルドできません。
修正したものを用意したので、フォークしたリポジトリからソースコードをダウンロードしてください、

後はコマンドでmakeすればebinフォルダにbeamファイルが生成されます。


サンプルを実行するには、exampleフォルダに移動後、以下のコマンドを実行してください。


$ erl -pa ../ebin
1> openrtm_erl:start(0,[]).
2> run_sample:run().


と言ってはみたものの、これが正しい使い方かは不明です。


これでTicker0.rtcとPrinter0.rtcが通信を開始しますが、ログメッセージが大量に表示されるためよく分かりません。
ログレベルを起動時に変更する方法は分からないので、defaults.erlのrtl_paranoidの部分をrtl_silentに変更するなどして対処してください。


RT System Editorからアクティブ化をしようとしたのですが、何故か失敗しています。





確かにErlangは使ってみると面白いプログラミング言語ではあるのですが、言語仕様が気に食わないというか、コードの記述方法が気持ち悪いです。
関数の途中に「,」が入ったり、関数の最後が「.」だったりと、なかなか馴染めそうにありません。
というか、関数でアロー演算子->を使う言語は嫌いです。MoonScriptも嫌いです。
アロー演算子ではなくて、全角の→を使えと思います。それはさすがに嘘ですけど。

標準でCORBAやFSMのライブラリが入っている言語って、Erlangだけなんだろうなあ。



(追記)
UbuntuでErlang/OTP 20を使って動作確認したのですが特に問題はなかったため、Windows上で動作させることが問題のようです。Erlang/OTPのバージョンは関係ありませんでした。





にほんブログ村 科学ブログ ロボットへ
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・

人気ブログランキングへ
今回はあの超人気プログラミング言語MoonScriptでRTCを作成します。

とは言ってみたものの、おそらくほとんどの人は知らないと思うので軽く説明します。

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等のツールは作りやすくなりそうです。











にほんブログ村 科学ブログ ロボットへ
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・

人気ブログランキングへ
OpenRTM Lua版 ver.0.2をリリースしました。
RTCのコーディング方法について変更したため、0.1で動作していたRTCは動作できなくなりましたが、特に影響はなさそうなので気にしないようにします。
RTC BuilderでLuaのコードも出せるようになるはずでしたが、OpenRTM-aist 1.2が何故かまだリリースされていないため、1からコードを書くしかありません。

実行時間、起動時間等について実験してみましたが、Luaの場合は地味に起動が遅いです。
ちなみにマスターマネージャが未起動の状態だとさらに遅くなります。

LuaRocksへの対応したため、インストールは簡単になったはずです。





RTMかROSのどちらを使うべきか、比較してどうか、という話はごく稀に聞きますが、はっきり言ってロボット屋さんだったらROSを使ったほうがいいです。
モジュールの数が桁違いですし、Linuxを使うというハードルが超えられるかが問題です。
僕みたいにLinuxが宗教的な理由で使えないとか、あるいは規格化したものでないと使えないとかであれば、RTMを使うのも選択肢に入るかもしれません。


ロボット用ミドルウェアとしてRTMがROSをユーザー数で上回るのは今更無謀だろうし、ロボット屋さん以外がロボット関連技術を使えるようにする方向のほうが正しいかもしれません。

過去にはメディアアートやゲームにRTMを活用する試みもありましたが、あれは方向性は正しかったと思います。

というわけで、OpenRTM Lua版もLÖVEやAviUtlのようなロボットとは関係ないようなソフトウェアに組み込んで使ってみたサンプルを増やす方向で考えたいと思います。



ただ、何もなければver.0.3は8月ぐらいまではリリースしないので、しばらく更新は滞ります。






にほんブログ村 科学ブログ ロボットへ
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・

人気ブログランキングへ
OpenRTM Lua版は見てわかる通りファイル一式で2MB程度のサイズです。
あとはテキストエディタがあればLuaのRTCを開発可能なため、OpenRTM-aistのインストーラーが900MBもあることを考えると非常に軽量です。

後はツールがあればいいのですが、GUIのツールはどうしても容量が必要なので難しいかもしれません。
RTC Builder on the WEBが使えればいいけど、当然Luaのコードなんか出してくれないし。

最大の問題はRT System Editorですが、自分の環境で開発するのであればRT System Editor on the WEBを使うのは微妙です。
だれかLua版rtshellを作ってくれたら、コンテストで賞あげます。





とりあえずRTC BuilderでLuaソースコードを出力するプラグインを作成したので、自分でRTC Builderのプラグインのビルドができる人は試してみてください。
onExecute関数の前とかに謎のスペースが入っていますが、これは今のところ解決手段がないです。
テンプレートのファイルに${def}と書くとdefと表示されるのですが、${function}と書いてもfunctionとは表示されません。これはRTCBuilder本体のTemplateUtil.javaというソースコード内に処理を記述しているので、プラグイン側ではどうしようもありません。





あとLuaRocksに対応したので、以下のようにコマンドでインストールできるようになりました。


git clone https://github.com/Nobu19800/RTM-Lua.git
cd RTM-Lua
sudo luarocks --local make




OpenRTM Lua版のバージョン0.2を3月中にリリースする予定でしたが、まだロガー機能の実装が残っています。遅れても誰も気にしないと思うので、他のことを優先します。




とりあえず、2か月ぐらい前に追加したOpenRTM Lua版のデモ動画を載せ忘れていたので載せておきます。











にほんブログ村 科学ブログ ロボットへ
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・

人気ブログランキングへ
次のページ >>
カレンダー
03 2018/04 05
S M T W T F S
1 2 3 4 5 6 7
9 10 12 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
フリーエリア
最新CM
[08/24 Nobu]
[08/24 puku]
[08/22 Nobu]
[08/22 puku]
[04/17 Nobu]
プロフィール
HN:
Nobu
年齢:
29
性別:
男性
誕生日:
1988/09/22
職業:
あれ
趣味:
妄想、自堕落
バーコード
ブログ内検索
P R
カウンター
忍者ブログ [PR]