仮想の街で自由にクルマを走らせて、SDLアプリをテストしよう!
SDLアプリをドライブシミュレーター型のテスト環境で動かす《後編》
2020年12月16日 11時00分更新
カーナビなど車載機とスマートフォンをつなぐオープンソースの共通規格がSmartDeviceLink (SDL)。スマホアプリをカーナビ画面や音声で安全に使えることに加えて、走行中の車のスピードやウィンカーやワイパーなど状態がアプリ側から読み取れるのが大きな特徴です。そこで、SDLアプリの開発では、実車の走行にできるだけ近いテスト環境が欲しくなります。ドライブシミュレーターを活用したテスト環境の後編です。
自動運転シミュレーター「CARLA」とSDLデバイスシミュレーター「Manticore」をつなぐ
前回の記事では、「CARLA」という自動運転シミュレーターが動く環境を用意しました。3Dのバーチャルな街の中に道路があり、そこを車で走ることができる。さらには信号や人もいて天候まで変化するようす試すところまでやりました。
今回は、いよいよSDLアプリのテスト環境にするための作業を行います。具体的には、SDLアプリのクラウドベースの開発環境「Manticore」に前回用意したドライブシミュレーターをつなぎます。
Manticoreも車を走らせるシミュレーターの役割も持っているわけですが、アプリのテストを行うには画面のパネルスイッチを操作する形です。基本的にマウス操作で、エンジン回転数や車速、ハンドルを切るなどを順番に設定を変えていく形です。それに対してドライブシミュレーターである「CARLA」なら本物の車のように動かすことができます。
そこで、本来は人間か手で行う「Manticore」の操作をCARLAの動作から自動的にやってしまおうというわけです。Manticoreは、同時にカーナビやDA(ディスプレイオーディオ)などのSDL対応機器の役割もはたすので、あとはAndroid Studioなどのスマホアプリの開発環境とつないでやればよいことになります。
Google Chrome拡張機能SDL Replayerをインストールしよう
このCARLAとManticoreをつなぐために必要なのが、Google Chromeの拡張機能として用意した「SDL Replayer」です。まずは、[SDL Replayer]をChromeにインストールしてください。
このドライブシミュレーターを使ったテスト環境は、2つの使い方に対応しています。1つは、ドライブシミュレーター上の車情報をリアルタイムでMantocoreに送信するやり方。もう1つは、ドライブシミュレーター上の車情報をファイルに保存し、それを再生する使い方です。
1つ目のリアルタイムで車両情報を送信する場合は、次のような情報の流れとなります。
[CARLA自動運転シミュレーター内の車両情報]
↓
[SDL Replayer]
↓
[Manticore SDLデバイスシミュレーター]
車両の情報をいったんファイルにログとして保存し、それを再生するような使い方の場合は、次の2つの段階をそれぞれ行います。いちど運転ログを作ってしまえば、あとはそれを使って同じ走行状態についてアプリのデバッグを何度でも行うことができます。
[CARLA自動運転シミュレーター内の車両情報]
↓
[JSON形式のログファイル]
[JSON形式のログファイル]
↓
[SDL Replayer]
↓
[Manticore SDLデバイスシミュレーター]
次の画面写真が、実際にCARLAシミュレーターとManticoreを連携させて動かしているところです。
右上がManticoreの画面で後で述べるSDL ReplayerがChrome上に組み込まれた状態です。残りの3つの画面はCARLAシミュレーターのもので全体が分かるメイン画面(左上)、CARLAを操作するのがPython(左下)、レースゲーム的な車の後部視点(右下)。
CARLA Simulatorの操作は、市販のハンドルコントローラー(+フットペダル)で行うことも可能です(この記事の冒頭の写真はそれらを設置した筆者の机まわりのようすです)。次の動画は、CARLAを動かしているところですが、同じようにして今回のテスト環境でもより実車を動かす感覚でテストできます。
リアルタイムな車両情報を送信する
それでは、具体的なやり方について説明していきましょう。まず、前回の記事を参考に、CARLAサーバーを起動しPythonでCARLAクライアントを動かせる状況を確認してください。
たくさんのクルマを生成させたり(spawn_npc.py)、カーレースゲームのように1台のクルマをマニュアルでコントロールさせたりした(manual_control.py)のと同じような方法で、CARLAクライアントとしてふるまい、車両情報を送信するPythonプログラムを動かします。
前回の記事で「クルマと人を出現させよう」あたりまで実行している状態を想定しますので、そこまで進めた状態にしてください。
$ cd .\Downloads\CARLA_0.9.9.4\WindowsNoEditor\PythonAPI\examples\ $ python .\spawn_npc.py -n 50 --car-lights-on
ここまでを実行した状態ですね。
この “spawn_npy.py”が保存されている “examples”ディレクトリに、車両情報をSDLに対して送信するプログラムをダウンロードしましょう。[carla2sdl.py]というプログラムですが、コチラから落としてください。
次に、このプログラムの使い方を説明します。引数に-h(-help)をつけて実行すると、簡単に使い方が表示されます。
$ python .\carla2sdl.py -h
usage: carla2sdl.py [-h] [--host H] [-p P] [--fps N] [--vid VID] [-l]
[--sdl URL] [-t] [-o] [--outfile OUTFILE] [-f] [-v]
optional arguments:
-h, --help show this help message and exit
--host H IP of the CARLA host server (default: 127.0.0.1)
-p P, --port P TCP port to listen to the CARLA (default: 2000)
--fps N set fixed FPS, zero for variable FPS (default: 1.0)
--vid VID vehicle id
-l, --list list vehicle id
--sdl URL sdl-core-broker (ex: wss://xxxxxx.m.sdl.tools:444)
-t, --path-through connect to sdl by path through mode
-o, --out output log file
--outfile OUTFILE (default: carla_log_YYYYMMDDHHMMSS.json)
-f, --force force overwrite when outfile is exists
-v, --verbose
いろいろな引数がありますが、まずCARLAのバーチャルな街で走っているであろう複数台の車両から、対象とする1台を選ぶ必要があります。
引数に-l(-list)を指定して、 'carla2sdl.py'を実行しましょう。次のように街を走っている車両のリストが表示されます。
$ python .\carla2sdl.py -l
connecting carla
connected
available vehicles:
85 : vehicle.harley-davidson.low_rider
86 : vehicle.yamaha.yzf
87 : vehicle.nissan.micra
88 : vehicle.bmw.isetta
89 : vehicle.bmw.grandtourer
90 : vehicle.dodge_charger.police
91 : vehicle.diamondback.century
92 : vehicle.nissan.micra
93 : vehicle.kawasaki.ninja
94 : vehicle.chevrolet.impala
95 : vehicle.audi.a2
96 : vehicle.toyota.prius
97 : vehicle.yamaha.yzf
98 : vehicle.chevrolet.impala
99 : vehicle.seat.leon
100 : vehicle.bmw.isetta
101 : vehicle.dodge_charger.police
102 : vehicle.citroen.c3
103 : vehicle.volkswagen.t2
104 : vehicle.jeep.wrangler_rubicon
105 : vehicle.audi.etron
106 : vehicle.lincoln.mkz2017
107 : vehicle.dodge_charger.police
108 : vehicle.yamaha.yzf
109 : vehicle.diamondback.century
110 : vehicle.volkswagen.t2
111 : vehicle.audi.tt
112 : vehicle.tesla.model3
113 : vehicle.audi.tt
114 : vehicle.carlamotors.carlacola
もし、一覧が表示されない場合は、“spawn_npc.py”を実行してクルマを出現させてから、再度お試しください。
このなかから任意の一台を選んで一番左の数字を覚えてください。次はそれを--vidに指定して “carla2sdl.py”を実行しましょう。
また、そのリアルタイムな車両情報を確認用に画面表示させるために-v(-verbose)の引数も指定しましょう。
$ python .\carla2sdl.py --vid 101 -v
connecting carla
connected
Actor(id=101, type=vehicle.dodge_charger.police)
{
"jsonrpc": "2.0",
"method": "VehicleInfo.OnVehicleData",
"params": {
"accPedalPosition": 0.44,
"gps": {
"compassDirection": "SOUTH",
"heading": 350.57,
"latitudeDegrees": 49.00031278040328,
"longitudeDegrees": 8.00010710156626,
"speed": 16.87,
"utcDay": 11,
"utcHours": 8,
"utcMinutes": 44,
"utcMonth": 8,
"utcSeconds": 0,
"utcYear": 2020
},
"headLampStatus": {
"ambientLightSensorStatus": "UNKNOWN",
"dataType": "VEHICLEDATA_HEADLAMPSTATUS",
"highBeamsOn": false,
"lowBeamsOn": false
},
"prndl": "FIRST",
"speed": 16.87,
"steeringWheelAngle": 20.93,
"turnSignal": "OFF"
},
"elapsedSeconds": 1.003977,
"elapsedSecondsStr": "0:00:01.003977"
}
{
"jsonrpc": "2.0",
"method": "VehicleInfo.OnVehicleData",
"params": {
"gps": {
"compassDirection": "SOUTH",
"heading": 355.89,
"latitudeDegrees": 49.00035517187305,
"longitudeDegrees": 8.00010253562132,
"speed": 16.87,
"utcDay": 11,
"utcHours": 8,
"utcMinutes": 44,
"utcMonth": 8,
"utcSeconds": 1,
"utcYear": 2020
},
"steeringWheelAngle": 18.07
},
"elapsedSeconds": 2.012944,
"elapsedSecondsStr": "0:00:02.012944"
}
約1秒に1回の周期で、JSON形式の車両情報が表示され続けるようになっています。
[CTRL] + Cで、実行は終了します。
次に、この内容を、Manticoreに送信します。
準備として、本連載の記事「SDLデバイスシミュレーター「Manticore」でSDLアプリを動かそう!」を参考にしながら、Manticoreを起動しておいてください。
また、なにかしらの車両情報をとりあつかうSDLアプリをManticore上で起動しておくとCARLAからSDLに車両情報がリアルタイムで送信されていることを確認しやすいので、自作のSDLアプリがあれば、それを実行しておいてください。
Androidアプリでも、iOSアプリでも、Webエンジンアプリでも、いずれでも構いません。
車両情報をとりあつかうSDLアプリを手元におもちでない場合は、こちらのSDL WEB Engineアプリを実行してみてください。
このURLの引数のxxxxxxの部分を、Manticoreの立ち上がりあたりに表示されているWS URLに変更して開くだけで、SDL Web Engineアプリが次のように実行されます。
つぎにGoogle Chromeに先ほどインストールした、SDL Replayerを開きます。WebSocketというタブをクリックすると、Core Brokerという欄にURLが表示されますので、これをコピーしておいてください。そしてそれを--sdl引数に指定し送信先に設定します。
また、とりあえずの動作確認をするにあたって、ネット環境や処理PCの性能によりますが、一気にデータを送信しすぎると別のエラーや誤動作が起きやすいので送信量をまずはおさえて実験します。
--fpsに0.2くらいを指定します。約5秒に1回の送信となります。
$ python .\carla2sdl.py --vid 101 -v --fps 0.2 --sdl wss://xxxxxx.m.sdl.tools:444
connecting carla
connected
Actor(id=101, type=vehicle.dodge_charger.police)
{
"jsonrpc": "2.0",
"method": "VehicleInfo.OnVehicleData",
"params": {
"accPedalPosition": 0.44,
"gps": {
"compassDirection": "SOUTH",
"heading": 350.57,
"latitudeDegrees": 49.00031278040328,
"longitudeDegrees": 8.00010710156626,
"speed": 16.87,
"utcDay": 11,
うまくすすんでいれば、Manticoreで実行しているSDLアプリになんらかの変化があるはずです。もしくは、Manticoreの右側で、GPSを表示してみてください。CARLAから情報が正しく送られ、それを正しくていれば、GPS時刻情報(秒数)は必ず更新されるようになっています。
また、こちらはManticoreを経由するため、SDL RPCのVehicleInfo.GetVehicleDataにも対応していますが、SubscriveVehicleData(OnVehicleData)しか利用しない場合は、パススルーモードをおすすめします。その場合は、-tもしくは--path-throughをつけて、実行してください。パススルーモードを指定しないときとくらべて、すこしManticore側の更新負荷が軽くなります。
$python .\carla2sdl.py --host [CARLAサーバーのIPアドレス] --vid 101 -v --fps 0.2 --sdl wss://xxxxxx.m.sdl.tools:444 -t
なお、このパススルーモードで実行された場合は、Manticoreの右側の操作パネルのGPSやSpeedなどの表示内容が、CARLAの車両情報で更新されませんのでご注意ください。
自分自身で運転した車両情報を使ってみよう
ここまでは、CARLA内で自動運転されている車両情報を取り扱いましたが、自分自身で運転した車両情報も送ってみたいですよね。それは簡単な応用になります。引数に指定した、-vidを自分自身が操作する車両の番号に変更するだけです。
前回の記事を参考に、次のように実行してください。
$ python .\manual_control.py
ゲームの操作画面のようなウィンドウを開いたら、次のように実行します。
$ $ python .\carla2sdl.py -l
車両リストに“manual_control.py”によって現れた1台が追加で一覧に表示されかと思います。おそらく一番大きな数字がついているVechicle情報です。その番号を引数の--vidに指定するだけです。
いかがでしょうか? ウインカーをちかちか操作させてみたり、暴走してみたスピードがSDLアプリに送信されたりすると思います。
ログファイルに保存して、再生してみよう
リアルタイムな車両情報ではなく、特定のあるシナリオをつくって、そのログ通りに車両情報をシミュレートし、SDLアプリの動作確認をされたいこともあるでしょう。それによって、次のような動きをしている車両情報を得るシナリオが作れます。
●スピードを出しすぎている車両情報
●特定のGPS位置情報から、特定のGPS位置情報まで、移動している車両情報
●ヘッドライトやウィンカーを、タイミングよくだしている車両情報
CARLAでログファイルをつくり、それをSDL Replayerで再生するような使い方です。手順は先ほどとほとんど同じで 'carla2sdl.py'実行時に-o(-out)をつけるだけです。それだけで、SDL車両情報がログファイルとして出力されます。
$ python .\carla2sdl.py --vid 101 -v -o
しばらく実行して、[CTRL] + Cで中断すると次のようなファイルが、examplesディレクトリにできます。
carlalog_YYYYMMDDHHMMSS.json
これを、SDL Replayerで再生するだけです。
SDL ReplayerのLogFileに、任意のcarlalog_YYYYMMDDHHMMSS.jsonを指定し、再生ボタンをクリックしてください。用意したログがManticoreにむけて再生され、SDLアプリに車両情報が反映されるのを確認できます。
CARLAをつかわなくともSDL Replayer用ログファイルはつくれます
SDL Replayerで対処ログファイルは、簡単なJSON形式となっています。現在carla2sdl.pyが対応する車両情報は、以下のもののみとなっています。
●accPedalPosition
●bodyInformation / parkBrakeActive
●ドライバー
●gps / compassDirection、heading、latitudeDegrees、longitudeDegress、speed、utcDay、utcHours、utcMinutes、utcMonth、utcSeconds、utcYear
●headLampStatus
●prndl
●speed
●steeringWheelAngle
●turnSignal
これ以外の車両情報(たとえば燃料情報など)で、SDLアプリの動作をシミュレートされたい場合は、そのデータをVehicleInfo.OnVehicleDataとおなじJSONフォーマットで準備し、SDL Replayerで再生することも可能となっていましたます。必要に応じて試してください。
複数台の車両情報にも対応します
Manticoreは、原則として1ユーザーが1台の仮想環境を使えるような仕組みですが、例えば、複数の開発者が同時にManticoreを起動し、そこに複数の車両情報をそれぞれ送信することで次のようなシミュレーションをすることができます。
●何台かのクルマに分かれて一緒に旅行に行くようなシチュエーションを再現
●見知らぬ何台かのクルマが、同じ町で、とある挙動をしたときになにかがおきるSDLアプリ}
●クルマ同士がすれ違ったときに、なにかがおきるSDLアプリ
SDLアプリには、複数の車両に乗ったユーザーが連携することも考えられますので、そのような場合に応用できるかと思います。
テスト環境としてだけでなくプレゼンにも有効
アプリの動作状態を説明する場合にそれをムービーで表現したくなります。SDLアプリコンテストでも、アプリの動作状態が分かるデモムービーの提出が求められていますが、実車を走らせて画面を撮影するのはなかなか大変です。
複数の車両でユーザーが連携するところや、高速道路で使用するアプリなどについて、どうしてもプレゼンが紙芝居的になってしまいがちです。撮影クルーを用意したりドローン撮影とまではなかなかいけません。
CARLAのバーチャルな街でのドライブは、画面キャプチャするだけで空撮やドライバービューなど様々な角度から簡単に撮影することができます。それと連動して動くSDLアプリも画面キャプチャで動画を用意することができるでしょう。
CARLAで用意されているバーチャルな街は、海外の右側通行の世界です。しかし、こうして作った動画は、見る人、評価する人の心を、グッとつかむデモムービーになるのではないでしょうか?
「クルマとスマホをなかよくする SDLアプリコンテスト2020」
主催:SDLアプリコンテスト実行委員会(事務局:角川アスキー総合研究所)
協力:SDLコンソーシアム日本分科会
応募締切:2021年1月15日(金)24:00
募集内容:エミュレーターか開発キット上で開発したSDL対応アプリ(既存アプリのSDL対応、新規開発)
募集対象:年齢、性別、国籍等不問。個人・チームどちらでも応募可
応募方法:プレゼンシートと動作解説動画をWebフォームで応募
審査:審査員が新規性、UX・デザイン、実装の巧みさ等で評価
最終審査会:2021年3月上旬、東京都内で開催予定
グランプリ:賞金50万円+副賞
特別賞(最大5作品):賞金各10万円
公式サイト:http://sdl-contest.com/
この連載の記事
-
第6回
sponsored
SDLアプリをドライブシミュレーター型のテスト環境で動かす《前編》 -
第5回
sponsored
これまでのSDLアプリコンテストでの優秀な作品を振り返る! -
第4回
sponsored
Webエンジニアでもクルマアプリが作れる! -
第3回
sponsored
ラズパイによる疑似SDL車載機に、地図を表示してみよう! -
第2回
sponsored
SDLデバイスシミュレーター「Manticore」でSDLアプリを動かそう! -
第1回
sponsored
スマートフォンと車をつなぐSDL規格。その魅力とは!? - この連載の一覧へ