2018a/Member

課題2

ライントレースを主に指定されたコースについてロボットに指定の動作をさせる.

コース

2018a-mission2.png

設計思想

時間との兼ね合いも考えて.シンプルにミスが起きづらい設計を目指した. 主題がライントレースなので小回りが利く小型の機体がいいと考えた.

工夫点

ダウンロード.png

赤外線センサを地面スレスレに置くことで狭い範囲で識別することができるようにしました.これによってプログラムを理論に近い挙動で動かすことができ,連続するプログラムを実行する際,初期位置に関係なく目標の位置からのズレを抑えることができた.

ダウンロード (1).png

カンを掴む機構については四角い枠を上下に動かすだけのシンプルな構造です.はさみ型も考えましたが,挟んだ時にカンが不安定になったり滑り落ちることがあったためこのような形になりました.籠にある程度自由度を持たせていますがカンをつかむ瞬間は地面と平行になるようになっています.ゲージを下す場所も交差点の位置でうまくいくように調整して余計なプログラムを省いた.

ダウンロード (2).png

この機体も後輪についてミッション1同様2×2で自由度を持たせることによって回転時などにトラブルが起こりにくいようにしました.軸を大きく取ることによって,急カーブ時にも余計なプログラムを書かずとも問題を怒らないようにした.

ダウンロード (3).png

重量のある本体をブロックで固定するのでは剛性に限界があるので,半ばモーターの上に乗せるような形にし加速度が生じるときの安定性を高めました.

反省点

・カンを持ちあげる部分について,ただの四角いゲージでは下部を支えて引きづるような形になり,落とす事故が多発したためゲージの機構についてももう少し議論して,高さをつけるべきであった.

・カンを認識する動作をかなり微調整に頼ったため,失敗することが多かった.確実性の高い方法や,超音波センサを使うべきであった.

・主な移動手段のライントレースについては速度の遅さを除いて良好であった.

プログラム

#define turnL OnFwd(OUT_A,30); OnFwd(OUT_B,-20):            // 左折
#define turnR OnFwd(OUT_A,-20); OnFwd(OUT_B,30);            // 右折
#define armUP OnFwd(OUT_C,-20); Wait(1500); Off(OUT_C);     // アーム上げ
#define armDW OnFwd(OUT_C,20); Wait(1500); Off(OUT_C);      // アーム下げ
task main()
{
  SetSensorLight(S2);
  long t0 = CurrentTick();
  while (CurrentTick()-t0 <= 300) {
    if (SENSOR_2 < 40){
       turnR;
    } else {
       turnL;
       t0 = CurrentTick();                           
     }
  }                                    //AからBまでライントレース
  OnFwd(OUT_B,20);
  Wait(500);
  Off(OUT_B);             //Bで右折
  while (CurrentTick()-t0 <= 300) {
    if (SENSOR_2 < 40){
       turnR;
    } else {
       turnL;
       t0 = CurrentTick();                //Jまでライントレース
     }
  }
  Off(OUT_AB);
  Wait(1000);               //Jで一時停止
  armDW                 //空き缶をキャッチ
  OnFwd(OUT_AB,-20);
  Wait(500);               //Jにもどる
 repeat(2){ 
  while (CurrentTick()-t0 <= 300) {
    if (SENSOR_2 < 40){
       turnL;
    } else {
       turnR;
       t0 = CurrentTick();            
     }
  }                   
  OnFwd(OUT_AB,20);
  Wait(500);         
 }                                      //JからK、KからLを通過
  while (CurrentTick()-t0 <= 300) {    
    if (SENSOR_2 < 40){
       turnL;
    } else {
       turnR;
       t0 = CurrentTick();            
     }
  }                   //Iまでライントレース
  OnFwd(OUT_A,20);
  Wait(500);
  Off(OUT_A);              //Iを左折
  while (CurrentTick()-t0 <= 300) {   
    if (SENSOR_2 < 40){
       turnL;
    } else {
       turnR;
       t0 = CurrentTick();            
     }
  }                   //Hまでライントレース
  Off(OUT_AB);             
  Wait(1000);
  OnFwd(OUT_A,20);
  Wait(500);
  Off(OUT_A);              //Hで一時停止後左折
  while (CurrentTick()-t0 <= 300) {
    if (SENSOR_2 < 40){
       turnL;
    } else {
       turnR;
       t0 = CurrentTick();            
     }
  }                  //Gまでライントレース
  Off(OUT_AB);            
  Wait(1000);
  OnFwd(OUT_B,20);
  Wait(750);
  Off(OUT_B);             //Gで一時停止後右折
  while (CurrentTick()-t0 <= 300) {
    if (SENSOR_2 < 40){
       turnR;
    } else {
       turnL;
       t0 = CurrentTick();            
     }
  }                  //Fまでライントレース
  Off(OUT_AB);
  Wait(1000);
  OnFwd(OUT_B,20);
  Wait(500);
  Off(OUT_B);             //Fで一時停止後右折
  while (CurrentTick()-t0 <= 300) {
    if (SENSOR_2 < 40){
       turnR;
    } else {
       turnL;
       t0 = CurrentTick();            
     }
  }                  
  OnFwd(OUT_AB,20);
  Wait(500); 
  Off(OUT_AB);                        //Eまでライントレース後直進
  while (CurrentTick()-t0 <= 300) {
    if (SENSOR_2 < 40){
       turnR;
    } else {
       turnL;
       t0 = CurrentTick();            
     }
  }
  Off(OUT_AB);            
  Wait(1000);            //Dまでライントレース後一時停止
  OnFwd(OUT_A,20);
  Wait(500);  
  Off(OUT_A); 
  armUP               //空き缶を置く
  OnFwd(OUT_B,20);
  Wait(500);  
  Off(OUT_B);             //Dに戻る
  while (CurrentTick()-t0 <= 300) {
    if (SENSOR_2 < 40){
       turnL;
    } else {
       turnR;
       t0 = CurrentTick();            
     }
  }                 //Cまでライントレース
  Off(OUT_AB);
  Wait(1000);
  OnFwd(OUT_AB,20);
  Wait(500);             
  Off(OUT_AB);            //Cで一時停止後直進
  while (CurrentTick()-t0 <= 300) {
    if (SENSOR_2 < 40){
       turnL;
    } else {
       turnR;
       t0 = CurrentTick();            
     }
  }                 
  OnFwd(OUT_AB,20);
  Wait(500); 
  Off(OUT_AB);            //Bまでライントレース後直進
  while (CurrentTick()-t0 <= 300) {
    if (SENSOR_2 < 40){
       turnL;
    } else {
       turnR;
       t0 = CurrentTick();            
     }
  }
  Off(OUT_AB);            //Aで停止

・ライントレースの際白か黒の二択で定義したため動きが小刻みになり,移動速度が異常にそかった. ・超音波センサをうまく利用できればプログラムをかなり簡潔にできたと思う.カンの位置を手動のプログラムで行ったため,今くいかないことが多く調整にもかなりの時間を要した.


添付ファイル: file2018a-mission2.png 139件 [詳細] fileダウンロード (3).png 211件 [詳細] fileダウンロード (2).png 164件 [詳細] fileダウンロード (1).png 172件 [詳細] fileダウンロード.png 143件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-08-21 (火) 13:54:28