#contents *課題の説明 [#ea3af44c] 課題3はっ課題2の時作った図を使い、C地点とD地点にコップを置き、そしてロボットでそのコップをQ地点まで運んでいって、そして紙コップを重ねるという課題だった。詳しくこちらをご覧ください [[課題3>http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMission3]] 課題2の時作った図: #ref(99AA.jpg) また、RIS1を使っている班とRIS2を使っているグループを一つのグループで作業を行うという課題だった グループメンバー: ・[[yamamoto>http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2Fyamamoto%2FMission3]] ・[[fujison>http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2Ffujison%2FMission3]] ・[[kuzusan>http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2Fkuzusan%2FMission3]] ・[[yamazaki>http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2Fyamazaki%2FMission3]] ・yui と私の6人のグループ *ロボットの説明 [#a34f18c5] 二つのロボットを作り、一つには二つの光センサーを付けた。もう一つには光センサーも何もをつけずにただQ地点まで行くとプログラムで命令し、そして紙コップが落ちないように支えるためのロボット。 壁になっているロボット #ref(Doba.JPG) 紙コップを運ぶロボット #ref(Dabadebo.JPG) **紙コップを運ぶロボット [#x61256fb] 光センサーについて このロボットに以上書いたように、光センサーを二つつけた。一つはライントレースのための光センサーで、もう一つは紙コップを認識するためである。紙コップを認識するため、最初タッチセンサーを使ったが、紙コップは軽すぎて、反応しなかったので、光センサーにした。以下の写真のように光センサーを付けた。 ロボットのアーム 作ったロボットのアームの仕組みは先生が授業で話していたとだいたい同じにした。[[こちら>http://yakushi.shinshu-u.ac.jp/robotics/?2014a%2FMember%2Fkiyo%2FMission2]] 以下の写真のようにアームを作りました。 #ref(nine.JPG) **壁のロボット。 [#l5fa1233] 壁のロボットはQ地点で待ち、そして紙コップが落ちないように作ったロボットである。以下の写真のような仕組みにした。 #ref(AAA.JPG) *問題点 [#ae0e2d14] 紙を運ぶロボットの光センサーの位置で問題があり、時々アームに打つかってしまいそして外れてしまう。改善をしようとしたが、結局そのままにした。 また、壁になっているロボットは後ろに行くとプログラムしたが、どうしても斜めになってしまい、いつもロボットが曲がってしまう。以下の写真のようである。 赤い線のようにまっすぐ行くはずだったが、青い線のようになってしまった。 #ref(al7ob.png) 競技の前に良い位置を見つけようとして、その位置に置いたら曲がっても、Q地点につきた。 *プログラム [#o64329e6] プログラムのほとんどは山崎さんがやったので、詳しい説明のために[[こちら>http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2Fyamazaki%2FMission3]]をご覧ください。 そして以下の写真で示されている順番で紙コップを運んで行く。 #ref(37.jpg) #ref(38.jpg) **壁になっているロボット [#h9eed36d] このロボットで紙コップを支える。紙コップを支えるために認識することが必要だが、光センサーは運ぶロボットに使ったから、使えない。ですから、紙コップを支えるために、通信をやった。ある程度紙コップを運ぶロボットが近づいたら、通信で反応するようにした。 ***マクロの定義 [#gbb65482] #define SIGNALON 121 //通信用 ***メインプログラム [#ecb01950] task main() { ClearMessage(); ClearTimer(0); OnRev(OUT_AC); //Q地点まで移動 Wait(450); Off(OUT_AC); OnRev(OUT_A); //向き調整 OnFwd(OUT_C); Wait(5); Off(OUT_AC); until(Message() == SIGNALON); //通信するまで動作停止 Wait(150); //紙コップが置かれたらアームで調整 OnFwd(OUT_B); Wait(10); Off(OUT_B); Wait(30000); //紙コップが集め終わるまで動作停止(あまりよくない) OnRev(OUT_B); //アームを広げる Wait(20); Off(OUT_B); OnRev(OUT_AC); //紙コップから離れる Wait(30); Off(OUT_AC); } **紙を運ぶロボット [#c0c793e7] ***マクロの定義 [#x655efe3] #define SIGNALON 121 //通信用 #define MIDDLE 50 //ライントレース用の中間値 #define WHITE 50 //紙コップ認識用の値 #define turn_left1 SetPower(OUT_AC,2); Off(OUT_A); OnFwd(OUT_C); //左 #define turn_left2 SetPower(OUT_A,1); OnRev(OUT_A); OnFwd(OUT_C); //左旋回 #define turn_right1 SetPower(OUT_AC,2); OnFwd(OUT_A); Off(OUT_C); //右 #define turn_right2 SetPower(OUT_C,1); OnFwd(OUT_A); OnRev(OUT_C); //右旋回 #define go_forward SetPower(OUT_AC,7); OnFwd(OUT_AC); //前進 ***数値の定義 [#wdbb56e7] 以下の定義でどのコップの集める動作をやるか判断できるようにする int cup_count=0; //コップのカウント ***サブルーチン [#zad2e9d5] ライントレースは課題2の時、作ったプログラムを使ってやった。しかし、サブルーチンで8個まで作れるので少しだけ変えた。 sub trace() //ライントレース { while(FastTimer(0) < 26) //左旋回が一定時間続くまでループ { if(SENSOR_2 < MIDDLE-5) //黒 { turn_left2; //左旋回 } else { if(SENSOR_2 < MIDDLE-2) //中間に近い黒 { turn_left1; //左曲がり } else if(SENSOR_2 < MIDDLE+3) //中間 { go_forward; //直進 } else if(SENSOR_2 < MIDDLE+6) //中間に近い白 { turn_right1; //右曲がり } else //白 { turn_right2; //右旋回 } ClearTimer(0); } } } sub i_forward() //直進 { turn_right2; Wait(30); go_forward; Wait(50); Off(OUT_AC); } sub i_left() //左折 { turn_left2; Wait(45); Off(OUT_AC); } sub i_right() //右折 { turn_right2; Wait(30); go_forward; Wait(30); turn_right2; Wait(80); Off(OUT_AC); } CとDのそれぞれの1つ目のコップの動作 sub cup1() { turn_right2; //紙コップまで方向調整 Wait(25); SetPower(OUT_AC,1); //紙コップまで移動 OnFwd(OUT_AC); while(SENSOR_3 <= WHITE); Off(OUT_AC); OnRev(OUT_B); //紙コップをつかむ Wait(150); Off(OUT_B); turn_right2; //ラインまで移動 Wait(180); go_forward; Wait(20); } 2つ目のコップの動作 CとDのそれぞれの2つ目のコップの動作 sub cup2() { SetPower(OUT_AC,1); //紙コップまで移動 OnFwd(OUT_AC); while(SENSOR_3 <= WHITE); Off(OUT_AC); OnRev(OUT_B); //紙コップをつかむ Wait(150); Off(OUT_B); turn_right2; //ラインまで移動 Wait(180); go_forward; Wait(120); } 3つ目のコップの動作 CとDのそれぞれの3つ目のコップの動作 sub cup3() { turn_right2; //紙コップまで方向調整 Wait(45); SetPower(OUT_AC,1); //紙コップまで移動 OnFwd(OUT_AC); while(SENSOR_3 <= WHITE); Off(OUT_AC); OnRev(OUT_B); //紙コップをつかむ Wait(150); Off(OUT_B); turn_right2; //ラインまで移動 Wait(170); go_forward; Wait(100); } そしてコップを下すときの動作 sub cup_down() { turn_left2; //コップを下す位置まで移動 Wait(5); OnRev(OUT_AC); Wait(5); Off(OUT_AC); if(cup_count == 1) //最初のコップを置くとき { SendMessage(SIGNALON); //もう一台の動作を再開する } OnFwd(OUT_B); Wait(50); Off(OUT_B); if(cup_count == 1) //最初のコップを置いたとき { OnFwd(OUT_AC); //コップを少し前に押す Wait(10); } OnRev(OUT_AC); //ラインまで移動 Wait(60); turn_left2; Wait(120); go_forward; Wait(50); } ***メインプログラム [#k848d930] 以下はメインプログラムで、交差点を認識するときcの値が増えていく。それは正しく順番をするためである。また、course_checkの定義でC地点に行くか、D地点に行くか決める。 詳しく[[こちら>http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2Fyamazaki%2FMission3]] task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); int c=1; //交差点の確認 int d=0; //1になったら動作停止 int course_check=0; //0ならC地点へ、1ならD地点へ SetPower(OUT_B,1); //コップをつかむときのモータをできるだけ弱くする go_forward; //ラインまで直進 Wait(80); while(d == 0) { ClearTimer(0); trace(); //ライントレース Off(OUT_AC); //交差点確認 PlaySound(SOUND_UP); Wait(100); switch(c) { case 1: //最初の交差点 i_left(); //S地点へ break; case 2: //S地点の交差点 if(course_check == 0) { i_right(); //C地点へ } else { i_left(); //D地点へ } break; case 3: //C地点かD地点 if(cup_count < 2) //集めたコップが2つより少ないなら { cup1(); } else if(cup_count < 4) //集めたコップが4つより少ないなら { cup2(); } else //集めたコップが4つ以上なら { cup3(); } cup_count++; break; case 4: if(course_check == 0) //C地点から戻ってきたら { i_left(); //P地点へ course_check = 1; //次はD地点へ } else //D地点から戻ってきたら { i_right(); //P地点へ course_check = 0; //次はC地点へ } break; case 5: //P地点の交差点 i_left(); //Q地点へ break; case 6: //Q地点の交差点 cup_down(); if(cup_count == 6) //コップを集め終わったら { d = 1; //動作停止 } break; case 7: //P地点の交差点 i_right(); //S地点へ c = 1; //case 2に戻る break; } c++; } Off(OUT_ABC); } *結果 [#ff181846] 私たちのグループは競技で一回目は紙コップを運んだが、壁のロボットに打つかって、失敗した。二回目は壁のロボットなしで、一つの紙コップを持って行って、そしておいたので基本3点をとった。しかしその後ライントレースで違いがあり、失敗したが、平均点は9.2で合計は12.2なので2位だった。 *感想 [#c3353c28] 今回の課題は本当に難しくて、完成するために時間がたくさん必要だった。しかし、期末試験のことであまり適切なじかんが見つからずに、そしてほとんどの作業は山崎さんがやってくれた。グループメンバーとしてもっと活躍したかったが、なかなか難しかった。 この授業を通して、私はプログラミングについていろいろなことが学べ、そして日本人と交流できて良かったと思う。思ったより大変でしたが、得たことの方がたくさんだと思う。