無題

自動運転車のアクセルやハンドルはどうやってコントロールされているのか

自動運転のナカミ⑥ 【車体制御編】

この記事の目的

事故や渋滞が無くなる!運送業が効率化する!時間が節約できる!…という明るい話から、事故の責任は誰が負うの?車がハッキングされたら?AIとかロボットに運転任せるの怖い…という心配になる話まで、色々な議論がされている自動運転技術。しかしそう言った自動運転が来る来ないという議論を盛んにしている一方、自動運転がどのようにして動いているのかなどと言った中身の深いところまで詳しい方は少ないのではないでしょうか。私はというと、数年前にこの技術を知って以来すぐに進路を変え自動運転研究室に入ったり、研究室入る前から有料オンライン講座(計約30万円…汗)で学んだりと、この業界のキャッチアップに勤しんできました。そこでこの記事を通して自動運転技術の中身を噛み砕いて紹介することで、より一層深い議論ができたり、この産業に張るか張らないかを考えて頂けたらなと思います。

第6回目の本記事では、第3回目の【仕組み編】で出て来た 3. 車体制御 の技術についてもう少し掘り下げて行こうと思います。アクセル、ブレーキ、ハンドル制御を行うので、人間に例えると”手足”の役割ですね。

1. 周辺認識
2. 状況判断
3. 車体制御 ← 今ココ

”制御”とは

そもそも制御とは何かと言うと、「目標の値までいかに効率良く到達するか」を突き詰める学問で、制御工学という名の分野が一つ確立されるほど大きなテーマです。エアコンに例えると、リモコンで25℃と設定されてからいかに効率良く実際の部屋の温度を25℃にまで持っていけるか?というのをエアコン内の機械があの手この手で頑張っているのです。元の室温が目標値の25℃より超暑かった( or 超寒かった)場合、目標値を早く達成するためにはガーッと沢山空気を出さなきゃいけないですし、反対に室温が元から目標値に近ければそんなに空気出さなくてもすぐ達成できそうだというのは想像しやすいと思います。

引用元

目標値達成までの評価軸は上記のように速度優先かもしれませんし、省エネ優先の場合もあり得ます。自動運転の文脈で言うと、大体の場合において目標値は"車線の真ん中"となりますね。

また、「設定した目標値をちょっとでも越えちゃいけない」なんて追加条件が加わる時もあります。エアコンの例ではちょっとくらい目標値の25℃を下回っちゃっても( or 上回っちゃっても)後々最終的に25℃に落ち着いてくれれば問題ありませんが、例えば工場のロボットアーム等は手先がちょっとでも目標地点を越えちゃうと商品またはベルトコンベアーを傷付けてしまうため大問題です。目標値にいち早く到達したいがばかりに、上図のように一旦目標値を越えてから「おっとっと」と言って目標値に戻ってくるようでは手遅れと言う状況があります。自動運転で言えば"対向車線や歩道の方まで突っ込んじゃう事"に当たりますね。それを防ぐためには目標値に向かって早く、かつ滑らかに沿うように制御するのが理想です。

引用元

何を制御するの?

自動車においての制御対象は主に速度(アクセル / ブレーキ)と角度(ハンドル)です。例えば"時速60km/hに合わせるため"にはどれくらいのアクセルを踏み込み、目標時速に近づいてきたらだんだんアクセルを緩め、必要ならばブレーキを踏む……"車道の真ん中を沿うため"には今〇〇cm離れてて、時速△△km/hだから□□° だけ角度を曲げる……という流れをコンピューター制御で人間じゃできないくらい事細かに操作します。

しかしアクセルを踏んでから加速するまで時間がかかるように、ブレーキを踏んでから停止するまで時間がかかるように、制御というものはどうしても操作してから→効果が出るまで時間差があります。せっかくカメラやLIDARによる周辺感知センサーが障害物を発見してそれを避ける経路を一瞬で算出できても、実際のハンドル捌きが間に合わなかったら意味ありません。そこで、迅速かつ正確に目標値を達成できると有名な制御則を一つ紹介します。

PID制御

PID制御とは、Proportional(比例というか一次関数)制御とIntegral(積分)制御とDerivative(微分)制御の3種類の制御方法を足し合わせたもので、最初の起源はとても古く17世紀までに遡ります。んー、急に数学チックになりましたね汗。わかりやすく解説していきます。

① P制御(比例というか一次関数)

これは簡単に言うと、目標値から遠ければ遠いほど大きくアクセルを踏み、目標値に近ければ近いほどアクセルを緩めると言うルールの制御方法です。なぜ比例制御と言うと、現在値から目標値までの差に比例した量のアクセルを踏むからです。なので差が遠ければ遠いほど大きく、近ければ近いほど小さく操作すると言う仕組みです。これは最も基本的な制御則で、簡単に実装できてかつまあまあ良い精度を出せるというメリットがありますが、目標値のめちゃくちゃ近くまではいけるけどぴったし一緒にはなれない(残差)、目標値を越えてしまう(オーバーシュート)等といったデメリットもあります。

引用元

② I制御(積分)

上のP制御だけではどうしても残ってしまう目標値との差(残差)を埋めるのに有効なのがこの2つ目のI制御です。積分と言うとなんだか難しそうに聞こえますが、これまでの総量の総和です。つまりただの足し算の繰り返しです。
I制御では、残差を積み重ねた量のアクセルを踏み込むと言うルールです。こうすることによって最後の一押しで残差を消すことができ、残差がゼロになった暁にはこれ以上残差の総和は増えていかないので(なぜなら現段階の残差がゼロでありゼロはいくら足しても何も変わらない)、そのまま残差がゼロつまり目標値ぴったしの状態をずっとキープできるのです。

引用元

③ D制御(微分)

最後のD制御は、P制御のデメリットであるオーバーシュート(目標値を越えてしまうこと)や急な変動を抑えてくれると言う効果があります。微分と言うとこれまた難しく聞こえそうですが、前回から今回への変化が急かどうかです。この3つ目のD制御では前回の残差量と今回の残差量を見比べて、急激な変化だったら多くのアクセルをふかし、緩やかな変化だったら少しのアクセルしか入れないと言うルールです。こうすることで例えば

・急に上り坂になったら今までと同じアクセル量だと加速具合が落ちるので
 (上り坂前と上り坂後の変化が激しいので)、もっとアクセル量を増やして
 同一速度を保つことができる

・突風で車線の真ん中からずれたら(突風前と突風後の変化が激しいので)、
 いち早くハンドルを切って元の位置に戻る

と言った外部要因への素早い処置が可能となります。

これらのPとIとDの3つ中でどれの効果をどれくらい適応させるか優先順位をつけながら、一番効率良く目標値に辿り着く絶妙のPとIとDのバランスを見つけていきます。またこのPとIとDの最適なバランスの見つけ方一つとっても非常に多くの幅広い研究がなされている事からも分かる通り、それほどこのPID制御はとても優れた制御則なのです。

今回は自動運転の"手足"の役割である、車体制御について深掘りしました。今回も数学的なことが多かったですかね。それでは次回は【未来編】を書こうと思います。

文:川西発之 / 陳発暉 (Twitter/note)
プロフィール:Deep4Drive開発メンバー。高専情報科(C/C++)→大学機械科→HWエンジニアインターン at ドローンベンチャー(Python)→SWエンジニアインターン in NY(PHP)→ニートしながらアプリ開発(React Native)→大学院で自動運転の研究(C++)。日本生まれの純血中国人🇯🇵🇨🇳

私たちはモビリティ分野でのオープンイノベーションを通じ、技術者を育成するコミュニティです。自動運転レースへの挑戦や、JR東日本様等との共同プロジェクト、新規価値創造等を行っています! モビリティに関するイベントも適宜開催中!