室内でカーナビなどのユーザーテストをする際、前方に走行映像を流したいことがあります。走行中の操作タスクをする際、少しでも被験者の意識を前方に向けて、あくまでサブタスクとしてナビ操作をさせたいわけです。その為、車載カメラで想定シチュエーションにあわせた映像を撮りにロケに行ったりもします。例えば「狭い道路でいつ脇道から人や自転車が飛び出してくるかわからない」映像とか「高速道路を巡行していて前方に渋滞が見えてくる」映像とかです。これがなかなか大変。
理想を言えばきちんとしたシミュレーターを使って、タスクの進行にあわせて飛び出しや渋滞が発生した映像を呈示できるのが望ましいですが、多くの案件ではそこまでの準備は適わないことが多いです。時にはカーレースゲームを使ったりしたこともあり、使いやすい要求仕様をまとめてみたこともあります。なんとまぁPlayStation2とかの時代の記事…。
そして昨今ではコンピューターパワーも飛躍的に高まり、また自動運転研究のためのシミュレーター環境などが無償または安価に利用可能になってきました。そこで今回はMicrosoftがクルマやドローンの自動運転研究のために無償公開したAirSimというオープンソースのシミュレーターを試してみました(日本では同名の格安SIMサービスがあって非常にググラビリティが低いです…)。
結論からいうと今一歩でした…(終わり)
以下、興味のある方向け。
■Microsoft AirSimとは?
Microsoftが自動車またはドローンの自動運転研究の為のシミュレーションを仮想世界で好きなだけ行うために開発、公開しているプラットフォームです。ゲームエンジンのUnreal Engineをベースにしているようですが、最近Unityでも使えるようになったようです。ただWindowsで既成のマップワールドを利用する分にはUnity環境込みのバイナリパッケージが公開されているので、.ダウンロード&解凍してexeファイルを実行するだけで利用可能です。標準ではキーボードで簡単な操作ができたり、Pythonスクリプトで制御したりできます。昼夜や天候なども簡単に変えられます。
■やりたかったこと
私もUnreal Engineの知識ゼロの状態で、とりあえずこの吊しのマップデータを使って、
- フォトリアルな走行風景
- 前走車の急停止や側方からの割り込みなどあらかじめ既定したタイミングでイベントを発生させた映像を動画ファイルに保存できる
- またはキーボード操作などで任意のタイミングでそれらのイベントを発生させられる
などができたらいいなという期待がありました。
■残念だったところ
Unreal Engineに精通しており自分でマップやオブジェクトを作成できればまた違うのでしょうけど、とりあえず吊しのデータを使い、標準のAPIドキュメントを眺めた限りでは以下の点で要求を満たすことができませんでした。
・市街地、道路のマップがアメリカで、走行車線も右側通行
グローバルな案件ではアリかもですが、私の請ける範囲ではちょっと使いにくい。特に市街地マップは信号や標識も違うし、モブのクルマが反対車線を走ってるのが厳しいです。郊外で高速道路想定であればまだ許容範囲かも知れません。
・カメラアングルの自由度が低い
FOV(ドライバー目線)はありますがハンドルを含む運転席のパーツを消せないので、UTで用意する治具とバッテイングする場合があります。
また第三者視点で選べるプリセットはやや上空から見下ろすアングルのみで、真後ろ視点が選べません。自動で真後ろ視点で追尾できると便利なんですが。
ただしマニュアルカメラモードにすることで好きなアングルに変更できます。ただし一度マニュアルモードにするとキーボード制御はそれ専用になってしまうので、別途車両を操作するコントローラーが必要です。とりあえずXBox Oneコントローラーは使えました(有線)。ステアリングコントローラーもLogicoolのG902などが使えるぽいです。
マイクロソフト ゲームコントローラー Bluetooth/有線接続/xbox one/Windows対応 PC用USBケーブル同梱 4N6-...
つまり、これらの外部コントローラーで操作して、その背後視点のカメラ(または運転席)から見た映像を得ることはできるので、あとは画面録画ソフトを使って録画すれば動画ファイルは得られることになります。
しかし!
・クルマオブジェクトが無人でブレーキランプが点灯しない
標準ライブラリのクルマが無人なんですw。最初から自動運転制御前提ですかねw。ちょっとこれもリアリティに欠けます。ダミーでいいので載せておいて欲しかった。
またさらに痛い点として、ブレーキ制御をしてもランプが光りません。例えば前走車が急ブレーキを踏んだ!というプレッシャーを与えることができません。
・期待したほどフォトリアルな映像品質ではなかった…
各記事の写真をみた限りでは結構綺麗そうだったんですが、少なくともウチのGeForce GTX 1080では「スゲー!」ってほどの感じではないです。画質もそうですが例えばぶつかった時にびよーんと車体が撥ねたりする時の挙動がすごくゲームちっくです。まぁ指定ルートを事故らずに走行している分にはいいのかも知れません。できれば車両のモデリングデータだけ実在の車種に近いもの、ナンバープレートがついていて、ブレーキランプがつくものに差し替えられればなぁと思います。マップも同様。ここら辺、UEやUnityを勉強するとか、有料であれモデリングデータを買ってきたりすればどうにかなるのかも知れません。
動画サンプルはこちら。
■使用方法メモ
・とりあえずAirSimを起動してみる
WindowsならUnreal Engine込みでビルドされたバイナリをダウンロードするだけ。GitHubのReleaseページでWindowsの最新版(執筆時点で1.2.2)の「Assets」リンクを展開すればマップ毎のビルド一覧が出てきます。サイズの大きなCityEnviron.zipだけは001と002に分かれています。同じフォルダに置いて7-zipで解凍すれば勝手に両方つなげて展開してくれます。でてきたフォルダを開くとUnreal Engineのアイコンがついた.exeファイルが1つあるのでダブルクリックすれば起動します。
「Choose Vehicle」というダイアログが出るので、クルマなら「はい」、ドローンなら「いいえ」を選びます。
F1で操作ガイド、F10で気象コントローラーです。標準ではカーソルキーで車両が走り、BSで初期状態に戻ります。「F」「B」「\」「/」でカメラ視点が変わります。「M」がマニュアルでこの状態だとカーソル上下やPage Up/Downなどで好きな視点にできますが、逆にカーソルで運転できなくなります。他のカメラモードにするとカメラ視点はリセットされてしまい、マニュアルカメラ視点で運転するには別途コントローラーが必要です。
・コントローラーを使う
Xbox OneコントローラーをUSBで接続しておけばとりあえずは使えます。RTがアクセル、LTがブレーキ、左スティックがステアリングで、ともにアナログ制御です。画面左上のリアルタイムでパラメーターが表示されます。
ただしこの状態だとバックができません。そこで初期設定を少しいじりました。
・初期設定を変更する
初期設定ファイルはユーザの「ドキュメント」フォルダに「AirSim」フォルダが作成されてsettings.jsonというテキストファイルができています。これをテキストエディタで開くと、
1 2 3 4 |
{ "SeeDocsAt": "https://github.com/Microsoft/AirSim/blob/master/docs/settings.md", "SettingsVersion": 1.2 } |
などとなっており、これを書き換えて.exeを再起動すると反映されます。ちなみに.exeの終了はメニューがないので、私はAlt+F4でやっています。
とりあえずこんな感じに変更。記法はJsonなのでカンマや{}の位置に注意。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "SeeDocsAt": "https://github.com/Microsoft/AirSim/blob/master/docs/settings.md", "SettingsVersion": 1.2, "SimMode": "Car", "Vehicles": { "Car1":{ "VehicleType": "PhysXCar", "X": -4, "Y": 0, "Z": -2, "Yaw": 0, "Roll":0, "Pitch":0, "RC": { "RemoteControlID": 0 } } } } |
"SimMode": "Car", があると、起動の度にカメラかドローンかを聞かれなくなります。
"Vehicles": {} で1台目のクルマを指定し、
"RemoteControlID": 0 でWindowsが認識している最初のコントローラーを使うことを明示します。なぜかこれを明示すると、左スティックの下でバックができるようになりました。上とAボタンでもアクセル全開(1)が入るようになります。ただし注意点として.exeファイルを起動する時点ではコントローラーのケーブルを抜いておかないと起動後におかしな挙動をするようです。再起動の度に毎回ケーブルを抜き差しするのがちと面倒になります。初期状態ならそうはならないので、バックが使えることとトレードオフのようです。
"X": -4, "Y": 0, "Z": -2, "Yaw": 0, "Roll":0, "Pitch":0, は初期出現位置と向きです。Yawをかえると向きがかわります。RollやPitchは平らな地面の上に置くクルマではいじる必要はないでしょう(ドローン向け)。Vehiclesの下に複数のクルマ設定を書けば出現する数を増やすことができます(同じRC設定をしてしまうと両方が動きます)。
これでとりあえずマニュアルカメラ視点をとりつつコントローラーで快適に操作できると思います。
・Pythonから制御する
さて目玉であるプログラム制御についても軽く触れておきます。Python詳しくないのですが一応動くところまで。
まずPython環境がない場合はAirSim公式推奨のAnacondaというツールを使ってインストールします。配布サイトからWindowsを選び、Python 3.7の64bit版インストーラを落として実行します。またPythonスクリプト自体は好きなテキストエディタで書き、コマンドプロンプトからpython3コマンドで実行すればいいのですが、デバッグ効率などを考えるとMicrosoft Visual Studio Code(以下VS Code)を使用するのがお勧めです。あわせてインストールしておきます。UI日本語化の方法は適当にググってください。
Anacondaをセットアップすると、スタートメニューから関連ツールが選べるようになります。まず「Anaconda Prompt (Anaconda3)」を開き、必要な追加ライブラリをインストールします(最初の1回のみ)。
1 2 |
pip install msgpack-rpc-python pip install airsim |
次に「Anaconda Navigator(Anaconda 3)」を起動します。ここからVS Codeを「LAUNCH」します。(直接VS Codeを起動するとコマンドパスの関係で動かない場合がある)
開いたVS Codeで新規ドキュメントを開き、以下のコードをコピペします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import airsim import time client = airsim.CarClient() client.confirmConnection() client.enableApiControl(True) car_controls = airsim.CarControls() car_controls.steering = 0.3 for i in range(3): car_controls.throttle = 1 client.setCarControls(car_controls) time.sleep(1) car_controls.throttle = 0 car_controls.breaks = 1 client.setCarControls(car_controls) time.sleep(1) |
8行目まではおまじない。10行目でステアリングを軽く右に切ります(負の数が左、最大は1)。11行目は以下を3回繰り返すという意味です。Pythonではインデントの範囲がブロックとみなされるので、それ以下が繰り返しの範疇ということになります(明示的に閉じ括弧がありません)。11,12行目でアクセルを全開(1)にして14行目で1秒待ち。15-17行目でアクセルを戻してブレーキをベタ踏み(1)。18行目でまた1秒待ち。つまり、微妙に右に曲がりつつ、チョイ前進を3回繰り返す感じです。AirSimはカーシミュレーターなので、オブジェクトとして位置を指定するのは初期設定ファイル側で最初のみ。あとはクルマの制御機構であるステアリング、アクセル、ブレーキを操作するというところがミソですね。
さてこのコードを拡張子を.pyにして適当な場所に保存すると、ウインドウがPythonモードになります。コードが着色され、右下のステータスバーが「プレーンテキスト」から「Python」に変わっていることを確認してください。
この状態でおもむろにF5キーを押します。すると下に「ターミナル」が出現し文字がパラパラと流れ、AirSim側でクルマが動けば成功です。VS Code側にはこんなツールバーが出現します。「□」で実行を停止。再度F5をすれば最初から実行されます。
またAirSim側でバックスペースを押せば初期状態に戻るので、コードをちょいいじっては実行するという作業をする時はこのVS Codeとの組み合わせが楽だと思います。また例えば「car_control.」まで打てばthrottle、brakes、steeringなどが推測候補として表示されるのでコーディング効率も良いです。
ただそれを見る限りでは、このAPIでは基本的なクルマの挙動しか制御できず、例えばブレーキランプやウインカーを点灯するとかそういうレベルまでは対応してないぽいです。そこは自前でそういうモデルデータを用意してAPIを拡張してやる必要があるということでしょう。その辺り、業務ニーズはあるのですが、私も3Dモデリング周りは全くの素人なので一朝一夕ではできそうにありません。願わくはこれを見たどなたかが刺激を受けて取り組んでくれたり、一緒にやろうと言ってくれればなと思います(笑)。
というところまでで今回の自由研究は一旦切り。覚え書きまで。