Help us understand the problem. What is going on with this article?

野良packageへ依存したROS packageのビルドを簡単にする

野良packageへ依存したROS package

そもそもタイトルのこれがなんなのか,というと,ようはオレオレROS packageをいくつも作っていき,それらが依存関係を持ったもの,です.
一人で開発している分にはそれらがどう依存しても構わないのですが,他の人にもそのパッケージをビルドしてもらおうとすると,依存関係を解決してもらわないといけません.ここでは,そういった依存関係を簡単に解決する,というよりはちゃんと記述できる方法を紹介し,それを利用した依存関係の自動解決・インストール方法を説明します.

ちなみに個人的にROS kineticを使っているので,ここで紹介する方法はkineticでのみ動作確認しています.

依存関係を記述する

package.xml をちゃんと書く

ROSにはもともと依存関係を package.xml に記述する仕組みがあります.まずはこれに則って,きちんと記述しましょう.なお, package.xml にはフォーマットのバージョンが1と2があります.ROS kinetic では, catkin_create_pkg で生成すると,勝手にバージョン1のテンプレートを使われてしまいますが,公式サイトにしたがって,バージョン2で書くようにしましょう.とくに依存関係で手間が減らせます.

まずは,ここに必ず必要な依存パッケージを記述しましょう.自分が作った,もしくは公式リポジトリにはなくgithubなどにあるような野良のパッケージであっても,そのパッケージ内にある package.xml の <name> タグで指定されたパッケージ名称を記載すればOKです.

なお,ROS側の公式サイトではわかりにくいのですが, package.xml の依存関係の要素には,ROSと関係ない外部のライブラリなども記載が可能です
例えば,ROSでもよく使われている数学ライブラリであるEigenなんかも,

<build_depend>eigen</build_depend>

のように記載できます.
ただし,ここに記載する名称が若干あやふやでよくわかってません.eigenみたいにrun-time libraryとして供給されていないものの場合は上記のようにかき,gstreamerのようなものの場合は

<build_depend>libgstreamer0.10-dev</build_depend>

のように,記載することとなっています.

パッケージのありかを示す

後述の依存関係の自動インストールの段階で,リポジトリにあるパッケージであればapt-getでインストールされるのですが,そうではないものについてはgit cloneしてきてビルドすることになります.当然ながら, package.xml には依存するパッケージ名しか記述していないため,その依存パッケージがどこのリポジトリに置かれているのか明示する必要があります.

そこで利用するのが .rosinstall ファイルです.これはかつてROSそのものをインストールするときに使われていたファイルなのですが,これを使うことでパッケージとリポジトリの対応を取ることができます.

.rosinstall ファイルの中身はyamlで記述されたテキストファイルです.フォーマットは公式サイトに記載がありますが,正直説明が足りてません.ちなみに,git以外にもsvn等のリポジトリにも対応していますが,試したことはないです.

gitの説明だけ抜き出してくると,ファイルフォーマットは下記のように説明されています.

- git: {local-name: /some/local/aboslute/path, uri: http://some/uri, version: 123}

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という自作パッケージがあり,それが他のライブラリに依存している例として説明します.

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については,追加で記事も書いたのでそちらも参照してみてください.

あとは普段つかっているツールでビルドするだけです.catkin_makeを使っている場合,ビルド順序の問題でビルドがこける場合があります.その時は数回実行してみると解決するとおもいます.catkin buildならそのへんは賢く解決してくれます.

まとめ

ということで,依存関係の書き方と,それをもとにしたインストール方法を紹介しました.ただ,インストール方法についてはいまいちしっくり来てない部分もあるので,もうちょっといい方法がみつかったら更新したいと思います.
世の中的には wstools を使い方法が多いようなのですが,これのためだけにインストールするのもなぁ,と思ってroswsで実現してみました.なにか良い方法あったらコメントなどで教えてください.

strv
ロボットつくるひと.ソフトは苦手.ロボットベンチャーで働いてるよ
http://strv.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした