青と赤のボールを運搬して、それぞれ所定の350ml缶の上に乗せる。私のグループでは、上の図のようにXからスタートGで赤いボールを取るFを通過しEを直進Dで缶を探しボールを置くボールを置いたらDに戻るEを右折Iを直進して青いボールを取る缶を探しボールを置くという経路でロボットを動かすことにした。今回のミッションではNXTの本体が2つ使えたので、NXTの本体を1つずつ使って2つのロボットを作るか、2つのNXTを通信して1つのロボットを作るか選択できた。2つのロボットを作ると、移動・ボールの掴み・ボールの持ち上げに4つのモータが必要になり、数が足りなかった。先生に3つのモータでも動かせるロボットの組み立て方を教えてもらったが、1つのロボットを作った方が簡単だという結論に至り、私たちのグループでは2つのNXTを通信して1つのロボットを作ることに決めた。2つのNXTを横に並べることと、後ろのタイヤ(駆動輪)を2つつけることでタイヤ1つにかかる重さを分散させて、急カーブなど曲がりやすくしたところを工夫した。†アームの持ち上げ1つのモータはアームの持ち上げに使った。これはモータを回すことで、写真のように�小さな歯車が回り、�大きな歯車が回ることでアームが持ち上げられる。アームが持ち上げた状態で缶に近づくので、持ち上げる時の高さも意識した。アームの開け閉めモータを回すと、上の写真のように�黒い小さな歯車が回り、�黒い小さな歯車に垂直に設置されている灰色の歯車が回ることでアームの開け閉めが行われる。上の図はボールを掴む仕組みを床と平行方向の目線で見た時の図である。灰色を黒の部品でできているものがアームで赤がボールである。ボールはすくうようなイメージで、ボールを掴む際、黒い部品は底、灰色の部品は壁になるように作った。光センサ課題2の時と同様に、光センサの値を見ながら白色と黒色の値がはっきり変わるように床と適度な間隔をあけた。超音波センサ今回のボールの持ち上げ方は上記で述べたようにアームを上げ下げするようにした。超音波センサを使うときはアームを持ち上げている状態の時なので、NXTの本体の上につけるとアームが邪魔になって超音波センサが正しく作動しない。そのため、超音波センサは写真のように下に取り付けた。†2体あるNXTの1つを親機、1つを子機とする。親機が主体となってプログラミングを実行し、通信することで子機に命令ができる。親機が子機に命令することで、子機の中に入っているプログラムを実行することができる。簡単に考えると、やることが多すぎて親機だけではまかなえない分を子機が手伝うというイメージである。2つはBluetoothで繋げる。今回はアームの開け閉め時、アームの上げ下げ時に通信を使用した。詳しいプログラムの説明は下にある。境界線の間」「真っ黒」の5つの段階で分け、光センサで測定すると以下の結果になった。光センサで測定すると「真っ白」は58以上、「白と境界線の間」は53以上57以下、「境界線」は44以上52以下、「黒と境界線の間」は34以上43以下、「真っ黒」は33以下であることがわかった。線の左側を進むので、「真っ白」の時は右旋回、「白と境界線の間」の時は右折、「境界線」の時は直進、「黒と白の境界線」の時は左折、「真っ黒」の時は左旋回をするプログラムにする。それにより、線の左側を沿って進むことができる。そのプログラムは以下のとおりである。以下のプログラムを定義しておく。左旋回と右旋回の時だけモータのパワーを33にした。それはロボットの総重量が重いため、急なカーブを曲がるときにモータが止まってしまったので、その2つだけパワーを少し大きくした。//左旋回}これを応用して交差点を見つけたら終わるプログラムを作る。上記のような線をジグザグしながら動くプログラムの場合、交差点では以下の図のように光センサは「真っ黒」を長い時間測定し続ける。図の赤い矢印は全て同じ長さである。直線上にある矢印は、白から黒、黒から白の部分を走っているが、交差点に入っている矢印だけ、矢印全体が黒い部分を走っている。これより、ロボットが交差点に入った時だけ光センサはずっと「真っ黒」を測定し続ける。これを利用して以下のような交差点に入ると終わるプログラムを作る。}}これは、「真っ黒」以外が測定されるたびにt5を更新すると現在の時間とt5の差が0.09秒にならず、while文のプログラムを繰り返し続ける。交差点に入ると、「真っ黒」が測定されて、t5は更新されないため、現在の時間とt5の差が0.09秒以上になるのでwhile文の繰り返しが終わり、プログラムが終わる。これを基本としてライントレースのプログラムを作る。†GとFの間にある急カーブやFの直角だと交差点と同じように「真っ黒」を一定時間測定して止まってしまう。今回は止まる必要がないので、DからFの直角まで通る時間をあらかじめ測定しておいて、その時間は基本形のライントレース(「真っ黒」を一定時間測定してもライントレースを続けるということ)を行うプログラムを作った。それが以下のプログラムである。main」中に交差点を認識したら終わる「tuuzyou」のプログラムの次に一定時間直進する「massugu」というプログラムを置けばよい。「massugu」のプログラムは以下のとおりである。//直進を1.2秒実行}交差点を見つけてロボットが「tuuzyou」のプログラムを終えると、ロボットの機体が少し左に曲がってプログラムが終わるため「turn_r1(右旋回)」によって右に機体を戻さないとラインから外れてしまうので、「turn_r1(右旋回)」はロボットの機体をライン上に戻すための微調整である。†Dの位置でボールを探そうとしていたので、Dの直角で止まらなければならない。このためにはDの直角を認識したら終わるプログラムが必要である。「tuuzyou」のプログラムは「真っ黒」の時間が長いときに終わるプログラムなので、左に曲がる直角でなければ終わらない。いうことは、「真っ白」を認識したら終わるプログラムを作ればよいということだ。「tuuzyou」のプログラムを応用して以下のようなプログラムを作った。†まずは、今までとは違い、線の右側を沿って進むプログラムを考える。線の左側に沿って進むプログラムは、光センサが測定する値が白ければ白いほど右に向かって進み、黒ければ黒いほど左に向かって進んでいた。線の右側を進むプログラムはその逆で、光センサが測定する値が白ければ白いほど左に向かって進み、黒ければ黒いほど右に向かって進めば、線の右側をライントレースするプログラムができる。そのプログラムは以下のとおりである。}これを応用してD-E間を通る時間をあらかじめ測定してその時間内は交差点や直角があってもプログラムを続ける以下のようなプログラムを作った。†Iの交差点で直進するには線の右側に沿って進み、交差点を認識するプログラムが必要である。上記の線の右側に沿って進むプログラムを応用して、以下のプログラムを作った。}}線の左側に沿って進むプログラムと同様に、交差点があると、光センサは「真っ黒」を長く測定する。「真っ黒」以外が測定されるたびにt5を更新すると現在の時間とt5の差が0.09秒にならず、while文のプログラムを繰り返し続ける。交差点に入ると、「真っ黒」が測定されて、t5は更新されないため、現在の時間とt5の差が0.09秒以上になるのでwhile文の繰り返しが終わり、プログラムが終わる。main」中に今のプログラムをおいて、次に直進するプログラム(go_s)を置けばよい。†ボーつを掴む時は通信を使った。//ボール取る時間...�}�は子機にあらかじめ入れておいた「CATCH.nxc」というプログラムを実行しろと命令している。�はあらかじめ子機で「CATCH.nxc」を実行する時間を測定しておいて、その時間は親機は待つということである。†コンテストではダミーの缶も置けたが、私たちのグループはダミーの缶を置かず、ボールを置かなければいけない缶を必ずロボットとの距離を1番近い物体にした。これにより、缶を探すプログラムは超音波センサを使って、ロボットとの距離が最小の物体の方向を向くプログラムを使う。それは以下のとおりである。d_min;}上のプログラムは、ロボットが回転することによって、ロボットの周りにある物体との距離を測定し、それをd_minとする。d_minは測定されたら更新されてることで、別の物体がロボットの周りにあったらその物体との距離もd_minとして記録する。測定が終わったら、測定したd_minの中で1番小さい値を見つけて、d_minが1番小さかった物体の方向へ向く。†あらかじめ超音波センサを用いて缶にボールを置くのに適している距離を測定して、缶とロボットが13.5cm離れているとボールを乗せることができるということがわかった。その結果を用いて以下のプログラムを作った。†ボールを置くときは通信を使う。//親機の待ち時間...�ボールを掴むプログラムと同様である。�は子機に「lost.nxc」というプログラムを実行しろと命令している。�はあらかじめ子機が「lost.nxc」のプログラムを実行する時間を測っておいて、親機はその時間待っているということである。上記のプログラムを組み合わせて缶を探してボールを置いて元いたDに戻るプログラムを作った。}}�のt3はロボットが缶に近づく前の時間で、t4はロボットが缶に近づいた後の時間である。これよりt4-t3とは、ロボットが缶に近づくために動いた時間だけ後退させる。これにより、どの位置に缶があっても元の位置に戻ってこられる。上記の缶を探して赤いボールを缶に置いて元いたDに戻るプログラムとほぼ同じだが、青いボールを缶に置いたら終わりなので、ボールを置いた後に元いた位置に戻らなくてもよい。そのプログラムが以下のとおりである。d=searchDirection(360);にすると、缶の位置はサイコロで決まるので、赤いボールを乗せる缶の方が青いボールを乗せる缶よりロボットとの距離が近くなる可能性もあったので測定する範囲を絞った。缶一直線にロボットが近づくときと近づかないときがあったこれによってボールが缶に乗るときと乗らないときがあり、本番では乗らなかった。正確な解決方法はわからないが、本番中に「スピードが速い」という声が聞こえた。缶を探すためにロボットを回転させる際に、回転するスピードを遅くすることで距離の測定がより正確になったかもしれない。超音波センサは超音波を出して物体によって反射され、跳ね返ってくる時間で距離を測っている。缶の側面が曲線なので、超音波の跳ね返り方が曲がってしまったりするかもしれないと思った。赤いボールを置く缶を探すためにロボットが回転した際、ロボット本体の後ろに付いていたコードが缶に当たってしまった缶の近くで探したほうが正確に測定できると思い直角Dで缶を探すことにしたが、直角Dで缶を探そうとすると思ったよりも缶との距離が近く、コードが当たってしまった。直角Dではなく交差点Eで缶を探すか、後ろのコードをまとめたりするなどの、コードの処理が必要だった。今回はミッション3回目でプログラムを作るのも慣れてきたと思ったが、とても苦労した。新しく習った通信もすぐできたのに、なぜ苦労したか。大まかなプログラムは作れても、乾電池の消費によってパワーを変えたり、少しロボットを組み替えただけで重さのバランスなどが変わり、数字の微調整。なんでボールが缶に乗らないのか、なんでボールが缶のある方向に近づかないかなどの解決方法を考えるなど、プログラム上の細かい作業がとても大変だった。最後に先生もおっしゃっていたが、いかに正確ではないかが分かった。