# 野良packageへ依存したROS package そもそもタイトルのこれがなんなのか,というと,ようはオレオレROS packageをいくつも作っていき,それらが依存関係を持ったもの,です. 一人で開発している分にはそれらがどう依存しても構わないのですが,他の人にもそのパッケージをビルドしてもらおうとすると,依存関係を解決してもらわないといけません.ここでは,そういった依存関係を簡単に解決する,というよりはちゃんと記述できる方法を紹介し,それを利用した依存関係の自動解決・インストール方法を説明します. ちなみに個人的にROS kineticを使っているので,ここで紹介する方法はkineticでのみ動作確認しています. # 依存関係を記述する ## package.xml をちゃんと書く ROSにはもともと依存関係を package.xml に記述する仕組みがあります.まずはこれに則って,きちんと記述しましょう.なお, package.xml にはフォーマットのバージョンが1と2があります.ROS kinetic では, catkin_create_pkg で生成すると,勝手にバージョン1のテンプレートを使われてしまいますが,[公式サイト](http://wiki.ros.org/catkin/package.xml)にしたがって,バージョン2で書くようにしましょう.とくに依存関係で手間が減らせます. まずは,ここに必ず必要な依存パッケージを記述しましょう.自分が作った,もしくは公式リポジトリにはなくgithubなどにあるような野良のパッケージであっても,そのパッケージ内にある package.xml の `````` タグで指定されたパッケージ名称を記載すればOKです. なお,ROS側の公式サイトではわかりにくいのですが, [package.xml の依存関係の要素には,ROSと関係ない外部のライブラリなども記載が可能です](https://docs.ros.org/kinetic/api/catkin/html/howto/format2/system_library_dependencies.html). 例えば,ROSでもよく使われている数学ライブラリであるEigenなんかも, ``` eigen ``` のように記載できます. ただし,ここに記載する名称が若干あやふやでよくわかってません.eigenみたいにrun-time libraryとして供給されていないものの場合は上記のようにかき,gstreamerのようなものの場合は ``` libgstreamer0.10-dev ``` のように,記載することとなっています. ## パッケージのありかを示す 後述の依存関係の自動インストールの段階で,リポジトリにあるパッケージであればapt-getでインストールされるのですが,そうではないものについてはgit cloneしてきてビルドすることになります.当然ながら, package.xml には依存するパッケージ名しか記述していないため,その依存パッケージがどこのリポジトリに置かれているのか明示する必要があります. そこで利用するのが ```.rosinstall``` ファイルです.これはかつてROSそのものをインストールするときに使われていたファイルなのですが,これを使うことでパッケージとリポジトリの対応を取ることができます. ```.rosinstall``` ファイルの中身はyamlで記述されたテキストファイルです.フォーマットは[公式サイト](https://docs.ros.org/independent/api/rosinstall/html/rosinstall_file_format.html)に記載がありますが,正直説明が足りてません.ちなみに,git以外にもsvn等のリポジトリにも対応していますが,試したことはないです. gitの説明だけ抜き出してくると,ファイルフォーマットは下記のように説明されています. ```yaml - git: {local-name: /some/local/aboslute/path, uri: http://some/uri, version: 123} ``` yamlなので,もうちょっと見やすいように展開すると ```yaml - git: local-name: /some/local/aboslute/path uri: http://some/uri version: 123 ``` となります. 結論からいうと, - local-name にはパッケージ名称 - uri にはgithub等のリポジトリアドレス(sshでもhttpsでも可) - version にはブランチ・タグ名 を記載することで,野良パッケージの名称とリポジトリを対応付けることが可能となります.例えば,格安中華LiDARのドライバリポジトリを参照するのであれば ``` - git: local-name: ydlidar uri: git@github.com:EAIBOT/ydlidar.git version: 1.3.1 ``` のようになります.バージョンは番号だけじゃなく、masterなどももちろん指定できます. さらに,```.rosinstall``` ファイルは,ドットファイルである必要はないため適当に名前をつけることができます.これらを利用して,自分が作ったパッケージがhogeなら,次のようなディレクトリ構成にして,そこの package.xml と ```.rosinstall``` ファイルに依存関係を書きます. ``` hoge ├ src │ ├ hoge.cpp ├ CMakeLists.txt ├ hoge.rosinstall └ package.xml ``` ここでは ```hoge.rosinstall``` とパッケージ名に揃えましたが,その必要性はありません.が,このパッケージの依存関係が記載されている,ということがわかりやすいと思うのでこうしています. # 依存関係をインストールする これまでの方法をつかってしっかり依存関係を記述したならば,あとはそれを利用して自動的に依存するパッケージ類をインストールしましょう. このへんの方法についてはどうもみなさん試行錯誤されているようで,これといった回答が得られてません.ここでは現状,自分がうまくできている方法を紹介します. 以下,```~/catkin_ws/src/hoge```にhogeという自作パッケージがあり,それが他のライブラリに依存している例として説明します. ```bash cd ~/catkin_ws touch src/.rosinstall rosws merge src/hoge/hoge.rosinstall -t src rosws update -t src rosdep install --ignore-src --from-paths src -y ``` 以上のコマンドたちで,gitからcloneすることと,apt-getでインストールすることが完了します. 小細工をしているのは,rosws mergeの使い方で,事前に ```src``` 以下に空の ```.rosinstall``` を作ります.catkin を使うようになってから,この ```.rosinstall``` は使われなくなっていたため,ワークスペースには標準では存在しません.そこで,新たに空のファイルで作ります. rosws merge コマンドで,このワークスペース共通の ```.rosinstall``` ファイルに,パッケージ固有の内容をマージしてくる形になります.その後ワークスペース全体の依存関係を rosws update で更新,つまりgit cloneします. 次にrosdep install で,指定したパスにある package.xml ファイルを読み取って,apt-getでインストールできるものをインストールします.rosdep installについては,[追加で記事も書いた](https://qiita.com/strv/items/ccd89c55957bd8dfada0)のでそちらも参照してみてください. あとは普段つかっているツールでビルドするだけです.catkin_makeを使っている場合,ビルド順序の問題でビルドがこける場合があります.その時は数回実行してみると解決するとおもいます.catkin buildならそのへんは賢く解決してくれます. # まとめ ということで,依存関係の書き方と,それをもとにしたインストール方法を紹介しました.ただ,インストール方法についてはいまいちしっくり来てない部分もあるので,もうちょっといい方法がみつかったら更新したいと思います. 世の中的には wstools を使い方法が多いようなのですが,これのためだけにインストールするのもなぁ,と思ってroswsで実現してみました.なにか良い方法あったらコメントなどで教えてください.