自動運転AIチャレンジ2024に参加する中で、C++のROS2パッケージをPythonパッケージに書き換える機会があったので実装方法を記載します。
自動運転AIチャレンジで利用しているコードはC++で記載されていますが、既存のpythonコードをサブモジュールとして活用したいと思い、Pythonパッケージへの変更を行いました。
- 構成
- Pythonへの書き換え手順
- ファイル構成の変更
- ソースコードのPythonへの変換
- setup.pyとsetup.cfgの作成
- package.xmlの修正
- Launchファイルの修正
- パッケージのビルド
- 最後に
構成
この大会では、自動運転システム用オープンソースソフトウェアAutowareの縮小構成したAutoware-Microを利用しています。
詳しくは以下のリンクでご確認いただけます。
automotiveaichallenge.github.io
今回は、path_to_trajectoryという車両の軌道を生成するパッケージの修正を行いました。
元々の構成:
aichallenge/workspace/src/aichallenge_submit/
├──aichallenge_submit_launch
│ └──launch/
│ └── reference.launch.xml
├──path_to_trajectory/
│ ├── set_route_client.py
│ ├── package.xml
│ ├── CMakeLists.txt
│ ├── include/path_to_trajectory/
│ │ └── path_to_trajectory.hpp
│ ├── src/
│ │ └── path_to_trajectory.cpp
Pythonへの書き換え手順
C++のROS2パッケージからPythonパッケージへの変更の、大まかな流れは以下の通りです。
- ファイル構成の変更
- ソースコードのPythonへの変換
- setup.pyとsetup.cfgの作成
- package.xmlの修正
- Launchファイルの修正
ファイル構成の変更
ディレクトリ構成をPythonパッケージ用に変更します。
構成:
aichallenge/workspace/src/aichallenge_submit/
├── aichallenge_submit_launch
│ └── launch/
│ └── reference.launch.xml
├── path_to_trajectory/
│ ├── path_to_trajectory/
│ │ ├── __init__.py
│ │ ├── path_to_trajectory_node.py
│ ├── resource/
│ │ └── path_to_trajectory
│ ├── setup.py
│ ├── setup.cfg
│ ├── package.xml
│ └── set_route_client.py
resource/ path_to_trajectoryも必要になるので、作成を行います。
ソースコードのPythonへの変換
具体的なコード内容は割愛しますが、path_to_trajectory.cppの内容をpythonに変更し、path_to_trajectory_node.pyへ記載します。*1
また、__init__.pyの空のファイルを作成します。
setup.pyとsetup.cfgの作成
setup.py
setup.pyは以下の内容で作成します。
from setuptools import setup, find_packages import os import glob package_name = 'path_to_trajectory' setup( name=package_name, version='0.0.0', packages=[package_name], data_files=[ ('share/ament_index/resource_index/packages', ['resource/' + package_name]), ('share/' + package_name, ['package.xml']), (os.path.join('share', package_name, 'launch'), glob.glob('launch/*xml')), ], install_requires=['setuptools'], zip_safe=True, maintainer='name', maintainer_email='name@todo.todo', description='TODO: Package description', license='TODO: License declaration', tests_require=['pytest'], entry_points={ 'console_scripts': [ 'path_to_trajectory_node = path_to_trajectory.path_to_trajectory_node:main', 'set_route_client = path_to_trajectory.set_route_client:main', ], }, )
setup.cfg
次にsetup.cfgを作成します。
このファイルを作成しないとエラーが発生し、Autowareが正常に動作しませんでした。
[develop] script_dir=$base/lib/path_to_trajectory [install] install_scripts=$base/lib/path_to_trajectory
package.xmlの修正
package.xmlは以下の内容に修正を行いました。
<?xml version="1.0"?> <package format="3"> <name>path_to_trajectory</name> <version>0.0.0</version> <description>TODO: Package description</description> <maintainer email="name@todo.todo">name</maintainer> <license>TODO: License declaration</license> <buildtool_depend>ament_cmake</buildtool_depend> <buildtool_depend>ament_python</buildtool_depend> <depend>rclpy</depend> <depend>autoware_auto_planning_msgs</depend> <depend>visualization_msgs</depend> <test_depend>ament_lint_auto</test_depend> <test_depend>ament_lint_common</test_depend> <export> <build_type>ament_python</build_type> </export> </package>
Launchファイルの修正
launch.xmlのファイルでpath_to_trajectoryを参照している部分を変更します。
パッケージ名などを修正している場合は、合わせて修正を行ってください。
<!-- Customizable --> <node pkg="path_to_trajectory" exec="path_to_trajectory_node" name="path_to_trajectory" output="screen"> <remap from="input" to="/planning/scenario_planning/lane_driving/behavior_planning/path_with_lane_id"/> <remap from="output" to="/planning/scenario_planning/trajectory"/> </node>
パッケージのビルド
上記の修正を実行後は、パッケージをビルドし動作を確認します。
問題なく書き換えができている場合は、C++と同じ動作が確認できます。
最後に
今回はROS2のC++パッケージをPythonパッケージへ修正する方法を記載しました。
調べてみると紹介した方法以外でも変更が可能なようですが、どの方法が最適かはわかっていない部分があるので、時間があるときに調べたいと思っています。
また、処理の速さはC++のほうが早かったため、C++での機能実装も検討したいです。
*1:ChatGPTなどを活用することで、比較的簡単に書き換えは可能です。