ロボットや機械を制御する PID Controller を数式を使わずに概観
今まで、多くのAI の技術に関するNoteを書いてきました。また、AI以外にもロボティクス関連としては、ドローンや UGV の記事もいくつか書いてきました。
今後は、ロボットや機械のエンジニアリングに関する技術にもいくつか触れていこうと思ってます。
ロボットの制御:PID Controller
ロボット技術の進化は昨今目をみはるものがあります。以下はボストン・ダイナミクスによるデモンストレーションビデオです。凄まじい動きですよね。どうやって制御をしているのかと思います。
このレベルの制御システムを理解していこうとしても一足飛びにはたどり着けません。そこで、今回は第一歩目としてロボットや機械の制御の基本の一つである PID Controller について、知らない方向けに数式を使わずにざっと解説してみたいと思います。
制御の難しさについて
まずは、産業用ロボットとして見られるような何かを掴んだりする、ピッキングを行うようなロボットアームを考えたいと思います。
ロボットはプログラムより、決まった位置への移動、アームの特定の角度での上げ下げ・回転等の動きを指示され、センサーで位置や角度等をモニタリングしながら、コントローラーにより正確に目的のタスクを行います。
しかし、ことはそう簡単ではありません。動く物体には慣性がありますし、様々な摩擦もあります。ここで止まれと指示されても正確なポイントで止まることというのはそうたやすいことではありません。そのため、どこに来たときにどれぐらいのスピードであったらどれぐらいの力で止まれという指示をするか、細かい条件やパラメーターの調整がもろもろ必要になってきます。
このとき、単に、この距離に来たときにこれぐらいの力で止まれと指示する、ということだけの調整アクションしか持っていないと、うまくいくときはそれでピッタリと正確なポイントで停止するかもしれませんが、ちょっと条件が変わってしまった時には、それでは正確な位置で止まれなくなってしまうかもしれません。それだけでなく、例えば行き過ぎてしまったために今度はそれをリカバリーしようと逆の方向に動かしてそして止めようとしても、今度は逆方向に行き過ぎるだけになってしまうかもしれません。結果として、振り子のように、正確な位置にとまれず、以下の図のように、ずっと目標の位置に収束せずにぶれ続けるということになってしまうでしょう。(手書きですみません。今回は手書きが多いです。)
やりたいこととしては、以下のように、目標の位置に向かって収束するように調整をかけていくことになります。
PID Controller
ここで登場するのが、PID Controller という制御システムです。PIDとは、Proportional Integral Derivative のそれぞれの頭文字で、直訳すると「比例、積分、微分による制御」という感じになります。
PID Controller の概念図を以下に示します。
まず、制御対象となるシステムがあります。上記の例ではロボットアームがそれになります。それがプログラムに従って動き、物をつかもうと動きます。センサーによってロボットアームの位置、スピード、角度などをトラックし、そのデータをPID Controller に渡します。PID Controller はどのように修正すべきかの情報をロボットアームに伝え、アームの動きが修正されます。その結果をまたセンサーがモニターしてPID Contoller にフィードバックします。これにより、正しい位置になるまでフィードバックループの中で調整が繰り返され、最終的に正確な位置や角度で物体を把持する動作を実現することになります。
冒頭で以前書いたUGVの記事を引用しましたが、UGVがコーヒーをデリバリーするために進んでいくことをイメージしてみましょう。
やりたいことは、お客さんたちへコーヒーを運ぶことです。安全性と利便性の両方を考慮して、1秒に2メートル進むことにします。これが制御システム(UGV)によって実現すべき速度の目標値ということになります。最初の配達ではやすやすとそれが実現でき、秒速2メートルで安定的に走行できました。ですが、いつも簡単な配達環境ばかりとは限りません。時には強い風が吹き、ある時は登り坂が延々と続き、時には坂のアップダウンが頻繁で激しい、ということも普通にあります。それらはUGVのスピードに影響を与え、不安定な状態にするでしょう。
一定のスピードを保つためには、モーターの微妙な調整を繰り返し、スピードのコントロールを達成していくことになります。UGVのスピードセンサーを使うことで、実際の速度をトラックすることができます。実際のUGVの速度は速くなったり遅くなったりしてぶれます。保ちたい一定の速度(目標値)との乖離が明らかになります。
PID Controller は、この目標値とトラックされた実際の値から3つの値を計算し、制御に用います。3つの値とは、目標値と実際の値との「差の比例 (Proportional value)」、「差の積分 (Integral value)」、および「差の微分 (Derivative value)」です。
差の比例
最初の値は「差の比例 (Proportional value)」です。これは、直近もしくは今の瞬間の実際のスピードの値と目標値との差から比例で求めます。この差が大きければ大きいほど、より正確に目的に到達するのが困難になりますので、乖離が大きい場合は大きく修正したいわけです。そのため、この差の比例値を操作量として修正をはかっていきます。これを Proportional control(P制御)と呼びます。
差の積分
次の値は、「差の積分 (Integral value)」です。これは、ある時間幅における、目標値との乖離の和になります。つまり、差を時間で積分した値になります(前の図の Integral と示した場所がそれに該当)。この値は、今までの目標の速度との乖離(エラー)の蓄積を意味しています。例えばUGVの例でいくと、坂の勾配がきつくなっていき、P制御では速度の乖離がうまく解消されていかないようなケースで起こります。この値が大きいと、P制御だけでは不十分だと言え、坂の勾配がきつくなっているのであればより大きなパワーで制御をかけていく必要があります。差の積分値を操作量とするこのコントロールを Proportional-Integral control (PI制御)と呼びます。
積分時間が小さいほどこの制御の寄与が大きくなり、目標値への矯正が迅速に行われます。ですが、小さすぎると目標値を行き過ぎたり(オーバーシュート)、目標値の前後を振動したり(ハンチング)する現象を起こすことがあります。
差の微分
そこで、3つ目の値「差の微分 (Derivative value)」が登場します。これは、 目標のスピードと実際のスピードの変化の度合いを表します。つまり、差を時間で微分したものになります。この値によって短時間での急激な変化をとらえることができるので、未来に起こりうる乖離に備えることができます。そのため、Derivative value は、「Anticipatory Control (予測制御)」とも呼ばれます。いきなりUGVがすごい加速をし始めたら、壁にぶつかってしまうかもしれません。この値を使って、オーバーシュートを防ぐことができるようになります。
これら3つの値を、それぞれの重みを付けて合計することで、制御システムへ適切な調整値を渡し、調整のためのコントロールをかけていくことになります。この重み付け等をどうするかについては、ロボットや機械がタスクを実行する目的や環境、また不確実性によって異なり、PID Controller においてパラメーターチューニングは非常に重要なポイントです。
PID Controller の応用範囲
PID Controller の用途は、何もロボットアームの動きやUGVのスピードに限った話ではありません。例えば、工場のパイプラインでパイプの内部を摂氏80度の一定の温度で決まった時間維持する等の温度の制御においても活躍します。PID Controller に目的の温度を入力し、温度は目標となる一定の温度に向けて上昇し、オーバーをセンサーが検知したら、フィードバックループの中で修正され、最終的に目標の温度で安定化することになります。
PID Controller は昔はすべて機械的な装置でしたが、今やソフトウェアとして構成されており、あらゆるところで活用されています。もちろん本Note でも時々記事を書いているドローンの一定の高度維持のためのローター速度調整から、自動車の高速道路での自動運転モードまで、その範囲は幅広いです。ドローンの場合は、着陸時は風で流されてしまわないように、PID の3つの値のうち、Derivative value を上げて制動を強めにするということをしますが、上空を飛んでいる場合は流されて多少コースから外れても大丈夫なので、バッテリーを長持ちさせるためにDerivative value を低く設定します。
今日の高度なロボットは、しばしば多くのPID Contoller によるコントロールループが並列で処理し、時には協働し、ありとあらゆることを制御します。二足歩行するロボットであれば、その重心のバランスから足の上げ下げまでです。
とはいえ、万能ではなく大型の機械の制御に関しては向いていないこともあります。応答開始に時間がかかるが、応答がはじまると急激に変化する制御対象には、あまり適していません。
そのような不向きな問題はあるものの、PID Controller は広く用いられている制御手法であり、知識として知っていて損はないかと思います。他にも制御手法としては、カルマンフィルタの適用や非線形制御等あります。現在は更にAI / Deep Learning による物体・環境認識や予測と組み合わさり、高度なロボット・機械制御が実現されています。以前に紹介したGoogle の関連会社で、自動運転技術を開発している Waymo はその最先端のプレーヤーのひとつです。
AI関連の記事と同様に、現代のAIとロボットや機械のエンジニアリングがクロスオーバーしていくロボティクス関連の記事も今後増やしていき、その中で、重要な情報やトレンドも紹介できればと思っています。
おまけ
今回解説した PID Controller は、AI、特に機械学習における「過学習」や「交差検証」あたりに相当するようなロボティクスの基本とも言えるかもしれません。基本の概念をはっきりとおさえることでその分野の全体像の視野が開けることもあります。
この記事が気に入ったらサポートをしてみませんか?