*ロボットの紹介 [#c5cbaaad] **全体図 [#m7f088db] #ref(2013a/Member/Hiko/Mission2/08-07@09-49-25-823.jpg,60%) ロボットの大きさは、課題1の時に比べ小さめにまとまり、軽量化に成功しました。しかし、あまり丈夫とは言えない作りになってしまいました。 **工夫した点 [#s84256f6] -課題1の反省を踏まえ、重心を真ん中に持ってくることでロボットを安定させ、ロボットの動きが滑らかになるようにしました。他には、ロボットの後方にロボットを持てるところを作り、ロボットを移動させるときに、部品が取れてしまって、また付け直す手間をなくしました。 **苦労した点 [#iaa7d145] -この課題が出されたときは、ボールを取って、パスをし、シュートするロボットはどんな形がいいのか全く想像もできず、作業が全く進みませんでした。しかし一つの動きでボールを取り、パスをすることを思いつき、このロボットが完成しました。 **ボールをつかむところ [#y58d641b] #ref(2013a/Member/Hiko/Mission2/08-07@09-49-43-254.jpg,60%) #ref(2013a/Member/Hiko/Mission2/08-07@09-49-10-268.jpg,60%) この部分がロボットの中で一番こだわった部分です。ボールを上から抑えこむようにしてつかみ、ボールをパスするときなどは、ボールをつかむ部分を上に上げることで、下の方にある緑の部分で前に押し出すようになります。また、掴んだボールが隙間に挟まって動かなくならないように黒い壁のようなものを取り付けました。課題1の時とは異なり、ロボットとの前を重くしないことで、ロボットが前に傾くのを抑え、光センサーを引きずったりしないようにしました。軽量化したことで、少し華奢になってしまったのが残念です。 **工夫した点 [#l5844703] -ボールをつかむところの紫の部分を特に工夫しました。一見適当についているだけのようにも見えるんですが、実はボールが横から出ないようになっています。ただし、工夫しているのはこれからです。この紫の部分をもっと外側に向けてしまうと、ボールが外に出てしまい機能を果たしません。逆にもっと内側に向けてしまうと、今度は、ボールの入るスペースが狭すぎてボールが入ってくれません。なので、ボールが外に出ないようにしたうえで、できるだけボールの入るスペースを広くとれる今の角度の微調整を工夫しました。 **苦労した点 [#a80211f0] -最初は、ボールを横から挟もうとしていました。しかし何度やってもうまくいかず、しかし解決策も見つからないまま時間だけが過ぎて行ってしまいました。しかし、あることがきっかけで、上からふたをすることを思いつき、何とかロボットを完成させることができました。 **後輪 [#p02d640b] #ref(2013a/Member/Hiko/Mission2/08-07@09-50-04-532.jpg,60%) 後輪をつけることで、少し後ろに重心があるロボット全体のバランスを取り、また動きをなめらかにします。 **工夫した点 [#iba1e38e] -車輪だけを取り外すことで、ロボットを安定して持つことができるような場所にしました。そのおかげで、持ち運びの際はいちいち分解していたものが、分解しないで持ち運べるようになりました。 **苦労した点 [#q4d9c27a] -車輪を低い位置につけすぎると、車体の後方が浮き上がってしまい、光センサーをこすりながら進むようになってしまうので、少し地面から浮かせるような位置にして、後ろに重心がかかる時にうまくバランスをとってくれるようにしました。しかし車輪もボールをつかむところと同じように高すぎてもうまくいかないし低すぎてもダメで、微調整がとても大変でした。 *コース攻略 [#k6a1f254] #ref(robocon2013Hiko.png) ロボコンのフィールド平面図 -フィールドの説明 フィールドは課題1で使用した紙を2枚つなぎ合わせる 図のように直線を二本加える 図のように空き缶を配置する(緑色) -課題1の経験を生かし、今回もタイマーによって動きの異なるプログラムを使いました。 -赤外線通信をせずに今回の課題に取り組みました。 **コース攻略における課題 [#ye506d78] +ボールをつかむ -まず最初に課題になったのは、ボールをつかむことです。ボールをつかむのは想像以上に難しく、向き・速度・紙の状態の中で一つでもうまくいかないと絶対に成功しないので、タイマーの設定が本当に大切になりました。ただ、タイマーでロボットを動かす場合、本当に正確に時間を設定しなければうまくいかないので、とても今気のいる作業になりました。 +パス -ボールをつかむのがうまく行った場合に次に課題になるのが、ロボット同士のパスです。パスは、今回の課題の肝とも言えるところで、一番の難関でした。パスにおけるポイントはとてもたくさんあり、ロボットの位置・回る角度・ボールの場所・打ち出す角度・紙の状態・受け取るロボットの場所・向き・状態など、うまくいくまでに本当に何度もやり直しを強いられました。 +シュート -缶にボールを当てるのは、一見難しいことに思えますが、実際、相手(缶)が動かないのでパスがうまく行くようになれば、結構簡単なことだとわかりました。しかし、タイマーを使ってその動作を行う場合、すべての時間を計らなければならないので、これもまたとても根気のいる作業になりました。 *ルール [#ubced72e] 基本ルール 競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 書き足した直線部からスタートする。 図の上部からスタートしたロボットAがピンポン玉を取りにいく 直線部までピンポン玉を持ってくる (1) 直線部に入ってからロボットBへパスを送る (2) ロボットBは直線部でパスを受け取る ロボットBは直線部でパスを送る (3) ロボットAは直線部でパスを受けとる ロボットAは直線部でパスを送る (4) ロボットBは直線部でパスを受け取る ロボットBがゴールの空き缶の近くまでピンポン玉を運んで空き缶に当てる (5) (ただし黒い線で囲まれた空き缶の領域には入ってはいけない) ロボットBはシュートをした後もう一つのピンポン玉を取りにいく 以後は、これまでのAとBの役割を反対にして、パスを繰り返し、最終的にはロボットAがもう一つのゴールにシュートする。 開始の合図から5秒以内にスタートボタンを押す作業を完了すること。 競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 *プログラムの説明 [#q87c2890] ↓プログラムの定義 #define THRESHOLD 37 // 閾値 #define HIPOWER 7 #define LOWPOWER 2 #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); // カーブを走る時のパワー #define set_power_N SetPower(OUT_B,LOWPOWER); // ボールをパスしたり、捕まえたりする時のパワー #define go_fwd set_power_H; OnFwd(OUT_AC); // 直線を走る時のパワー #define arm_fwd set_power_N; OnFwd(OUT_B);Wait(30);Off(OUT_B); // ボールを蹴る動き #define arm_bwd set_power_N; OnRev(OUT_B);Wait(30);Off(OUT_B); // ボールを捕球する動き #define turn_left1 set_power_L ; OnFwd(OUT_C);OnRev(OUT_A); // 右旋回 #define turn_left0 set_power_L ; OnFwd(OUT_C);Off(OUT_A); // 右回転 #define turn_right0 set_power_L ; OnFwd(OUT_A);Off(OUT_C); // 左回転 #define turn_right1 set_power_L ; OnFwd(OUT_A);OnRev(OUT_C); // 左旋回 #define STEP 1 #define nMAX 150 #define short_break Off(OUT_AC); Wait(100); #define CROSS_TIME 300 #define cross_line set_power_L; OnFwd(OUT_A);OnRev(OUT_C); Wait(CROSS_TIME);short_break; ↓左周りでライントレース sub followline_l () { int nOnline=0; int MOVETIME; MOVETIME=0; SetSensor(SENSOR_2,SENSOR_LIGHT); // センサー2に光センサーがついていることの確認 PlaySound(SOUND_UP); // 音を鳴らして、順調に動いているか確認 MOVETIME=MOVETIME+500; while(nOnline < nMAX && FastTimer(0)<=MOVETIME){ if(SENSOR_2< THRESHOLD -14) { turn_left1; nOnline++; }else{ if(SENSOR_2< THRESHOLD -10){ turn_left0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD -1){ turn_right0; }else{ turn_right1; } nOnline=0; } Wait(STEP*10); } } ↓右回りでライントレース sub followline_r () { int nOnline=0; int MOVETIME; MOVETIME=0; SetSensor(SENSOR_2,SENSOR_LIGHT); // センサー2に光センサー雅ついていることの確認 MOVETIME=MOVETIME+500; PlaySound(SOUND_DOWN); // 音を鳴らして、うまくいっているか確認 while(nOnline < nMAX && FastTimer(0)<=MOVETIME){ if(SENSOR_2< THRESHOLD -14) { turn_right1; nOnline++; }else{ if(SENSOR_2< THRESHOLD -10){ turn_right0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD -1){ turn_left0; }else{ turn_left1; } nOnline=0; } Wait(STEP*10); } } ↓再び左回りでライントレース sub followline_l1 () { int MOVETIME; MOVETIME=0; SetSensor(SENSOR_2,SENSOR_LIGHT); // センサー2に光センサーがついていることの確認 MOVETIME=MOVETIME+500; PlaySound(SOUND_LOW_BEEP); // 音を鳴らして、うまくいっているか確認 while(FastTimer(0)<=MOVETIME){ if(SENSOR_2< THRESHOLD -14) { turn_left1; }else{ if(SENSOR_2< THRESHOLD -10){ turn_left0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD -1){ turn_right0; }else{ turn_right1; } Wait(STEP*10); } } } ↓ここからメインタスク task main () { SetSensor(SENSOR_2,SENSOR_LIGHT); // センサー2に光センサーがついていることの確認 ClearTimer(0); int nOnline; int MOVETIME; while(FastTimer(0)<=700){ followline_l(); } Off(OUT_AC); Wait(50); PlaySound(SOUND_DOUBLE_BEEP); ClearTimer(0); while(FastTimer(0)<=700){ followline_l(); followline_l(); // 左周りでライントレース } Off(OUT_AC); Wait(50); PlaySound(SOUND_DOUBLE_BEEP); ClearTimer(0); turn_right0; Wait(100); Off(OUT_AC); Wait(50); go_fwd; Wait(50); Off(OUT_AC); Wait(50); OnFwd(OUT_B); Wait(10); Off(OUT_B); turn_left0; Wait(100); Off(OUT_AC); Wait(50); while(FastTimer(0)<=700){ followline_l(); followline_l(); // 左周りでライントレース } Off(OUT_AC); Wait(50); PlaySound(SOUND_DOUBLE_BEEP); // 音を鳴らして、うまくいっているか確認 ClearTimer(0); while(FastTimer(0)<=700){ followline_l1(); } PlaySound(SOUND_DOUBLE_BEEP); // 音を鳴らして、うまくいっているか確認 turn_left1; Wait(30); ClearTimer(0); while(FastTimer(0)<=700){ followline_r(); } Off(OUT_AC); Wait(50); PlaySound(SOUND_CLICK); PlaySound(SOUND_CLICK); // 音を鳴らして、うまくいっているか確認 turn_left1; Wait(20); ClearTimer(0); while(FastTimer(0)<=700){ followline_l(); followline_l(); // 左周りでライントレース } } -このプログラムのポイントは、課題1でプログラムが長くなりすぎてしまった反省を踏まえ、サブルーチンを駆使し、プログラムを見やすいようにすっきりとまとめたところです。 -タイマーを使っているので、足場や部屋の明るさが少しでも変わってしまうと成功確率に大きな影響を与えるのが、問題点です。 -動作を一つ一つするごとに音を鳴らすことで、どこがうまくいかないのかがすぐにわかるようになり、課題1に比べてプログラムを直す手間が格段に楽になりました。 *まとめ [#r36f88f5] -ロボットにパスをさせるというのは、自分が同じことをするのとはまるで異なり、とても難しく困難を強いられました。パスを通すには一台目が、狙い道理の場所に正確なパスをだし、なおかつ二台目がそのパスの来る場所にあらかじめいて、そのパスをキャッチしなければなりません。最初は、赤外線通信を用いて、ロボットにパスをさせようとしましたが、あまりうまくいかず、一回目の課題に使用したタイマーでロボットを動かすようにしました。そのため、一回目と同じように、電池の消費によるロボットの移動距離・速度の差に悩まされました。 -一回目と同じように、今回もチームのみんなに頼りきりになってしまい、本当に迷惑をかけてしまったことにとても後悔をしています。また機会があったら、今度こそみんなの役に立つ働きをしたいと思っています。 -私自身が、工学部機械システム工学科なこともあり、自分で設計・プログラミングしたロボットを動かし、改良していく作業はきっとこれからの未来に役に立つと思います。とてもいいメンバーに恵まれ、いい経験ができた素晴らしい授業でした。チームのみなさん、本当にありがとうございました。