December 29, 2009

ROSとRTミドルウェアの比較

1.はじめに

 ロボット用のOSと銘打った,『ROS』というプロジェクトが発表されました.学会や展示会などでの露出も大きく,日本のロボット界には衝撃が広がっています.というのも,我が国には以前から,複雑なロボットシステムを組み上げるためのプラットフォームを開発する,『RTミドルウェア』というプロジェクトが存在するからです.
 先日,ROSをざっくり理解するために,主要なページとチュートリアルのページについて翻訳しました.この過程で私が理解した,ROSとRTミドルウェアについて比較してみようと思います.なお,私はROSもRTミドルウェアも,まだ”実際の開発で使ったことはない”ので,アプリケーションの仕組みといった,仕様書で確認できるところまでの比較となっております.あらかじめご了承ください.
 RTミドルウェアについては,急いで調べたので間違いがある可能性もあります.その際はコメント等でご指摘・ご教授よろしくお願い致します.


0.目次

 1.はじめに
 2.ROSの紹介
 3.RTミドルウェアの紹介
 4.比較
  4.1 動作環境について
  4.2 システムの構成単位(モジュール)について
  4.3 モジュール間の連携について
  4.4 サードパーティ製モジュールについて
  4.5 開発ツールについて
  4.6 ライセンスについて
 5.おわりに
 6.参考文献

2.ROSの紹介

 ROS(ロス)とは,Willow Garage社が中心となって開発しているロボット用のツールキットです.LinuxなどのOSに,ROS固有のツールをインストールして使用します.VxWorks等のようにカーネルレベルから提供しているわけではないので,これを”OS”と呼ぶのは個人的に抵抗があります.ハードウェア抽象化や低レベルデバイス制御・よく使われる組み込み関数・プロセス間通信・パッケージ管理といった機能がROSによって提供されます(ROS.org).ROSについての講義が,アメリカのスタンフォード・テキサスや,ベルギー,シンガポールの大学で計画されています.
 ROSを語るときに外せないのが,Willow Garage社の特殊性です.WG社はeGroups(現Yohoo Groups)を立ち上げ,現在はそこから離れてWG社の創設者となっているScott Hassanによって設立された(WillowGarage),非軍事の科学技術で社会へ貢献することを社是とする,アメリカでは非常に珍しいロボット会社です(WillowGarage).WG社はScottの個人資金により,無期限に60人からなる研究所を維持できるだけの財源を持つらしい(GetRobo)です.なお,WG社にはコンピュータビジョン向けのライブラリとしてグローバルスタンダードなOpenCVの開発者Gary Bradski(Intel在籍時に開発をスタート)が在籍していて,現在のOpenCVの開発・サポートはWG社が行っています.RTミドルウェアでも,カメラの画像処理をやるときは普通OpenCVを使います(aist).ROSはOpenCVとのシームレスな統合を利点の一つとして挙げています.これが,ロボットの人がROSを脅威と見る点の一つです.
 ただし,これは私個人の見解ですが,OpenCVはROSより開発の歴史も長く,ユーザ数も桁違いに大きいオープンソース・プロジェクトです.そのため,OpenCVがROSに対して優先的に歩み寄ることはないかと思います.OpenCVはROSだけでなく,その他の多くのプロジェクトに対しても親和性の高いプロジェクトであることを目指し続けるでしょう.だってオープンソースってそういうもんです.


3.RTミドルウェアの紹介

 RT ミドルウェアとは,産総研が開発中の様々なロボット要素(RTコンポーネント)を通信ネットワークを介して自由に組み合わせられるようにするためのプラットフォームです.ロボットシステムはハードウェアに依存して設計されるため,通常のソフトウェア開発と比べて作成したソフトウェアの再利用性が低く,開発効率が悪いと行った問題がありました.ロボットの技術要素をソフトウェアレベルでモジュール化し再利用性を高めることで,その問題を解決しようというというのがRTミドルウェアの目的です.
 RTミドルウェアは日本のロボット技術の基盤として期待されており,経産省の技術戦略ロードマップでも,ロボット分野の中核的な位置づけとなっています.ただし,RTミドルウェアで開発を効率化するためには,ある程度の種類と数が揃ったモジュール(RTコンポーネント)が必要ですが,現時点ではそれらが揃っているとは言い難く,RTミドルウェアを実際の開発で使用するメリットはありませんでした.その状況を改善するために, 2007年度より「次世代ロボット知能化技術開発プロジェクト(知能化プロ)」という経産省の事業がスタートし,約60の企業や大学・公的研究機関が様々なモジュール(RTコンポーネント)を開発しています(ロボナブル)先日のSI2009でも,RTミドルウェアコンテストが開かれたり,「RTシステムとオープン化」の名前のセクションが大きな時間を取ったりと,活発に人とお金が動いています.
 でも,この”活発”という言葉は,ROSと比べると明らかに見劣りするんですよね.オープンソースのROSは,開発Wikiが毎日5・6ページが更新されるし,メーリングリストにも毎日10件くらいメールが来てて,その全部に即刻レスポンスがつきます.要するに,ハデ.明らかに今一番ホットなロボット技術です.5月に東京大学稲葉研で行われたWillow Garageのセミナーには,定員250くらい?の教室に立ち見が出るほど(おそらく300は来てた)盛況でした(Robot Watch).それに比べてRTミドルウェアは,たまに産総研からプレスリリースがある他は,学会とかでまとまった発表があるのみです.スピード感・ホット感が違う.お金が流動しているということは非常に良いことなんですけどね.

4.比較

 以下では,ROSとRTミドルウェアとMicrosoft Robotics Studioについて,いくつかの特徴ある点をピックアップして比較します.なお,比較するのは仕様書の動作範囲内とします.「仕様書には書いてないけど,こんな使い方もできるよ」というのは,今回は除外です.

4.1 動作環境について

 各システムが動作する環境を以下に示します.
Table 1: Environment
ROSRT - MiddlewareMicrosoft
Robotics
Studio
Linux×
Windows*3
Mac OS X*1*4×
VxWorks××*2×

*1: ROSのMac OS Xへの実装は実験段階
*2: RT - MiddlewareのVxWorksへの実装は検討段階
*3: Windowsでは,Pythonで記述されたコードの一部が動く
 10/01/08 追記apt-cygを使うことで,Cygwin上でROSは動作します
*4: 公式ではない

 動作環境についてはRTミドルウェアの勝ちですかね.「Windowsなんて信頼性・安定性が必要なロボットシステムで使われてるの?」という疑問を持つ方もいらっしゃるでしょうが,その答えはイエスです.実は世の中のかなりのロボットシステムは,中身がWindowsだったりします.情報が多く対応デバイスも多いので,開発がその他のOSに比べて圧倒的に楽ですから.他にも,実験段階(プロトタイピング段階)はWindowsで開発して,最終的には他の信頼性の高い/扱い易いOSのバージョンをリリースするといったことも,よくやられます.
 RTミドルウェアは他にもμITRONでも動作するらしいですが,TRON系列は今後Androidとの熾烈な生存競争が待っているものと思われるので,今回の表からは除外しました.
 ROSは今後もWindowsへの対応は難しいと思われます.だいたい,作ってる人たちにWindowsへの興味がなさそうです.
 Microsoft Robotics Studioを持ってきたのは,ネタ以外の何者でもありません.Windowsで動作するということは,とても大きなアドバンテージですが,Windowsでしか動作しないというのは・・.

4.2 システムの構成単位(モジュール)について

 ロボットシステムというものは,たいてい様々な機能を複雑に組み合わせてシステムを構成します.このシステムの構成単位(ここでは”モジュール”という言葉を使うことにします)によって,システムの概念設計がどのレベルまで可能なのかが変わってきます.

ROS : パッケージ
 ・ROSのランタイム プロセス(ノード)
 ・ROS依存ライブラリ
 ・環境設定ファイル
 ・その他のツール
 ROSのコードは,ROSを使用しないコードと形式はほとんど変わりません.main関数に直接処理を記述します.クラスである必要もありません.ROSモジュールの記述例を見てみましょう.
#include <ros/ros.h>
#include <std_msgs/String.h>
#include <sstream>
int main(int argc, char** argv)
{
  ros::init(argc, argv, "talker");
  ros::NodeHandle n;
  ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 100);
  ros::Rate loop_rate(5);
  int count = 0;
  while (ros::ok())  {
	std::stringstream ss;    ss << "Hello there! This is message [" << count << "]";
	std_msgs::String msg;
	msg.data = ss.str();
	chatter_pub.publish(msg);
	ROS_INFO("I published [%s]", ss.str().c_str());
	ros::spinOnce();
	loop_rate.sleep();
	++count;
  }
}
ROS.orgより

RTミドルウェア : RTコンポーネント
 ・ロボットの機能要素
 RTコンポーネントは作成される全てのコードがRTコンポーネントアーキテクチャを満たすように,クラスを継承することで作成されます.RTコンポーネントの動作は,onExecuteやonAbortingといった,予め規定された関数内に記述します.実際の記述例を見てみましょう.
#include <iostream>
#include <string>
#include <stdlib.h>
#include <rtm/Manager.h>
#include <rtm/DataFlowComponentBase.h>
#include <rtm/CorbaPort.h>
#include <rtm/DataInPort.h>
#include <rtm/DataOutPort.h>
#include <rtm/idl/BasicDataTypeSkel.h>

using namespace RTC;

class Sample
  : public DataFlowComponentBase
{
 public:
  Sample(Manager* manager)
  : DataFlowComponentBase(manager),
    m_outOut("out", m_out)
  {
  }
  ~Sample()
  {
  }

  virtual ReturnCode_t onInitialize()
  {
    registerOutPort("out", m_outOut);
    return RTC::RTC_OK;
  }
  virtual ReturnCode_t onExecute(UniqueId ec_id)
  {
    std::cin >> m_out.data;
    m_outOut.write();
    return RTC::RTC_OK;
  }

 protected:
  TimedLong m_out;
  OutPort<TimedLong> m_outOut;
};

static const char* Sample_spec[] =
  {
    "implementation_id", "Sample",
    "type_name",         "Sample",
    "description",       "Sample component",
    "version",           "1.0",
    "vendor",            "robotrope",
    "category",          "example",
    "activity_type",     "DataFlowComponent",
    "max_instance",      "10",
    "language",          "C++",
    "lang_type",         "compile",
    ""
  };

int main (int argc, char** argv)
{
  Manager* manager;
  manager->init(argc, argv);
  Properties profile(Sample_spec);
  manager->registerFactory(profile, Create<Sample>, Delete<Sample>);

  RtcBase* comp = manager->createComponent("Sample");
  manager->activateManager();
  manager->runManager();

  return 0;
}
ロボット系プログラマの日記より

 ROSに比べてコード量が多いように見えますが,RTミドルウェアはGUIで自動的にコードを生成できるため,このコードでユーザが手打ちでコードを書かなければならない部分はほんの一部です.詳しくは開発ツールについての項目をお読みください.

 ROSとRTミドルウェアの構成単位は実質同じです.
 各モジュールは別々のプロセスとして動作します.そのため,重い処理をするモジュール1つのせいでシステム全体が停止してしまったり,死んだモジュールが出た場合にもシステムを稼動し続けられるなど信頼性が向上します.また,最近のCPUはマルチコアで複数のプロセスを並列実行できるようになっているのですが,プロセスやスレッドの複雑な構成を考えずとも,モジュールを分けておくことでCPUリソースを有効に使い切ることができます.各モジュールは独立しているので,C++やPythonといった別々の言語で作成することができるということも利点の1つでしょうか.ただし,メモリの消費は激しくなります.
 プロセスを分けることで,各モジュールはOS上の別々のユーザ空間で動作するため,モジュール間の通信が単純にはできなくなります.それを解決するための仕組みがROSやRTミドルウェアには実装されています.次の項に進みましょう.

4.3 モジュール間の連携について

ROS : トピックサービス
ROS_basic_concepts
Fig 1: ROS communication model
copyright ROS.org
 ROSの場合,各モジュールはずっと勝手にしゃべっています.モジュールはしゃべっている内容に”トピック”という新聞の見出しのようなものをつけて配信しており,その他のモジュールはトピックから,その内容が必要だと判断したら購読するといったモデルです.例を出すと,各モジュールは「経済」や「政治」といった見出しをつけた新聞を配信していて,他のモジュールが「経済」の内容に興味をもった場合に,選択して購読するといったものです.
 その他に,単発のリクエストに対してリプライを返すことができる,”サービス”という仕組みもあります.これは,例えば「現在の座標を送れ」みたいな使い方ができますね.

RTミドルウェア : データポートとサービスポート
RTM_ConnectPort
Fig 2: RT-Middleware communication model
copyright AIST
 RTミドルウェアの場合,入力と出力を完全に別のものとして考えます.データポートとサービスポートは,通信できる内容が規定された型なのかユーザが自由に決められる型なのかの違いだけで,通信方式の違いなどはないです.ROSのトピック方式との違いは,ROSは購読するデータを,データ自体の見出し(トピック)で指定するのに対し,RTミドルウェアは出力しているモジュールで指定することです.

 通信方式については,ROSのほうが柔軟に組めるんでしょうかね?RTミドルウェアにはROSのサービスのような仕組みはないんでしょうか?

4.4 サードパーティ製モジュールについて

ROS : リポジトリ
 ROSで新規にモジュールを作ったら,コミュニティに連絡すればリポジトリの場所を与えられて,モジュールの管理者になることができます.これはROSプロジェクトが,ROSに関わる全てのコードを一括して管理しておく方針を取っているからです.このおかげで,一般のユーザはモジュールの置き場所を気にすることなく様々なモジュールを使用することができます.さらに,モジュールごとに必要となる,他のモジュールやアプリケーションなどと言った依存関係を自動的に解決してくれる仕組みを備えています(例えば,数値計算にOctaveを使用するモジュールは,そのビルド時に自動的にOctaveを取得してインストールする).Linuxのディストリビューションごとのパッケージ・マネージャの仕組みをイメージしてもらえばいいと思います.ちなみに,モジュールの登録に審査などはありません(ROS.org).

RTミドルウェア : 産総研内のコンポーネント紹介のページ 他はバラバラ
 RTミドルウェアのコンポーネントは全然まとまってないです.産総研の公式ページに少しだけある以外は,個人のページにいくつかまとまっているだけでしょうか(ysuga.net).

 ROSのサードバーティ製モジュールの管理方法は,さすがオープンソースプロジェクトに精通した人の構築したシステムだと思います.オープンソースのプロジェクトは,GUIや物理計算などに部分的に他のプロジェクトの成果物を取り込むことも多いのですが,その導入の困難さでユーザを逃がしてしまうこともあると思います.ROSの一括管理の方式はそのような煩わしさを一掃してくれます.さすが,コミュニティの醸成に最新の注意を払っているプロジェクトだと思います.
 RTミドルウェアとROSのサードパーティ製のモジュールの数は,現在はほとんど大差ないと思います.ただ,ROSのほうが情報がまとめられていて,その更新頻度も高いので,「今,何があって何がなくて,何が作られようとしているのか」が一目で見渡せます.コミュニティの手綱の取り方はROSが一枚も二枚も上手ですね.

4.5 開発ツールについて

 開発ツールは大事です.どんなに切れ味の良い包丁でも,柄が握りにくければ誰も使わないでしょう.

ROS : 基本的に全部コード手打ち
 ROSの全てはコードで成り立っています.ROSの基本的なコマンドの一つ「rosed」は「ROS + edit」の略ですが,立ち上がるのはデフォルトで vim です.

RTミドルウェア : RTCBuilderRTSystemEditor
RTM_InitialOfEclipseStart_1
Fig 3: RTSystemEditor
 RTミドルウェアの開発のためにEclipseのアドインが無償で提供されており,これを使用することができます.RTコンポーネントの作成にはRTCBuilder.RTコンポーネントを組み合わせたシステムの構築にはRTSystemEditorを使用します.
RTM_RTCBuilder
Fig 4: RTCBuilder
 RTCBuilderは,ヒントに従ってモジュールの属性を入力していくだけで,コードの基本的な骨組みを生成してくれるという,とても強力な開発支援機能です.説明を読んでみると,どうやら一度生成した後の属性の再編集にも対応している?(マージ機能)みたいです.
 RTSystemEditorで,RTCBuilderで作成したモジュールや,サードパーティから提供されたモジュールを組み合わせることができます.組み合わせの可否やデータの流れが一目で分かるので,初心者でもすぐに使いこなすことができるでしょう.しかも,このモジュール同士の接続・接続断・再接続は,システムの稼働中にも行うことができます.あと忘れてはいけないポイントとして,システム全体の挙動を一枚の紙面上で表せるということが挙げられます.この機能はディスカッション時や学会での発表時に特に重宝します.

 開発ツールの利便性はRTミドルウェアの圧勝でしょう.エンドユーザの利用を意識した機能と言えるでしょう.GUIが発達しているのは,システムの部品としてのモジュールの設計が堅牢だからでしょう.RTミドルウェアの場合,全てのモジュールがRTコンポーネント・アーキテクチャを満たすように,全てのモジュールは基本クラスを継承することを義務づけられています.ROSの場合はモジュール開発者の自由度を広くとるために,このような基本クラス継承の形にはしませんでした.そのためモジュールの形式が定まらず,RTミドルウェアのようなGUIを作ることは難しいと思われます.
 ちなみに,ROSにはシステム全体のデータの流れを見通す rxgraph というコマンドが存在しますが,rxgraph で表示されるモジュールの接続図は,RTミドルウェアのように編集することはできません.

4.6 ライセンスについて

ROS : モジュールの作成者ごとに決められる
 現在はBSDライセンスが多くて,たまにLGPLのモジュールがあるようです.

10/01/23 追記
 ROSのコア部分のコードはBSDライセンスで配布されていて,これは今後も守り続けられるらしいです.LGPLライセンスのアプリケーションをROSのコア部分に入れる提案があった際に,Kenさんが言ってました
 懸念していた,巷で”GPL汚染”と呼ばれるようなことは大丈夫そうです.

RTミドルウェア : LGPL(GNU Lesser General Public License) および産総研と個別に契約するライセンスのデュアルライセンス方式
 正確にはRTミドルウェアは規格の名前でアプリケーションの名前ではないのですが,ここではRTミドルウェアの本家である産総研の OpenRTM-aist のライセンスを出します.

 ROSの場合,モジュールの導入に必要なアプリケーションを自動的に組込んでしまうので,使う人が気をつけないと,ライセンスが競合してあわわ・・といったことにもなりそうです.

5.おわりに

 今回ROSとRTミドルウェアについて比較して,この2つがとてもよく似ていることが分かりました.目指しているものが両方とも「ロボットに使用されるソフトウェアの再利用」というところで一致しているからでしょうか.この記事は「どちらがいい」という比較をするつもりは最初からなかったのですが,「どの場面でどちらが向く」といった指針すら示すことができずに終わりそうです.
 最後に,ROSとRTミドルウェアについての興味深いWeb資料を作成して下さった皆さまに感謝致します.また,ここまで長い記事を読んでくださった読者の方にも感謝致します.

 ここまで読んでくださった皆さまには既にご理解のことと思いますが,この赤枠の中は,私が毒を吐くスペースとなっております.これらの部分を読み飛ばせば,きっと公平な記事となっているでしょう.
 さて,ROSとRTミドルウェア.バックで推している機関について考えてみると,これもまた面白い(今のところ当事者じゃないから・・).ROSのバックはIT長者.対するRTミドルウェアのバックは独法(独立行政法人)です.これが片方株式会社とかだったら,速攻で片方が片方を買収してたでしょう.どちらも金で潰すことはちょっと難しい.ただ,ROSについては,ある程度大きくしてからGoogleやらYahooやらに買収してもらうという計画が存在する可能性はあると思います.だって創業者が創業者だし.
 ROS側の戦略としては,RTミドルウェア側の知名度が日本以外でほとんどないことを利用して,今のうちに日本以外で大量のユーザを会得しておこうというものです.だってROSの人たち,この前産総研に見学に行ってたらしいし.RTミドルウェアとROSがとてもよく似ていることは知ってるはず.それなのにROSの公式WebページでRTミドルウェアについて全く触れられてないのは・・.
 これに対してRTミドルウェアの取るべき対策として,産総研がROS内にaistっていうリポジトリを作っちゃうのがいいと思うよ.ROSは柔軟なシステムなので,ROSでRTミドルウェアを構成することは十分可能だと思う.これが実現すれば,ROSは苦手なWindows対応とGUI部分と国際規格を手に入れることができて,RTミドルウェアは名前と規格を残しながら,多くの強力な開発者を手に入れることができる.Win-Winじゃん.
 あと,RTミドルウェアは予算がついてるうちに,さっさと有用そうなモジュールを買いあさるべき.『OpenRTM-macports』とか,『Pattern Weaver for RT-Middleware』とか.あれを一般ユーザが自由に使用できるように開放できたら,RTミドルウェアは変われると思う.前から思ってたんだけど,RTミドルウェアのシステム図,あの緑と青の四角が接続されている図は,慣れている人ならいいんだろうけど,知らない人は全然分かんない.例えば,センサのモジュールならセンサの,ニューラルネットのモジュールならネットワークの図にするか,できるようにして欲しい.強力なGUIは他のシステム開発ツールにほとんどない利点なんだから,そこは伸ばすべき.RTミドルウェアコンテストとか小っさい大会開いても意味ないっしょ.10万円じゃ誰も動かんし,その程度のモジュールなんか誰も必要としてないっしょ.あーでも,産総研って一応半分公的機関だから,数百万規模で特定企業から物品を購入するのって問題あるのかな?競争入札??めんどいねー.その程度の買収はROSならすぐにやっちゃうだろうけどね.

6.参考文献

 ROS.org : http://www.ros.org/
 ウィローガレージ : http://jp.willowgarage.com/
 RTミドルウェア : http://www.is.aist.go.jp/rt/OpenRTM-aist/html/
 RTミドルウェア入門:http://www.ysuga.net/robot/rtm/practice/index.html
 GetRobo Blog:http://www.getrobo.com/getrobo_blog/
 ロボナブル:http://www.robonable.jp/
 Robot Watch:http://robot.watch.impress.co.jp/
 ロボット系プログラマの日記:http://d.hatena.ne.jp/robotrope/



 この記事についてのご意見・ご感想をコメント・メール等でお寄せください.



この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
現状報告
 KiCad解説本の重版が決定しました!ありがとうございます♪.(2016/12/10)

自己紹介
yoneken
logo
 ロボットの研究・開発をしています。

続きを読む

連絡先は
ad

Syndicate this site
 2012年からKiCad日本語版バイナリのメンテナもしています.
来てくれた人たち
  • 今日:
  • 昨日:
  • 累計:

ショップリンク
嬉しいコメント
記事について
 このブログ記事の著作権は全てyonekenに属します。
 転載や個別記事へのリンクはご自由にどうぞ。連絡は必要ありません。
 記事の内容は無保証です。古い記事の内容は当時と状況が変わっている場合があります。
 内容に関する質問はコメント欄でもらえると、他の人にも役立ちます。
記事検索
月別
リア友リンク