はじめに
Merry OpenXmas(白目)
こんにちは、HerniaBabyです。お元気ですか?
僕は今、クリスマスイブでカップルがちんちんかもかもしているなか、一人でしこしこ本記事を書き進めています。
お外は危険です。若いアベックたちの光に包まれて死んでしまいます。
なので今回はバーチャル環境で車を動かしてキャッキャしたいと思います。
やること
今回はOpenSCENARIOに関する車の振舞いをMATLABで数値を書き換えてesminiで遊んでみたいと思います。
ただ多くの人はこう思うかもしれません。
「OpenSCENARIO?esmini?わけわかんねえこと言ってねえで外出ろよ」
というわけで、上記の説明からしていきたいと思います。
説明
OpenSCENARIO
What is OpenSCENARIO?
OpenSCENARIO(オープンシナリオ)は 自動運転やADAS(先進運転支援システム)をテストするための「走行シナリオの書き方を統一したルール」 です。
何をするためのもの?
自動運転ソフトを評価するときに、
- どんな道路で
- どんな車や歩行者が
- いつ・どう動くか
を決まった形式で記述できるようにするためのものです。
具体的には以下のようなシステムテストに使われます。(画像はVECTOR社より借用)
ちなみに、ここに書いてあるOpenDRIVEってのは道路のようなOpenSCENARIOを動かすための静的オブジェクトですね。
細かい地形の表現にOpenCRGっていうのが存在します。
esmini
What is esmini?
esminiはOpenSCENARIOで書かれた走行シナリオを「実際に再生して確認するための軽量シミュレータ」です。
なんといっても無料でgithubに落ちてるのがいいんですよね。
何をするツール?
esminiは主に次の用途で使われます。
- OpenSCENARIOファイルを読み込む
- 車や歩行者の動きをシミュレーションする
- シナリオが意図どおりに書けているかを確認する
つまり、「このシナリオ、ちゃんと動く?」を確かめる再生プレイヤーです。
題材
今回はesmini側で準備してあるacc-test.xoscを使っていきたいと思います。
道路に関しては今回はOpenDRIVEのstraight_500m.xodrを改造してstraight_1000m.xodrとして使用します。
全体構成は以下のようになっています。
Step01.OpenDRIVEを書き換える
straight_500m.xodrのOpenDRIVE構成は以下のようになります。
赤字の部分が今回修正する点です。
簡単に説明しますとRoadオブジェクトのlengthは道路全体の長さで、PlanViewのgeometry.lengthは各区間の長さです。
今回はroadは1つの区間しか持たないので同じlengthになります。
最初はいろいろクリアして…
clc, clear, close all;
OpenDRIVEの中身を書き換えていきます。
元データの straight_500m.xodr を読み込みましょう。
path = "[MyFolder]\esmini\resources\xodr";
fname = "straight_500m.xodr";
T = readstruct(fullfile(path,fname),"FileType","xml","StructNodeName","OpenDRIVE");
変更箇所は T.road.lengthAttribute と T.road.planView.geometry.lengthAttribute です。
disp([T.road.lengthAttribute, T.road.planView.geometry.lengthAttribute])
500 500
これらを書き換えます
T.road.lengthAttribute = 1000;
T.road.planView.geometry.lengthAttribute = 1000;
disp([T.road.lengthAttribute, T.road.planView.geometry.lengthAttribute])
1000 1000
出力は writestruct関数 で行います。
fname_out = "straight_1000m.xodr";
writestruct(T,fullfile(path,fname_out),"FileType","xml","StructNodeName","OpenDRIVE")
Step02.OpenSCENARIOを書き換える
acc-test.xoscの構成は以下のようになっています。
アクティビティ図は以下の通りです。
今回はOpenDRIVEのパスの書き換えをしてEgoSpeedを時速200kmに変えます。
path = "[MyFolder]\esmini\resources\xosc";
fname = "acc-test.xosc";
T = readstruct(fullfile(path,fname),"FileType","xml","StructNodeName","OpenSCENARIO");
中身を見てみましょう。
まずはParameterDeclarationsから
struct2table(T.ParameterDeclarations.ParameterDeclaration, "AsArray", true)
| nameAttribute | parameterTypeAttribute | valueAttribute | |
|---|---|---|---|
| 1 | "HostVehicle" | "string" | "car_white" |
| 2 | "TargetVehicle" | "string" | "car_red" |
| 3 | "EgoSpeed" | "double" | "120" |
| 4 | "TargetSpeed" | "double" | "30" |
| 5 | "EgoS" | "double" | "20" |
| 6 | "TargetS" | "double" | "100" |
| 7 | "LaneChange1Time" | "double" | "5" |
| 8 | "LaneChange2Time" | "double" | "7" |
| 9 | "BrakeTime" | "double" | "11" |
| 10 | "AccelerateTime" | "double" | "17" |
| 11 | "Brake2Time" | "double" | "20" |
次にパスの部分も見てみます。
struct2table(T.RoadNetwork.LogicFile, "AsArray", true)
| filepathAttribute | |
|---|---|
| 1 | ../xodr/straight_500m.xodr |
ここでEgoSpeedを200にしてパスをstraight_1000m.xodrに変えます。
まずはEgoSpeedから
EgoSpeed = 200;
P = T.ParameterDeclarations.ParameterDeclaration;
idx = string({P.nameAttribute}) == "EgoSpeed";
P(idx).valueAttribute = EgoSpeed;
T.ParameterDeclarations.ParameterDeclaration = P;
パスは素直に以下のように変更します。
T.RoadNetwork.LogicFile.filepathAttribute = "../xodr/straight_1000m.xodr";
出力します
fname_out = "acc-test_1.xosc";
writestruct(T,fullfile(path,fname_out),"FileType","xml","StructNodeName","OpenSCENARIO")
esminiで確認してみましょう。
確かにEgoが爆速になってますね(道路はよくわからん)。
おわりに
これ書き終わったのが 12/25 の 4:30AM くらい…何やってんだ自分…






