2006a/A4

その1:スタートまで空き缶を持っていくロボット

Anomalocaris10a.jpg

↑仮の画像かもしれません。

プログラム

//// programing by Taro

#define SR SENSOR_1
#define SC SENSOR_2
#define SL SENSOR_3
#define MR OUT_A
#define MC OUT_B
#define ML OUT_C
#define armdown 240
#define bd 37
#define L 3
#define C 2
#define R 1
#define turn90 67
#define turn180a 139
#define turn180b 150

int armposi=0;

void arminit(){
 until(SL>=80){
   OnRev(MC);
 }
  Off(MC);
 until(SL<80){
   OnFwd(MC);
 }
 Wait(10);
 Off(MC);
 armposi=0;
}

void S_P(int x , int y){
         switch(x){
           case 1:
            SetPower(ML,y);
           break;
           case 2:
            SetPower(MC,y);
           break;
           case 3:
            SetPower(MR,y);
           break;
           default:
           break;
         }
}
task main(){
 SetSensor(SL,SENSOR_LIGHT);
 SetSensor(SC,SENSOR_TOUCH);
 SetSensor(SR,SENSOR_LIGHT);
 S_P(L,10);
 S_P(C,10);
 S_P(R,10);
 
int direc=1 , Xlinenum=0 ;
int OSL=SL , OSC=SC , OSR=SR ;
int NSL=SL , NSC=SC , NSR=SR;
int kannum=0,i=0;


  arminit();

while(true){
  OSL=NSL;OSR=NSR;OSC=NSC;
  NSL=SL; NSR=SR; NSC=SC;
  
  if(NSL<bd && NSR>=bd){
    Off(ML);
    S_P(L,4);
    S_P(R,10);
  }
  
  if(NSR<bd && NSL>=bd){
    Off(MR);
    S_P(R,4);
    S_P(L,10);
  }
  
  if(NSR>=bd && NSL>=bd){
    S_P(R,10); S_P(L,10);
  }
  
  OnFwd(MR + ML);

  
  if(NSL<bd && NSR<bd){
    S_P(R,10); S_P(L,10);
    if(OSL>=bd || OSR>=bd){
      Xlinenum=Xlinenum+1;
      OSL=NSL;OSR=NSR;
      
    }
    
    if(Xlinenum==2 || Xlinenum==4 ||(Xlinenum==3 && kannum>=1)){
      OnFwd(ML + MR);
      Wait(72);
      if(direc==1 && Xlinenum!=3){
          Off(MR +ML );
          OnFwd(ML); OnRev(MR);
                 Wait(turn90);
      }
      if(direc==-1){
          Off(MR +ML );
          OnFwd(MR); OnRev(ML);
                 Wait(turn90);
          if(Xlinenum==3 && kannum>=1){
            Xlinenum=Xlinenum+1;
          }
      }
      

      
      until( SR <bd || SL <bd){
        if(direc==1){
          OnFwd(ML); OnRev(MR);
        }
        if(direc==-1){
          OnFwd(MR); OnRev(ML);
        }
      }
      
      Off(MR + ML);
      
      if(direc==-1 && Xlinenum==4){
        OnRev(MR + ML); Wait(70);Off(MR + ML);
        
        
      }
      
    }
    
    if(Xlinenum>=5){
          S_P(R,10);
          S_P(L,10);
    
      Off(MR + ML);
      if(direc==1){
      OnRev(MR + ML);
      Wait(23);
      
      OnRev(ML);
      OnFwd(MR);
      Wait(turn90);
      OnRev(MR + ML);
      if(kannum==0){
        Wait(9);
      }
      
      if(kannum>=1){
        Wait(100);
      }
      Off(MR + ML);
      
      OnFwd(MR);
      OnRev(ML);
      Wait(75);
     }
     if(direc==-1){
     
     Off(MR + ML);
     PlaySound(SOUND_CLICK) ;
     Wait(50);
     OnFwd(MR + ML); Wait(60); Off(MR + ML); Wait(20);
     OnRev(MR);
     OnFwd(ML);
     Wait(120);
     until(SR<bd){
      OnRev(MR); OnFwd(ML);
     }
     Wait(3);
     Off(MR + ML);
     
     
     }
      Off(ML + MR);
      
      ClearTimer(0);
       while(direc==1){

        
        if(armposi==0){

          if(FastTimer(0)>250){
          
            Off(MR + ML);
            OnFwd(MR + ML);
            Wait(8);
            Off(MR + ML);
            OnRev(ML);
            Wait(8);
            Off(MR + ML);
            OnRev(MR);
            Wait(10);
            Off(MR + ML);
            OnRev(MR + ML);
            Wait(15);
          }

          OnRev(MR + ML);
          

          
          if(SC==1){
          Wait(15);
          Off(MR + ML);
            OnFwd(MC);
            Wait(armdown);
            Off(MC);
            armposi=1;
            direc=-1;
            Xlinenum=1;
            Off(MR + ML);
          }
        }
        
       }
       
       while(direc==-1 && Xlinenum>=5){

        
        S_P(R,10); S_P(L,10);

        OnRev(ML + MR);
        Wait(120);

        
        Off(MR + ML);
        Wait(40);
        arminit();
        OnFwd(MR + ML);
        Wait(77);
        Off(MR + ML);
        OnFwd(MC);  Wait(armdown); Off(MC);
        OnRev(MR + ML); Wait(140); Off(MR + ML);Wait(20);
        
        
        
         ClearTimer(0);
         while(FastTimer(0)<400){
          SendMessage(1);
          PlaySound(SOUND_CLICK) ; 
         }
        arminit();
        OnFwd(MR + ML);
        Wait(40);
        
        direc=1;
        Xlinenum=1;
        kannum=kannum+1;
        Off(MR + ML);
       }
      
       
    }
  }
  

   


}
}
 
  • 製作:前列の人々

その2:受け取った空き缶をゴールに運ぶロボット

Anomalocaris05e.jpg
名前:アノマロカリス ver.0.5(仮)

本体の制作者はる土佐犬なおきたろう
プログラム制作者NRLP
ホームページ制作主任NRLP

製作過程

  1. とりあえずA4班が二手に分かれて製作を開始する。
  2. こちらはゴール担当となり、如何にしてゴールを目指すか考える。
  3. パワー重視で走行はキャタピラとしてキャタピラを組む。
  4. キャタピラのみで走らせてみるが、動きがあまりに歪なため、急遽タイヤに変更、ギヤ比を間違えて爆走したりといったハプニングはあったもののうまく走るようになる。
  5. うまく摑んで運べるようなアームを必死で作る。
  6. ハード製作と同時進行で大体の走行プログラムを組む。
  7. とりあえず運べるようにはなり、ここで微調整を繰り返す。
  8. 相方のロボと組んで本番のテストを繰り返す。
  9. 完成!
    Anomalocaris05f.jpg
    Anomalocaris05g.jpg

盲目のプログラム

制作者:NRLP
#define zen(t) OnFwd(OUT_A+OUT_C);Wait(t);Float(OUT_A+OUT_C);Wait(15);  //前進を定義
#define kou(t) OnRev(OUT_A+OUT_C);Wait(t);Float(OUT_A+OUT_C);Wait(15);  //後進を定義
#define migi(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Float(OUT_A+OUT_C);Wait(15);  //右方向転換を定義
#define hidari(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Float(OUT_A+OUT_C);Wait(15);  //左方向転換を定義
#define ygd 120  //45度回転するときの秒数を定義
#define chain OnFwd(OUT_B);Wait(236);Off(OUT_B);  //つかむ作業を定義
#define unchain OnRev(OUT_B);Wait(243);Off(OUT_B);  //放す作業を定義

task main()  //仕事始め
{
   while(true)  //以下の作業を繰り返す
   {
   ClearMessage();  //信号をクリアする
   until(Message()!=0);  //何らかのメッセージを受け取るまで待機
   if(Message()==1)  //もし(向こうの機体から)メッセージ1を受け取ったら
      
      PlayTone(523,30);  //音を鳴らして
      
      Wait(30);  //0.3秒待機
      
      zen(17);  //前進して
      chain;  //缶を掴む
      
      kou(292);  //ゴールへ行くために後進して
      migi(ygd);  //右に方向転換
      zen(295);  //前進して
      hidari(ygd);  //左に方向転換
      
      unchain;  //缶を放して
      zen(200);  //前進してゴールへと缶を押し込む
      kou(15);  //バックして
      zen(90);  //念のため押し込む
      kou(15);  //またバックして
      zen(100);  //念のため一気に押し込みつつ方向修正
      Wait(15);  //揺れる誤差を防ぐためにウェイト
      
      kou(110);  //最初の位置に戻るために後進
      hidari(93);  //左方向転換(缶を所持していないためウェイトは少なめ)
      zen(274);  //前進して
      migi(93);  //右方向転換
      zen(305);  //前進して元の位置に戻って
      
      Float(OUT_A+OUT_C);  //ゆったりと停止
      Wait(30);  //念のためのウェイト、以下は別機体から信号を受け取り次第行動を繰り返す
   }
}

反省

↓反省はいっぱいです。

苦労した点

  • アームの構造が複雑で、組み立てが大変だったこと(構造案のメインはたろう様)
  • 機体同士の赤外線センサのやり取りがなかなか反応しなかったこと。
  • マシンの前後の重心のバランスをとること(ウェイトととしてライトセンサを設置)
  • 手動での細かい誤差修正のため、コースでの練習が何度も何度も必要だったこと(頑張った!)
  • 缶が木の棒を越えて、なかなかゴールに押し入らずに苦労した(後に飛び出たパーツが缶を遮っていた事が分かり、そのパーツを変更して出っ張りを無くすことで解決)
  • 明らかなる部品不足は痛すぎる…(代用品を探すのにまた一苦労)
  • 缶を持っているときと持っていないときでは、方向転換時のウェイト数に差が出るため、それぞれ別に秒数を入れて微調整したこと。

工夫した点

  • すべての行動パターンを細かく入力したこと。
  • 誤差修正のプログラムを入れていないため、できるだけ誤差の出ない様な機構にしたこと。その点を以下に示す。
    • 最初はキャタピラを作ったが、方向転換を良くしてその際の誤差を少なくするためにタイヤに変更した。
    • 前進の際、重心が高すぎたため前後にガックンガックンするのを防ぐため、機体の後ろ部分にウェイトを設置した(因みにそのウェイトとは、先ほども言ったが光センサのことである)
    • 缶をゴールさせた後、真っ直ぐに後進できるよう方向修正を無理やりできるようにした(ゴールに無理やり突っ込んで下部の平行なパーツにより真っ直ぐに方向転換する)
  • ライトセンサ式にはできない黒線を無視した小回りな動きを利用し、移動時間を短縮させたこと。
  • 缶をうまくゴールに入れられるように、強く押し出すと缶の下が持ち上がる様なパーツを取り付けたこと。

感想

部品不足に疲れました。
微調整何度も何度もやるのにも疲れました。
1日でも早めに始めたのは良いことでした。

↓↓↓この添付ファイルの写真使ってくださいなー
   ファイル名の一部が10と05で機体別になっています。(未公開画像たっぷりです)

コメントをお願いします

  • プログラムの解説とコメントを書きましょう。苦労した点に関して、「マシンの前後の重心のバランスをとること(ウェイトととしてライトセンサを設置)」とありますが、ライトセンサ程度でウェイトになるとは思えないのですが、そのへんはどうなのでしょうか。また、実際の作戦の流れがわかりにくいのですが、そのへんを(余裕があれば)詳しく書いてほしいです。 -- まいける(TA) 2006-08-15 (火) 23:46:04


添付ファイル: fileAnomalocaris05l.jpg 115件 [詳細] fileAnomalocaris05k.jpg 102件 [詳細] fileAnomalocaris05j.jpg 110件 [詳細] fileAnomalocaris05i.jpg 122件 [詳細] fileAnomalocaris05h.jpg 112件 [詳細] fileAnomalocaris10f.jpg 97件 [詳細] fileAnomalocaris10e.jpg 98件 [詳細] fileAnomalocaris10d.jpg 101件 [詳細] fileAnomalocaris10c.jpg 103件 [詳細] fileAnomalocaris10b.jpg 109件 [詳細] fileAnomalocaris05g.jpg 107件 [詳細] fileAnomalocaris05f.jpg 121件 [詳細] fileAnomalocaris10a.jpg 117件 [詳細] fileAnomalocaris05e.jpg 136件 [詳細] fileAnomalocaris05d.jpg 133件 [詳細] fileAnomalocaris05c.jpg 120件 [詳細] fileAnomalocaris05b.jpg 109件 [詳細] fileAnomalocaris05a.jpg 120件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-08-15 (火) 23:46:04