ROS(Robot Operating System)を使う
安曇野の森から> ROS(Robot Operating System)を使う> 5分で分かるROS
ROS(Robot Operating System)はOSRF(Open Source Robotics Foundation)が開発・メンテナンスしているロボット用OSです。
OSというよりはLinux上のミドルウェアに近いものです。(Androidに似ています。)
プログラムはLinuxのプロセスに相当するノードやスレッドに相当するノードレットとして動作します。
ROSはノード間の通信方法に特徴があります。
ノード間をトピックと呼ばれるデータバスで接続し、発信側ノードがトピック上にメッセージを発行し、受信側ノードが、このメッセージを受信することにより通信を行います。
メッセージは流しっぱなしで受信側ノードは流れてきたメッセージが必要なものであった場合のみメッセージを拾い上げます。
受信側ノードがメッセージを受信するとノード内のコールバック関数が呼び出され、その関数の中でメッセージで伝えられた情報の処理を行います。
また、ROSにはクライアント・サーバーシステムのようにクライアント側ノードがサーバー側ノードにリクエストを発行し、クライアント側ノードがサーバー側ノードからのレスポンスを待つ仕組みもあり,
この仕組みはサービスと呼ばれています。
サービスの場合もサーバー側ノードがリクエストを受け取るとノード内のコールバック関数が呼び出され、その関数の中でリクエストで伝えられた情報を処理し、レスポンスを返します。
メッセージとの違いはサーバー側ノードがクライアント側ノードへレスポンスを返すところにあります。
以下で、ROSの主な構成要素を説明します。
ノードはLinuxのプロセスに相当し、ノード毎の独立したメモリ空間内でプログラムが動作します。
ノードにはROS独自のノード間通信手段(メッセージ、サービス、パラメーターサーバー)が用意されています。
ノード生成時、各ノードには通信時の識別のために固有の名前を付ける必要があります。
マスターはノードやトピック等の名前を管理しており、ノード間通信を始める前にノードがどのトピックに繋がっているかを解決する手段を提供しています。
接続先・接続元のノードが見つかった後、両ノードは1対1で通信を行います。
マスターは、このような機能を持つために他のノードより先に起動していなければならず、かつ、システムの中に複数のマスターが存在してはいけません。
複数のマシンが接続されているシステムの場合でも、その中の1台のマシンだけでマスターが動いていなければなりません。
マスターが起動するとパラメーターサーバーと/rosoutノード・トピックも自動で立ち上がります。ノードが出力するログ等は、この/rosoutを通してターミナルに表示されます。
パラメータサーバーはパラメーター名によって特定出来る値を記録している一種のデータベースです。
パラメーターサーバーはマスターの中で動作しています。
トピックはノード間をつなぐデータバスのような働きをします。
送信側ノードがメッセージをトピックへ発行し、そのメッセージの受信待ちをしている受信側ノードがトピックからメッセージを取り込みます。
メッセージはトピックへ情報を流すための情報の塊です。
標準的なメッセージはROSで定義されています。また、ユーザー固有のメッセージを定義することも出来ます。
メッセージを使った通信の実態は1体1の通信ですが論理的には1対多ノードの通信です。1つのノードが送信したメッセージは複数のノードで受信出来ます。
ただし、送信側ノードがメッセージを送信した後、受信側ノードからの受信確認が無い非同期通信になります。
サービスはROSが持つノード間の通信手段の一つです。
メッセージと異なり1対1ノードの通信で、送信側ノードからリクエストを送信した後に受信側ノードからのレスポンスの受信を送信側ノードが待つ同期通信になります。
バッグファイル(bugではなくbagであることに注意してください。)はトピック上を流れるメッセージを記録するためのファイルです。
rosbagツールを使うと左図のようにトピック上のメッセージをバッグファイルに記録することが出来ます。
メッセージには送信時間も含まれているため、以下で説明するバッグファイル再生時にはプログラム動作の再現が正確に出来ます。
rosbagツールを使うと左図のようにバッグファイルに記録されたメッセージをトピック上に再生することが出来ます。
バッグファイルの再生により何度でも同じ動作をさせることが出来ますので、問題発生時に問題となった動きの再現が繰り返し正確に行えますので問題解析に便利です。
ローンチファイルは複数ノードを一度に起動するためにノード情報など起動に必要な情報をXML形式で記述したファイルです。
ローンチファイルでノード名などを上書きすること(リマッピング)が出来ます。このリマッピングにより、プログラムの修正なしにシステム構成を変更したり、1つのノードプログラムから複数のノードを複製することが出来ます。
ノードを単体で起動する場合と違いローンチファイルでノードが起動される場合にはマスターが起動していない時にはマスターが自動で起動されます。