課題3は「ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。課題3はテストの時期と重なるため十分な時間をかけての試行錯誤は困難であると予想された。この課題は所定の容器に入れられたピンポン玉に応じてポイントが加点されるがプラ容器内のピンポン玉1個運べば8点2つとも運べば20点L地点とL'地点(いずれもプラ容器外)のピンポン玉1個運べば4点2つとも運べば12点と加点されるポイントはプラ箱内のピンポン玉を運んだほうが多い。そこで今回はプラ箱外のピンポン玉は無視してプラ箱内のピンポン玉のみを運ぶロボットを作ることにした。†プラ容器の中のピンポン玉は以下の方法で取ることにした。プラ容器を下の図のように傾ける。下の図のように傾けたプラ容器から転がってきたピンポン玉を取る。今回は上のようなロボットを作った。工夫した点は以下の4つである。図のようにプラ箱を傾けるためにはかなり長い腕が必要だった。腕の先端の棒はプラ箱を傾けたときにプラ箱を安定させるという役割がある。†ピンポン玉を回収する部分は上のようになっている。プラ容器内のピンポン玉2つしか回収しないのでここにはピンポン玉2つ分のスペースしかないが、その分ピンポン玉を回収する部分をコンパクトにし、重心を後ろに下げることが出来た。今回はライントレースにカラーセンサーを2つ使いライントレースの精度を高めた。今回のロボットではモーターを多く使ったため重心が前に傾いてしまったがタイヤを4つ使い安定した動きができるようにした。MediumMotor('outB')それぞれ以下のモーターやセンサーのインスタンスである。今回は以下の関数を定義した。†ロボットを右に回転させる関数は回転の中心の違う2つの関数を定義した。†ロボットを左に回転させる関数は回転の中心の違う2つの関数を定義した。停止の命令をしない限り動き続けるforward_forever関数の二種類を定義した。前進のときとは違い、ロボットを後退させる関数は1種類のみを定義した。†ライントレースをするための関数。この関数はライントレースの為でなく、下のように「ロボットに対して直角な黒線があったらロボットを止める」といった役割でつかわれた。次のようにプログラムを5つのブロックに分けて作った。最初ロボットは赤い□の位置にMのほうを頭にしておいた。前進してプラ容器と縦軸を合わせる。ロボットを回転させてプラ容器のほうを向かせる。line_trace関数でロボットとプラ容器の間にある黒線までロボットを前進させる。プラ容器を傾けやすいよう距離を詰めるために少し前にずらす。プラ容器から確実にピンポン玉を出すためにプラ容器を2回傾ける。直線B'C'まで動かしたいが途中ある直線BCのせいでline_trace関数1回では直線B'C'に届かない。直線BCを超えた後にline_trace関数を使う。直線B'C'までロボットを動かす。プラ容器を傾けやすいよう距離をとるために少し後ろにずらす。ハンドを回転させてピンポン玉をシュートする。ピンポン玉確実にシュートするためにハンドは何回もまわす。ハンドを何回もまわすためにposition_spには大きい数字を入れる。†2回チャンスが与えられたが、2回ともボールをとることが出来なかった。今回失敗した理由としてあげられるのは、テスト前で時間がなさ過ぎて試行錯誤する回数が減ってしまったことである。試行錯誤の回数が少ないのにブロック�のsleep(2.1)などの手動で値を決める場所が多すぎて、それがボールを取る動作の精度の低下を招いたと思う。十分な時間がかけられず、プログラムがかなり荒くなってしまった。forward(4000)と書くところをforward_forever(100)sleep(4)mL.stop()mR.stop()と書くなど、プログラムが最適化されていないことも精度を低くした原因の1つだと思う。時間をかけられればより良い結果を出せたと思う。