🚘

自動運転AIチャレンジ throttleを変更するノードを作成

2024/01/08に公開

背景

自動運転AIチャレンジ2023(シミュレーション)に参加しており、自作AIの構築とAutoware環境への組み込みにチャレンジしたいと考えております。まずは、生成された経路に対して、アクセル・ブレーキの制御を出力するAIの構築を目指したいと思います。本記事では準備段階として、推定された経路をあらかじめ設定した制御値で走行させるノードの作成について記載します。

環境

以下のaichallenge2023-racingのリポジトリを使用しております。

https://github.com/AutomotiveAIChallenge/aichallenge2023-racing

方針

今回は本大会のベースのフレームワークの一つとなる Autoware microを使用します。
※Autoware microの詳細についてはこちらをご参照ください

image.png

Autoware micoroでは、経路生成時に走行する座標と各座標の目標速度を推定し、Trajectory データにそれらの情報を格納しておき、それに従って、simple_pure_pursuit ノードが制御コマンドを決定しています。そのため、本来はシーンに合わせてAIに最適な速度を推定させ、Trajectoryデータに格納した方がいいのですが、その場合はAIが一度の推定で複数(Trajectoryのポイント分)の出力をする必要があります。
初心者の私が複雑なノードを作成するのは困難なため、より簡易的な制御方法を考えます。

Autoware micoroでは以下のように dallara_interface ノードから "/vehicle_inputs" というトピックを送信して、車両を制御しています。

Screenshot from 2023-12-29 14-30-50.png

今回は、dallara_interfaceからトピックを受信し、新たに"/vehicle_inputs"トピックを送信するノードを作成します。これにより、作成したノード内でAutowareが推定した制御値を変更することができます。
image.png

実装

トピックの送受信の編集

dallara_interface が送信するトピック名を変更します。具体的には下記のようにdallara_interfac.cppを修正しビルドします。これにより、車両には dallara_interface からの制御値が直接送信されなくなります。

https://github.com/AutomotiveAIChallenge/aichallenge2023-racing/commit/c1817b8917483e035cf51cd1c2eead5731df3cca

スクリプトの作成

結論として、下記のスクリプトを作成しました。ROS2のパッケージ作成についてはこちらのページなどをご参照ください。

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import time
import rclpy
from rclpy.node import Node
from autonoma_msgs.msg import VehicleInputs


class vel_throttle_setter(Node):
    def __init__(self):
        super().__init__('vel_throttle_setter')

        # dallara_interface からトピックを受信
        self.create_subscription(VehicleInputs, "/vehicle_inputs_prepare", self.onTrigger, 1)

        # AWSIM にトピックを送信
        self.vehicle_inputs_pub_ = self.create_publisher(VehicleInputs, "/vehicle_inputs", 1)

        # throttle を 10 で固定とする
        self.throttle = 10.0

    def onTrigger(self, msg):
        msg.throttle_cmd = self.throttle
        # トピックを送信
        self.vehicle_inputs_pub_.publish(msg)

def main(args=None):
    print('Hi from vel_throttle_setter.')
    rclpy.init(args=args)
    node = vel_throttle_setter()
    rclpy.spin(node)

    node.destroy_node()
    rclpy.shutdown()


if __name__ == '__main__':
    main()

作成したパッケージの全体は以下になります。

https://github.com/bushio/vehicle_inputs_setter/tree/v1.1

実行手順

準備

実行のためには3つのターミナルを起動します。また、事前にAIチャレンジ2023のdockerコンテナの中に入っていることが前提になります。AIチャレンジ2023のdockerコンテナへの入り方は下記になります。

cd ~/aichallenge2023-racing/docker/train/
bash build_docker.sh
bash run_container.sh 

AIチャレンジ2023のdocker コンテナの詳細についてはこちらをご参照ください。

実行

1つ目のターミナルでAWSIMを起動します。

cd /aichallenge/
bash build_autoware.sh
bash run_awsim.sh

2つ目のターミナルでAutowareを起動します。dallara_interface を変更したため、この時点では車両にトピックが送信されてないので車両は停止したままです。

cd /aichallenge/
bash run_autoware.sh

3つ目のターミナルで作成したノードを起動します。起動後に車両が走行を開始します。

cd /aichallenge/
ros2 run vehicle_inputs_setter vel_throttle_setter

結果

https://www.youtube.com/watch?v=pBW0bjYHMJ0

throttle=10 で固定にしたため、速度は遅いですが、最初のシケイン以外はレーンからほぼ外れることなく走行することができました。ただ、throttle=10 ではかなり遅いので、AIにより最適な制御値を推定させる必要があります。

まとめ

今回はAIチャレンジ2023(シミュレーション)のAI構築に向けた準備として、あらかじめ設定した制御値で経路を走行させる方法を記載しました。今後はこちらのノードを使用し、AI構築のための訓練データの収集を行って行きたいと思います。

Discussion