画像処理マイコンカー製作




最小二乗制御法(実践編)

 では、実際にマシンが見ている画像から最小二乗法で1次関数を引いてみましょう。ただし、座標をわかりやすくするために時計方向に90度回転させて、マシンから近い方から遠い方に進む軸を「x軸」、画面の左から右へを「y軸」としています。

○ 車体が中央位置

車体が中央位置

 計算結果は、「ずれ」を表すbb「−4」で傾きを表すaa「0」です。この計算結果からハンドルを切る量を決定します。

○ 車体が左に寄っている。

車体が左に寄っている

 計算結果は、「ずれ」を表すbb「47」で傾きを表すaa「−4」です。bb値からかなり、マシンがラインからずれていることがわかります。また、値が「+」ですので、ラインが右に見えていますのでマシンが左方向にずれていることがわかります。傾きを表すaaは値が小さいのでほぼラインと平行にマシンが位置していることがわかります。

○ 車体が右に寄っている。

車体が右に寄っている

 計算結果は、「ずれ」を表すbb「−47」で傾きを表すaa「4」です。bb値からかなり、マシンがラインからずれていることがわかります。また、値が「−」ですので、ラインが左に見えていますのでマシンが右方向にずれていることがわかります。傾きを表すaaは値が小さいのでほぼラインと平行にマシンが位置していることがわかります。

○ 車体が中央位置で左カーブしている。

車体が中央位置で左カーブしている。

 計算結果は、「ずれ」を表すbb「−16」で傾きを表すaa「−13」です。y軸の「+」と「−」が普段目にしているグラフと反対で上に行くほど「−」で、下に行くほど「+」ですので、注意が必要です。bb値の値からマシンはラインの中心から「ずれ」の大きさが「16」がわかります。aaの値よりマシンとラインとの平行が保たれていないことになります。また、値が「−」ですのでラインが左の方にカーブしていることがわかります。この値によりカーブの大きさを知ることができます。

○ 車体が中央位置で右カーブしている。

車体が中央位置で右カーブしている。

 計算結果は、「ずれ」を表すbb「3」で傾きを表すaa「11」です。y軸の「+」と「−」が普段目にしているグラフと反対で上に行くほど「−」で、下に行くほど「+」ですので、注意が必要です。bb値の値からマシンはラインからそれほどずれていないことがわかります。しかし、aaの値よりマシンとラインとの平行が保たれていないことになります。また、値が「+」ですのでラインが右の方にカーブしていることがわかります。この値によりカーブの大きさを知ることができます。


 このようにbbの値よりマシンがラインからどれだけ「ずれ」ているかを知ることが出来ます。aaの値よりマシンとラインの平行度を知ることが出来ます。また、「+」であれば右のカーブ、「−」であれば左のカーブと言うことまで判別することが出来ます。
 今回、この2つの値によってハンドルの切る方向と角度を計算することにしました。

○ ハンドルの方向と角度計算

 まず、マシンとのラインとの「ずれ」となるbbを用いて計算をします。今回、マシンが左にずれているとラインが右の方に見え、bbの値が「+」となります。反対にマシンが右にずれているとラインが左に見え、bbの値が「−」となります。これはハンドルの制御でセンター値より増やすと右にハンドルをきり、センター値より減らすと左へハンドルを切るようにサーボを取り付けていますのでハンドルを切る方向が同じになります。次に、bbの値は「ずれ」の大きさとなりますので、大きくずれているときは値が大きくなり、サーボのハンドルを大きく切ることになります。
     handle2( bb );
ただし、カメラの取り付け位置やサーボの制御プログラム、マシンの運動性能などによってbbの値だけではハンドルの切りが足らない場合は、定数をかけて増幅する必要があります。反対にbbだけではハンドルの切りが大きくなりすぎる場合は定数をかけて減衰する必要があります。
     handle2( bb*hp );
アナログ制御を行っているマシンは2つのセンサーの差からマシンの「ずれ」を読み取りハンドル角度を計算しています。この制御はアナログ制御マイコンカーと同じ制御になり、この制御を「P制御」と言います。しかし、マシンの速度が上がってきますと、この「P制御」だけだと目標値付近での制御量が大きすぎて「オーバー」「アンダー」を繰り返してしまい、目標値に収束に時間がかかってしまい、蛇行した走りとなってしまいます。そこでアナログ制御マイコンカーは、前回の「ずれ」と今回の「ずれ」の差を計算し先ほどの「P制御」に修正を加えた「PD制御」が行われています。
今回、速度がそれほど速くありませんので、「P制御」のみで制御しています。
 次にカーブの大きさとしてaaの値によってハンドルを制御していきます。aa値が右カーブなら「−」、左カーブなら「+」となっておりサーボーの動きの反対となっていますので気を付ける必要があります。具体的には(−1)を掛けてハンドル値とします。これを先ほどのbb値に加えます。
     handle2( bb*hp-aa*kp );
bb値と同じく、諸条件によってハンドルの値を増幅、減衰する必要がありますので定数を掛けています。



これで、適当な定数を与えてあげればラインをしっかりとトレースします。画像処理でライントレースをさせるのであればこれで完成です。意外と出来そうと感じてもらえたと思います。ただし、途中のところにも書いていますが、マイコンの処理能力が低いために手を抜いている部分やマシン速度が遅いために適当にしている部分もありますので、検証していくところはたくさんあります。
特に、カメラの制御についてはいただいたものを一切、手を入れていませんので研究の価値はあると思います。


カーブ走行動画



次回からは、マイコンカーラリーのコース中ででてくる障害物の走行について解説します。

<< 最小二乗制御法(理論編)   目次  クランク走行 >>