All_outlook

All_outlook

RCJ Soccer Lightに出場予定の高校1年生4人組です!中学の科学部仲間で再集合して結成しました。作ったものや研究結果、余談?などを上げていきます。

ホームページ Junの個人ブログ

このブログの影響で生じた損害などにおいては責任を負いかねます。試す場合は完全自己責任でお願いします。
ブログの運営はJunがやっています。

ブロッカーについて

どうもこんにちはYoshitoです! 今回は関東大会で作ったブロッカープログラムについて紹介したいと思います。 関東大会では、1試合目はブロッカーを動かしたのですが、2機体目以降はアタッカーが故障したためにブロッカーをアタッカーとして使ったので、調整と1試合目しか出ていませんが、自分たちのブロッカーについて書きたいと思います。 が、自分たちのブロッカーについて書きたいと思います。

ブロッカーは大まかに、ゴールを囲う白線上を動くという感じです。ボールが左側にあったら左に、右側にあったら右に、正面にあったら止まります。一応、ボールが一定間動かなかったら前に出るようにしています。

詳しく説明する前にラインセンサのプログラムについて紹介したいと思います。

ラインセンサ

ラインセンサは32個と多いためアナログマルチプレクサを使い読み取っています。 白線を踏むと値が大きくなるので閾値を調整して値が閾値未満なら0、閾値以上なら1としています。 その1の中で最も小さな整数と最も大きな整数を出し繋いでいます。 分かりにくいと思うので例を出すと、閾値が500だとして、0~31を示した場合、

240,300,280,300,560,600,480,240,300,200 (0~9番)

400,300,345,340,380,420,250,420,440,200(10~19番)

450,300,240,450,560,320,190,220,450,600(20~29番)

560,540,(30~31番)

と出た場合、4、5、25、29、30、31番のラインセンサが1となり、他は全て0です。また、この中の最大値は31、最小値は4となります。(テキトーに出したのでこういう値が出るかは分かりませんが…) これで(最大値ー最小値)がラインセンサの半分(16)より大きければ、平均を出してラインセンサの半分(16)を足した値、小さければただ平均の値としています。その出た値に11.25(360÷32)を掛けて出た角度が白線がある位置となります。 上記の例の場合だと、31が最大、4が最小になるので、(31-4>16)であるため、(31+4)÷2+16となります。(ラインセンサの値が0か1かを決める時点で全てが0だった場合、角度は0としています。逆に正面は360にしています。)しかし、この場合だと、33.5と31を超えてしまうので、32よりも大きかった場合は、その値から32を引いています。そこから出た1.5上記の例の場合だと、31が最大、4が最小になるので、(31-4>16)であるため、(31+4)÷2+16となります。(ラインセンサの値が0か1かを決める時点で全てが0だった場合、角度は0としています。逆に正面は360にしています。)しかし、この場合だと、33.5と31を超えてしまうので、32よりも大きかった場合は、その値から32を引いています。そこから出た1.5に11.25を掛けた値が白線の位置となるので、1.5×11.25=16.875が白線の位置です。通信の関係上、小数点以下は送れないので、四捨五入をして、17がラインセンサの角度として送っています。

ブロッカー

ということで、ラインセンサの角度が出たところで、本題のブロッカーのプログラムに入っていくのですが、ラインセンサから0(コート内である時の値)が送られ来た場合、機体は180°に進むようにしています。これはコートを囲む白線を守るためです。 ゴールの白線の横ラインに触れた時は、ラインセンサから180という値が送らてくるはずなので、そうなったら0つまり機体が停止するようにしています。しかし、機体は急には止まれず、白線を超えてゴールエリアに侵入してしまう(白線を超えて最終的に白線が読み取ることができなくなり、コート内にいることになり、180°に進んでしまう)ため、前回から送られてきた値を保存しておいて前回のラインセンサの値が360(白線を通過した時、ラインセンサが最後触れるのは31、0、1番付近で上記のラインセンサプログラム上、360)であり、今回の値が0となった時のみ、次にラインセンサから180と送られてくるまで360°の方向に進むようにしています。

youtu.be

最終的にラインセンサの値を頼りにして決めた角度が0となったらここで初めてIRセンサを頼りにします。IRセンサも同様0~360(ボールが見えない時は0、正面にある時は360)で送られてくるため、350~10、170~190は止まり、10~170は右へ、190~350は左に進むようにしています。 また、ボールを追っていると、ゴールを囲む白線のカーブしているところや縦のラインを踏むことになることがありました。 そのため、ラインセンサでは踏んでいる角度が送られてくるため、右のカーブしている部分は330°、左のカーブしている部分は30°、縦の白線は360°に進むようにすることでゴールを囲む白線の横のラインにいれるようにしました。 しかしこれでは、それがゴールを囲む縦の白線なのかコートを囲む白線なのかを判定できなく、もしコートを囲む白線だった場合、機体がずっと前進し、相手側に行ってしまうため、一定時間ラインセンサから90もしくは270と送られてきた場合は、送られてきた値の反対側に1秒ほど進むようにしています。こうすることでコートのをしっかりと守ることができました。 また、ボールが一定時間動かなかった場合、機体がボールを1秒ほど追った後、また180°戻るようにしました。 この方法として、最初ラインセンサと同じように前回の値と今回の値とほぼ同じなのが3000回くらい繰り返した場合、前に出るにしていましたが、これだと機体の1ループはとにかく速く、ボールが動いていても前回の値と今回の値はほとんど変わらなくなってしまい、1000ループに1回機体ボールを追うことになってしまいました。そのため、IRセンサから値が送られてくる度に数えておき、1回目と750回目が同じだった場合は次へ、違かった場合は数えていたものをリセットというものを1500回目、2250回目と繰り返し、3000回目と1回目の値が同じだった場合のみにボールを追うにすることで改善されました。 最終的に出たラインセンサもしくはIRセンサを頼りにした値とジャイロセンサの姿勢制御をスピードに入れて機体を動かしました。

しかし、ゴールがなかったら上手くいったのですが、ゴールを付けると角ではまってしまうというミスが出てしまったため、これはもっともダメなことなんですけども直すことができませんでした。 以上がブロッカーのプログラムでした。 分かりにくいと思うのでなんとなくまとめると、

1、ラインセンサからの値が0であった場合は後進する 2、ラインセンサが180と示したら、ゴールの横線であるため、ストップ 3、しかし、2だとアウト・オブ・バウンズになってしまうため前回の値と今回の値を記録しておき、前回が360で今回が0だった場合は、ラインセンサから180と送られてくるまで前進 4、白線のカーブは30°、330°、縦線なら前進 5、しかし、4だと前進する時コートを囲む白線かゴールを囲む白線かを判断できないため、一定時間前進命令が出たらラインセンサの値の反対側に一定時間進むようにする 6、ボールは何度か値を保存しておきその値と1回目と3000回目が同じだったら、ボールのみを追い、一定時間したら戻ってくる

しかし、ゴールの角にはまってしまうためそこは要検討… こんな感じですかね…分かりにくいと思うのでプログラムを載せて置きます。(こっちも分かりにくいかも←そしたらどうしようもねぇ…)

最後に

上のブロッカーを読んでいただきありがとうございました。今回の関東ブロックをもって私、Yoshitoはロボット制作すなわちAll_outlookを引退させていただきます。これは学力が低下して大学に行けないのではないかと親に止められてしまったからです…これから勉強に励みますのでよろしくお願いします。私情ですみません… RCAPで関わって頂いたり、Twitterで交流して下さった方々ありがとうございました!9か月くらいととても短い間でしたがとても楽しかったです。今後も私は引退しますが、All_outlookは残りますのでよろしくお願いします。

ご静聴ありがとうございました!