ROSとは何かについて,厳密性を排除し簡単な説明を試みました.
一次情報に触れたい方はROS WikiのIntroductionやros.orgでのROSの紹介を読んでみてください.
また,ここに記載した内容はROSに触れているうちに次第に分かってくるので,軽く読み飛ばす程度で結構です.
ROS (Robot Operating System) はロボットの研究開発を促進するライブラリやツールのセットを提供します.
ロボット制御のコードを書くにあたって利用できると便利なもの,くらいに捉えてもらえれば大丈夫かと思います.
以下にどのように便利なのかを記述していきます.まずはROSが掲げる目標について記述します.
ロボットの研究開発において,コードの「再利用」を支援すること
the primary goal of ROS is to support code reuse in robotics research and development. [1]
ロボットの研究開発にはセンサ情報取得(知覚),知能設計(計画),アクチュエータ駆動(制御)と様々な要素があり,それぞれにドライバやコードの開発が必要です.また,可視化ツールやシミュレータ等も開発しようとするとさらに作業量が増えます.
これらを全部一からやろうとすると,一番研究開発でやりたい部分に到達するまでに大変時間がかかります.
そこで,ROSでは独自のフレームワークを定め,ROSの下で開発されたコードは容易に再利用可能,各自のシステムに組み込めるようにすることで,各自が自身のロボット研究開発に注力できるよう支援しています.また,専門分野の異なる各自がそれぞれROSの下で作成したコードを組み合わせることでロボットシステムを構成するという共同研究開発の促進も理念に掲げています.
以下にROSの特徴をざっくりと記述します.
-
オープンソース
- 開発がオープンソースで行われています(例).誰でも閲覧,ダウンロード,コミット可能です.そして,多くの方が自分で作成したROSコードをGitHub等で公開しています.私も,自分で作成したROSコードを公開できる範囲で公開したり,ROSコミュニティへの貢献を行っていけると良いと思っています.(したい)
-
分散アーキテクチャ
- ROS上で動く実行プロセスは「ノード」と呼ばれ,各ノードには情報の入力と出力があります(どちらかでもよい).複数のノードが結合し,互いに情報を授受することでロボットシステムを成します.この構造により,ノードを置き換えたり入出力の接続の仕方を変更すれば,自分のシステムにネット上に公開されたコードで記述されたノードを組み込むことができます.詳細は後述します.
-
多数のプログラミング言語をサポート
- メインでC++, Pythonに対応しており,各ノードごとに別々の言語で記述できます.LispやJavascriptなどもあります.
-
コミュニティが活発
- ROS専用の知恵袋があります (ROS Answers). また,ROSConやROSCon JPといった会議や,ROS ユーザー会等の活動も活発に行われています.
次に,分散アーキテクチャに関連して,ROSのアーキテクチャについて説明します.
先程述べたように,ROSは複数のノードが情報を授受しあうことでロボットシステムを構築します.ここでは,その通信方式についてとROSの基本的な用語について説明します.
ROS上で動く実行プロセスはnodeと呼ばれます.そしてノード同士では情報の送受信が行われています.ここで情報のことをtopic,送信することをpublish,受信することをsubscribeといいます.また,topicをpublishするノードをpublisher,subscribeするノードをsubscriberといいます.(1つのノードは複数のtopicをpublish, subscribeできます.あるいは一つもtopicをpubsubしなくても構いません.)topicは各ノードが好きなタイミングでpublish, subscribeできます.(非同期通信)
これらのnode間通信のとりまとめはmasterが行います.ROSインストール時に動作確認で打ったroscore
というコマンドは,このROS masterを立ち上げるコマンドです.
そして,上図のような構成の通信はトピック通信と呼ばれ,これがROSで最も一般的な通信方法です.ROSには他にもサービス通信,アクション通信という通信形式がありますが,興味のある方は余談をご覧ください.
最後に,複数のノードやその他パラメータファイル等を含んだ機能の集合でパッケージと呼ばれる単位があります.
より詳しく知りたい方は以下のリンクを読んでみてください.
http://forestofazumino.web.fc2.com/ros/ros_basics.html
この辺の話は手を動かしながら理解するのが一番良いです.そして,この概念を理解するのがROSの学習において一番大事な箇所といっても過言ではありません.そこで,次のページではROSパッケージを作成し,その中で簡単なpublisher, subscriberを作成してトピック通信を実際に行うことで,上記のROSの基本的な概念を理解することを目指します.
-
ROSロボットプログラミングバイブル
-
トランジスタ技術2020年9月号
-
- 公式Wiki
-
- 私はこのサイトを中心に勉強しました.
-
- 全編日本語でかなり詳しいところまで書かれています.特にnavigation stackやSLAMの章は重宝しました.
- 慶應の学生はネット上で無料で読めます(リンク)
-
(コード)
- やっぱり自分の目で挙動を詳しく確認したいというときはコードを読み込むのが一番良いです.(コードに従って動いているので)
- ROSはオープンソース推奨なので多くの場合コードが読めます.
ROSに関する情報は英語のほうが圧倒的に多いので,エラーなどが出て困った際は英語でググると早く解決策が見つかるかもしれません.(大体ROS Answersで同様の悩みを抱えている人が見つかります)
ROSには先程説明したトピック通信の他にはサービス通信,アクション通信という方式が存在します.
- サービス通信
- 常に垂れ流すトピック通信とは異なり,サービスクライアントと呼ばれるノードがサービスメッセージを投げ,サービスサーバーと呼ばれるノードがそれを受け取るとサービスサーバーで処理が開始する.処理が終わるとサービスクライアントにメッセージを送信する.
- アクション通信
- サービス通信ではサーバーは終了時にメッセージを送信したが,アクション通信では処理実行中の途中結果をサーバーがトピックとして逐一publishする.処理が終わるとクライアントにメッセージを送信するのは同じ.
興味のある方は調べてみてください.