目次

課題2 

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

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

http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=2018b-mission2.png&refer=2018b%2FMember%2Fyamada%2FMission2

ロボットについて

ロボットの写真 http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=C28CF2AD-EBF7-4DC6-BAD4-E41C3BCDE9D9.jpeg&refer=2018b%2FMember%2Fyamada%2FMission2

前方から撮影したセンサー部分の写真 http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=721D9563-2EBC-45A6-92F9-D74A4BE851C6.jpeg&refer=2018b%2FMember%2Fyamada%2FMission2

ロボット本体への工夫

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

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

センサー部分への工夫

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

ボールを保持するための部分の説明

3つ目のモーターで上下できる柵を取り付けた。

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

ボールをシュートする方法

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

改善点

シュートする部分に関して、他のグループが作っていたようにロボット上部から転がすという形を取っていればシュートの精度もプログラムの質も格段に上がったように思った。

プログラムについて

プログラム中の説明は次のコース攻略に詳しい説明を書きました。

実際のプログラム

#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()            //交差点を判断したら1秒間停止した後再発進 {

   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()          360°回転して障害物(缶)を見つけ出しその方向に向かう {

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);
 }

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<=40000){
    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,SPEED);
Wait(2000);
Off(OUT_BC);
}              //いらここまでが攻略

プログラムの説明と反省

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

実際のコース攻略

計画

計画図 http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=9A237485-F723-4A92-9CC5-0360831E87B7.jpeg&refer=2018b%2FMember%2Fyamada%2FMission2

A地点をスタートし、ラインの右側をトレースする。スタート後15秒間は交差点判断をしないのでB地点を右折。何度かタイム計測をした結果15秒以内にK地点まではたどり着けないのでK地点では交差点と判断し、横断。円HIJKの内側に入る。

円HIJKの内部を18秒間トレースする。大体15秒程度でI地点を過ぎたあたりに到着する予定である。ボールをシュートするときの前進で円HIJKの外側に出て外側のトレースを開始する。

ボールをシュートした後通常通りのトレースをする。G地点で交差点を判断したら一時停止した後交差点判断をしないトレースを開始する。

G地点を曲がりだすところからスタート。40秒間で通常のF地点までたどり着き、E地点で交差点を判断したら右折する。

ゥ薀ぅ鹹未蠅膨梢覆掘交差点(L地点)を横断した後2秒間前進して四角の中に入って停止する。

失敗例

◆哨轡紂璽帆

18秒間でI地点を超えられず、本来G地点で行うはずの一時停止をI地点で行ってしまう。(時間以外の方法でどれくらい進んだかを測っていれば防げたのではないか)

◆哨轡紂璽隼

18秒間でH地点近くまで来てしまいシュート時の前進で円HIJKの外側に出られない。(時間以外の方法でどれくらい進んだかを測っていれば防げたのではないか)

‐最後、ぁ昇能

G地点を曲がり切れずに直進してしまう。(停止した後一度後退してトレースしなおすとよかったのではないか)

ぁ承泙淵ーブ

稀に曲がり切れずにコースアウトしてしまう(しきい値を計測しなおす、ロボットを改造するなど様々な対策があたのではないか)

-F地点

40秒間でたどり着けないとここで交差点判断をしてコースアウトしてしまう。(時間以外の方法でどれくらい進んだかを測っていれば防げたのではないか)

-E地点

40秒間以内に辿り着いてしまうと交差点判断をすることができずに、道順を間違えてしまう。(時間以外の方法でどれくらい進んだかを測っていれば防げたのではないか)

全体を通して

前回のプログラムに比べればコンパクトで綺麗なプログラムに仕上がったと思うが、ほかのグループの人たちと比べるとプログラム、ロボットへの工夫や綺麗さは劣っているので、ロボコンまでにできる限り同じレベルになれるように頑張りたい。また、前回に比べて綺麗に仕上がったといってもまだ無駄の多く回りくどい方法をとったプログラムであると思うのでもう少しコンパクトなプログラムを書けるように努力したい。レポートに関しても画像が表示できずURLを貼っているなど詰めの甘い部分は自分のダメなところであるので改善していきたい。


添付ファイル: file9A237485-F723-4A92-9CC5-0360831E87B7.jpeg 2件 [詳細] file2018b-mission2.png 7件 [詳細] file721D9563-2EBC-45A6-92F9-D74A4BE851C6.jpeg 8件 [詳細] fileC28CF2AD-EBF7-4DC6-BAD4-E41C3BCDE9D9.jpeg 7件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-01-11 (金) 15:40:31 (5d)