rosdepによる依存関係の管理
目標: rosdepを使用して外部依存関係を管理する。
チュートリアルレベル: 中級
所要時間: 5分
このチュートリアルでは、rosdepを使用して外部依存関係を管理する方法を説明します。
警告
現在、rosdepはLinuxとmacOSでのみ動作します。Windowsはサポートされていません。 https://github.com/ros-infrastructure/rosdepにWindowsサポートの追加を目指した長期計画があります。
rosdepとは?
rosdepは、パッケージと外部ライブラリで動作する依存関係管理ユーティリティです。 パッケージのビルドやインストールのための依存関係を特定してインストールするコマンドラインユーティリティです。 rosdepはそれ自体がパッケージマネージャーではありません。システムと依存関係についての独自の知識を使用して、特定のプラットフォームにインストールする適切なパッケージを見つけるメタパッケージマネージャーです。 実際のインストールは、システムのパッケージマネージャー(例:Debian/Ubuntuのapt、Fedora/RHELのdnfなど)を使用して行われます。
ワークスペースをビルドする前に最もよく呼び出され、そのワークスペース内のパッケージの依存関係をインストールするために使用されます。
単一のパッケージや複数のパッケージのディレクトリ(例:ワークスペース)に対して動作する能力があります。
注意
名前からROS用であることが示唆されますが、
rosdepはROSに対して半独立的です。 スタンドアロンのPythonパッケージとしてインストールすることで、ROS以外のソフトウェアプロジェクトでもこの強力なツールを活用できます。rosdepを正常に実行するにはrosdep keysが利用可能である必要があり、これはいくつかの簡単なコマンドで公開gitリポジトリからダウンロードできます。
package.xmlファイルについて
package.xmlは、rosdepが依存関係のセットを見つけるソフトウェア内のファイルです。 package.xml内の依存関係のリストが完全で正確であることが重要で、これによりすべてのツールがパッケージの依存関係を判断できます。 依存関係の欠落や間違いは、ユーザーがあなたのパッケージを使用できない、ワークスペース内のパッケージが順番通りにビルドされない、パッケージがリリースできないという問題を引き起こす可能性があります。
package.xmlファイル内の依存関係は、一般的に「rosdep keys」と呼ばれます。 これらの依存関係は、パッケージの作成者によってpackage.xmlファイルに手動で入力され、必要とするすべての非組み込みライブラリとパッケージの網羅的なリストであるべきです。
これらは以下のタグで表現されます(完全な仕様についてはREP-149を参照):
<depend>
これらは、パッケージのビルド時と実行時の両方で提供される必要がある依存関係です。 C++パッケージの場合、迷った時はこのタグを使用してください。 純粋なPythonパッケージは一般的にビルドフェーズがないため、これを使用すべきではなく、代わりに<exec_depend>を使用すべきです。
<build_depend>
パッケージのビルドにのみ特定の依存関係を使用し、実行時には使用しない場合、<build_depend>タグを使用できます。
この種類の依存関係では、パッケージのインストール済みバイナリはその特定のパッケージがインストールされている必要はありません。
ただし、パッケージがこの依存関係からのヘッダーを含むヘッダーをエクスポートする場合、問題が発生する可能性があります。 その場合、<build_export_depend>も必要になります。
<build_export_depend>
依存関係からのヘッダーを含むヘッダーをエクスポートする場合、あなたのパッケージに<build_depend>する他のパッケージによって必要になります。 これは主にヘッダーとCMake設定ファイルに適用されます。 エクスポートするライブラリによって参照されるライブラリパッケージは、通常、実行時にも必要なため、<depend>を指定すべきです。
<exec_depend>
このタグは、パッケージを実行する際に必要な共有ライブラリ、実行可能ファイル、Pythonモジュール、起動スクリプト、その他のファイルの依存関係を宣言します。
<test_depend>
このタグは、テストでのみ必要な依存関係を宣言します。 ここでの依存関係は、<build_depend>、<exec_depend>、または<depend>で指定されたキーと重複すべきではありません。
rosdepはどのように動作するのか?
rosdepは、そのパス内のpackage.xmlファイルまたは特定のパッケージをチェックし、その中に保存されているrosdep keysを見つけます。 これらのキーは、中央インデックスと照合され、様々なパッケージマネージャー内の適切なROSパッケージやソフトウェアライブラリを見つけます。 最後に、パッケージが見つかると、それらがインストールされて準備完了です!
rosdepは、毎回実行時にネットワークにアクセスする必要がないように、中央インデックスをローカルマシンに取得することで動作します(Debian/Ubuntuでは、その設定は/etc/ros/rosdep/sources.list.d/20-default.listに保存されています)。
中央インデックスはrosdistroとして知られており、オンラインで見つけることができます。 次のセクションでそれをより詳しく探求します。
package.xmlに何のキーを入れればよいかどうやって知るの?
素晴らしい質問ですね、聞いてくれてうれしいです!
パッケージで依存したいパッケージがROSベースで、ROSエコシステムにリリースされている場合(例:
nav2_bt_navigator)、単純にパッケージの名前を使用できます。 お使いのROSディストリビューションのリリース済みROSパッケージのリストは、https://github.com/ros/rosdistroの<distro>/distribution.yaml(例:humble/distribution.yaml)で見つけることができます。ROS以外のパッケージ、いわゆる「システム依存関係」に依存したい場合は、特定のライブラリのキーを見つける必要があります。 一般的に、興味のあるファイルは2つあります:
rosdep/base.yamlには
aptシステム依存関係が含まれていますrosdep/python.yamlにはPython依存関係が含まれています
キーを見つけるには、これらのファイルであなたのライブラリを検索し、名前を見つけます。 これがpackage.xmlファイルに入れるキーです。
例えば、パッケージが品質の高いドキュメント(ヒントヒント)を気にかける素晴らしいソフトウェアであるdoxygenに依存していると想像してください。 rosdep/base.yamlでdoxygenを検索すると、以下に遭遇します:
doxygen:
arch: [doxygen]
debian: [doxygen]
fedora: [doxygen]
freebsd: [doxygen]
gentoo: [app-doc/doxygen]
macports: [doxygen]
nixos: [doxygen]
openembedded: [doxygen@meta-oe]
opensuse: [doxygen]
rhel: [doxygen]
ubuntu: [doxygen]これは、私たちのrosdep keyがdoxygenであることを意味し、インストール用に異なるオペレーティングシステムのパッケージマネージャーでのこれらの様々な名前に解決されることを示しています。
ライブラリがrosdistroにない場合はどうすればよいか?
ライブラリがrosdistroにない場合、オープンソースソフトウェア開発の素晴らしさを体験できます:自分で追加できるのです! rosdistroのプルリクエストは通常1週間以内によくマージされます。
新しいrosdep keysの貢献方法についての詳細な手順はこちらで見つけることができます。 何らかの理由でこれらが公開的に貢献できない場合、rosdistroをフォークして使用のための代替インデックスを維持することが可能です。
rosdepツールはどうやって使うのか?
rosdepのインストール
ROS と共に rosdep を使用している場合、ROS ディストリビューションと一緒に便利にパッケージ化されています。 これがrosdepを取得する推奨方法です。 以下でインストールできます:
sudo apt-get install python3-rosdep注意
DebianとUbuntuでは、
python3-rosdep2という同様の名前の別のパッケージがあります。 そのパッケージがインストールされている場合、python3-rosdepをインストールする前に必ず削除してください。
ROS以外でrosdepを使用している場合、システムパッケージが利用できない可能性があります。 その場合、https://pypi.orgから直接インストールできます:
pip install rosdeprosdepの動作
rosdep、package.xml、rosdistroについてある程度理解したので、ユーティリティ自体を使用する準備ができました! まず、rosdepを初めて使用する場合は、以下で初期化する必要があります:
sudo rosdep init
rosdep updateこれにより、rosdepが初期化され、updateはローカルにキャッシュされたrosdistroインデックスを更新します。 最新のインデックスを取得するために、時々rosdepをupdateすることは良いアイデアです。
最後に、rosdep installを実行して依存関係をインストールできます。 通常、これはワークスペースの多くのパッケージに対して単一の呼び出しですべての依存関係をインストールするために実行されます。 ソースコードを含むsrcディレクトリを持つワークスペースのルートにいる場合、その呼び出しは以下のように表示されます。
rosdep install --from-paths src -y --ignore-srcこれを分解すると:
--from-paths srcは、rosdep keysを解決するためにpackage.xmlファイルをチェックするパスを指定します-yは、プロンプトなしでインストールするためにパッケージマネージャーからのすべてのプロンプトにデフォルトでyesを意味します--ignore-srcは、rosdep keyが存在していても、パッケージ自体もワークスペースにある場合は依存関係のインストールを無視することを意味します
追加の引数とオプションが利用可能です。 それらを見るにはrosdep -hを使用するか、http://docs.ros.org/en/independent/api/rosdep/html/でrosdepのより完全なドキュメントを参照してください。