†フィールドの説明フィールドは課題2で使用した紙を使用する。その上にボールを載せておく。競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。図のA地点または(および)A'地点からスタートする。収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。開始の合図から5秒以内にスタートボタンを押す作業を完了すること。競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。競技終了後、ロボットが、空き缶に触れていてはいけない。†ボールを1個運べば8点。3つとも運べば24点。き缶にロボットが触れていれば、もとの基本点の3減点。以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。今回のロボットは「できるだけ小さく」を目標に設計した。その点においてはこれ以上ないくらいのできばえになったと思う。小さい分単純な動きしかできず共同作業には向かないため、同じものを2台作って別々に動作させるようにした。前述したように簡単な動作のみを行う。ライントレースし、ボールの置いてある缶を超音波センサで感知したらボールを掴み、ボールが置かれていない缶を感知したらその場で離すというものだ。ボールをきちんと掴めるように、横から押さえるだけでなく、アームの下部にすくい上げるようなパーツをつけた。この構造のおかげで安定してボールを掴むことができた。†このロボットを小さくするにあたって最も効果があったのは、MediumMotorを完全に本体の下に収納したことである。課題1、2で製作したロボットはいずれもロボットの正面にMediumMotorをつけていたため、アームはさらに外側につけなくてはならなかった。今回のロボットはその構造上、本体のすぐそばにアームをつけることができたため、大幅なサイズダウンに成功した。3つの缶に通じる狭い交差点の中でも回転する余裕のあるサイズとなったため、小回りがききライントレースを失敗してしまうこともほぼなくなり、缶にぶつかって減点をうけることもなくなった。この構造にも1つ欠点がある。モーターとアームとの間の距離が長くなってしまったため、回転を伝える部分が横揺れを起こす現象が起きた。そのためアームに若干のゆとりができてしまい、初期位置と回転角をきちんと調整しないとボールをうまく掴むことができなくなってしまった。正しい調整が行われればほぼ100%ボールを掴むことができるので課題をこなす上では大きな問題ではなかった。†ミスの少ないライントレースを動かすには光センサのブレを少なくすることが有効だが、今回のロボットは光センサと重心の位置が大きく離れていないため、光センサのブレは起こらなかった。超音波センサは横から少し斜めに向けて設置されているため、ロボットの正面にある缶を正確に捉えることができる。センサーの取りつけはプログラムの正常な動作に大きく関わってくるため特に注意した。ためのカウント数、を表している。self.cv=a#aには実行時、カラーセンサで読み取った値が入る。速度、右輪の速度をそれぞれ0として定義しておく。self.typcheck()#光センサで読み取った値の色分けを行う。self.movesp()#上記の色分けから左輪右輪の速度を定める。Clev[i+1]<=self.cv<Clev[i]:#カラーセンサで読み取った値が黒よりなのか白よりなのか判断する。self.colortyp=i#色の種類を定める。self.dcv=Clev[i]-self.cv#基準となる値との差から速度を調整するための値を定める。zuw=round(self.dcv/llp,1)#上記のdcvを使って速度調整用の変数を定義する。self.risp=spab-(spab-spmin)*zuwはじめに定義されたClevというリストを用いてカラーセンサの値を分析し、色の種類を決定する。その後、色の基準となるWmaxやBmaxなどからどれほど離れているかによって右左輪の速度を調整する。近ければ近いほど速度は小さくなるようになっている。action(line,stti,enti):#括弧内の変数にはそれぞれ、左右のどちらをライントレースするかを決定する0か1の数、交差点判断を始める時間、交差点判断を終わる時間を入力する。bcon=0#黒判定した回数をカウントするための変数を0として定義しておく。brockch):#交差点判断時間ないで黒判定カウントが規定の数に達したときwhile文から抜け出す。line==0:#右か左のどちらかをラインとレースしているかを判断し、それにあったモーターの速度を代入する。tw.off()右側ライントレースをすれば右折し、左側ライントレースをすれば左折する。直進するときはまっすぐ進ませる。closs(self.cltyp,self.line)ここで値を定義していれば、わざわざ関数ごとに値を代入しておく必要がなくなる。__init__(self,hou):#houの値によって上記のx、yの値を決める。linekizyun(linehou,pointhou):#2つの値によって右側、左側ライントレースの判断する。tyフィールドを複素数平面と捉えて、ライントレースしたい向きの値をlinehouに入れ、進みたい向きをpointhouに入れる。すると、任意のライントレースが実行される。tw.on_for_degrees(-4,4,360)ボールがある時ない時で値を変えることで制御できる。point_b(stas)#bの関数に移動する以降の関数も同様の内容となっている。snd.speak("finish")フィールドの交差点を上記のa,b,c...に置き換え、その地点にいるとき動かしたいように動かすための関数を定義していく。目的地に合わせて次の関数に移行していき目的を達成する。最後にはendd()関数に入るようになっている。2台のロボットを使用しているが、プログラムの違いはここのみで、お互いをよけるためのスリープ場所や時間が異なる。point_b(lobo)#b地点から開始する。1台の方はjから始める。snd.beep()#終了後に音を鳴らすpoint関数に入って一通り仕事をこなした後止まる。main()今回はロボットを私が作り、プログラムは相方が書きました。プログラムの内容はできる限り理解して書いたつもりですが、相方のものに比べると説明不足であると思います。本番ではボールをすべて運ぶことができた。途中で超音波センサがうまく作動できず缶を円の中から押し出してしまったのは残念だ。リハーサルではそんなことは起こらなかったので、もう少しロボットの正確性や缶の位置にまで気を遣えばよかったと思っている。