4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenSCENARIOをMATLABでいじってみよう

Last updated at Posted at 2025-12-24

はじめに

Merry OpenXmas(白目)

こんにちは、HerniaBabyです。お元気ですか?

僕は今、クリスマスイブでカップルがちんちんかもかもしているなか、一人でしこしこ本記事を書き進めています。

お外は危険です。若いアベックたちの光に包まれて死んでしまいます。

なので今回はバーチャル環境で車を動かしてキャッキャしたいと思います。

やること

今回はOpenSCENARIOに関する車の振舞いをMATLABで数値を書き換えてesminiで遊んでみたいと思います。

ただ多くの人はこう思うかもしれません。

「OpenSCENARIO?esmini?わけわかんねえこと言ってねえで外出ろよ」

というわけで、上記の説明からしていきたいと思います。

説明

OpenSCENARIO

What is OpenSCENARIO?

OpenSCENARIO(オープンシナリオ)は 自動運転やADAS(先進運転支援システム)をテストするための「走行シナリオの書き方を統一したルール」 です。

何をするためのもの?

自動運転ソフトを評価するときに、

  • どんな道路で
  • どんな車や歩行者が
  • いつ・どう動くか

決まった形式で記述できるようにするためのものです。

具体的には以下のようなシステムテストに使われます。(画像はVECTOR社より借用)

image_0.png

ちなみに、ここに書いてあるOpenDRIVEってのは道路のようなOpenSCENARIOを動かすための静的オブジェクトですね。

細かい地形の表現にOpenCRGっていうのが存在します。

image_1.png

esmini

What is esmini?

esminiはOpenSCENARIOで書かれた走行シナリオを「実際に再生して確認するための軽量シミュレータ」です。

なんといっても無料でgithubに落ちてるのがいいんですよね。

何をするツール?

esminiは主に次の用途で使われます。

  • OpenSCENARIOファイルを読み込む
  • 車や歩行者の動きをシミュレーションする
  • シナリオが意図どおりに書けているかを確認する

つまり、「このシナリオ、ちゃんと動く?」を確かめる再生プレイヤーです。

image_2.png

題材

今回はesmini側で準備してあるacc-test.xoscを使っていきたいと思います。

acc-test.gif

道路に関しては今回はOpenDRIVEのstraight_500m.xodrを改造してstraight_1000m.xodrとして使用します。

全体構成は以下のようになっています。

Step01.OpenDRIVEを書き換える

straight_500m.xodrのOpenDRIVE構成は以下のようになります。

赤字の部分が今回修正する点です。

簡単に説明しますとRoadオブジェクトのlengthは道路全体の長さで、PlanViewgeometry.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.lengthAttributeT.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で確認してみましょう。

acc-test_01.gif

確かにEgoが爆速になってますね(道路はよくわからん)。

おわりに

これ書き終わったのが 12/25 の 4:30AM くらい…何やってんだ自分…

image.png

image.png

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?