皆さんはROSパッケージの依存関係をちゃんと書いていますか?依存関係を正しく書いておけば別環境に移行してもちゃんと動くパッケージを作ることができるほか、依存パッケージのアップデートを一括で取り込む事も出来ちゃいます。package.xmlと.rosinstallを書いてsudo apt installから解放されましょう。
rosdep
多くのROSパッケージ(特にROS公式パッケージ)はrosdepで依存パッケージをインストールするのが最も簡単です。rosdepはpackage.xmlに書かれたdependタグからパッケージ名を特定して必要なものをapt installします。
package.xmlを書く
package.xmlはパッケージの名前や管理者の情報、そして依存関係を記述するためのROS用ファイルです。書き方は以下のような感じです。
<?xml version="1.0"?> <package format="2"> <name>my_package</name> <version>0.0.0</version> <description>The package to calculate 3D pose.</description> <maintainer email="ppdr@xxx.com">ppdr</maintainer> <license>MIT</license> <buildtool_depend>catkin</buildtool_depend> <depend>roscpp</depend><!-- ビルド時&実行時に依存するパッケージ --> <build_depend>eigen_conversions</build_depend><!-- ビルド時に依存するパッケージ --> <build_depend>my_other_package</build_depend><!-- ビルド時に依存するパッケージ --> <exec_depend>rospy</exec_depend><!-- 実行時に依存するパッケージ --> <exec_depend>python3-scipy</exec_depend><!-- 実行時に依存するパッケージ --> <export> </export> </package>
前半はパッケージに関する情報を記述している部分です。後半のこの部分で依存関係を定義しています。
<buildtool_depend>catkin</buildtool_depend> <depend>roscpp</depend><!-- ビルド時&実行時に依存するパッケージ --> <build_depend>eigen_conversions</build_depend><!-- ビルド時に依存するパッケージ --> <build_depend>my_other_package</build_depend><!-- ビルド時に依存するパッケージ --> <exec_depend>rospy</exec_depend><!-- 実行時に依存するパッケージ --> <exec_depend>python3-scipy</exec_depend><!-- 実行時に依存するパッケージ -->
<build_depend>はビルド時の依存でC++ライブラリ等が該当します。<exec_depend>は実行時の依存でpythonライブラリ等が該当し、<depend>は<build_depend>と<exec_depend>の両方を記述したのと同じ効果があります。
rosdepではこれらは特に区別しないので、どれかに書いておけばインストールしてくれます。
<depend>のパッケージ名は何を書いたら良い?
ここにはrosdepで管理されているパッケージ名を書く必要がありますが、管理されているパッケージ名はrosdep dbコマンドで一覧取得できます。例えばvelodyneパッケージのrosdepでのパッケージ名を知りたい場合は、
rosdep db | grep velodyne
のようにすることで分かります。velodyneの場合は
velodyne -> ros-noetic-velodyne velodyne_driver -> ros-noetic-velodyne-driver velodyne_laserscan -> ros-noetic-velodyne-laserscan ...
のような出力が表示されるので、velodyneやvelodyne_driverを<depend>タグに書けばOKです。ちなみに右側の表示は環境によって異なり、noeticならros-noetic-xxx、melodicならros-melodic-xxxのように環境ごとにインストールすべきパッケージを判断してくれます。
rosパッケージだけでなく、libyaml-devやpython3-scipyなどもrosdepでインストールすることができ、UbuntuやFedora、Debianなど環境ごとに適切なパッケージを判断してくれるのでとても便利です。
なお、管理されているパッケージの一覧はここでも見ることができます。
base.yaml
rosdep updateとrosdep install
package.xmlを書いたらrosdepによるパッケージのインストールが可能です。パッケージリストのアップデートはrosdep updateコマンド、パッケージの新規インストールorアップグレードはrosdep installコマンドで行います。
# リストのアップデート rosdep update # パッケージインストール rosdep install -iry --from-paths .
rosdep installコマンドはパッケージを指定してインストールすることもできますが、新しくクローンしてきたパッケージとかだとrospackリストに登録されていないと使えないので、今いるディレクトリ以下の全てのpackage.xmlに対して適用するオプションである”–from-paths .”をよく使います。
またオプション”-iry”は「ローカルにインストールされているパッケージ(自作パッケージ等)を無視する」「エラーがあっても中断しない」「インストール時の質問にはyesで答える」の意味です。
package.xmlに記述されているパッケージのインストールが全て完了したら、
#All required rosdeps installed successfully
が表示されると思います。これでrosdepによるパッケージインストールは完了です。
.rosinstall
ではrosdepによる管理がされていないパッケージを使いたい場合はどうしたら良いでしょうか。例えばDENSO製ロボット用のパッケージであるdenso_robot_rosパッケージはrosdep dbでは出てこず、githubから直接cloneしなければいけません。このようなgit cloneで取得する依存パッケージの記述方法として、.rosinstallファイルとvcstoolによるインストールがあります。