ROSでインストールされるパッケージ群

## はじめに
ROSをインストールする際には，[ROS Wikiの記載](http://wiki.ros.org/kinetic/Installation/Ubuntu)通り，以下のいずれかのコマンドを実行していると思います．

>**Desktop-Full Install: (Recommended)** : ROS, rqt, rviz, robot-generic libraries, 2D/3D simulators, navigation and 2D/3D perception
`sudo apt-get install ros-kinetic-desktop-full`
**Desktop Install**: ROS, rqt, rviz, and robot-generic libraries
`sudo apt-get install ros-kinetic-desktop`
**ROS-Base: (Bare Bones)** ROS package, build, and communication libraries. No GUI tools.
`sudo apt-get install ros-kinetic-ros-base`

説明書きの通り，それぞれ必要なパッケージがインストールされるのですが，それぞれのコマンドで具体的にどのパッケージがインストールされるのか気になったので，まとめてみました．

本記事はROS Kinetic Kameに基づいています．
ざっと確認した限りでは，Melodic Moreniaでも同じですが，見落としがあるかもしれません．

## 調査方法
ROSインストールのためのコマンドで指定している`desktop-full`や`desktop`，`ros-base`は，それぞれメタパッケージになっています．
ですので，それぞれのメタパッケージ内のpackage.xmlに記載されている必須パッケージを見ていけばいいことになります．ROS Wikiを見るか，[githubのソース](https://github.com/ros/metapackages)を見るとわかります．

なお，パッケージ名のアンダースコア（_）は，インストールの際はハイフン（-）に置き換わることに注意してください．
インストールの際は，
`sudo apt-get install ros-kinetic-ros_base`
ではなく，
`sudo apt-get install ros-kinetic-ros-base`
になります．
ROS Wikiでパッケージの詳細を見たい場合は，アンダースコアで見てください．例えば，
[http://wiki.ros.org/ros-base](http://wiki.ros.org/ros-base)
ではなく，
[http://wiki.ros.org/ros_base](http://wiki.ros.org/ros_base)
になります．

## メタパッケージ間の関係性
メタパッケージ**desktop_full**を頂点としたメタパッケージの関係性を表したのが以下の図です．左側が上位メタパッケージで，右側の線がつながったメタパッケージがインストールされます．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234210/f325f15d-c85a-e3d8-3e71-84bddb8c66a5.png)
たとえば，`ros-kinetic-desktop`でインストールされるのは，**viz**と**robot**，そして**ros_base**と**ros_core**になり，**simulators**と**perception**に含まれるパッケージはインストールされないことになります．ROS Wikiの説明の通りです．

## 各メタパッケージでインストールされるパッケージ
各メタパッケージでは，下位のメタパッケージとともに個別のパッケージがインストールされます．

### desktop_full
基本的に下位のメタパッケージである**desktop**，**simulators**，**perception**がインストールされるだけなのですが，なぜか**urdf_sim_tutorial**というチュートリアルが入っています．未確認ですが，おそらく，**perception**や**simulators**で入るパッケージが必要なチュートリアルになっているのだと思います．

### desktop
チュートリアル用のパッケージがほとんどで，あとはユーティリティの類です．
**1. angles**
ラジアンと度の変換，正規化（$-\pi～\pi$に変換），2つの角度の短い方の差分の計算などといった角度の処理に関するユーティリティパッケージです．
**2. common_tutorials
3. geometry tutorials
4. ros_tutorials
5. roslint**
ROSパッケージのCMake lintを行うことができます．C++とPythonの両方のコードをチェックしてくれるようです．
**6. urdf_tutorial
7. visualization_tutorials**

### simulators
rqt/gazebo/stage用のパッケージ群です．
**1. gazebo_ros_pkgs
2. rqt_common_plugins
3. rqt_robot_plugins
4. stage_ros**

### perception
センサーによる認識に必要なパッケージ群です．
**1. image_common
2. image_pipeline
3. image_transport_plugins
4. laser_pipeline
5. perception_pcl
6. vision_opencv**

### viz
rviz関連のパッケージ群です．
**1. rqt_common_plugins
2. rqt_robot_plugins
3. rviz**

### robot
ロボットを動かすために必要なパッケージ群です．
**1. control_msgs
2. diagnostics
3. executive_smach
4. filters
5. geometry
6. joint_state_publisher
7. kdl_parser
8. kdl_parser_py
9. robot_state_publisher
10. urdf
11. urdf_parser_plugin
12. xacro**

### ros_base
アクション通信やプラグインなど，**ros_core**をベースにして，より高度な仕組みを提供するパッケージ群です．
**1. actionlib
2. bond_core
3. dynamic_reconfigure
4. nodelet_core
5. class_loader** （Melodicからros_coreに移動）
**6. pluginlib** （Melodicからros_coreに移動）

### ros_core
ROSの中核をなすパッケージ群です．ROS特有のノードやトピック通信，サービス通信などが実装されています．
多岐に渡り，参照関係も複雑ですので，詳細な中身は記事を改めて書きたいと思います．

## まとめ
ROSでインストールされるパッケージ群についてまとめました．

ある程度理解が進めば，用途に合わせて，**ros_base**（場合によっては**ros_core**）と他にご自身が必要なパッケージをインストールするという方法が良いでしょう．本当の初心者にはおすすめできないですが，それほど難しい構成でもありませんので，チュートリアルを一通り終えたら，トライしても良いと思います．

特にラズパイやその他の組み込みボードのように，計算資源が限られており，可視化ツールなどが必要ない場合には，必須になる知識かと思います．

今後は，ROSの基本仕様である**ros_core**と**ros_base**の中身について記事にしていきたいと思います．