センサ技術~制御応用編~
1 2つのセンサでライントレース~オーバーランしてしまったら~
2 3つのセンサでライントレース~オーバーランしてしまったら~
3 直前動作記憶を超音波センサのクランク走行に利用してみよう!

ロボット講座の14回目です。前回は反射型のフォトリフレクタモジュールTCRT5000をロボットカーに取り付け、床面に引いた黒い線を認識して、この線に沿って走行するライントレースに挑戦しました。実際にコースを走らせてみましたが、ジグザグ走行をしたり、コースを外れたり、実際に走らせるとなかなかうまくいきませんでした。今回は、オーバーラン対策を考え、より実践的なプログラムを作成していきます。ライントレースに利用した直前のセンサの状態を記憶して、次の動作の判断に利用する方法は超音波センサでのクランク走行にも利用できます。
1 2つのセンサでライントレース~オーバーランしてしまったら~
オーバーランしてしまうということは、すべてのセンサーがラインからはずれてしまうことです。センサーが2つでも3つでも勢い余って飛び出してしまったり、曲がる指示を出しても慣性で曲がり切れない状態です。この対策として最も有効なのは速度を落とすことですが、スピード競技を行う場合、あまり速度を落としたくないので、オーバーランを見込んで対策する必要があります。それは、直前の状態を記憶しておいて、オーバーランしたら、元に戻すように命令することです。直前の状態を記憶しておくために、43、44行目に変数を設定します。

None の意味:None は、Pythonにおける特別な値で、「何もない」や「値が未設定である」という状態を示します。None を代入することで、これらの変数が「まだ何も値が設定されていない状態」であることを明示しています。
なぜ None を使うのか:このコードの目的は、センサーの現在の状態と以前の状態を比較するために使います。初期状態では、まだセンサーの状態が何も読み取られていないので、None を使ってそのことを示しています。
その後、センサーの値が読み取られると last_left と last_right に実際のセンサーの値が代入されます。
53行目~56行目:これはif left != last_left or right != ast_right:と同じ意味です。つまり、left か right のどちらかが変化があれば、このif文を実行しますが、センサの値に変わりがなければif文を実行せずに73行目に進み、46行目に戻って、繰り返し実行します。同じ動作であれば、変化するまでその動作を繰り返し、変化があれば、if文の中身を実行します。

左のセンサと右のセンサのどちらかが黒いライン上にあればオーバーランしていないので
69行目から74行目を実施します。オーバーランしているときは左右のセンサが両方とも黒いラインの外になりますが、②は理想的な状態なので、67行、68行のように対応します。
オーバーランしているのは①の状態と③の状態です。この直前の状態との変化をみて、次のように対策を行いました。
①の状態:右側センサはライン外。左側センサが直前まではライン内にある。
対応:60行~62行
③の状態:左側センサはライン外。右側センサが直前まではライン内にある。
対応:63行~65行
2 3つのセンサでライントレース~オーバーランしてしまったら~
センサ3つでも考え方は同じです。


54行目~58行目は、前のループ時とセンサ値が一緒なら、59行目以降は実施せずに91行目で0.01秒後に48行目に戻って再ループします。
59行目~63行目は、3つのセンサすべてが黒いラインから外れているなら、
緑色:中央が1→0でラインをまたいでいる
青色:左が1→0でオーバーランしている
の2通りで、
赤色:左が0→1なので、現在は0でなく1
59行目はif文、74・77・80行目はelif文
83行目はelse文で、if ・・ elif ・・ else の構文です。
87行目~89行目は、現在のセンサの状態を記憶しています。
3 直前動作記憶を超音波センサのクランク走行に利用してみよう!

第11回の「クランク走行の基本」で考えたプログラムは左右の壁との距離を均等に保ちながらコーナーまで進みターンするものでしたが、コーナーをいかにうまく曲がるかということについては不十分なものでした。上の図の②から③までの移動についてプログラム上では指示していませんでした。そこで、両側の壁を意識して走るのではなく、片側のみを考えて走るようします。
例えば②から③に移るときに、左右の壁までの距離のバランスを考えると、②から③のときに急に左側が大きくなるので、左に曲がろうとするため、③の位置までいかずに、斜めの方角に向かってしまいます。これを、この図のように左に曲がっているコーナーならば、右の壁までの距離だけを意識して走ることで、③の位置まで曲がらずに進むことができます。その後、90度回転しますが、それでも右の壁沿いに進めばよいと考えられます。次に右曲がりのコーナーに来たら、①から②に進むと、今度は右の方が広いので、逆に左の壁沿いに走ればよいと考えられます。このような点をプログラムにすれば、より円滑にコーナーを走行できるクランク走行が実現できます。また、曲がる角度についても壁との距離に応じて、曲がる角度を変化させる、つまり、壁との距離を基にした比例制御プログラムを作成することで速さだけでなくターンも状況に応じて円滑にできるようになります。



