ロボトレース競技のマシンを作ってみる その9 センサの使い方を考える
こんにちは。そらです。
記事一覧のまとめ、ハードウェア、ファームウェアのデータはこちら。
はんだ付けまで終わって、回路周りの確認をしていたらセンサ回路を変えようとするところまで検討しました。今回は、センサの使い方について書いていきたいと思います。
センサの使い方の話の前にハードウェアのモータマウント等が届いたのでそれらの話をしていきたいと思います。
組付けをしてみました。モーターマウント自体はギアのかみ合わせ等問題がなくできました。ここで悲劇がおきました。不注意で基板を机の上から落としモーターマウントを割りました。
反省会
ナットで固定するというのは固定方法としては問題がないが、磁気式エンコーダのようにホイールが外すのが面倒な場合は付けずらいのでやめることにする。ねじを切った方が楽だと感じました。アクリルの場合はねじを切ることができるので切った方がいいかもしれません。
今回の問題点の解決策を考える
[Pさんよりアドバイス] マシンを壊すのは手遊びして落としたりしているからでは?扱いが雑。(要約)
↑その通りでございます。今年度も初っ端からやらかしました。
マイクロマウス等のロボットを作っている方へ。机がいくら散らかっていたとしてもマシンは机の内側に置くことに気を付けていただければと思います。
私が移動しようとしたときに机の上のコードを引っ張って落としました。ハーフマウスを手遊びしていて落とすということを昨年度の機体でなんどもしてしまったので手に持つのもやめるということも気を付けたいです。唯一の救いは、はんだ付けをした基板ではなく、はんだ付けをする前の基板に組み付けていたときだったことです。メイン基板にダメージは与えることはなかったです。
戒めタイム
割れることを考慮して複数発注しておくとGoodです。複数発注していないと壊したときに詰みます。マイクロマウスの場合は大会の前日の試走会に持って行ったときや、大会の当日の最終チェックのときに不調をきたすことが多々あるので、理想は二台同じように走るマシンを用意することだと考えています。
また、パラメータ等はマシン一台ずつ完璧に調整が必要ではなく、同一のマシンであればPID等のマシンに依存する少しのパラメータを変更するだけで走るようなソフトだと嬉しいですね。
閑話休題、センサの話に戻りたいと思います。
センサの使い方について考える
ロボトレース競技の参加者の走行前にやっていることについて考える
ロボトレのマシンを作るにあたって、YouTubeでロボトレのマシンの走行動画を探してはみるということをしていました。すると、マシンを走行させる前にラインに対してマシンを垂直において、ロボットを前後ろに動かすということをしている方が多くいるということに気づき、興味を持ちました。
何をしているのか、と考えてみたところセンサのキャリブレーションではないかという答えにたどり着きました。センサのキャリブレーションは最大値と最小値を取っていることが仮定されます。大会のコースによって白色の最大値や板の黒色の値は変化することが考えられます。センサの値を決め打ちにしてしまった場合は大会会場のコースのコンディションが変わった時にコースアウトしやすくなってしまう等が考えられます。
他に、ステアリング機構のついている方はセンサが小さいことやマイクロマウスのように光センサを使用している方がいました。
ラインに追従する方法を検討する
ロボトレース競技に出走しているロボットのほとんどは、対向二輪、変則四輪のロボットでラインセンサ基板は固定でした。他に、サーボ機構を用いた4WDや変則四輪のセンサ基板だけサーボ機構で追従するものがありました。
私が製作しているロボットは変則四輪になります。なので、大多数の参加者の方と同じような構成です。
初めに、センサが白線を追従するサーボ機構を用いたマシンの制御を考えていきたいと思います。サーボ機構のついたマシンはセンサ基板が小さいことから使用しているセンサの数が小さいことが読み取れます。白線は真ん中だけにあり他は黒い板であるため、光センサの左右の引き算をして0になるようにサーボ機構を動かしてサーボ機構の角度によってタイヤの回転数を変えるという形で制御していそうだということ考えられます。
続いて、対向二輪、変則四輪について考察していきます。
サーボ機構がないため、センサ基板は白線に追従するということができません。変わりにセンサが横に広く複数のセンサがついていることがわかるため白線の位置に対して制御量を生成して制御をしているのではないだろうかということが考えられます。ここからは、ラインセンサの使い方や制御量の生成をする方法について検討していきます。
ラインセンサの使い方に検討する
ここからの内容を書いていくにあたって、今回の検討する対象について説明します。私が設計したセンサを以下に示します。センサにはそれぞれ記号を割り振りました。
フォトトランジスタのコレクタ/エミッタのどちらに電圧変換抵抗を付けるのかによって白のときに値が上がるか黒の時に値が下がるのかが決まりますが、今回はエミッタに抵抗を付けた時で、白線を読んだときに値が大きくなるという前提に話を進めていきます。また、AD変換は10bitすなわち0~1023の値を使います。
白線の上にのったセンサは値が大きくなり、他のセンサは黒色の上にあるため値が小さくなることが考えられます。グラフにすると次のようになっていることが仮定できます。
これはマシンが白線に対して真ん中においてあると仮定したときに予想できる値をプロットしてみたものです。センサはそれぞれ黒や白の時に同じ値にはならないことが考えられます。すなわち、ラインセンサをそのまま生値で使用するのは使いづらそうだということが読み取れます。
ここで、最初に紹介したセンサキャリブレーションが役に立つということがわかりました。センサが乗っていないところは基本的に黒色のところ、すなわちAD変換としては最低の値であり、白線のところはセンサの最大値であることが考えられます。ここで、最大値と最小値を使用してセンサの正規化を行うことで、すべてのセンサの値をある一定の値の範囲内に収まるようにできそうです。
センサでラインの位置を検出するイメージや、正規化を行って、0~1の間に値を変換することができたので制御量の生成について考えていきます。
制御量の生成について検討する
センサの正規化ができたところで、制御量の生成について考えていきたいと思います。先程のグラフを参考にすると、L1,R1が1、他の値が0であることが読み取れます。制御量自体は0であってほしいので0になるような計算式は、L1-R1が思いつきます。左の場合は制御量が正、右の場合は制御量を負として目標値を生成することにすると、次の式で計算することが可能になります。
Control = (L1+L2+L3+L4+L5+L6) – (R1+R2+R3+R4+R5+R6)
ただし、このままではL1~L6,R1~R6の値がすべて均等の重みになっています。実際に白線を追従するためには外側のセンサが値が大きくなったときに大きな制御量を与えてあげないとラインから脱線してしまうことが容易に想像がつきます。したがって、距離が離れたセンサほど重みをつけてあげる必要性があるということがわかります。重みをそれぞれK1~K6とすると、
Control = (L1K1+L2K2+L3K3+L4K4+L5K5+L6K6) – (R1K1+R2K2+R3K3+R4K4+R5K5+R6K6)
この値に対して、目標値の大きさになるように定数倍をしてあげれば制御量として使用できそうですね。
さいごに
長々と書きましたが、最終的に一行の式で制御量の生成ができそうだということがわかりました。
youtubeでロボットの動画をたくさん見るのが楽しかったです。ロボットの動画を見るときにほとんどの人がやっていることには、それを行うことで得られることが何かしらあるという目線で見るといろいろな発見を見つけることができるかもしれません。
ハードウェアは苦手なのでハードの話から脱却できて嬉しい限りです。制御やソフトウェアも全然ダメなんですけどね。ソフトウェア、制御は理解ではなく雰囲気がわかった(?)って感じです。精進していきたいです。