//アームを強さ20で持ち上げる方向に動かし続ける}コップを持ち上げたまま維持するためのプログラムである。連続で試行したときは何度かアームが壊れた(少し無理に動かし続けるため)。}ロボットを任意の距離(cm)だけ進ませるためのプログラムである。dは進ませたい距離を表している。//ロボットをその角度だけ旋回させる}ロボットを任意の角度だけ時計回りに旋回させるプログラムである。angは旋回させたい角度を表している。//最も近い距離の仮の最小値。d_min;}先生が授業中に配ったプリントを参考にして書いた、ロボットを中心に、任意の範囲にあるものを見つけてそこまでの距離を測定するプログラムである。angは物体を探させたい範囲を表している。//コップを持ち上げて維持する。//タイヤを120度回転させて後退}}コップを重ねるための親機のプログラムである。通信を行っている以外は特別なものはない。ライントレースを含める前の実験段階では、このプログラムでコップを重ねることに成功した。コメント文中の図の番号はコップを重ねる方法を参照。//強さSLOWで角度ang1だけモーターを回し腕を閉じる}腕を任意の角度だけ閉じるサブ関数である。ang1はアームのモーターの回転角度である。//強さSLOWで角度ang2だけモーターを回し腕を開く}腕を任意の角度だけ開くサブ関数である。ang2はアームのモーターの回転角度である。//停止}ピンポン玉を枠に入れるためのプログラムである。実験段階では0.7秒間の後退の代わりに回転角で試し、その時はうまくピンポン玉を入れることができていた。本番用のプログラムに組み込んだ時に動作がおかしいと言われたので変えたのだが、結局上手くいかなかった。使ったものをそのまま載せたので、コップ関連のプログラムとライントレースのプログラムが混ざってしまっている。見づらくなってしまい、プログラムの試行と修正のときにスムーズにいかなかったことも失敗の原因といえるだろう。メイン関数は下の方にある。メイン関数のコメント文中の経路の番号は「プログラムについての」図9及び図10を参照。音楽は親機と一緒である。親機と異なるのは定義とサブ関数の一部がないことと、異なるサブ関数が1つあることなので追加されたもののみ載せておく。他は親機のライントレース関連を参照。†こちらも親機と異なるのは通信のプログラムのみなので、それだけ載せておく。他は親機のコップ関連を参照。動作には影響しないが、定数名に「1」を書き忘れていたようであるので載せておく。//後退する}msgは受け取ったメッセージを格納する変数である。counterは繰り返しのために数字を数える役割をしている。今回、メッセージを受け取るプログラムをメッセージが届くまで繰り返させるために、カウンターを用いた。counterが0の間は延々とメッセージを受け取るプログラムを回し、メッセージ1を受け取るとif文の中の動作を行ってからcounterに1を加えることでループを抜け、counterを初期化する。その後、同じようにしてメッセージ2が届くまで再びメッセージを受け取るプログラムを回し...、となっている。実験段階では親機と合わせてコップを重ねることに成功したのでおそらく狙い通りになっている。コメント文中の図の番号はコップを重ねる方法を参照。親機同様使ったものをそのまま載せたので、コップ関連のプログラムとライントレースのプログラムが混ざってしまっている。メイン関数は下のほうにある。メイン関数のコメント文中の経路の番号は「プログラムについての」図9及び図10を参照。発表1回目は、子機が1個ピンポン玉を枠内に入れたが、その後動作がおかしくなり、また親機もおかしい動作をして失敗し2点だった。2回目は子機が2個ピンポン玉を枠内に入れたが、その後左側スタート地点(A地点)の障害物のコップを弾き飛ばし4点となった。技術点は8.8点で、合計12.8点となり、9チーム中6位の結果となった。†レポートを作るにあたってロボットの機構やプログラムを見直したが、どちらも作りこみが非常に甘かったように思う。ロボットについてだが、1つ目は、超音波センサーは左右どちらか(どっちかは忘れました)から超音波を発し、もう一方で受け取っているらしいが、これを横向きに取り付けたことで、受け取りにずれが生じたり、そもそも検知に失敗してしまう原因となった可能性がある。解決策としては、他の班にあったものだが、アームと超音波センサーを前後に分けるという方法だ。これならばセンサーを縦に取り付けることができ、誤検知を減らせただろう。2つ目は、アームの自重が大きくなり、コップを持ち上げた状態を維持するのが難しくなったことだ。上手く引っかかった場合は止まることもあるが、基本的に持ち上げただけではアームは落ちてしまうので、維持するためには弱い力を加え続ける必要があった。これだけなら簡単そうだが、加える時間や強さを誤るとアームが破損してしまうため、調整が大変だった。軽量にしたり、安定させられる部分につけると自重を気にせずに済んだだろう。3つ目は、機体が長くなってしまったことだ。これの影響で、障害物にぶつかるのを防いだり、ピンポン玉を枠内に入れるときにコップを浮かせる前に枠に当たらないように動きを調整しなければならなくなった。これは、アームの取り付け位置を変えるか、あるいはアームを全く別のものにするしかないだろう。まとめると、3つの理由で機体の動きが制限されてしまったということだ。ロボットに合わせてプログラムを作るので、上手くいくように努力したが、結果はひどいものだった。十分なプログラム作成能力があれば異なる結果を得られたかもしれないが、ないものを言っても仕方ない。班で集まって、十分な話し合いとロボットの作成をするべきだった。プログラムにも問題があったと考えられる。ライントレースを含めない試行の段階では、ピンポン玉を枠内に入れる動作はほとんど成功していたし、コップを重ねる動作も成功率は高いとは言えなかったができていた。これを発表用のプログラムにすると謎の行動をするようになった。プログラムを見てみると、移動用のプログラムと組み合わせるときに、本来必要な動作を書き忘れたり、逆に不要な動作を入れてしまったようである。作ったサブ関数を使えるところで使っていなかったり、(必要なのかもしれないが)自分でもよくわからない動作が混じっているようだ。プログラムを作っているときには気づけなかったことから、そのときはかなり集中力がなく切れていたようである。大きな要因となったかは分からないが、移動が合わさることで直前の動作による慣性やロボットの向きに影響を受けた可能性もある。†あらゆる状況や問題を考慮した上で、結果を出せるプログラムやロボットを作らなければならないのは当然のことなのだが、結果は遠く及ばないものだった。少ない時間で良いものを作るという理想を実現できなかったのはやはり残念であった。†これまでの3つの課題を通して、プログラミングの基礎をしっかり学ぶことができたように思う。ハード面の重要性もよく理解できた。どれ程優れたプログラムを作れたとしても、ハードがしっかりしていなければ十分な結果を得ることはできないということを実感することができた。これからもプログラミングをすることはあると思うので、この授業で得られた知識や経験を生かしていきたい。