----- |CENTER:SIZE(30):ロボコン C4| CENTER:缶を運ぶロボット ----- #br **課題 [#ce67d178] 350ml の中身の入ったアルミ缶を所定の場所から所定の場所まで移動させる。&br; [[☆詳しいこと★(ルール等)>2006a/ロボコン]] **制作者 [#if448371] [[&color(#008000){''Utsumi''};>2006a/C4/梅干し]] [[&color(#0000FF){''コミ''};>2006a/C4/助教授]] [[&color(#808000){''Nori''};>2006a/C4/教授]] [[&color(#FF00FF){''ちぃ''};>2006a/C4/アルバイト]] [[&color(#FFA500){''SHIBATA''};>2006a/C4/柴田君]]&br; *全体の構想 [#ibadea9a] 1台が缶をスタート地点まで運び、スタート地点で缶の受け渡しをし、もう1台がスタート地点からゴールまで運ぶ。&br; 真ん中の缶は前から捕らえ、両側の缶は障害物や角材を避けて斜め前から捕らえる。&br; 障害物の排除はせず、障害物を避けるようにする。&br; ロボットの誘導ではライントレースを一部で行う。 *ロボ本体 [#gd971829] [[&color(#808000){''ロボ制作日記''};>2006a/C4/ロボ制作日記]]を読む #ref(2006a/C4/ロボコン/CA330023.JPG,50%,本命) 1号機☆&br; スタートから缶を受け渡す所までを担当します。&br; #ref(2006a/C4/ロボコン/CA330010.JPG,50%,本命2) 2号機★&br; 缶を受け渡されてから、ゴールに入れるまでを担当します。&br; &br; 1台で缶を運ぶという構想で途中まで製作していたため1号機のほうが幅が少し小さくなっているが、基本的な構造は同じ。&br; 缶を転がす部分が前であるかのように見えるが実は後ろである。&br; どちらも後輪駆動で前輪はキャスタ。モータと後輪の間のギアは減速比3。&br; ロボコン前の課題でキャスタを用いたところ回転やコーナーリングがスムーズにできたので、今回も前輪にキャスタを用いた。&br; 前輪付近には2つの光センサが、後部には缶を認識するタッチセンサと缶を転がす腕がある。&br; 2号機には、缶が角材を乗り上げるようにタッチセンサの腕に階段状の部品が取り付けてある。&br; 缶を捕らえる腕の動きは単純だが、1号機は捕らえる部分を大きくすることで、単純な動きで缶をしっかりと斜めからでも捕らえるようにした。&br; そこを大きくすると運搬中に缶の向きが変わってしまい受け渡し時にうまく転がらないことがあるが、&br; 内側の2つのローラーにより缶の長手方向とロボットの直進方向が平行にならないようにしている。&br; 2号機は受け取るだけなので、小さく構造も簡単になっている。 *プログラム [#f3b00117] **1号機のプログラム [#q6894c19] #define THRESHOLD 42 //閾値 #define thrtime 45 //黒線通過時間 #define offac Off(OUT_A+OUT_C); //停止 #define fwd OnFwd(OUT_A+OUT_C); //前進 #define rev OnRev(OUT_A+OUT_C); //後退 #define fwdright Off(OUT_A);OnFwd(OUT_C); //右前方へ #define fwdleft Off(OUT_C);OnFwd(OUT_A); //左前方へ #define revright Off(OUT_A);OnRev(OUT_C); //右後方へ #define revleft Off(OUT_C);OnRev(OUT_A); //左後方へ #define tracecond ((SENSOR_3>THRESHOLD)||(SENSOR_1>THRESHOLD)) //ライントレース条件 #define wht1 (SENSOR_1>THRESHOLD) //センサ1が白を認識 #define blk1 (SENSOR_1<=THRESHOLD) //センサ1が黒を認識 #define wht3 (SENSOR_3>THRESHOLD) //センサ3が白を認識 #define blk3 (SENSOR_3<=THRESHOLD) //センサ3が黒を認識 #define blk1a3 ((SENSOR_1<=THRESHOLD)&&(SENSOR_3<=THRESHOLD)) //センサ1,3両方がが黒を認識 #define snd PlaySound(SOUND_DOUBLE_BEEP); //音を鳴らす sub trace() //ライントレース { if(wht1&&wht3){fwd} if(blk1&&wht3){fwdright} if(wht1&&blk3){fwdleft} } sub turnleft() //左折 {fwd;Wait(25); OnRev(OUT_C);OnFwd(OUT_A);Wait(30);until(blk3);} sub turnright() //右折 {fwd;Wait(25); OnRev(OUT_A);OnFwd(OUT_C);Wait(30);until(blk1);} task message() //通信 {ClearMessage();while(Message()!=255){SendMessage(128);Wait(25);}} task main() //以下メインタスク { int i=1,time=0; SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ1: 右光センサ SetSensor(SENSOR_2,SENSOR_TOUCH); //センサ2: タッチセンサ SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ3: 左光センサ SetPower(OUT_A,7);SetPower(OUT_C,6);SetPower(OUT_B,7); //出力調整 OnRev(OUT_B);Wait(50); //腕をあげる。 repeat(3) //以下3回繰り返し。 { fwd;Wait(100);fwdright;Wait(60);fwdleft;Wait(60); //右によって、線を認識するまで直進し右折。 fwd;until(blk1a3);snd;turnright(); while(tracecond){trace();}snd;fwd;Wait(thrtime); //2つ目の交点に達するまでライントレースし、右折。 while(tracecond){trace();}snd;turnright(); while(tracecond){trace();}rev;Wait(50); //交点に達するまでライントレースし、0.5秒後退。 OnRev(OUT_A);OnFwd(OUT_C);Wait(40);until(blk1); //センサ1が線を認識するまで右回転。 if(i==1) //1回目の動作 { OnRev(OUT_C);OnFwd(OUT_A);Wait(5); //0.05秒左回転(位置調整)。 rev;until(SENSOR_2==1);offac;OnFwd(OUT_B);Wait(120);Off(OUT_B); //センサ2が押されるまで後退し、押されたら停止後腕を下ろし、一旦力を抜く。 fwd;Wait(50);OnFwd(OUT_B); //0.5秒前進し、腕に力をかける。 } if(i==2) //2回目の動作 { revleft;Wait(8);ClearTimer(0);rev;until(SENSOR_2==1);time=FastTimer(0); //左後方へ0.08秒動き、センサ2が押されるまで後退。後退時間を変数timeに記録。 offac;OnFwd(OUT_B);Wait(120);fwd;Wait(time);fwdleft;until(blk1); //停止して腕を下ろした後、time*10^-3秒間前進し、センサ1が線を認識するまで左前方へ。 } if(i==3) //3回目の動作 { rev;Wait(50);revright;Wait(20); ClearTimer(0);rev;until(SENSOR_2==1);time=FastTimer(0); //0.5秒後退し右後方へ0.2秒動いた後、センサ2が押されるまで後退。後退時間記録。 offac;OnFwd(OUT_B);Wait(120);fwd;Wait(time);fwdright;until(blk3); //停止して腕を下ろした後、time*10^-3秒間前進し、センサ3が線を認識するまで右前方へ。 } fwdleft;Wait(25);fwd;until(blk1a3);snd;turnleft(); //左に向きを変え、線を認識するまで直進し、左折。 while(tracecond){trace();}snd;fwd;Wait(thrtime); //2つ目の交点に達するまでライントレースし、左折。 while(tracecond){trace();}snd;turnleft(); while(tracecond){trace();}snd;start message; //交点に達するまでライントレースし、通信を開始。 turnleft();Wait(20);until(blk3);Wait(11); //左折を開始し、センサ3が2回線を認識するまで動く。 rev;Wait(90);stop message; //0.9秒間後退し、通信を終了。 OnRev(OUT_B);Wait(20);offac;Wait(80);i=i+1; //腕をあげ、停止。iに1を足す。 } offac; } **2号機のプログラム [#g1faa54f] #define THRESHOLD 42 //閾値 #define thrtime 45 //黒線通過時間 #define offac Off(OUT_A+OUT_C); //停止 #define fwd OnFwd(OUT_A+OUT_C); //前進 #define rev OnRev(OUT_A+OUT_C); //後退 #define fwdright Off(OUT_A);OnFwd(OUT_C); //右前方へ #define fwdleft Off(OUT_C);OnFwd(OUT_A); //左前方へ #define revright Off(OUT_A);OnRev(OUT_C); //右後方へ #define revleft Off(OUT_C);OnRev(OUT_A); //左後方へ #define tracecond ((SENSOR_3>THRESHOLD)||(SENSOR_1>THRESHOLD)) //ライントレース条件 #define wht1 (SENSOR_1>THRESHOLD) //センサ1が白を認識 #define blk1 (SENSOR_1<=THRESHOLD) //センサ1が黒を認識 #define wht3 (SENSOR_3>THRESHOLD) //センサ3が白を認識 #define blk3 (SENSOR_3<=THRESHOLD) //センサ3が黒を認識 #define blk1a3 ((SENSOR_1<=THRESHOLD)&&(SENSOR_3<=THRESHOLD)) //センサ1,3両方がが黒を認識 #define snd PlaySound(SOUND_DOUBLE_BEEP); //音を鳴らす sub trace() //ライントレース { if(wht1&&wht3){fwd} if(blk1&&wht3){fwdright} if(wht1&&blk3){fwdleft} } sub turnleft() //左折 {fwd;Wait(27); OnRev(OUT_C);OnFwd(OUT_A);Wait(30);until(blk3);} sub turnright() //右折 {fwd;Wait(27); OnRev(OUT_A);OnFwd(OUT_C);Wait(30);until(blk1);} task message() //通信 {ClearMessage();until(Message()==128);repeat(12){SendMessage(255);Wait(25);}} task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ1: 右光センサ SetSensor(SENSOR_2,SENSOR_TOUCH); //センサ2: タッチセンサ SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ3: 左光センサ SetPower(OUT_A,5);SetPower(OUT_C,7);SetPower(OUT_B,7); //出力調整 Wait(50); while(true) //以下繰り返し。 { start message;OnFwd(OUT_B);Wait(10);Float(OUT_B);until(Message()==128); //出力を1号機からの通信を待つ。 OnRev(OUT_B);until(SENSOR_2==1);stop message; //通信ができたら腕を上げ、センサ2が押されるまで待つ。 OnFwd(OUT_B);Wait(100); //センサ2が押されたら腕を下ろす。 fwdleft;Wait(62);fwdright;Wait(44); //左によって、線を2本横断するまで直進し、左折。 fwd;until(blk1a3);snd;Wait(thrtime);until(blk1a3);snd;turnleft(); while(tracecond){trace();}snd;fwd;Wait(thrtime); //2つ目の交点までライントレースし、右折。 while(tracecond){trace();}snd;turnright();Wait(3);offac; OnRev(OUT_B);Wait(100);rev;Wait(400); //腕を上げ、4秒後退。ゴールっ…。 fwdright;Wait(79); //右前方に0.79秒動き、線を2本横断するまで直進。 fwd;until(blk1a3);snd;Wait(thrtime);until(blk1a3);snd; turnleft();Wait(2);rev;Wait(150);offac; //左折し、1.5秒直進して停止。 } offac;Off(OUT_B); } 2号機は同じ動きを繰り返すだけのものであり、またゴール時に角材に向かって直進することで向きを確実に決め直すことができるため調整が簡単で、&br; ライントレースは缶をゴールに運ぶ時に少し行うだけで済んだ。 *問題点 [#n333343f] -前輪にキャスタを用い減速比を下げたため、回転やコーナーリングはスムーズで移動速度は速いが、安定性が低く正確な動きができない。&br; また、缶を転がしているときにうまく動かないことがある。 -細かい動き以外では動く時間を指定せず、ラインによって位置を捉えて次の動きに移る。そのため何らかの原因で線を認識できなかった場合、&br; 本来曲がるべきところで直進してしまうなど想定外の動きをする。 *反省 [#n4aa37e4] //最初の時点で3つすべてを素早く運ぶことを目標としたが、まず簡単なことを目標にし、それができるようになってから上の目指すようにすべきだった。いきなりよくばったため速度を上げ、不安定さに気付かないままキャスタを用いて、正確な動きができなくなってしまった。 *コメント [#nb5a35ba] コメントをどうぞ(^ω^)ノ #comment #hr [[2006a/C4 へ戻る>2006a/C4]]