1. マップの読み込み:CARLAワールドへの第一歩
CARLAシミュレーション環境において最も基本的かつ重要なステップであるマップの読み込みについて解説します。CARLAをインストールしたばかりで、クライアントウィンドウが真っ黒な状態で何をすればよいか戸惑うかもしれません。心配しないでください。多くの開発者が同じ経験をします。CARLAの世界を「活性化」させる鍵は、適切なマップを読み込むことです。これは単なるシーンの表示ではなく、すべての自動運転アルゴリズムをテストするための舞台となります。
では、CARLAにおけるマップとは何でしょうか?それは非常に高精度な仮想都市の模型であり、道路、建物、交通標識、街灯、植生、さらには動的な気象システムや照明システムが含まれています。Pythonスクリプトを介してCARLAサーバーと通信し、コマンドを送信することでこの模型を「呼び出す」ことができます。最も一般的なコマンドは simulator.load_environment('Town01') です。ここで simulator はCARLAサーバーに接続されたクライアントオブジェクトであり、'Town01' は読み込むマップの名前です。グラフィカルインターフェースに依存するのではなく、コードですべてを制御する習慣を早めに身につけることを強くお勧めします。これこそが自動化テストとバッチシミュレーションの出発点です。
コードを記述する前に、環境を正しく設定する必要があります。多くの初心者はこのステップでつまずきますが、それはコードが難しいからではなく、パス設定が正しくないからです。CARLAのPython APIは「egg」ファイルまたはソースコードの形式でインポートする必要があります。公式チュートリアルに従ってCARLAを解凍した場合、通常 PythonAPI フォルダが存在します。プロジェクト内にスクリプトを作成し、このパス問題を専門に処理するのが私の一般的なアプローチです。以下のコードブロックは、私が何度も使用してきた「万能の始まり」であり、そのままコピーして使用できます。
import glob
import os
import sys
# CARLA eggファイルのインポートを試行(リリース版向け)
try:
carla_path = glob.glob('../carla/dist/carla-*%d.%d-%s.egg' % (
sys.version_info.major,
sys.version_info.minor,
'win-amd64' if os.name == 'nt' else 'linux-x86_64'))[0]
sys.path.append(carla_path)
except IndexError:
pass
# PythonAPIソースコードパスの追加(ソースビルド版または開発版向け)
try:
base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_path + '/carla')
except:
pass
import carla
このコードの役割はCARLAモジュールのパスを自動的に見つけて追加することです。最初の try ブロックは起動子(CarlaUE4.sh)で実行されるプリコンパイル版向けで、.egg ファイルを探します。2番目の try ブロックはソースコードからビルドした場合向けで、直接 PythonAPI/carla ディレクトリを指します。この始まりがあれば、後続の import carla はほとんど問題なく動作するはずです。
次に、サーバーに接続し、利用可能なマップを確認します。これは遊園地に行った最初に導览地図を受け取るのと同じくらい重要です。
# CARLAサーバーへの接続
simulator = carla.Client('localhost', 2000)
simulator.set_timeout(10.0) # タイムアウト設定、ネットワーク問題によるフリーズを防ぐ
# 利用可能なすべてのマップを取得
map_list = simulator.get_available_maps()
print(f"{len(map_list)} のマップが利用可能です:")
for map_name in map_list:
print(map_name)
このコードを実行すると、長いリストが表示されます。CARLA 0.9.12バージョンでは、出力はおおよそ次のようになります:/Game/Carla/Maps/Town01, /Game/Carla/Maps/Town02, /Game/Carla/Maps/Town01_Opt, /Game/Carla/Maps/Town10HD など。ここで重要な概念が登場します:マップは非階層マップ(Non-layered maps)と階層マップ(Layered maps)の2大カテゴリに分けられます。_Opt 接尾辞が付いているものが階層マップです。現時点では、この事実を知っていれば十分です。まずは最もシンプルな非階層マップを使用して、最初のワールドを作成してみましょう。
# 非階層マップ(例:Town01)を読み込む
env = simulator.load_world('Town01')
print(f"現在のワールドマップ:{env.get_map().name}")
すべてが順調であれば、CARLAサーバーウィンドウが真っ黒から完全な都市シーンに変わるはずです。道路、建物、空があるでしょう。おめでとうございます!CARLAワールドの扉を成功裏に開きました!この env オブジェクトは、後続のすべての操作の基盤となります。車両の生成、センサーの配置、情報の取得はすべてこのオブジェクトを介して行われます。この新しく読み込まれた Town01 で、まずはマウスとWASDキーを使用してサーバーウィンドウ内を散策し、この基本都市のレイアウトに慣れることをお勧めします。その規模と詳細を感じることは、後続のテストルート設計に非常に役立ちます。
1.1 非階層マップの理解:8つの特徴的なテスト都市
読み込みが成功したら、作業に適したマップを選ぶ必要があります。CARLAに組み込まれている非階層マップは8枚あり、Town01 から Town07 まで、そして Town10HD があります。これらは単なるコピーペーストではなく、それぞれが明確な特徴と特定のテストシーンを持っています。適切なマップを選ぶと、テスト効率は倍増します。間違ったマップを選ぶと、望ましい境界ケースをシミュレートできないかもしれません。以下に、私の使用経験に基づき、これらのマップを詳しく説明します。
Town01 と Town02 は初心者向けのマップです。Town01は基本的な都市であり、道路網が整然としていますが分岐が多く、T字路が満載です。車両の基本的な旋回、交差点での通行、単純な交通ルール遵守のテストに最適です。Town02はTown01の「ミニバージョン」と考えることができ、レイアウトは似ていますが面積はより小さく、道路はよりシンプルです。アルゴリズムの基本ロジックを素早く検証する必要がある場合、または大量の短周期のリグレステストを行う場合、Town02は多くのシミュレーション時間を節約できます。私はアルゴリズムのプロトタイプ開発段階で頻繁にTown02を使用して迅速なイテレーションを行います。
初心者向けマップが簡単すぎて、より高い難易度に挑戦したい場合は、Town03 と Town05 が最適です。Town03は多くの古いプレイヤーから「究極の挑戦マップ」と呼ばれています。ここには何があるかと言うと、多車線の高速道路、複雑な立体交差、トンネル、上下坂、不規則な交差点があります。ここでは、車線維持、車線変更判断、複雑な交差点処理に関するアルゴリズムのすべての弱点を暴露できます。一方、Town05は格子状の大都市であり、多数の十字路口と橋、密集した信号機があります。都市環境における知覚-意思決定-計画の全チェーンをテストするのに最適です。センサーフュージョンアルゴリズムがTown05で安定して動作する場合、基本的には合格と見なせます。
Town04 と Town06 は高速道路シーンを主題としています。Town04はほぼ無限ループの高速道路とその近くの小さな町を組み合わせたもので、高速巡航、追従、自動車線変更などのシーンのテストに最適です。Town06は複数の出入口を持つ長直線高速道路であり、車両の高速道路への合流・退出挙動をテストするのに理想的な場所です。高速自動運転を開発している場合、これら2枚のマップはあなたの主戦場となります。
Town07 のスタイルは全く異なり、農村環境をシミュレートしています。道路は狭く、カーブが急で、ほとんど車線がなく、両側には農場と温室があります。このマップは車線に過度に依存するアルゴリズムを「治療」するために特化しています。ここでは、車両は他の知覚情報(路肩、通行可能領域など)により多く依存してナビゲーションする必要があります。Town10HD は後から追加された「ハイデフィニション」マップで、テクスチャの詳細がより豊富で、建物のスタイルも多様です。より現代的な都市に近い外観をしています。ただし、ビデオカードのVRAM要件もより高くなります。私自身のRTX 2060 6GBビデオカードでは、高画質でTown10HDを実行しているときに、時折クラッシュすることがあるので、機能開発にはまず他のマップを使用し、最後にTown10HDで視覚的リアリティのテストを行うことをお勧めします。
選択を迅速化するために、これら8つの非階層マップの主要な特徴を以下の表にまとめました:
| マップ名 | 主な特徴 | 適したテストシーン | パフォーマンス要件(相対的) |
|---|---|---|---|
| **Town01** | 基本都市、多くのT字路 | 基本制御、交差点での挙動 | 低 |
| **Town02** | Town01の簡易版、小規模都市 | 迅速なイテレーション、基本機能検証 | 非常に低 |
| **Town03** | 複雑な高速道路、立体交差、トンネル | 高度なナビゲーション、複雑な交差点 | 中 |
| **Town04** | ほぼ無限ループの高速道路+小さな町 | 高速巡航、追従、車線変更 | 中 |
| **Town05** | 格子状大都市、多くの十字路口と橋 | 都市環境での全システムテスト | 中~高 |
| **Town06** | 複数出入口付き長直線高速道路 | 高速道路合流・退出挙動 | 低~中 |
| **Town07** | 農村環境、狭い道路、急カーブ | 車線に依存しないナビゲーション | 低 |
| **Town10HD** | 高解像度、詳細なテクスチャ、多様な建物 | 視覚的リアリティテスト | 高 |