[[2017a/Member]] 目次 #contents *今回の課題について [#z48c0f13] **空き缶の配置 [#m49b4e12] #ref(./2017a-mission3.png,100%,a) **制約 [#eb88150b] 競技時間は審判が続行不能と判断するまで、あるいはリタイアするまでです。 図のA地点または(および)PQRSで囲まれた中央部の円からスタートします。ただし接地している部分はそれぞれの領域内に収まるものと 図のA地点または(および)PQRSで囲まれた中央部の円からスタートします。ただし接地している部分はそれぞれの領域内に収まるものとします(線上はOK)。 します(線上はOK)。上空部分は領域からはみ出していてもよいものとします。 上空部分は領域からはみ出していてもよいものとします。 空き缶を集めて図のT地点を含む「ゴール」と書かれた3/4円と2線分で囲まれる領域に空き缶を運ばなければなりません。 なるべく高く空き缶を積み上げたほうが得点が高いです。 運び終わった後、あるいは積み上げた後はロボットはゴールの領域から外に出なければならず、また空き缶と接触していてはいけません。 開始の合図から5秒以内にスタートボタンを押す作業を完了しなければなりません。 競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはいけません。 途中でうまく動かなくなった場合、1回限り再スタートすることができます(再スタートの際に別プログラムで起動して良いです)。 *得点の算出方法 [#g8e68d00] **基本点 [#a0eff7da] 空き缶の1段目は3点2段目は6点3段目は9点です。 **技術点 [#t45454f6] 空き缶を取りにいくまでの動作 (3点) 空き缶を掴む動作 (3点) 空き缶をを運ぶ動作(2点) 空き缶を積み上げる動作(5点) 2台のRCXまたはNXT、EV3の連携の良さ(3点) 自立型のロボットとしての形や動作の美しさ、斬新さ(2点) その他 (2点) の計20点満点です。 *ロボット [#iaaec498] **全体図 [#w65a8131] #ref(./2017_08_07_3.jpg,100%,a) 本体を2台使うということでRISを前後に繋げ、向かい合わせて交信を行います。前の本体は車輪を前後に動かし、後方の本体は腕の部分を開閉させたり缶を持ち上げるためのプログラムを組みました。しかしながら、前方がかなり重くなってしまい、後ろに重しをつけなければならない羽目になりました。 **前方部 [#nb11d98a] #ref(./tennkai.jpg,50%,a) アームで缶を回収し、回収した一つの缶を上下についたタイヤに当てることで上にあげ、もう一つの缶を下に潜り込ませて缶を積み上げようとしました。 **側面部 [#l249046f] #ref(./2017_08_07_9.jpg,100%,a) アームを動かす部分です。モーターを動かすことでアームの開閉を可能にしました。実際にはあまりギア同士が強固にかみ合うことはなくアームがあまりうまく固定されませんでした。 **後方部 [#ae4a00ea] #ref(./2017_08_07_11.jpg,100%,a) 後輪はキャスターにすることであらゆる方向に進むことができるようになりました。 *プログラム [#ee642b3d] **アーム部分 [#z00c8d90] #define SIGNALON 11 #define SIGNALOFF 12 #define SIGNALUP 21 #define SIGNALDOWN 22 #define SIGNALOPEN 31 #define SIGNALCLOSE 32 ここではメッセージの番号を定義付けしています。 task main() { ClearMessage(); while(true){ until (Message()==SIGNALON); OnRev(OUT_C); OnFwd(OUT_A); until(Message()==SIGNALOFF); Off(OUT_AC); SIGNALONはアームを閉めながら缶を持ち上げ、SIGNALOFFは停止をプログラムしています。 until (Message()==SIGNALUP); OnRev(OUT_C); until(Message()==SIGNALDOWN); Off(OUT_C); SIGNALUPはアームを閉め、DOWNは停止のプログラムです。 until (Message()==SIGNALOPEN); OnFwd(OUT_C); until(Message()==SIGNALCLOSE); Off(OUT_C); SIGAALOPENはアームを開け、SIGNALCLOSEは停止を表しています。 } } 停止のプログラムを逆の意味を表す単語を使用しています。 また、最初と少し変更したのもあり名前はかなりおかしな部分がありますが、プログラムには問題がなかったのでそのままにしました。 **本体 [#n9f8b898] #define SIGNALON 11 #define SIGNALOFF 12 #define SIGNALUP 21 #define SIGNALDOWN 22 #define SIGNALOPEN 31 #define SIGNALCLOSE 32 後ろに送るメッセージの番号を定義付けしました。 task main() { OnFwd(OUT_AC); Wait(321); Off(OUT_AC); OnRev(OUT_A); OnFwd(OUT_C); Wait(30); Off(OUT_AC); OnFwd(OUT_AC); Wait(150); Off(OUT_AC); 最初の缶に向かって角度をつけながらむかいます。 SendMessage(SIGNALON); Wait(200); SendMessage(SIGNALOFF); SendMessage(SIGNALOPEN); OnFwd(OUT_AC); Wait(10); SendMessage(SIGNALCLOSE); SendMessage(SIGNALUP); Wait(50); SendMessage(SIGNALDOWN); アームが長いこともあって二つの缶を同時に捕まえ持ち上げます。 ロボットでは一瞬アームを緩め前に進むことできれいに重ねることができました。 OnFwd(OUT_AC); Wait(90); Off(OUT_AC); OnFwd(OUT_C); OnRev(OUT_A); SendMessage(SIGNALOPEN); Wait(60); SendMessage(SIGNALCLOSE); Off(OUT_AC); OnRev(OUT_AC); Wait(30); Off(OUT_AC); ここではゴールまで運んだうえで缶を離し離れるプログラムです。 *結果と感想 [#xbf416b7] 締め切り間近になって慌ててロボットを作ったりプログラミングを作ったりしてしまったせいで理想とはかけ離れた結果になってしまいました。正直今回は空き缶二本を積み上げるのが限界でした。もっと余裕を持って完成させるべきでした。