目次
#contents

*課題2  [#gc83284e]

下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。

自分はコース1を選択した。

*ロボットについて [#o99e9921]
**ロボット本体への工夫 [#oac0b510]

カラーセンサーを設計図よりタイヤに近づけるためにできるだけ元の車体バランスを崩さないようにしながらNXTの真下の部品を1段分後ろに下げた。

それによって急なカーブをより良い精度で通過できるようになった。

**センサー部分への工夫 [#vab13230]

前述の通り設計図と比べてタイヤの近くに配置することで急なカーブの成功率を上げた。

**ボールを保持するための部分の説明 [#m5d5a43a]
3つ目のモーターで上下できる柵を取り付けた。

ボールをシュートした後も柵を完全に上げきることでちょうどNXTの上部に来るので柵の重さによって車体が傾き、地面とカラーセンサーの距離があまり変わらないようにした。

**ボールをシュートする方法 [#f7193112]

缶の方向を向いた後に柵を上げ前進することでボールに体当たりをする。ロボットの設計段階で道順の中でボールを拾うと勘違いしていたのでタッチセンサーがついているが修正する時間がなかったのでシュートするときにボールが当たる部分として使うことにした。

*プログラムについて [#j8cc8344]

**実際のプログラム [#tae93a47]


#define THRESHOLD 54
#define SPEED 30
#define speed 20
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
#define LEFT OnRL(speed,-speed);
#define left OnRL(speed,0);
#define straight OnRL(SPEED,SPEED);
#define right OnRL(0,speed);
#define RIGHT OnRL(-speed,speed);
#define STEP 1
#define nMAX 300
#define short_break Off(OUT_BC);Wait(1000);
#define CROSS_TIME 700
#define cross_line OnFwd(OUT_BC,speed);Wait(CROSS_TIME);short_break;
#define turn_time 3000
#define turn_left LEFT;Wait(turn_time);short_break;
#define turn_right RIGHT;Wait(turn_time);short_break;
#define kaiten OnRL(SPEED,-SPEED);
#define kaiten_time 5500
#define arm_up OnRev(OUT_A,SPEED);Wait(500);Off(OUT_A);



sub kousaten_trace()
{
    SetSensorLight(S3);
    int nOnline=0;

   while (nOnline < nMAX) {
    if (SENSOR_3 < THRESHOLD-10) {
     RIGHT;
     nOnline++;}
    else {
     if (SENSOR_3 < THRESHOLD-3) {right;}
     else if (SENSOR_3 < THRESHOLD+2) {straight;}
     else if (SENSOR_3 < THRESHOLD+6) {left;}
     else {LEFT;}
     nOnline=0;}
    Wait(STEP);
   }
   short_break;
   LEFT;
   Wait(nMAX*STEP);
   cross_line;
   nOnline=0;
  }

sub kousaten_usetsu()
{
    SetSensorLight(S3);
    int nOnline=0;

   while (nOnline < nMAX) {
    if (SENSOR_3 < THRESHOLD-8) {
     LEFT;
     nOnline++;}
    else {
     if (SENSOR_3 < THRESHOLD-3) {left;}
     else if (SENSOR_3 < THRESHOLD+2) {straight;}
     else if (SENSOR_3 < THRESHOLD+6) {right;}
     else {RIGHT;}
     nOnline=0;}
    Wait(STEP);
   }
   short_break;
   RIGHT;
   Wait(nMAX*STEP);
   turn_right;
   nOnline=0;
  }

sub kousaten_teishi()
{
    SetSensorLight(S3);
    int nOnline=0;

   while (nOnline < nMAX) {
    if (SENSOR_3 < THRESHOLD-8) {
     LEFT;
     nOnline++;}
    else {
     if (SENSOR_3 < THRESHOLD-3) {left;}
     else if (SENSOR_3 < THRESHOLD+2) {straight;}
     else if (SENSOR_3 < THRESHOLD+6) {right;}
     else {RIGHT;}
     nOnline=0;}
    Wait(STEP);
   }
   short_break;
   nOnline=0;
  }

sub serch_kan()
{
 SetSensorLowspeed(S4);
 long t10,t11;
 int L=10000;
 while(CurrentTick()-t10<=kaiten_time){
  OnRL(speed,-speed);
  if(SensorUS(S4)<L)
  {
   L=SensorUS(S4);
   t11=CurrentTick()-t10;
  }
 }
 OnRL(-speed,speed);
 Wait(kaiten_time-t11);
 Off(OUT_BC);
 }


sub shoot()
{
  arm_up;
  OnFwd(OUT_BC,100);
  Wait(200);
  Off(OUT_BC);
  OnRev(OUT_BC,100);
  Wait(100);
  Off(OUT_BC);
  }

task main()
{
 SetSensorLight(S3);
 SetSensorLowspeed(S4);
 long t0,t1,t2,t3;
 t0=CurrentTick();
 while(CurrentTick()-t0<=15000){
     if(SENSOR_3<THRESHOLD-8){RIGHT;}
     else if(SENSOR_3<THRESHOLD-3){right;}
     else if(SENSOR_3<THRESHOLD+2){straight;}
     else if(SENSOR_3<THRESHOLD+6){left;}
     else{LEFT;}
    Wait(STEP);
    }
 kousaten_trace();
 t1=CurrentTick();
 while(CurrentTick()-t1<=15000){
     if(SENSOR_3<THRESHOLD-8){RIGHT;}
     else if(SENSOR_3<THRESHOLD-3){right;}
     else if(SENSOR_3<THRESHOLD+2){straight;}
     else if(SENSOR_3<THRESHOLD+6){left;}
     else{LEFT;}
    Wait(STEP);
    }
 serch_kan();
 shoot();
 t2=CurrentTick();
 while(CurrentTick()-t2<=18000){
     if(SENSOR_3<THRESHOLD-8){LEFT;}
     else if(SENSOR_3<THRESHOLD-3){left;}
     else if(SENSOR_3<THRESHOLD+2){straight;}
     else if(SENSOR_3<THRESHOLD+6){right;}
     else{RIGHT;}
    Wait(STEP);
    }
 kousaten_teishi();
 t3=CurrentTick();
 while(CurrentTick()-t3<=50000){
     if(SENSOR_3<THRESHOLD-8){LEFT;}
     else if(SENSOR_3<THRESHOLD-3){left;}
     else if(SENSOR_3<THRESHOLD+2){straight;}
     else if(SENSOR_3<THRESHOLD+6){right;}
     else{RIGHT;}
    Wait(STEP);
    }
 kousaten_usetsu();
 kousaten_trace();
 OnFwd(OUT_BC,30);
 Wait(2000);
 Off(OUT_BC);
 }

**プログラムの説明と反省 [#y27f08f7]

基本的にはタイマーで時間を計りながら交差点判断をするかしないかを決めているためこのコースでしか使えないうえに想定した以上にスムーズに進んだり時間がかかったりしてしまうとコースを間違えてしまうためコースを完走しないことが多くなってしまった。
時間ではなく、タイヤの回転角などで距離を測りながら進むと今よりは成功率の高いプログラムになったのではないだろうか。



*実際のコース攻略 [#udea7385]

**当初の計画 [#q9faae0e]

**失敗例 [#w1b2a956]

*全体を通して [#q23ba7ce]

前回のプログラムに比べればコンパクトで綺麗なプログラムに仕上がったと思うが、ほかのグループの人たちと比べるとプログラムやロボットへの工夫や綺麗さは劣っているので、ロボコンまでにできる限り同じレベルになれるように頑張りたい。

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS