忍者ブログ
ロボット、千葉ロッテマリーンズについていいかげんなことを書きます。
[1]  [2]  [3]  [4]  [5]  [6
ロボット用ミドルウェアとは一般的にはロボットのソフトウェアをモジュールに分割し、ソフトウェアモジュールを組み合わせてシステムを開発するためのフレームワーク、通信ライブラリのことを指します。
あるいはロボットのソフトウェア開発に有用なライブラリ群を指すこともあります。



ロボット用ミドルウェアのようなものが出てきたのは90年代前半にSPACEが出てきたあたりだろうけど、そんな昔のことは詳しく知りません。ちなみにSPACEはONC RPCによるリモート呼び出しによりモジュール間の連携を行っていたのでほとんど現在のロボット用ミドルウェアと仕組みは同じです。

ロボット用ミドルウェアと名乗るものが出始めたのが2000年前後にMCA、SmartSoft、OROCOS、Orca、ORiN、Player、RTミドルウェア、MIRO等がどこからともなく湧いてきたごろだろうと思いますが、そんな昔のことは知りません。

ちなみにOpen Robot Controller Architectureの略のORCAとシャチの学名から付けられているOrcaは別物です。一般的に知られているのは後者の方です。


2000年代半ばになるとMRDS、ROS、ASEBA、YARP、RSNP、ERSP、MARIE等の怪しい実装がわらわら出てきました。

MRDSはVPLによるビジュアルプログラミングができ、解説書も出ていたのでそれなりに知名度があったと思います。
ROSはPR2ベータプログラム等で普及活動に重点を置いていたような印象です。
RTMはOMG標準規格を取ることに力を入れていた感じです。


それでどうなったかというとROS以外消えました。
MRDSはMicrosoftがやる気をなくしたのかどうか知りませんが、まあ.NETの言語やVPLでロボットを開発する人なんてほとんどいないだろうし、プログラミング教材として残るという道はあったかもしれないけどそれもありませんでした。
RTMについては標準規格を持っていて勝てるならCORBAは大人気のはずだし、PythonよりもRubyの方が人気があるはずです。RTMは次世代ロボット知能化技術開発プロジェクトでいろいろ作っていたのに全部捨てたのがちょっともったいなかった感じです。
ロボット用ミドルウェアを使いたくて使う人はほぼいません。Moveit!等のツールを使うために仕方なくROSを使うというのが普通です。


2010年以降もCCA、MIRA、ISCSP等の胡散臭い実装が登場してはROSに蹴散らされてるか、もしくはだれにも認識されずに消えています。ISCSPなんて数人しか知らないと思う。
ROS2もROSに蹴散らされる予定です。まあ小さい業界の話だし、普及しているといってもそれなりですが。


上記のロボット用ミドルウェア対応のモジュールは大抵オープンソースで公開されていますが、今後はクローズドソース、シェアウェアも利用する方向になるのか。でもROSの方針とは違うのでそうならないかもしれません。
これからもオープンソースだけでやっていくとなるとどうやって収益化するのかということですが、それは散々問題視されているから簡単ではないのでしょう。JR北海道を黒字化させる方が簡単な気がする。つまりほぼ不可能という事。

考えられる方法としては、顧客の要求しているシステムをオープンソースから構築するシステムインテグレートで儲けるという手はあるかもしれません。
そのオープンソースの品質をだれが保証するんだという問題もあるかもしれないので、「ROSに何かあったら俺が責任を取る」とか言ってサポート料金を取るという手はあるかもしれません。
もしくはROS等で制御するハードウェアを売って儲けるという手段はあり、実際そういう商売をしている人はいますが、オープンソースがどの程度収益に影響しているかは不明です。


というわけで、現在はロボット用ミドルウェア(主にROS)を使ってどう収益化するかという方向に向かっており、概ね失敗しています。
個人的にはオープンソースから脱却したほうがいいと思う。








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

人気ブログランキングへ
PR
プラットフォーム、フレームワーク、ミドルウェア、ライブラリについて用語の意味の違いが分かりづらいのでメモしておきます。間違っていたらコメントで指摘してください。
  • プラットフォーム
プラットフォームは日本語では「基盤」という意味ですが、基盤となる装置やソフトウェアのことを指すようです。具体的にはWindows、Linux、Java VM、Lua VMなどが該当します。
ロボット界隈では「プラットフォームロボット」という用語を使いますが、これは新規機能の開発、追加が可能な基盤となるロボットのことを指します。
  • フレームワーク
フレームワークは日本語では「枠組み」であり、ソフトウェアフレームワークはソフトウェアをある枠組みで開発、実行するための機能や実装などを指します。
具体的にはRuby on Rails、OpenRestyなどが該当します。
ただ、ソフトウェアフレームワークはユーザーの作成したアプリケーションの機能をフレームワーク側のメインループから呼び出す「制御の反転」の構造になっている必要があります。
論文などでROSはフレームワークであると書いてあるものがありますが、これは厳密には間違いという事になります。
OpenRTM-aistやChoreonoidはフレームワークに該当します。

Lua VMがプラットフォーム、OpenRestyがフレームワークという事です。多分。
.NET Frameworkはフレームワークで、その実行環境のCLRがプラットフォームという事になります。
  • ミドルウェア
OSとアプリケーションの中間に位置するソフトウェアです。
というか、ほとんどの場合はアプリケーション、OS以外のソフトウェアのことを指します。
具体的にはOpenCV、OpenGLなどが該当します。
Java VMやLua VM等のプログラミング言語の実行環境も該当します。

ただし、ミドルウェアはその名の通りOSとアプリケーションの中間に位置するソフトウェアのため、OSが無い環境のライブラリはミドルウェアには該当しません。例えばArduino用のライブラリはミドルウェアではありません。
  • ライブラリ
ソフトウェアの機能を再利用可能な形でまとめたものです。
フレームワークの場合はフレームワークが主となりますが、ライブラリはアプリケーションに機能を提供するだけのため、アプリケーションが主になります。


適当にソフトウェアを分類すると以下のような感じだろう。


ソフトウェアの分類プラットフォームフレームワークミドルウェアライブラリ
OpenRTM-aist
omniORB
Qt
ROS
Choreonoid
ODE
OpenCV
Lua VM
VMWare
所々どこに分類すればいいのか分からないものもあります。
まずOpenRTM-aistはスタンドアロンRTCとして起動すればライブラリ、RTCDで起動すればフレームワークに該当しそうなので仕分けが難しいです。
これがLove2Dのようにアプリケーションのみの提供であればライブラリには該当しません。

QtはQt Creatorを使えばフォームに追加したウィジェットから直接スロット関数をいじることでフレームワーク的な使い方ができるので、フレームワークでもあると言えます。

Luaは単体で実行したらただのプラットフォーム、組み込んで実行すればミドルウェアでもあるということになります。組み込む側からすればライブラリのようにも見えます。

というわけでライブラリ、フレームワーク、プラットフォームを図で表すと以下のような感じになりますが、プラットフォームの定義がよく分からないので間違っているかもしれません。





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);









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








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

人気ブログランキングへ
4000円で買えるロボットアームがあるらしいです。
もう入門用ならこれでいいのではないですかね?

安いのはいいのですけど、一体どこが開発した製品なのかが謎です。

マニュアルやサンプルプログラムはあるのかないのかも不明です。
この値段なのでホビー用途なのでしょうけど、おそらくこの製品単体では動作できないので誰向けなのかが不明です。
対象年齢8才以上になっていますが、8才ではちょっと厳しいかもしれないです。
製品が手元にないのでよく分かりませんけど。







ものすごく今更ですが、OpenRTM-aistのbeginnersのメーリングリストに投稿されても僕のところにはメールが来ないのですが、ひょっとしてusersとは別に登録する必要があるのでしょうか?
いやでもbegginnersは登録するページがないように見えます。

よく分かりませんが既に登録している人は返信してあげてください。
トピックの一覧をパッと見た感じですが、2~3週間放置されることはざらにあるみたいです。
ならusersの方に送ればすぐに返信が来るとは思うのですけどね。どうせこっちもたまにしかメールは来ないのだから。

あの質問はrtshellを使うか、あるいはこのサイトこのサイトを参考にしてプログラムを書くか、それかwasanbon等のツールを使うかという方法があると思います。
いやでもrtshellは内部でRTCを操作するプログラムを書いていて、ツール等では内部でrtshellやrtctreeを使っているので結局同じなのですけどね。




複合コンポーネント作成支援ツールのインストーラーを作成しました。
マニュアルのリンクからダウンロードできます。

別にこのツールでもRTCの起動とRTシステムの復元を自動化する事はできるので使ってほしいのですが、動作確認が不十分なので初心者にはお勧めしません。
誰か犠牲動作確認してください。










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

人気ブログランキングへ
・・・どうも,お久しぶりです.

更新しようという気はあったのですが,どうにもネタがなくて滞りまくりでした.

サボってる間にOpenRTM-aist-1.1.0-RC2がリリースされたので,一応宣伝しときます.

レビューしたいところですが,C++版はだれかやりそうなので,Python版がリリースされたらやります.本当か?



それはさておき,さすがに放置しっぱなしはまずいので,単発企画ですが劣駆動ロボットの制御シミュレーションをやります.

単発企画なので,今回は車の制御や劣駆動マニピュレータの制御を飛ばして,蛇型ロボットの制御をやります.

・・・・とは言っても,非線形制御入門―劣駆動ロボットの技能制御論を参考にしたので,この記事読まずにこの本を読んだ方が良いです.

まず,劣駆動マニピュレータとは,


968dd74b.gif












こんな感じに,非駆動関節のあるマニピュレータのことを言うと思います.
ちなみに,根元が非駆動です.

一方,蛇型ロボットは,
snake.gif











上の劣駆動マニピュレータに,非駆動の並進関節を追加すれば良いことになります.
すなわち,これは劣駆動と言えるかと思います.


今回は以下のような6リンクの蛇型ロボットを制御します.
1リンク目以降は面倒くさいので以下略で.

snake3.gif












受動車輪までの長さをlgとすると,各リンクの受動車輪の位置,速度は,

siki1.GIF










こうなります.
クリックで拡大します.


また,受動車輪は横滑りしないとします.
そんな環境や機構が存在するかは別にして.


受動車輪の車軸方向のベクトルは,
siki2.GIF




となります.
受動車輪が横滑りしないとき速度ベクトルの車軸方向に0となるはずなので,

siki3.GIF

となる.
この式をまとめると,

siki4.gif



となります.

この式を,
siki5.GIF






各関節角速度dψと,絶対角の角速度dθの関係式は,
siki6.GIF







となるので,

siki7.GIF




と,dψをロボットの入力とすれば先端速度dwを制御できます.

まあ,本当だったら動力学モデルに基づいてなんやかんややるべきでしょうけど,面倒くさいのでdwには目標位置との偏差を入れます.

関節はトルク制御ではなく,速度制御をします.

・・・・・・制御できてない可能性が大なので,間違えても今回のプログラムを研究の参考にしないようにしてください.

今回のプログラムのソースはここからダウンロード出来ます.

プログラムの実行には,PyOpenGL,numpy,pyODEが必要です.


動画も作ってみました.




奥の黒い棒みたいなのが目標位置です.


やっぱり,あんまり参考にはしない方がいいかも.

次回は車両の制御を・・・・する気分ではいます.










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

人気ブログランキングへ

カレンダー
04 2020/05 06
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
フリーエリア
最新CM
[05/21 激安ブランドのオーデマピゲ腕時計]
[12/11 Nobu]
[12/11 Kanamura]
[08/24 Nobu]
[08/24 puku]
プロフィール
HN:
Nobu
年齢:
31
性別:
男性
誕生日:
1988/09/22
職業:
あれ
趣味:
妄想、自堕落
バーコード
ブログ内検索
P R
カウンター
忍者ブログ [PR]