Itamika logo Itamika

ロボコン制御中級

自動制御

自動制御とは

人が操縦しなくても勝手に判断して動いてくれるように制御する

目標

オムニを自動制御する

流れ

  1. 自動制御動画
  2. フィードバック制御
  3. PID
  4. 内界センサ
  5. 外界センサ
  6. 自己位置推定
  7. 自動制御基礎

自動制御動画

https://twitter.com/Kotakku_07/status/1213015087033667584?s=20

具体的な目標

「1m前に進んで、左に1m進んで、斜めに戻ってくる」 というプログラムをかけ

  1. センサ等で今どこにいるか調べる
  2. 目標位置を通り過ぎたら、戻る
  3. 目標位置に届かなかったら、ちょっと進む

フィードバック制御

適当に5秒、PWM30%とかで動かしても、1mぴったりとか正確にはできない

auto-ex.avif

よって、センサの値をフィードバックすることにより、1mぴったりに移動する

フィードバック制御とは 結果を入力にフィードバックし、結果と目標の差によって、入力を調整する制御方法

例1: 水道の蛇口をひねりすぎて水が跳ねるので、ちょっと閉めていい感じにする 例2: FPSのエイムコントロール

フィードバック制御で有名な手法がPID制御である

PID

PIDとは

  • P: Proportional (比例)
  • I: Integral (積分)
  • D: Differential (微分)

の3つの制御を組み合わせた制御手法である

P制御PI制御PID制御
モーターのPID制御法より

このようにいい感じにいい感じに目標値に収束させることができる

また、いい感じのGIFがある

PID制御アニメーション
Wikipedia Commonsより

PIDを数式でモデル化すると以下のような感じになる ttは時間、r(t)r(t)は目標、y(t)y(t)は結果とする

偏差は以下で表される e(t)=r(t)y(t)e(t) = r(t) - y(t)

P制御の入力は以下で表される u(t)=Kpe(t)u(t) = K_{p}e(t)

PI制御の入力は以下で表される u(t)=Kpe(t)+Ki0te(τ)dτu(t) = K_{p}e(t) + K_{i}\int_{0}^{t}e(\tau)d\tau

PID制御の入力は以下で表される u(t)=Kpe(t)+Ki0te(τ)dτ+Kdde(t)dtu(t) = K_{p}e(t) + K_{i}\int_{0}^{t}e(\tau)d\tau + K_{d}\frac{de(t)}{dt}

そのままである

内界センサ

IMUやオドメーター(エンコーダ)は内界センサと呼ばれる、ロボット本体の情報を計測するセンサである

外界センサ

カメラや赤外線センサ、超音波センサなどは外界の情報を取得するため、外界センサと呼ばれている

自己位置推定

PID制御により、ロボットの位置わかれば、その位置まで移動させることができることが分かった しかし、肝心の位置はどうしたら手に入れられるのだろう センサから持ってくればいいと思う人もいるだろうが、位置情報の取得方法にはいくつかある

弊部で通常、使っているのはIMUとオドメーターを使用した自己位置推定である

IMUは角速度と加速度などを計測できるセンサである ロボットの**角度(θ\theta)**を計算するのに使用する

**オドメーター(計測輪)によりX軸とY軸の移動距離(m)**を計算する 幣部ではエンコーダー、オムニホイール、リニアガイド、ばね等を使用し、オドメーターというものを自作している

MPU6050自作オドメーター
SWITCHSCIENCEより

IMU1つと、 オドメーターX軸Y軸それぞれ1つずつにより、 オドメトリ(自己位置)を推定している

IMU

IMUセンサは加速度と角速度を得られる。 一般的にはこの2つをカルマンフィルタなどでセンサフュージョンし、角度を算出している。 個人的に気に入っているのはMadgwickフィルタである。 しかし、簡単に角度 (θ\theta) を出す方法として、角速度 (ω\omega) を積分する方法が使用される。 弊部では競技時間が概ね3分であるため、積分誤差があまり発生しないと考え、この方法を使用している。

θ=0Tωdt\theta = \int_0^T \omega dt

オドメーター

オドメーターはオムニとエンコーダーで、オムニの移動距離を計測するものである。 エンコーダーより回転数 (rr) を取得し、オムニの外形 (ll )倍にすることで、移動距離 (L) を算出できる。

L=r×lL = r \times l

センサフュージョン

IMUとオドメーターの使い方はわかったが、これだけでは自己位置は推定することができない。 IMUとオドメーターのセンサフュージョンを行う必要がある。 情報を統合することで、XY座標系での現在の自分の位置を計算する。

まず、エンコーダーの回転数の値が、dtdtで変化した分をそれぞれ、dr1,dr2dr_{1}, dr_{2}とする。 オムニの直径をdwd_wとする。 これからdx,dydx, dyを求める。dr1dr_{1}をロボットのX軸を測る方に配置していた場合、

dx=π×dw×dr1dx = \pi \times d_w \times dr_{1} dy=π×dw×dr2dy = \pi \times d_w \times dr_{2}

となり、Yaw角速度 (rad/s) ω\omegaを使用して、

x=0T(dxcosωdysinω)dtx = \int_0^T (dx\cos{\omega} - dy \sin{\omega}) dt y=0T(dxsinω+dycosω)dty = \int_0^T (dx\sin{\omega} + dy \cos{\omega}) dt

と計算できる。 このようにXY座標を計算し、θ\thetaはさっきの積分の式の通りに計算すれば、ロボットに必要な座標情報がすべて求まったことになる。

自己位置推定

自動制御基礎

IMUやオドメーターにより、オドメトリを取得し、PID制御によっていい感じに制御せよ!