バックナンバーはこちら
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倍する。](https://www.simulationroom999.com/blog/wp-content/uploads/2020/07/02_車速の出し方-1024x398.png)

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

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

うん。ばっちり。
まとめ

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