rosdep使おうよ

# rosdep

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ROSユーザの皆様、rosdep</p>&mdash; strv (@strv) <a href="https://twitter.com/strv/status/1204546184431300608?ref_src=twsrc%5Etfw">December 10, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

みんな使おうよ、rosdepを!!

※rosdepについては公式のチュートリアルや日本語解説もいくつかありますが、内容が古い仕組みのままだったりするので、簡単に使うのに必要な部分だけまとめることにしました。

## 何に使う?

rosdep は、ROS の依存関係を確認・解釈・解決・更新してくれるツールです。超便利です。

rosdep には複数のサブコマンドがあり，上記機能をそれぞれで実現しています。この記事では特に必要性が高い install と update を紹介します。

## どうやってインストールする?

ROSがインストールされてれば、標準で入ってます。もともとある仕組みです。公式のインストールチュートリアルにしたがってインストールしたのであれば、必ず

```bash
sudo rosdep init
rosdep update
```

したことがあるはずです。思い出しましたか?

※ROS Melodicからはインストールチュートリアルからは外され、そもそも標準ではインストールもされなくなりました。
Melodic以降を使っている場合は、

```Bash
# Noeticの場合
sudo apt-get install python3-rosdep
# Melodicの場合
sudo apt-get install python-rosdep
```

でインストールしてください。

# rosdep install

## いつ使う?

```rosdep install``` が必要になるタイミングは、公式リポジトリにないパッケージをビルド・インストールしたいときです。公式リポジトリにあるパッケージをaptでインストールする場合には、その段階で依存関係が解釈されて、必要なパッケージがまとめて自動的にインストールされます。

ですが、github上にソースの形だけで公開されているようなパッケージを使いたい場合には、依存関係を自力で解決する必要があります。そのときに```rosdep install```を使います。

依存関係は、ROSパッケージだけでなく、aptでインストールできるものなら基本的に解決できます。

## 注意事項

- ```sudo rosdep init``` はROSインストール時に一度だけ実行すればいい
- それ以外の操作をするときには ```sudo``` をつけない!!
    - もしつけてしまった場合には、 ```sudo rosdep fix-permissions``` で修正しましょう。

## コマンドの詳細

公式 : https://docs.ros.org/independent/api/rosdep/html/commands.html

ただし、この公式ドキュメントも古いもので、現代の内容に沿ってない部分が見受けられるので注意してください。

## 基本の使い方

rosdep は指定したパッケージの依存関係を処理しようとします。パッケージの指定方法が標準ではパッケージ名なのですが、まだビルドしてない（いまビルドしたい）パッケージはハンドリングできないため、パッケージのあるディレクトリをパスを指定します(```path-to-ros-package```を実際のパスに置き換える)。

```bash
rosdep install -i --from-paths path-to-ros-package
```

```rosdep install``` はどこで実行しても大丈夫です。パスは相対パスも使えます。また、複数のパッケージを含む親ディレクトリを指定することもできます。

これを実行すると、必要な依存関係を解釈して、足りないものの```apt-get```が始まります。パスワードや[Y/n]を聞かれるので適宜答えましょう。```rosdep install```に```-y```オプションを付けると、この段階での[Y/n]については強制的にYesで進められます。

上記例でつけている```-i```オプションは、```--ignore-src```の略で、ローカルなパッケージ置き場にあるパッケージについては無視してくれるようになります。
これを有効にしないと、インターネット上にない自分の作業ディレクトリにだけあるパッケージに依存するようなパッケージを作った場合に、rosdepが依存関係を解決できなくなってしまいます。基本的にはつけるようにしましょう。

## その後は

指定したパッケージの依存関係はクリアされたはずなので、catkin_makeしてビルドすればOKです。

ビルドできない？依存関係が足りないって言われる？それはビルドしようとしてるパッケージの依存記述が足りない場合、もしくは依存するrosのメッセージやサービスなど先にビルドしないといけないものがビルドされてない、場合がほとんどです。
後者の場合は何回かcatki_makeしてれば解決すると思いますよ。（真面目にやるなら、依存してるパッケージを先に指定してビルドする、catkin_makeをやめてcatkinに移行する等）

前者の場合なら、あとに書く依存関係の記述をちゃんとして、また```rosdep install```しましょう。
正しく動くものができたら本家にプルリク投げてマージしてもらってみんなハッピーになりましょう！

# rosdep update

rosdepは依存関係を最初にクリアする以外に、まとめて更新するupdateサブコマンドもあります。
これはインストール済みのrosパッケージすべての依存関係を調べて、必要ならば```apt-get install```で更新してくれます。

ROSのインストールチュートリアルでもこのコマンドを実行しているのは、そのためです。ただ、直前にapt updateしてからインストールしてるので、普通はあまり追加のアップデートインストールは発生せず、やる意味を感じないと思います。

# その他サブコマンド

他のサブコマンドも依存関係を調査したりするときに便利です。ヘルプを読んでいろいろ使ってみましょう。

# ちゃんとrosdepを使えるようにするために

```package.xml``` に依存関係をちゃんと記載しましょう。前述のとおり、ROS外への依存も記述できます。基本的なことは、[この前投稿した記事](https://qiita.com/strv/items/dbde72e20a8efe62ef95)を参考にしてください。

# 試してみる

## realsense

距離画像カメラの定番、[Realsenseのパッケージ](https://github.com/IntelRealSense/realsense-ros)が依存関係の記述がそこそこしっかりしてるので、これで試してみましょう。すでにインストール済みの人は流れだけ追ってみてください。

ここでは ```~/catkin_ws/``` に通常使うcatkin work spaceがあるものとします。

なお、```#```以降の部分についてはそれぞれコメントです。そのまま入力しないように。

```bash
cd ~/catkin_ws/src
git clone https://github.com/IntelRealSense/realsense-ros.git
cd realsense-ros
git checkout 2.2.8 #これはバージョンの都合上必要
cd ~/catkin_ws/
catkin_make #ここで実行しても依存関係が足りずにエラーになるはず
rosdep install -i --from-paths src/realsense-ros
catkin_make #ここは正常にビルドできるはず
```

以上で```~/cakin_ws/src/realsense-ros```ディレクトリ以下2つのパッケージについて依存関係が調査・インストールされます。
ね？簡単でしょ？
いちいちビルド時のメッセージを読んで必要なライブラリを探して…なんてする必要はないのです。

### バージョン整合の確認

おまけです。

上記例では、realsense-rosのバージョンを2.2.8に指定していますが、これは依存しているrealsenseのライブラリとのバージョン整合が必要なためです。
2.2.8より新しいバージョンでは、ライブラリのバージョンがより新しいもの(2.29.0)を要求するのですが、ubuntuのリポジトリにはまだそのライブラリが存在せず、古いバージョンしかインストールされず、realsense-rosのビルドできません。

この時はエラーを読むしかないのですが、ちゃんとエラーにライブラリAPIのバージョンが違う旨が表示されていたので、まずaptでインストールされるライブラリのバージョンを調べました。

```bash
apt search librealsense2
```

何に依存しているかは、[package.xml](https://github.com/IntelRealSense/realsense-ros/blob/development/realsense2_camera/package.xml)を読みましょう。
すると

```bash
ros-kinetic-librealsense2/xenial 2.25.2-1xenial-20190821-190058+0000 amd64
  Doron Hirshberg Library for capturing data from the Intel(R) RealSense(TM) SR300, D400 Depth cameras and T2xx Tracking devices.
```

と表示されました。これがインストールされるパッケージです。これを見ると、バージョンは2.25.2がインストールされるようです。

次にrealsense-rosのリリースページをみると、丁寧なことに依存するライブラリのバージョンが記載されております。
ここを見ると、2.25.2が使えて一番新しいバージョンは2.2.8であることがわかります。
よって上記ではそのバージョンを指定してインストールしました。

実はこの辺のバージョン番号についての依存までpackage.xmlには記載できるのですが、realsense-rosではサボられてます。
ただ、これを正しく記述されたところで、公式リポジトリにないパッケージについてはrosdepの段階でエラーになるようになるだけです。

# まとめ

公式リポジトリにあるものについては、という制限がかかりますが、それでも多くの依存関係が自動的に解決できるrosdepは非常に強力で便利です。
くだらない依存関係調査なんて、できるだけしないで済むように活用しましょう。また、それをさせないようにちゃんと依存関係の記述をするように心がけましょう。