【上流検証】最小構成のモデルベース開発事例その54【ドライビングシミュレータ④】

【上流検証】最小構成のモデルベース開発事例 その54【ドライビングシミュレータ④】 事例

バックナンバーはこちら
https://www.simulationroom999.com/blog/model-based-of-minimum-backnumber/

はじめに

オープンソースドライビングシミュレータであるCARLAの話。
今回はサンプルへのPIDの組み込みと車速の取得方法。

CARLAのサンプルのmanual_control.pyをベースに修正。
制御を組み込む際のちょうど良さそうなところとかとちょろっと説明。

車速も取得可能なので、それの取得の仕方とか。

ただ、取得される車速はスカラーではなく、ベクトルであり、それをスカラーにしないと・・・。

登場人物

博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

とりあえずCARLAにPID制御を突っ込んでみた

太郎くん
太郎くん

とりあえず、PID制御をDLLにして、manual_control.pyから呼び出せるようにしたぞ。

太郎くん
太郎くん

で、どこでPID制御を呼び出せばよいのかな?
manual_control.pyも結構膨大なコードで全体像がよくわからない。

フクさん
フクさん

とりあえず、KeyboardControlクラスの_parse_vehicle_keysメソッドあたりに突っ込めばいいんじゃないかな?

太郎くん
太郎くん

よし。とりあえず配置した。

太郎くん
太郎くん

実車速とかはどう取得したらいいのかな?

実車速の取得方法

フクさん
フクさん

world.player.get_velocity()
で取得できるよ。

太郎くん
太郎くん

なんだ。結構簡単なんだ。

フクさん
フクさん

(さて、どう反応してくれるか。)

太郎くん
太郎くん

あれ?
車速を取得できたみたいだけど、
なんか変だ。

太郎くん
太郎くん

数値型を期待してたけど、Vector3Dっていうクラスが返ってきてる!

フクさん
フクさん

world.player.get_velocity()
で取得できる車速は3次元ベクトルなんだよ。
各軸はメンバのx,y,zで取得できるよ。

太郎くん
太郎くん

いや、3次元ベクトルじゃなくて車速が欲しいんだけど。

3次元からノルムへ

フクさん
フクさん

まぁ、たぶん引っかかるだろうなぁとは思ってたよ。

太郎くん
太郎くん

意地悪だな!

太郎くん
太郎くん

で、対策方法は?

フクさん
フクさん

3次元ベクトルのノルムを算出すれば良いよ。

太郎くん
太郎くん

ノルムってなんだっけ?

フクさん
フクさん

説明文をWikipediaから引っ張ってきたよ。

解析学において、ノルム (英: norm, 独: Norm) は、平面あるいは空間における幾何学的ベクトルの “長さ” の概念の一般化であり、ベクトル空間に対して「距離」を与えるための数学の道具である。ノルムの定義されたベクトル空間を線型ノルム空間または単にノルム空間という。

Wikipediaより(https://ja.wikipedia.org/wiki/%E3%83%8E%E3%83%AB%E3%83%A0)
太郎くん
太郎くん

スカラーってこと?

フクさん
フクさん

まぁベクトルのスカラーはノルムではあるね。
ただ、ノルムはスカラーと言えるけど、
スカラーは必ずしもノルムとは限らない。
水量とか質量はスカラーだけど、ノルムではない。って感じ。

太郎くん
太郎くん

ようわからんけど、3次元ベクトルをノルムにするにはどうするの?

フクさん
フクさん

三平方の定理を使えば良いよ。

太郎くん
太郎くん

あ、そういえばそういうのあったね。
楽勝楽勝!

太郎くん
太郎くん

・・・あれ?

フクさん
フクさん

どうしたん?

太郎くん
太郎くん

2次元ベクトルであれば、確かに三平方の定理でいけるけど、
3次元の場合はどうなるんだ?
頭がこんがらがってきた。

フクさん
フクさん

うーん、そこで悩むのか。
先に答えを言うと\(\displaystyle\sqrt{v_x^2+v_y^2+v_z^2}\)だね。
さらに、単位が\([m/sec]\)なので、それを\([km/h]\) にするため3.6倍する。
$$1[m/sec]×60[sec/min]×60[min/hour]×0.001[km/m]$$

$$=3.6[\frac{km/hour}{m/sec}]$$

太郎くん
太郎くん

三平方の定理っぽいけど、3次元に対しても同じようにしても良いものなの?

フクさん
フクさん

結果的に似た感じになるってだけだな。
丁寧に説明すると以下の感じになる。

三平方の定理、ピタゴラスの定理、さらに、単位が[m/sec]なので、それを[km/h]にするために3.6倍する。
太郎くん
太郎くん

あ、なるほど!
二次元の計算を2回したってことだね!

フクさん
フクさん

これで車速は出せるよね。

太郎くん
太郎くん

うん。ばっちり。

まとめ

フクさん
フクさん

まとめだよ。

  • CARLAのサンプルのmanual_control.pyに制御を組み込む際はKeyboardControlクラスの_parse_vehicle_keysメソッドあたりに突っ込めば良い。
  • 車速はworld.player.get_velocity()で取得可能。
    • ただし、3次元ベクトルで取得されるのでノルムに変換する必要がある。

バックナンバーはこちら

コメント

タイトルとURLをコピーしました