引き続き,交差点についてです.
前のページのプログラムではUターンに失敗することが多く発生します.
原因として大きいのが,図のように2つの緑マーカを同時に検出しない場合があることです.
ロボットが斜めに交差点に進入すると2つ緑マーカのうち片方だけを先に検出します.
そして,前のページのプログラムの場合は先に緑マーカを検出した側に旋回してしまいます.
また,センサの読み取りタイミングも問題になる可能性があります.
複数のセンサの値を読む場合,同時には読めず順番に読んでいくのですが,その間もロボットは移動しているため
交差点にある2つの緑マーカを同時には検出できないことがあります.
前のページのプログラムのような「緑マーカを見つけ次第,すぐに右折・左折・Uターンを判断」という方法は, 他にもうまくいかない場合があります.
レスキューラインのルールでは,「交差点マーカは交差点のすぐ手前に置かれる」となっており, 図のように交差点の向こう側に緑マーカがある場合には直進する必要があるのですが, 緑マーカだけで左折を判断すると,コースから外れたり逆走になってしまったりします.
上の2つの問題を解決する方法を考えます.
レスキューラインのルールあるとおり,交差点マーカは交差点の手前に置かれます.
これをロボットから見ると,まず交差点の緑マーカが現れ,そのあとに交差点の黒ラインが現れることになるので,
この順番で右折・左折,Uターンを判断できそうです.
緑マーカを検出したらそれをしばらくの間記憶しておきます.そのしばらくの間に交差点の黒ラインを検出したら,
右折・左折・Uターンを実行します.
Uターンの場合,
片側の緑マーカを検出したらそれを記憶,
その後に両側の緑マーカを検出したらそれを記憶,
続いて横向きの黒ラインを検出したらUターンを実行.
左折の場合,
左側の緑マーカを検出したらそれを記憶,
続いて横向きの黒ラインを検出したら左折を実行.
交差点の向こう側に緑マークがある場合,
交差点を通り過ぎた後で緑マーカを検出してそれを記憶.
続いて横向きの黒ラインを検出しないので直進を継続.
緑マーカの状態を判定するプログラムは前のページで作ったものがそのまま利用できるので, 交差点候補を検出するプログラムを作ります.
レスキューラインのルールによれば交差点は常に垂直に交わります.
ここで使用しているような横に5つ並べたセンサの場合は交差点で3個以上が黒を検出するはずですので,
これを利用して交差点の候補を検出するサブプログラムを作ります.
変数Cは交差点候補を検出したとき1,それ以外のとき0となります.
交差点判定手順を追加したメインプログラムを作ります.
上で説明した「緑マーカの判定結果をしばらくの間だけ覚えておく」という部分は,
変数とC-Styleの「タイマ」機能を使って実現することができます.
タイマは時間をカウントするもので,C-Styleの「タイマスタート」命令を実行するとカウントが0からスタートし,
時間が経つにつれ値が大きくなっていきます.
カウントしている値はif文の条件などに使用することができます.
今回のプログラムでは,
・緑マーカの状態の判定結果を変数Hに保存し,タイマスタート
・タイマのカウントが1秒を過ぎたら,変数Hを0に戻す
という使い方で,「一定時間だけ覚えておく」というプログラムにしました.
次に,この緑マーカの状態の判定結果をしばらく覚えている変数Hと, 交差点候補を検出したときに1になる変数Cを組み合わせて,交差点での左折・右折・Uターン・直進を判断します.
だいたいうまくいきました.
しかし,このプログラムではクリアできない交差点のパターンはまだあります.
次も交差点を考えたいと思います.
このページやサイトで紹介しているプログラムは1つの例です.
ライントレースの方法もいろいろあり,同じライントレースの方法でもそれを実現するプログラムもいろいろなものがあり得ます.
思いつく範囲でなるべく簡単にそこそこうまくいくと思われる方法やプログラムを紹介していますが,100%うまくいくものでもありませんし,
もっと良い方法もあると思いますので,1つの例として見ていただければと思います.