ROS2でパッケージを作成してから使うまでの流れ【Python3】

ROS

ロボットを使う人ならお馴染みのROS。

今回はその最新バージョンROS2(Foxy)で、パッケージを作成して使うまでの流れをご紹介したい思います。環境はUbuntu20.04、言語はPythonを想定しています。

内容はROS2の公式チュートリアル[1]https://docs.ros.org/en/foxy/Tutorials.htmlに準拠、情報を付け加えています。

ROS2の用語については、こちらの記事も参考にしてみてください。

パッケージ作成から使うまでの流れ

詳細に入る前に、まずは全体の流れを俯瞰します。

  1. ROS2の環境設定
    (任意のディレクトリでsource /opt/ros/foxy/setup.bash
  2. ワークスペースを作る
    (任意のディレクトリでmkdir -p ~/<workspace_name>/src
  3. パッケージを作る
    ~/<workspace_name>/srcros2 pkg create --build-type ament_python <package_name>
  4. 依存パッケージを解決する
    ~/<workspace_name>rosdep install -i --from-path src --rosdistro foxy -y
  5. パッケージをビルドする
    ~/<workspace_name>colcon build
  6. パッケージの設定を反映
    (新しいターミナルを開いて~/<workspace_name>に移動し、source install/setup.bash
  7. パッケージを使う(ノードを起動する)
    (任意のディレクトリでros2 run <package_name> <executable_name>




ROS2の環境設定

前提として、ROS2(Foxy)がインストールされていることとします。
ターミナルでROS2を使えるようにするために(ROS2の環境変数やライブラリのパスの設定を反映するために)、以下を実行[2]毎回実行するのは面倒なので.bashrcに書き込んでしまうのが楽です

source /opt/ros/foxy/setup.bash

sourceは対象ファイルに書かれたコマンドを現在のシェルで実行するコマンド。

ここで反映したROSに関する環境設定の情報は、printenv | grep -i ROSで確認できる。

ワークスペースを作る

ワークスペースのためのディレクトリを作るために、以下のコマンドを実行。

mkdir -p ~/<workspace_name>/src

ここでsrc/はパッケージを置くためのディレクトリ。ROSのパッケージはワークスペースのsrc/に置くことが推奨されているので、先んじて作っておきます。

パッケージを作る

~/<workspace_name>/src以下にパッケージを作成するために、以下のコマンドを実行。

ros2 pkg create --build-type ament_python <package_name>

ちなみに、以下のような便利なオプションがあります。

  • —node-name <node_name>:パッケージ内にノード用のスクリプト(<excutable_name>.py)を自動で作成。
  • --dependencies <dependency>:package.xml、 CMakeLists.txtに依存ライブラリ(<dependency>)を自動で記述。

ros2 pkg createで出来上がるファイル構造は以下のとおり。

<package_name>/
   package.xml
   resource/
   setup.cfg
   setup.py
   test/
   <package_name>/

この<package_name>/<package_name><excutable_name>.pyを作り、ノードとして実行したい処理を実装します。

ちなみに、PythonでROS2パッケージを作るときの最小構成は以下。

ファイル名内容
package.xmlパッケージに関するメタ情報。依存パッケージ(<excutable_name>.py内でimportしたライブラリなど)をここに書く。
setup.pyパッケージのインストールに関する情報。package.xmlに書いたのと全く同じdescriptionやlicenseなどの情報を書く必要。
setup.cfg<excutable_name>.pyを実装した場合、ros2 runで実行できるようにするために必須。
/<package_name><excutable_name>.pyを格納。ディレクトリ名はパッケージ名と同じにする。また、__init__.pyを含んでいる必要がある。

依存パッケージを解決する

ビルドを待ってから依存関係のエラーで苦しむのを避けるため、以下のコマンドを実行。

rosdep install -i --from-path src --rosdistro foxy -y

rosdepはパッケージの依存関係を確認し、問題がある場合は解決するためのツール。依存関係はROS2のパッケージ、aptでインストールできるパッケージについては解決できる。

パッケージをビルドする

ワークスペースのルートに移動して、全てのパッケージを一括でビルドする。

cd ~/<workspace_name>
colcon build

colconは依存関係がある複数のパッケージを正しくビルドするためのツール。 環境やCPU数にもよりますが、並行処理可能[3]https://colcon.readthedocs.io/en/released/reference/executor-arguments.html

以下の便利なオプションがあります。

  • --packages-select <target_package>:任意のパッケージだけをビルドする。
  • --symlink-install:ビルド時にファイルコピーの代わりにシンボリックリンクを使用する。このオプションをつけてビルドしておくと、ビルド後にPythonスクリプトを弄る度にリビルドする必要がなくなる。

ビルドのアウトプットはinstall/に保存される。

色々作業をしていると、キャッシュが原因でビルドエラーが発生することがあるかもしれません。その場合は、--cmake-clean-cacheオプションでキャッシュを削除してビルドします。

パッケージの設定を反映

ビルド完了後、新しいターミナルを開いて、ワークスペースのルートでsource install/setup.bash[4]ワークスペースの設定ファイルを実行。
ビルドしたのと同じターミナルでsourceすると、やっかいな問題を引き起こしかねないので、必ず新しいターミナルで行うこと。

Before sourcing the overlay, it is very important that you open a new terminal, separate from the one where you built the workspace. Sourcing an overlay in the same terminal where you built, or likewise building where an overlay is sourced, may create complex issues.

https://docs.ros.org/en/foxy/Tutorials/Workspace/Creating-A-Workspace.html

これでワークスペースの設定が反映されて、新しいパッケージを使用できるようになる[5]オーバレイがアンダーレイより優先されて実行されるようになる

パッケージを使う(ノードを起動する)

以下のコマンドでパッケージ内のノードを実行。

ros2 run <package_name> <executable_name(ノードの処理を書いたPythonスクリプト)>

ros2 runを使うことで、パッケージに含まれる実行ファイルを(パスを指定せずに)実行できる。
python3 <excutable_nameへのパス>で起動する方法もあるが、ros2 runでは、便利なオプション(例えばノード名を変更するなど)が利用できる。

注釈

注釈
1 https://docs.ros.org/en/foxy/Tutorials.html
2 毎回実行するのは面倒なので.bashrcに書き込んでしまうのが楽です
3 https://colcon.readthedocs.io/en/released/reference/executor-arguments.html
4 ワークスペースの設定ファイル
5 オーバレイがアンダーレイより優先されて実行されるようになる

コメント