作成者:ゆうたろう,PuKKu作成したコースを1周するロボットを製作する。交差点以外のコース上に500mlの空の紙パックを3個以上おき、紙パックにぶつかった時には次のような動作するプログラムを作成する。今回は、特に「確実さ」に重点を置き、そしてより「速い」ロボットを目指して製作することにした。†ライントレースを確実にそして速く行うために、右図の例のように光センサー2個を黒線の外側になるように設置する。黒い線に光センサーが反応すると黒い線が中央になるように向きを変え、ラインを見失わないように進むことができるようにする。2つの光センサーの幅をなるべく狭くするようにし、線から外れていることを早めに検出できるようにする。†より容易に紙パックを運ぶことを考えたが、紙パックを逃がしてしまう可能性があった。そこで、紙パックを持つと目的の場所まで確実に運ぶことができるように、紙パックを逃がすことがないように右図のように四方を囲む方式を採用することにする。紙パックは下図のアニメーションのような方法で捉えて運ぶようにする。今回は、左右に動くのが基本の動作となるので、最初の授業で作ったドライブベースを基にして上に乗るものが安定するように改良を加えた。2つの光センサーの幅を狭くするために、右図のように位置を変更した。†ライントレースが確実にできるように、光センサー2つの幅がなるべく小さくなるようにした。地面に近づくようにして、線を正確にとらえられるようにした。初めは、ギアだけを組み合わせて動かそうとしたが、アームの重さに耐えられずに動き出してしまった。そのため、ウォームギアを使用して、アームの重さでアームが動き出してしまわないようにした。紙パックの四方を囲むようにして、運ぶときに逃がしてしまわないようにした。確実に捉えることができるよう四角形の横の長さを少し長くした。当初は、それぞれの図の左側の図のようにしていた。実際に動かしてみると反応するときとしないときがあった。そのために思考錯誤をしてタッチセンサーの設置する場所から考え直し、組み立てガイドのバンパーを参考にしてそれぞれの図の右側の図のように改良を行った。この方式だと、きちんと紙パックを認識することができた。正面に紙パックがいるとき以外は反応しないようにするために、試作品に比べて、完成では、バンパーの直線部分を短くした。紙パックを支えるために、と思って付けたバンパーの上の方の部分は、正面に紙パックがないときでも反応しやすくなるため外した。図1は、正面から見た様子であり、図2はタッチセンサーの様子を写した図である。†この左図は、初期の状態である。これだと、バンパーが紙パックに反応することができたりできなかったりすることがあり、確実に運ぶことができなかった。†これが、完成品である。バンパーの反応は万全になった。一応、課題を行うことができるようになった。†ウォームギアを使用して、アームを動かすようにし、アームが自らの重さで動き出さないようにした点。アームを動かす速度をウォームギアの使用で、適当な速さにすることができた点。光センサーの2つの幅を狭くすることで、黒い線を正確にとらえられるようにした点。紙パックを認識するバンパーをどのようにすれば、軽い紙パックを前に押し出すことなく認識できるかどうか考えながら作成した点。コードをロボットの作業に支障が出ないようにコードを通すところを考えて配置した点。紙パックの四方を囲むことで運ぶ途中で障害物のない限り、確実に目的の場所に運ぶことができる点。それぞれのパーツをどのようにして台車に乗せると良いのか考えた点。紙パックの設置位置によって、バンパーが反応してアームが動き出したときに紙パックが枠の中にきちんと入ることができないと、その紙パックは、動かすことができない点。バンパーが前に出ているため、カーブなどに紙パックが置かれると紙パックの正面を本体が向いていないのにバンパーが反応する点。紙パックを運ぶ際、下に段差などの障害物があると紙パックが倒れてしまう点。†このコースを走行する。〜このコースについて〜マリオサーキット2,3(SFC版のマリオカート)を参考にして作った。このコースの欠点としては交差点直前のラインが曲がりくねってるため、マシンがときどき交差点から外れてしまうのと直線が少ないので箱をうまく配置しないと箱をうまくキャッチできない点である。//前進}}Off(OUT_A+OUT_C);}←箱の配置と進行ルート交差点ではいちいち停止し、箱があればどけて進む。†〜工夫した点〜バンパーを改良し、タッチセンサが反応するようにした。成功率を上げるために交差点で二度止まるようにした。牛乳パックは時計回りで回転し、どける。パックを進行方向の反対にどかした後、進行方向へ向き直る時そのまま回転するとマシンがパックにあたってしまうので、向き直る前に少し位置をずらしてから向き直るようにした。これにより、マシンがパックに当たらなくなった。〜問題点〜マクロなどを使わなかったためにプログラムがけっこうややこしくなってしまった。やりようによっては、もうちょいすっきりさせることができたような気もする。私の課題は、紙パックを交差点へ運ぶというものである。右図には、具体的にこのロボットがどの方向へ進み、紙パックがどの辺りに設置してあるかを示してある。交差点に運ぶだけのように思うが、このコースに注目をすると、紙パックを交差点まで運んでも、次に交差点を通るときにこの紙パックが邪魔になってしまうのだ。この課題を行う上での以下の2つの点が特に大変であった。これらについて、私なりに考えた解決策を示してみる。交差点に置いてある紙パックかどうか判断させる点。どのようにして、紙パックを避けるのかという点。〜交差点に置いてある紙パックかどうか判断させる点〜交差点を見てみると、必ずT字型の交差点であることを知らせる印が進行方向から見て左側にある。1回紙パックを持ったあとに左斜めに進んでT字型の印があるかどうかを判断させて、交差点であるかどうかを決めていくことが一番良い方法だと私は思った(プログラムでは「//運ぶべきものか、置き去るべきものかの判断へ」から)。左図の�から�の順番でロボットは動き、交差点にあるかどうか判断する。初めは、紙パックに触る回数で、奇数回が運ぶというようにしようと思ったが、実はそれができないところが一か所あったので断念をした。〜どのようにして、紙パックを避けるのかという点〜この点についてはとても悩んだ。紙パックの周りを通る方法や、最後に交差点を通るまで紙パックを持ち続ける方法など。その中で、確実にライントレースを再び行うことができるものは、コース上からあまり離れないターンをする方法だと思った。そこで、もう一度紙パックを持って少し動いてから、回転し元の位置に戻すようにした。turn()」が主であるが、この説明の部分は「//暗くなったら(置き去るべきもの)」から)。右図は「//暗くなったら(置き去るべきもの)」の「//ライントレースを少しだけ再開」からの部分の軌跡を示したものである。�〜�の順番に動いていく。�が終えたときに紙パックを離す。紙パックがバンパーに当たっても、少し間をおいて紙パックを捉えるようにしたことで以前より失敗する確率が低くなった点。「turn()」を有効に使うために交差点で紙パックを置くときにも使えるようにした点。コース上から離れないようにするために、ライントレースをしてコース上に戻るようにした点。交差点に紙パックを置くときに、黒い線が途切れているために半回転したことが分からなくなり、かつ前に出すぎておいてしまうために、もう一度進行方向を向かせて、少し前に出てから、もう一度回転をさせる点。ターンをする度、紙パックを持っているとアームが本体より前に出ているために、他の紙パックを動かしてしまう点。ターンをすることで、画用紙の周りに紙パックが出てしまうと、ときによっては紙パックが倒れてしまう点。†〜ゆうたろう〜PuKKuの力無しではこの課題こなせなかったかもしれぬ。マシン製作に少しくらいは貢献したはずだ。今回の課題の出来は上々だ。〜PuKKu〜今回は、ゆうたろうと一緒に集まって製作する時間があまりとれなくて大変だった。それに加えて、ダウンしてしまい時間がギリギリになってしまったことは大きなダメージであった。ロボットの作成では、バンパーについてもう少し考えておくべきだった。なんとかできて形が良かった。プログラムでは課題をどのような方法で解決していくか考えるのが大変だった。†コメントをどうぞロボットの説明、プログラムの説明ともに、写真や図を使用してわかりやすくできていて、とてもよいです。プログラムについては、if部分をインデントして見やすくしてください。パックが軽すぎて反応しづらい場合、センサー部分を改良することで反応しやすくすることができないか考えてみてください(今回は工夫しなくても反応する範囲かもしれませんが)。15:32:20ロボットもプログラムもいろいろと工夫しているようですし、その説明も詳しくてとてもよいです。一つ目のプログラムでは閾値に直接数値を書いていますが、変数を使った方が後でまとめて調節できます。whileから抜け出す方法として、変数を設定しなくともbreakもあります。他にも、細かいことですが、変数をマクロ内で定義すると、呼び出すたびに何回も定義することになるので、変数を定義する場所にも注意できたらより無駄がなくなると思います。プログラムがごちゃごちゃしてしまったら、フローチャートなどを書いて整理しなおすと良いかもしれません。