2013b/Member

課題

http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2013b%2FMission2&openfile=robocon2013b.png

「基本ルール」

「基本得点の計算方法 (片道)」

「技術点の計算方法」 以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。

得点の目安:

ロボットの説明

図1

結局車体が重すぎて急カーブができないことがわかったが、下を向いている光センサはその名残である。

図2

ディファレンシャルギアも、ライントレースのときの車体の無理な動きに対応できるように取り付けた。

図3

缶は光センサで検知してつかみ、持ち上げる。結局缶を積み上げることはできなかったが、つかんで持ち上げる機構自体は優秀で、手で缶を光センサのところまで持っていくと、4段まで積むことができた。5段目は、缶の重みで腕が缶の高さまで上がらず、積み上げられなかった。

図4
図5

缶を確実に捉えられるように、8班のような地面に接地した触覚をつければよかったかもしれない。缶を置くと、その合図にメトロイドのメロディーが流れる。

プログラム

あくまで、予定であった理想のプログラムであり、本番はこのようにうまくはいかなかった。

ライントレース側のプログラム

#define OPEN 1
#define GO 2
#define PUT 3
#define BACK 4
#define THERESHOLD 47 // 閾値
#define HIGHPOWER 3 // 直進用パワー
#define LOWPOWER 2 // カーブ用パワー
#define set_power_H SetPower(OUT_AC,HIGHPOWER);
#define set_power_L SetPower(OUT_AC,LOWPOWER);
#define go_forward set_power_H; OnRev(OUT_AC); // 直進
#define turn_left1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C); // 左旋回
#define turn_left0 set_power_L; OnRev(OUT_C); Off(OUT_A); // 左折
#define turn_right0 set_power_L; OnRev(OUT_A); Off(OUT_C); // 右折
#define turn_right1 set_power_L; OnFwd(OUT_C); OnRev(OUT_A); // 右旋回
#define STEP 1
#define nMAX 35 // 通常のカーブとみなす時間の上限
#define short_break Off(OUT_AC); Wait(100); // 小休止
#define cross_line go_forward set_power_H; OnFwd(OUT_AC); Wait(20); short_break; // 交差点通過 
task main()
{
 SetSensor(SENSOR_1,SENSOR_LIGHT);
 SetSensor(SENSOR_3,SENSOR_LIGHT);
 int nOnline=0;         

 ClearTimer(1);

 while (FastTimer(1) <= 500) {
   go_forward;                 // 最初の缶へは直進で向かう
   if (SENSOR_3 > 48) {     // 缶を発見 
   SendMessage(OPEN);      // アームを動かすように指示
   Off(OUT_AC);
  }
   until (Message() == GO);   // アームの動作が終了したら
   go_forward;         // 再び直進
 }

 ClearTimer(0);

 while (true) {
   while (FastTimer(0) < nMAX) {  
     if (SENSOR_1 < THERESHOLD -4) {
       turn_right1;
       } else {
         if (SENSOR_1 < THERESHOLD -2) {
           turn_right0;
       } else if (SENSOR_1 < THERESHOLD +2) {
           go_forward;
       } else if (SENSOR_1 < THERESHOLD +4) {
           turn_left0;
       } else {
           turn_left1;
       }             // ライントレース
   ClearTimer(0);
    }
   Wait(STEP);
   }
   turn_left1; Wait(nMAX*STEP);
   cross_line;           // 交差点を判別・通過
   nOnline++;          // カウンタを進める
   PlaySound(SOUND_CLICK);
   ClearTimer(0);
  
   if (SENSOR_3 > 48) { 
   SendMessage(OPEN);       // 缶を発見
   Off(OUT_AC);
   }


   if (nOnline == 8) {           //交差点を8回判別したとき、ロボットは左側のコースを1周し、GOALの位置に到達(黒線の左側を走るため、右側のエリアに繋がる丁字路も交差点とみなしている。)
   OnFwd(OUT_A);
   OnRev(OUT_C);  // ロボットの向きを調整
   Wait(70);
   SendMessage(PUT);  // 缶を置くように指示
 }


   until (Message() == GO);    // アームの動作が終了したら

 while (FastTimer(0) < nMAX) {              // ライントレース再開
   if (SENSOR_1 < THERESHOLD -4) {
     turn_right1;
     } else {
       if (SENSOR_1 < THERESHOLD -2) {
         turn_right0;
     } else if (SENSOR_1 < THERESHOLD +2) {
         go_forward;
     } else if (SENSOR_1 < THERESHOLD +4) {
         turn_left0;
     } else {
         turn_left1;
      }
     ClearTimer(0);
    }
   Wait(STEP);
   }
   turn_left1; Wait(nMAX*STEP);
   cross_line;         // 交差点を判別・通過
   nOnline++;
   PlaySound(SOUND_CLICK);
   ClearTimer(0);

   if (SENSOR_3 > 48) {    // 缶を発見
   SendMessage(OPEN);     // アームを動かすように指示
   Off(OUT_AC);
   }

   until (Message() == BACK);  // 缶が置かれたら、少し後退して終了
   OnRev(OUT_AC);
   Wait(100);

   } 
}

アーム側のプログラム

#define OPEN 1
#define GO 2
#define PUT 3
#define BACK 4
#define PowerA SetPower(OUT_A,0);   // アームを開ける為のパワー
#define PowerB SetPower(OUT_A,7);   // アームを閉じ、缶を掴み続ける為のパワー
#define PowerC SetPower(OUT_C,0);   // アームを下ろすのと、アームを上で固定する為のパワー
#define PowerD SetPower(OUT_C,10);  // アームを上げる為のパワーアームの開閉用モーターはA、昇降用モーターはCに接続。

task main()
{
 ClearMessage();
 while (true) {
   PowerC; OnFwd(OUT_C);  // アームを上に固定する為、常にモーターを上に回す
   until (Message() == OPEN); // 缶を発見したら
   PowerA; OnRev(OUT_A);  // アームを開く
   Wait(40);
   PowerC; OnRev(OUT_C);  // アームを下ろす
   Wait(90);
   PowerB; OnFwd(OUT_A);  // アームを閉じる
   Wait(40);
   PowerD; OnFwd(OUT_C); // アームを上げる
   Wait(160);
   SendMessage(GO);     // ライントレースを再開するように指示
   PowerC; OnFwd(OUT_C);  // 再びアームを上に固定し続ける
   until (Message() == PUT);  // GOALに到着したら
   PowerC; OnRev(OUT_C);  // アームを下ろす
   Wait(50);
   PowerA; OnRev(OUT_A);  // アームを開く
   Wait(40);
   SendMessage(BACK);  // 少し後退するように指示
   }
  Wait(10); 
}

苦労した点

ライントレースは、片方のタイヤを動かさずにもう片方のタイヤのみを動かすカーブ(turn_left(right)0)をなくし、両方のタイヤを互いの逆に回転させるカーブ(turn_left(right)1)と前進のみにすると、一応できるようになったが、これは定位置で動かなくなる恐れがあり、あまり生かせなかった。

反省

ソフト面のプログラムは、班員のearthがよくやってくれた。ハードのロボットがきちんと組み立てば、彼のプログラムはきちんと役に立ったはずだ。それだけに、ライントレースが常にできるぐらいに軽いロボットが作れなかったのは非常に悔しい。授業ではプログラムのことしか教わることができないので、レゴの組み立てに関することは勉強不足になってしまったかもしれない。


添付ファイル: fileDCIM0264.JPG 347件 [詳細] fileDCIM0260.JPG 344件 [詳細] file1391616505104.jpg 342件 [詳細] file1391616493383.jpg 314件 [詳細] file1391616426969.jpg 343件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-02-06 (木) 22:52:36