[[2015b/Member]] 私は今回このテーマにほとんど携わることができていません。ですが、同じグループでこのロボットを作ってくれた二人の功績を報告しようと思います。 目次 #contents *課題 [#d32f62d5] ボールを離れた場所から缶に当てるロボットとボールを回収するロボット &ref(2015b/Member/nakami/Mission3/2015b-mission3,40%.png); *ルール [#e1a85f86] 基本ルール 競技時間はロボットAがSTART A地点のスタートラインを横切って、ロボットBがGOAL B地点のゴールラインに達するまで、あるいは審判が続行不能と判断するまで。 ロボットAはSTART A地点から出発し、P地点におかれた赤いボールを拾って350mlのアルミ缶に当てる。 その後、ロボットBがボールを回収する。引き続き青いボールについても同様の動作を繰り返す。ロボットBはボールを回収した後、最終的にGOAL Bまでボールを運ぶ。 アルミ缶は中身が入っているものを使う。 RISのチームはアルミ缶の上に灯台としてランタンを置く。 ボールがアルミ缶に当たる前にロボットBがボールに触ってはいけない。 ロボットAはセンターラインを超えては行けない。 アルミ缶を5cm以上動かした場合は減点 基本得点の計算方法 技術点の計算方法 以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチームが20点満点で採点し、その平均点を求める。 得点の目安: ボールをつかむ動作 (2点) ボールを運ぶ動作、ライントレースの正確さ、滑らかさ(2点) ボールを投げる動作・正確さ(3点) ボールを探す動作(3点) ボールを回収してゴールまで運ぶ動作(2点) 2台のNXTの連携の良さ(2点) 自立型のロボットとしての形や動作の美しさ、斬新さ(3点) その他 (3点) *ロボット [#g1b9641e] &ref(2015b/Member/nakami/Mission3/last2.jpg,20%); &ref(2015b/Member/nakmai/Mission3/last1.jpg,20%); &ref(2015b/Member/nakami/Mission3/last1.jpg,20%); このロボットはボール拾い、缶に向けて投げて当てるロボットです。よってボールを拾って移動する動作(ホールド)、缶を探して近づく動作、缶に向かって投げる動作が必要でした。 ライントレースできるように、ドライブベースを用いています。また、缶の位置を光センサーで感知するために高さをもたせています。缶を感知するための光センサは周りをブロックで囲むことによって缶の光だけを感知しやすいようにしています。 私が感動した最もアピールしたいポイントが、アーム部分です。アームを上にあげるだけどボールを前後の2本の爪でホールドすることで、アームを振り上げるだけで後ろの爪によってボールが前に押し出されるという仕組みです。 *プログラミング [#b704f119] モーターの配置の関係により、OnRev(OUT_AC)でロボットは前進します。 全体の流れは、まず一つ目のボールを取りに行き、缶の光を探し、当てに行きます。その後2つ目のボールを取りに行き、1つ目同様に缶に当てに行きます。 **数値の定義 [#a7c5a2f4] int light_max = 0; //光の一番大きい数値 int turn_time = 500; //光を探すために旋回する時間 int time_max = 0; //回り始めてから最大の明るさの値を見つけるまでの時間 **光を探すサブルーチン [#qbddcc95] sub light(){ SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_LIGHT); ClearTimer(0); OnFwd(OUT_A);OnRev(OUT_C); while(FastTimer(0) < turn_time){ if(SENSOR_2 > light_max){ light_max = SENSOR_2; time_max = FastTimer(0); } } Off(OUT_AC);Wait(100); OnFwd(OUT_C);OnRev(OUT_A);Wait(turn_time - time_max); Off(OUT_AC);Wait(100); } 光の探し方として、まず一回転し、最も光の数値が大きいところを決める。そこまでの回転時間(time_max)を測り、一回転するのにかかる時間(turn_time)から引く。その時間(turn_time-time_max)だけ始めと逆回転する。 **メインタスク [#c176b618] task main(){ SetSensor(SENSOR_2,SENSOR_LIGHT); SetSensor(SENSOR_1,SENSOR_LIGHT); SetPower(OUT_B,5);OnFwd(OUT_B);Wait(50); OnRev(OUT_AC);Wait(200); OnRev(OUT_A);OnFwd(OUT_C);Wait(100); OnRev(OUT_AC);Wait(200); Off(OUT_AC);Wait(100); SetPower(OUT_B, 1);OnRev(OUT_B);Wait(100); 1つ目のボールを拾う これは時間の微調整でボールの元へ近づきました。 またアームの上下運動をするモーターBをOffにしないのは、近づいてる間に除々にさがってしまうのを防ぐためでした。しかしアームが動かない状態でモーターBをOnにし続けることはロボットを傷めやすいという指摘を先輩方から受けました。 アームを下げるときにはあまりパワーを必要としなかったので、下げるときのパワーを1、上げるときのパワーを5としました。 OnRev(OUT_C);OnFwd(OUT_A);Wait(150); OnRev(OUT_AC);Wait(300); while(light_max < 65){ OnRev(OUT_AC);Wait(50);Off(OUT_AC); light(); } PlaySound(SOUND_CLICK); light(); SetPower(OUT_B,5);OnFwd(OUT_B);Wait(50); 缶に当てに行く 拾ってから少し旋回し、前進しています。これは光を探す前に、缶の光を感知できるように、缶に近づいています。拾った時のロボットの向きを踏まえ、秒数を調整しています。 近づいたあと、光の数値が65よりも小さい時、サブルーチンを繰り返します。この65という数値は、近づいていいギリギリのラインより少し手前でロボットが感知した、確実にボールを当てることができるであろう距離でした。数値が65以上になったとき、音がなり、最後にもう一度最も大きな数値の光を探し、ボールを投げます。 OnFwd(OUT_C);OnRev(OUT_A);Wait(150); Off(OUT_AC);Wait(100); OnRev(OUT_AC);Wait(200); OnRev(OUT_AC);until(SENSOR_1 < 41); Off(OUT_AC); PlaySound(SOUND_CLICK);Wait(100); SetPower(OUT_B,5);OnFwd(OUT_B);Wait(50); SetPower(OUT_B,1);OnRev(OUT_B);Wait(100);Off(OUT_B); ライントレースに至るまで ボールを投げた位置から旋回し、ラインを見つけるまで直進します。 ClearTimer(1); while(FastTimer(1) < 50){ if(SENSOR_1 > 49){ OnRev(OUT_A);OnFwd(OUT_C); } else if(SENSOR_1 > 46){ OnRev(OUT_A);Off(OUT_C); } else if(SENSOR_1 > 40){ OnRev(OUT_AC);ClearTimer(1); } else if(SENSOR_1 > 37){ OnRev(OUT_C);Off(OUT_A);ClearTimer(1); } else{ OnRev(OUT_C);OnFwd(OUT_A);ClearTimer(1); } } OnRev(OUT_A);OnFwd(OUT_C);Wait(80); OnRev(OUT_AC);Wait(150);Off(OUT_AC);Wait(100); 二つ目のボールを取りに行く 2つ目のボールを取りに行く際に、ライントレースをします。しかし、このロボットは構造上、ライントレースをしてボールを取りに行くことは不可能でした。どうしてもボールをはじいてしまいました。よって、ボールを投げた位置から最も近いか角までライントレースをし、角を交差点とを判断するのと同様に判断すると、秒数の微調整により、ボールの位置まで一直線に向かうプログラムにすることにしました。 OnFwd(OUT_A);OnRev(OUT_C);Wait(350); OnRev(OUT_AC);Wait(200); while(SENSOR_2 < 50){ OnRev(OUT_AC);Wait(50);Off(OUT_AC); light(); } PlaySound(SOUND_CLICK); light();OnRev(OUT_A);OnFwd(OUT_C);Wait(35); Off(OUT_AC);Wait(100); SetPower(OUT_B,5);OnFwd(OUT_B);Wait(50); OnFwd(OUT_AC);Wait(100); Off(OUT_AC); } 缶に当てに行く 一つ目と同様に当てに行きます。 *感想 [#bea0d75b] このボールの精度は本当に素晴らしいものだと思います。先生のおっしゃった「誰がスタートのボタンを押しても成功するロボット」には程遠いですが。 本当に二人に感謝でしかありません。ありがとうございました。