概要
本記事では、自動運転 AIチャレンジのシミュレーション環境を導入して触ってみた!という内容です。なお、筆者はAutowareもros2も初心者なので、記述や認識に誤りがあるかもしれません。優しく見守っていただけると幸いです。
導入
基本的には、公式ドキュメントのSetupに書かれている内容に従います。筆者はUbuntuとDockerを使った環境を用いました。以下、少しだけ引っ掛かったポイントなどを記述します。
初期位置の設定について
ドキュメントにもある通り、
ros2 launch autoware_launch e2e_simulator.launch.xml vehicle_model:=golfcart sensor_model:=awsim_sensor_kit map_path:=/aichallenge/mapfile
で起動した後、初期位置とゴールの位置を設定する必要があります。
上の画像は左がAwsimで右がAutowareの画面なのですが、対応関係がパッと見わかりにくいです。
ここで、左のAwsimの緑色に光っている線(恐らく走行ルート)と右のAutowareの手書きの部分が対応しています。また初期位置は赤い矢印に書かれた部分に設定する必要があります。
手動操縦に関して
Awsimでは、手動操縦が可能です。
手動操縦は、上の画像のManualと書かれた部分をクリックしD
キーを押したあと矢印キーで行います。
Local EnvironmentとAutoware-Mini
自作のパッケージを作成するためには、公式ドキュメントのLocal Environmentを参考にdockerやコードをビルド・実行する必要があります。デフォルトでは、Autowareを用いて自動運転をシミュレーションしているのですが、Autowareは少し複雑なので、よりシンプルなAutoware-Miniを導入したほうが良さそうです。導入方法は公式ドキュメントのAutoware-Miniにあります。
ここで、これをlaunchするときはSetupにあったautoware_launch e2e_simulator.launch.xml
ではなくLocal Environmentにあった
cd /aichallenge
bash run.sh
で実行する必要があります。
自作パッケージを作って挙動を変えてみる
とりあえず、このシミュレーションをどの様にカスタムすればよいのかを学ぶため、試しに自作のパッケージを作ってみます。
自作パッケージでは、車両の制御部を変更し、経路計画を無視して前進し続けるパッケージを作成することを目標とします。
これを行うためにやるべきことは以下の2点です
-
trajectory_follower
に流れているplanning/scenario_planning/trajectory
というトピックを流れないようにする。そうすることにより、trajectory_follower
から出ている車両への指令値であるcontrol/trajectory_follower/control_cmd
を止めることができる。 - 自作で
planning/scenario_planning/trajectory
をsubscribeしてcontrol/trajectory_follower/control_cmd
をpublishするプログラムを書く。
1に関して、docker/aichallenge/aichallenge_ws/src/aichallenge_submit/autoware_universe_launch/tier4_control_launch/launch/control.launch.py
の69行目にある("~/input/reference_trajectory", "/planning/scenario_planning/trajectory"),
という部分を
# ("~/input/reference_trajectory", "/planning/scenario_planning/trajectory"),
("~/input/reference_trajectory", "/planning/scenario_planning/trajectory2"),
というような適当な名前に書き換えます。
また、2に関しては、docker/aichallenge/aichallenge_ws/src/
下に適当なパッケージを作成し、以下のようなノードを作成します。
from typing import List
import rclpy
from rclpy.node import Node
from autoware_auto_control_msgs.msg import AckermannControlCommand
from autoware_auto_planning_msgs.msg import Trajectory
class GoStraightAhead(Node):
def __init__(self) -> None:
super().__init__("control_cmd_subscriber")
self.pub = self.create_publisher(
AckermannControlCommand,
"/control/trajectory_follower/control_cmd",
10,
)
self.sub = self.create_subscription(
Trajectory,
"/planning/scenario_planning/trajectory",
self.listener_callback,
10,
)
self.sub
def listener_callback(self, msg: Trajectory):
print(msg)
cmd = AckermannControlCommand()
# ひたすら前進するように
cmd.longitudinal.speed = 10000.0
cmd.longitudinal.acceleration = 10000.0
self.pub.publish(cmd)
def main(args=None):
rclpy.init(args=args)
minimal_subscriber = GoStraightAhead()
rclpy.spin(minimal_subscriber)
minimal_subscriber.destroy_node()
rclpy.shutdown()
if __name__ == "__main__":
main()
結果
ひたすら前に進み続けるシミュレーションができました!