【自動運転AIチャレンジ2024】C++のROSパッケージをPythonのパッケージに修正する

自動運転AIチャレンジ2024に参加する中で、C++のROS2パッケージをPythonパッケージに書き換える機会があったので実装方法を記載します。

自動運転AIチャレンジで利用しているコードはC++で記載されていますが、既存のpythonコードをサブモジュールとして活用したいと思い、Pythonパッケージへの変更を行いました。

構成

この大会では、自動運転システム用オープンソースソフトウェア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パッケージへの変更の、大まかな流れは以下の通りです。

  1. ファイル構成の変更
  2. ソースコードのPythonへの変換
  3. setup.pyとsetup.cfgの作成
  4. package.xmlの修正
  5. 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などを活用することで、比較的簡単に書き換えは可能です。

執筆担当者プロフィール
寺澤 駿

寺澤 駿(日本ビジネスシステムズ株式会社)

IoTやAzure Cognitive ServicesのAIを活用したデモ環境・ソリューション作成を担当。

担当記事一覧