ROS 概要

## はじめに
この記事は、ROS についての概要をまとめたものです。
筆者が ROS を用いたロボット開発を行う上でのインプットを主目的としたものですが、同様に ROS 初学者の方の最初の足掛かりになれば幸いです。

## ROS とは
- ROS(Robot Operating System) は、オープンソースのロボット制御ソフトウェア、およびそれを包括するロボット開発プラットフォーム全体を指す。
- ROS の主な特徴は、分散処理フレームワークであること、ロボティクス向けの豊富なライブラリ群を備えていること、シミュレーションツールやデバッグツールなどの高機能な開発ツールを使えることなどが挙げられる。

## ROS の構成要素
ROS の構成要素は下記の4つである。
- 通信(Plumbing)
- ツール群(Tools)
- 機能群(Capabilities)
- エコシステム(Ecosystem)

### 通信(Plumbing)
ROS は、ノード間でデータを送受信する機能を持ち、データを ROS メッセージという形式で通信する。
そのメッセージには、整数型、浮動小数点型などの一般的なデータ型の他に、画像データ用、関節角度用、加速度センサ用等のロボットシステムで頻繁に通信されるデータのためのデータ型があらかじめ用意されている。
ROS メッセージを利用した通信方式として、下記の3つがある。
- トピック通信
- サービス通信
- アクション通信

#### トピック通信
トピック通信とは、単方向非同期通信であり、トピック名に基づき選択的にデータの送受信を行う仕組みである。
データの送信側を Publisher、 データの受信側を Subscriber という。
Publisher は特定の名前を持つトピックに対してデータを送信し、Subscriber は指定したトピックに流れるデータを受信する。

#### サービス通信
サービス通信とは、双方向同期通信であり、「サーバー - クライアント」関係の通信の仕組みである。
サーバー通信では、クライアントがサーバーにリクエストを送信すると、サーバーがレスポンスを返すという流れで通信が行われる。

#### アクション通信
アクション通信とは、双方向非同期通信であり、サービス通信と同様に「サーバー - クライアント」関係の通信の仕組みである。
サービス通信と異なる点は、サーバーがクライアントに対し、リクエストに対する処理で発生するイベントであるフィードバックを返す点である。
フィードバックによって、クライアントはサーバーの処理の進行状況を知ることができる。

### ツール群(Tools)
ROS 専用の主なツールは下記の5つがある。
- catkin
- Rviz
- Gazebo
- rosbag
- roslaunch

#### catkin
catkin とは、ROS におけるビルドシステムである。
catkin は基本的に CMake と似ているが、異なる点は、パッケージ検索機能や複数の独立したプロジェクトを同時にビルドする機能などが挙げられる。
また、以前の ROS のビルドシステムである rosbuild の後継であり、容易なパッケージ配布、クロスコンパイルのサポート、ソフトの移植性向上などの点で機能向上が図られている。

#### Rviz
Rviz とは、ROS に付属する3Dビジュアライザーである。
Rviz を使用することで、ロボットやセンサーなどのデータを3D空間上で表現することができる。
これによりロボットのシミュレーションが行えたり、実際にロボットを動かした際のデータを可視化することができる。

#### Gazebo
Gazebo とは、ROSと連携できるシミュレーションツールである。
URDF* モデルにシミュレーション用の記述(重さ、慣性モーメントなど)を追加しておけば、物理的なシミュレーションを行うことが可能になる。
(* URDF: Unified Robotics Description Format。製造業の組み立てライン用ロボット マニピュレーター アームや遊園地用のアニマトロニクス ロボットなどのマルチボディ システムをモデル化するために、学術界や産業界で使用される XML 仕様のこと。)

#### rosbag
rosbag とは、ROS トピックを記録および再生するためのツールのセットである。
rosbag パッケージは、bag(ROS メッセージデータを保存するための ROS のファイル形式)を操作するためのコマンドラインツールと、C++ および Python でバッグを読み書きするためのコード API を提供する。

#### roslaunch
roslaunch は、複数のノードをまとめて起動・停止を行うツールである。
rosrun によりノードを起動することができるが、複数のノードを立ち上げる際に1つずつ起動するのは手間であるため、それを解決する手段として roslaunch が用意されている。
roslaunch は、launch ファイル(XML 形式で書かれたスクリプト)で定義されたノードを起動することができる。

### 機能群(Capabilities)
ROS には、ロボットの有用な機能がまとめられたパッケージがある。
主なパッケージは下記の2つである。
- NavigationStack
- Movelt!

#### NavigationStack
NavigationStack は、オドメドリ情報*1、および測域センサ情報*2を入力値として、与えられた目標地点／姿勢に到達するための安全な駆動（速度）命令を出力するソフトウェアである。
TF(Transform tree)と呼ばれる座標軸の相対位置情報を与える必要がある。
オプションで NavigationStack に対して地図を与えることができ、より効率的に移動経路の検索を行うことができる。
(*1 オドメドリ情報: ホイールエンコーダ等の内界センサーによる推定自己位置および現在速度のこと。)
(*2 測域センサ情報: 障害物までの距離情報のこと。)

#### Movelt!
Movelt! は ROS の自遊空間動作計画フレームワークである。
ロボットの動作計画を行う際に必要となる機能が詰め込まれている。
主にロボットアームのモーションプランニングに使用されているとのこと。
また、多くの ROS ライブラリとは異なり、優れた GUI 操作画面が用意されている。

### エコシステム(Ecosystem)
エコシステムとは、本来 "生態系" を表す単語で、業界や製品がお互いに連携し、大きな利益構造を構成することを指す。
ROS におけるエコシステムの構成要素は、下記の 4 つがある。(ここでは、簡易的な説明にとどめる)
- ROS Wiki
　各言語に対応しており、チュートリアルを完備している。
- ROS Answers
　ROS についての質問が可能。
- ROS Discourse
　ROSについての議論が可能。
- ROScon
　年一回開催されるイベントであり、活発に活動している。

## 参考文献
- [ROSとは｜特長・ROS1とROS2の違い・活用事例・動かせるロボット](https://macro-send.com/blog/ros)
- [分散処理に適した ROS の通信機能](https://orist.jp/technicalsheet/22-10.pdf)
- [ROSのトピック通信](https://hara-jp.com/_default/ja/Topics/ROS%E3%81%AE%E3%83%88%E3%83%94%E3%83%83%E3%82%AF%E9%80%9A%E4%BF%A1.html)
- [ROS入門 (12) - ROS1のサービスによる通信](https://note.com/npaka/n/n3e90d24bd38b#d6FEm)
- [ROS入門 (14) - ROS1のアクションによる通信](https://note.com/npaka/n/n6734a8ebcf9b)
- [ROS講座58 ROSのツール概要](https://qiita.com/srs/items/3188fc6d1a932a37ad3c)
- [ROSの新しいビルドシステムcatkinについて](https://myenigma.hatenablog.com/entry/20131229/1388320084#google_vignette)
- [Rviz2の使用方法](https://zenn.dev/array/books/5efdb438cf8be3/viewer/bbf361)
- [ROS勉強メモ Gazeboシミュレーション](https://qiita.com/ryuka0610/items/1104543c22c3389fe5c5)
- [URDF 入門](https://jp.mathworks.com/help/sm/ug/urdf-model-import.html)
- [rosbag](https://wiki.ros.org/rosbag)
- [bag](https://wiki.ros.org/Bags)
- [複数のノードを同時に起動する方法](https://robot.isc.chubu.ac.jp/?p=458)
- [Navigation Stack概要](https://robo-marc.github.io/navigation_documents/navigation_overview.html#)
- [MoveIt! パッケージのビルド](https://industrial-training-jp.readthedocs.io/ja/latest/_source/session3_JP/Build-a-Moveit!-Package_JP.html)
- [「ROS + MoveIt! でハンドリングしたい！ 1. Moveit!ってなに？](https://qiita.com/RyodoTanaka/items/1a2f3a427c8800b5cecd)
- [The ROS Ecosystem](https://www.ros.org/blog/ecosystem/)