Carla自動運転シミュレーターの基本アーキテクチャ

Carlaは、Unreal Engine 4上に構築されたオープンソースの自動運転シミュレーターです。C++とPythonの両方のインターフェースを完全に公開しており、OpenDriveやOpenScenarioといった標準規格、Responsibility Sensitive Safety(RSS)にも対応しています。

本記事では、Carlaの中核をなす以下の概念について解説します。

  • WorldとClient
  • アクターとブループリント
  • マップとナビゲーション
  • センサーとデータ

1. WorldとClient

クライアント(Client)は、シミュレーション上で情報を要求したり変更を加えたりするモジュールです。IPアドレスとポート番号を用いてサーバーと通信し、ワールドに接続して車両制御やシミュレーション環境の操作を行います。複数のクライアントを同時に実行することも可能です。

クライアントの生成は以下のように行います。

client = carla.Client('localhost', 2000)

接続のタイムアウト時間を設定することもできます。

client.set_timeout(10.0) # 秒単位

ワールド(World)はシミュレーション環境そのものを表します。アクターの生成、天候変更、現在の世界状態の取得などの主要メソッドを提供する抽象層です。シミュレーションには常に一つのワールドのみが存在し、マップが変更されると破棄されて新しいものに置き換わります。

現在のワールドへの接続は以下の通りです。

world = client.get_world()

特定のワールドに接続する場合は、マップ名を指定します。

world = client.load_world('Town01')

各ワールドオブジェクトにはID(episode)が割り当てられており、load_world()reload_world()が呼ばれると古いワールドは破棄されます。

2. アクターとブループリント

ブループリント(Blueprint)は、アクターを生成するためのテンプレートモデルです。車両、歩行者、センサーなど、それぞれに形状や属性が定義されています。

ブループリントの管理はcarla.BlueprintLibraryクラスを通じて行います。

blueprint_library = world.get_blueprint_library()

特定のブループリントを検索するにはfind()filter()を使用します。

# 特定のブループリントを検索
collision_sensor_bp = blueprint_library.find('sensor.other.collision')
# ワイルドカードでフィルタリング
vehicle_bp = random.choice(blueprint_library.filter('vehicle.*.*'))

アクター(Actor)は、車両、歩行者、センサー、交通標識、信号機など、シミュレーション内のオブジェクトを指します。アクターのライフサイクルは「生成→操作→破棄」の三段階です。

生成にはブループリントとcarla.Transform(位置と回転)が必要です。

transform = Transform(Location(x=230, y=195, z=40), Rotation(yaw=180))
actor = world.spawn_actor(blueprint, transform)

アクターの破棄は明示的に行う必要があります。

destroyed_sucessfully = actor.destroy()  # 成功時Trueを返す

各アクタータイプの特徴は以下の通りです。

  • センサー: データストリームを生成します。カメラやLiDARなどがあり、listen()メソッドでデータ受信時の処理を定義します。
  • 観客(Spectator): ゲーム内カメラの視点を制御します。
  • 車両(Vehicle): carla.VehicleControlで速度や操舵を制御します。
  • 歩行者(Walker): carla.WalkerControlで移動を制御し、AIコントローラーも利用可能です。

3. マップとナビゲーション

マップ(Map)は、シミュレーションの地形情報を管理するオブジェクトで、OpenDRIVE 1.4形式で道路情報を記述します。Carlaには7種類のマップが用意されています。

マップの変更はワールドと連動します。

world = client.load_world('Town01')

ナビゲーションは、ウェイポイント(Waypoint)クラスを用いて実現します。ウェイポイントは道路上の点を表し、以下のメソッドで経路を構築します。

  • next(d): 車線方向に距離dだけ進んだウェイポイントのリストを返す
  • previous(d): 反対方向のウェイポイントを返す
  • get_right_lane() / get_left_lane(): 隣接車線のウェイポイントを返す
# 前方2メートルのウェイポイントを取得
next_waypoints = waypoint.next(2.0)

マップオブジェクトから推奨生成ポイントを取得することも可能です。

spawn_points = world.get_map().get_spawn_points()

特定の位置に最も近いウェイポイントを取得するには、get_waypoint()get_waypoint_xodr()を使用します。

4. センサーとデータ

センサーは特定のイベントを待ち受け、シミュレーションからデータを収集するアクターです。通常は車両に取り付けて使用します。ブループリントライブラリには様々なセンサーが定義されています。

以下はRGBカメラを車両に取り付け、取得した画像をディスクに保存する例です。

camera_bp = blueprint_library.find('sensor.camera.rgb')
camera = world.spawn_actor(camera_bp, relative_transform, attach_to=my_vehicle)
camera.listen(lambda image: image.save_to_disk('output/%06d.png' % image.frame))

タグ: CARLA 自動運転シミュレーター Unreal Engine OpenDRIVE ブループリント

7月30日 21:44 投稿