# ROS概要 ROS(Robot-Operating-System)はロボットソフトウェアプラットフォーム(コンピューター上でソフトウェアを動かすための基盤もしくは土台)である。 # ROSの利点 **1.プログラムの再利用性** ROSではユーザー(我々自身)は自身の研究分野である開発に集中し、その他の機能(SLAM, 衝突回避)は関連するパッケージをダウンロードして使用して研究開発の生産性を向上することができる。更に自身が開発したパッケージを他人が利用できるように公開することができるオープンソースソフトウェアの文化に参入することができる。    **2.コンポーネント化(部品化)されたプログラムと通信** 今までは(ROSを基盤とした開発ではない時期), センサによる入力からアクチュエータによる出力まで単一のプログラム(C, C++書いたようなコード)で実現していた。しかし, 全体の処理をより小さな単位に分割し, 要求使用によって必要な処理を組み替えて全体の処理が実現できれば, 柔軟性と再利用性と保守性の高いシステムが実現できる。ここで個々の実行単位はコンポーネントあるいはノードと呼ばれる。ROSは最小実行単位であるノード間でデータを送受信する仕組みを提供している。また各ノードは、基本的にはネットワークで接続されたいかなるコンピューター上でも実行でき、簡単に遠隔操作ができる。 **3.豊富な開発ツール** ROSでは二次元プロット(rqt_plot)と三次元可視化ツール(Rviz)などのロボット開発に必要なツールが標準で提供されている。例えばLidarから取得した点群からその環境の地図を構築するといった作業もROS上ではRvizを使用することで簡単に実現することができる(今までなら大変な作業)。更に取得したセンサ情報を保存して後日全く同じ状況を可視化することもできる。CADで自身が設計したロボットモデルを簡単に三次元で可視化することができる。 ## 用語説明 **ノード**:個々の実行単位。可視化ソフトウェアの設定をするノード、経路を生成するノード、モータを動かすノードなどがある。 **パッケージ**:プログラムの集合であり、ROSの基本単位である。その中には少なくとも一つのノードが含まれているか、他のパッケージのノードで使用される設定ファイルが含まれている。更にノードの実行に使用される依存ライブラリ(roscppやrospyなど)、データセット、設定ファイル(CMakeList.txt)などパッケージに必要なすべてのファイルが含まれている。 **オープンソースソフトウェア(OSS)**:他人の開発したプログラムを利用出来たり、また自身が開発したプログラムを自由に配布する文化(GitHubなど) **アクチュエータ**:電機などのエネルギーを機械的な力に変換して機器を動かす駆動装置 **実行単位**:一つ一つのタスク(センサ情報の取得やモータ制御など)を一つの処理としてプログラムに記述しそれらを実行する際の単位 # ROSの特徴 **分散プロセス**:ノードと呼ばれる実行可能な最小単位のプロセスにより、全体の機能が実現される。各ノードは独立して並列的に動作し、双方向の送受信が可能である。 **パッケージ管理**:同一の目的で作成された複数のノードは、まとめてパ**ッケージとして管理される。パッケージの利用、共有、修正、再配布は極めて容易である。 **リポジトリ**:公開パッケージの場合、各パッケージのWikiにはパッケージのリポジトリが明記されている。各リポジトリはURLが割り当てられ、パッケージのソースコードが管理されている。Gitなどのソースコードマネージメントシステムを用いると、パッケージのダウンロード、アップロード、メモが利用できる。現在公開されているパッケージのほとんどはGitHUbによって管理されている。 **公開リポジトリ**:開発されたパッケージはGitHubなどの開発者のリポジトリを通じて公開される。ただし、各パッケージには適切なライセンス(BSD)がついている。 **API(Application Programming Interface)**:アプリケーション(ROS)とソフトウェア(各ノードやパッケージ)とつなぐもの。 **APIの整備**:ROSとは無関係に開発されたプログラムもROSで提供されるAPIを使えば、簡単にROSで利用できるプログラムに変更できる。 **多数のプログラミング言語をサポート**:ROSでは、自身で提供するクライアントライブラリ(roscppやrospyなど)によってPython, C++などの一般に広く利用されている言語から、コアな言語(C#, Lua, Rubyなど)の個別アプリケーション開発に特化した言語まで、さまざまな言語を利用することができる。このため、多くの開発者は、自身がよく知るプログラミング言語によって、ROSのプログラム開発が可能である。 ## 用語説明 クライアントライブラリ:ROSでは言語依存性を抑えるために、クライアントライブラリを採用している。クライアントライブラリはroscpp,rospyなどが提供されおり、これによりC++,Pthsonなどのプログラミング言語を利用できる。 # ROSの構成 多言語プログラミング開発を支援するためのクライアントライブラリ、標準的なアプリケーションパッケージ、ハードウェア制御のためのインターフェース、データ通信、個々のアプリケーションプログラム作成のためのアプリケーションフレームワーク、シミュレータやソフトウェア開発支援ツールから構成される。 ![](https://i.imgur.com/77no2SN.jpg) [](人のやつ) 脳みそとなる部分にはPCを用いる。PCはデスクトップ型やノート型、Raspberry Piシリーズなどubuntuの動くものであれば良い。 センサ類は基本的にusbでPCと接続する。組み込み用途のセンサなどusbでデータを送れないセンサは、一旦電子基板で処理してからPCにusbなどで送る。 アクチュエータ類もPCから直接は動かせないので、一度ドライバなどの電子基板を経由して駆動させる。 PCは得られたセンサ類の情報から次に駆動させるアクチュエータの計算を行う [](ここから話変わる) # ROSの作業フォルダの生成および初期化 cd ~/catkin_ws/src catkin_make そうするとsrcフォルダの中に以下の三つのフォルダが存在する build devel src この時catkinビルドシステムのビルド関連ファイルはbuildフォルダに、実行関連ファイルはdevelフォルダにそれぞれ自動的に生成される 最後にcatkinビルドシステムの環境設定ファイルを読み込んでおく。 source ~/catkin_ws/devel/setup.bash ## 用語説明 **catkin**:catkinはROSのビルドシステムである。ROSのビルドシステムは基本的にCMake(Cross Platform Nake)を使用しており、パッケージのフォルダ内にある CMakelists.txtなどのテキストファイルにビルド環境を記述している。 **CMakelists.txt**:ROSのビルドシステムであるcatkinはCMakeを使用しており、CMakelists.txtにビルド環境が記述されている。 **package.xml**:パッケージの名称、ライセンス、パッケージ依存性など、パッケージ情報を記載したXMLファイルである。 # ROSの開発環境 ROSを利用するには、新しくターミナルを開くたびに以下のコマンドを毎回実行する必要がある。 source /opt/ros/kinetic/setup.bash source ~/catkin_ws/devel/setup.bash ただし、ターミナルを開くたびに自動的に環境設定ファイルを読み込むように設定する。 以下にその手順を書く。 vi ~/.bashrc そこでbashrcの中に以下を追加する。この中に書かれる内容はターミナル起動時に自動的に行われるコマンドとなる。 source /opt/ros/kinetic/setup.bash source ~/catkin_ws/devel/setup.bash 最後にbashrcの変更を反映するために以下のコマンドを入力するか、ターミナルを一旦閉じて新たにターミナルを開く。 source ~/.bashrc 更にROSのネットワーク環境を設定する。(デフォルトの設定の場合export ROS_MASTER_URIが設定されている) export ROS_HOSTNAME = xxx.xxx.xxx.xxx export ROS_MASTER_URI = http://${ROS_HOSTNAME}:11311 xxx.xxx.xxx.xxxには設定するコンピューターのIPアドレスを設定する。 一方, コンピュータが1台だけでIPアドレスを特定する必要がないや、インターネットに接続せず、IPアドレスの割り当てができない場合は、IPアドレスにlocalhostと指定してもよい。 export | grep ROS と打つと現在の環境設定の状況が確認できる # ROSの主要概念 ## メッセージ通信 ここで言う通信はセンサーとロボットの間で行われるような通信ではない。 ノード間ではメッセージ通信が行われ、相互にデータがやり取りされる。通信の方法はトピック、サービス、アクションの三つが存在する。 ![](https://i.imgur.com/12FKz27.jpg) 1.**トピック**:トピックはいわゆる話題である。ノードの起動時、ノードのパブリッシャはトピック名をマスタに登録し、そのトピックの具体的な内容(話題)をメッセージで定めた形式で他のノードに送信する。またサブスライバが実装されたノードは、聞きたいトピックを発信しているパブリッシャの情報をマスタに問い合わせる。これにより、両ノードのパブリッシャとサブスライバの間が接続されてメッセージが送受信される。トピック通信は非同期通信方式であり、一度接続されればメッセージ送受信が継続されるため、高頻度のデータ通信を行うセンサ信号の送受信に利用される。例えるとマスタは通信システムの管理会社で、パブリッシャーはその管理会社に送信の方法を、サブスクライバは受信方法を登録することで、その後の通信を円滑に行っている。 2.**サービス**:サービス通信はサービスを要請するサービスクライアントとサービス応答を担当するサービスサーバの間の双方向同期通信方式である。トピック通信は、一度接続すれば連続的にデータが得られるが、要請に応じて、そのたびに応答が得られた方がよい場合もあり、この場合にはサービス通信が用いられる。例えばロボットの事前に決められた動作をさせるときや、ある条件下で特別なイベントを発生させるときなどに利用される。情報を送るときは毎回マスタに登録する。 3.**アクション**:アクション通信は、要請から応答までの時間が長い場合、または処理中に中間結果が必要な場合に利用される。この通信は、アクションの目標を送信するアクションクライアント、与えられた目標に対する処理を実行し、処理中のフィードバックや結果を送信するアクションサーバで構成される双方向非同期通信である。例えば、アクションクライアントが四角い経路追従をしている時に角に来たらロボットの状態を送れというような司令を与え、角に来た時にアクションサーバが情報を送信する。 ### 用語説明 メッセージ:ノードは他のノードとメッセージのやり取りをし、データを交換する。メッセージには標準のデータ型が存在する。 **マスタ**:マスタはノードとノードの間を接続し、メッセージ通信を行うための環境を提供する役割をする。マスタはroscoreで起動する。マスタを起動すると、マスタには実行中の各ノードの名前が登録され、ほかのノードはその情報に問い合わせることができる。マスタを起動しないと、ノード間の接続、トピックやサービスなどのメッセージ送信が実行できない。マスタはノード名、トピック名、サービス名、アクション名、URIやポート、パラメータなどを管理する。通信方式に問わず、通信を開始するノードが自身の情報をマスタに登録し、通信を利用するノードがマスタから接続先ノードの情報を取得する。 **roscore**:マスタを実行するコマンドである。 **パブリッシャ**:パブリッシャはトピックを用いたメッセージデータの送信のことである。パブリッシャは、パブリッシュに必要な情報(データ型、いくつのデータなど)をマスタに登録し、パブリッシャが登録したトピック(送るデータの型)をサブスクライブしようとするサブスクライバにメッセージを送る。パブリッシャはノード内で宣言することで使用できる。 **サブスライバ**:サブスライバはトピックを通じたメッセージデータの受信のことである。サブスライバはサブスライブに必要な情報(データ型、いくつのデータなど)をマスタに登録し、サブスライブしようとするトピックをパブリッシュしているパブリッシャの情報をマスタに問い合わせる。 **サービスサーバ**:サービスサーバはサービスクライアントからサービス要請を受け取ると、指定された処理を実行した後、その結果をサービスクライアントに返信する。 **サービスクライアント**:サービスクライアントは、サービスサーバにサービスを要請し、その結果を受け取る。 **アクション**:アクションはサービスに似た双方向通信方式であるが、要請から応答まである程度時間が必要なときに使用される非同期通信方式である。アクションのデータ形式は、サービスの要請と応答に対応する目標と結果、そして中間結果を返すフィードバックで構成される。 **アクションサーバ**:アクションサーバは、アクションクライアントから目標を取得し、フィードバックおよび結果を受信する。 **アクションクライアント**:アクションクライアントは、アクションサーバに目標を送信し、フィードバックに基づき、次の目標を設定したり、処理を取り消す。 # メッセージ通信の流れ マスタはノードの情報を管理し、各ノードは他のノードと接続し通信する。 ## マスタの実行 ノード間の通信において、マスタはノード間の接続情報を管理する。マスタはコマンドroscoreで実行され、XMLRPCサーバで起動する。この時、マスタはノードの接続のためのノード名、トピック名、サービス名、アクション名、メッセージ型、URIやポート情報を格納し、他のノードから要請を受けると、それらの情報を送信する。 roscore ## サブスクライバを実装したノードの実行 ノードはrosrunまたはroslaunchコマンドにより実行される。この時、ノードはノード名、トピック名、メッセージ型、URIやポートをマスタに登録する。マスタとノードはXMLRPCを通じて通信する。 rosrun PACKAGE_NAME NODE_NAME or roslaunch PACKEAGE_NAME LAUNCH_NAME ## パブリッシャを実装したノードの実行 パブリッシャを実装したノードもrosrunまたはroslaunchコマンドで実行される。起動すると、ノード名、トピック名、メッセージ型、URIとポートをマスタに登録する。マスタとノードはXMLRPCを通じて通信する。 ## パブリッシャ情報の取得 サブスクライバからの要請により、マスタはパブリッシャのノード名、トピック名、メッセージ型、URIやポートの情報をサブスクライバに送信する。 ## サブスクライバの接続要請 サブスクライバはマスタから取得したパブリッシャの情報に基づき、パブリッシャに接続を要請する。このとき、サブスクライバはノード名、トピック名、メッセージ型などを送信する。また、サブスクライバとパブリッシャはXMLRPCを通じて通信する。 ## パブリッシャの接続応答 パブリッシャはサブスクライバに接続応答を行う。このとき、パブリッシャは自身のTCPサーバ情報であるURIやポート情報を送信する。 ## TCPROS接続 サブスクライバはTCPROS上のクライアントを作成し、パブリッシャ側のサーバと接続する。このとき、パブリッシャとサブスクライバはTCP/IP接続であるTCPROSを通じて接続する。 ## メッセージ送信 パブリッシャはサブスクライバにメッセージを送信する。このとき、パブリッシャとサブスクライバはTCP/IP接続であるTCPROSを通じて接続する。 ### 用語説明 **プロトコル**:通信規約 **URI**:URIは名前、場所を判断するため乗法の記載方法である。URL(保存場所)やURN(保存名)がこのルールにのっとって記載されている。 **XMLRPC(XML-Renote Procedure Call)**:XMLRPCはRPCプロトコルの一種であり、エンコーディング形式にはXMLを、転送方式にはHTTPプロトコルをそれぞれ使用する。ここでHTTPプロトコルは、要請や応答の際に欠落検査を行わず、両末端間の接続状況も維持しない特徴がある。 RPCプロトコル:RPCとは、あるコンピュータで動作するソフトウェアから、通信回線やコンピュータネットワークを通じて別のコンピュータ上で動作するソフトウェアへ処理を依頼したり、結果を返したりするための規約。プログラム中の手続きや関数、メソッドなどを呼び出すのと同じ手順でネットワーク越しに別のコンピュータ上のプログラムを呼び出す手法であり、プログラマがネットワークによる通信手順の詳細な実装をする必要はない。(コピー) エンコーディング形式:文字コードの形式 HTTPプロトコル:HTTPとは、Webサーバ(HTTPに則ってWebブラウザに画像などの表示を提供するサーバー)とWebクライアント(Webサーバに情報を要求して受信するシステム)の間でデータの送受信を行うために用いられるプロトコル。Webページを構成するHTMLファイルや、ページに関連付けられたスタイルシート、スクリプト、画像、音声、動画などのファイルを、データ形式などのメタ情報(編集者、編集日時などのファイルの情報)を含めてやり取りすることができる。(コピー) TCP/IP:IP(Internet Protocol)に基づき、TCP(Transmission Control Protocol)を用いてデータを送信する。 TCPROS:TCP/IPベースのデータ通信方式 # メッセージ メッセージはノード間のデータ送受信に使用されるデータの形式のことである。メッセージはフィールドタイプとフィールドネームで構成される。フィールドタイプは図にしめすROSのデータ型を記入し、フィールドネームにはデータの意味を示すネームを記入する。 ![](https://i.imgur.com/CnkIiMX.png) ## msgファイル *.msgファイルには、トピック通信における型を定義する。ただし、フィールドタイプとフィールドネイムだけが定義される。 ## srvファイル *.srvファイルにはサービス通信における型を定義する。ここで3つのハイフン(---)は、サービス要請メッセージ(上部)とサービス応答メッセージ(下部)を分けている。