目次

課題の確認

コースの全体図

 今回私が担当するコースは第3コースである。尚、第3コースの具体的な内容は以下の通りである。

(1)Aをスタート(2)Bを直進(3)Cを直進

(4)D地点の紙コップを取得して来たコース戻りCへ向かう

(5)Cを左折(6)Fを直進(7)Rを左折(一時停止)(8)Pを直進

(9)X地点に紙コップを置いてコースに戻る

(10)Qを左折(11)Sを右折(一時停止)(12)Fを左折(一時停止)(13)Cを右折(一時停止)(14)D地点へ(ゴール)

ロボットの説明

ロボット作成に向けて

正確にミッションをクリアするために必要になる6つの課題

機.薀ぅ鵑涼爾鮴騎里砲燭匹

→ ,茲蠑回りがきくようにするために、センサと動力の位置をできるだけ近づける。(ローバー)

 ◆〇罎留凸、ラインの塗りの粗さなどで動作に支障をきたさないように、センサと地面の位置の調節する。(ローバー)

供.灰奪廚瞭手とリリース

→ コップの位置が多少ずれていても入手できるアームを作成する。(ローバー)

 ぁ.灰奪廚瞭手とリリースの動作を電池残量に左右されないようにする。(プログラム)

掘\騎里妨鮑硬世鮓極める(交差点以外での誤認を無くす)

→ァ仝鮑硬整奮阿如屬海海聾鮑硬世澄廚噺軫Г靴覆い茲Δ淵廛蹈哀薀爐鮑鄒する。(プログラム)

 Α仝鮑硬生紊瞭虻遒鯏澱啝栂未砲茲辰栃儔修靴覆い茲Δ砲垢襦(プログラム)

私達のグループでは、以上の6点の課題を解決することで今回のミッションをクリアできると考えた。

ロボットの作成

ローバーの説明

今回は「ロボットの作成に向けて」であげた6つの課題の中のローバーの課題 銑に着目して、ローバーを作成していく。

課題 .札鵐気汎偉呂琉銘屬鬚任るだけ近づける。

課題◆.札鵐気斑鰐未琉銘屬猟汗瓩垢襦

  • 試作1 (センサを地面に対し斜めに配置する。)

調度良い位置だったらしく、ライントレースはスムーズに出来た。しかし、この方式では課題,任△襦屮札鵐気汎偉呂琉銘屬鬚任るだけ近づける。」ことが難しいということがわかった。

このことから、センサは地面と垂直になるように設置することで、よりセンサを動力に近づけることができるということがわかった。

  • 試作2 (センサを地面に対し垂直になるように設置する)

突然カーブしてしまうと言ったおかしな動きをすることが増えてしまった。おかしな挙動をする点を後で調べてみたところ、紙に若干の凹凸があったということがわかった。このことから、センサの位置が地面に近すぎたためではないかということがわかった。

地面と、ある程度離れた位置にセンサを配置しないと、正確なライントレースは難しいのだということがわかった。

  • 試作3(本番で使用)

試作3号機での光センサの位置

試作2よりもセンサの位置を地面から離すことで、試作1のような安定したライントレースを行うことに成功した。また、課題,任△襦屮札鵐気汎偉呂琉銘屬鬚任るだけ近づける。」ことにも成功した。

課題 コップの位置が多少ずれていても入手できるアームの作成。

アームの説明、コップ入手前 →  アームの説明、コップ入手後

今回私達のグループでは、コップの入手とリリースが容易にできる、「アームを上からかぶせる」方式のロボットを作成した。

これにより、画像のように多少コップに位置がずれていても、「4本の爪で引き寄せて上からアームをかぶせる」ことで確実にコップを取得することができるようになった。

プログラミングの説明

定義

私達のグループでは、より滑らかなライントレースを行うために5段階の比例制御を行っている。そのため、プログラムが膨大なものとなってしまっている。このことにより、電池の消耗などで速度が変化してしまった際、各値を修正するのに多大な時間を使用してしまうとともに、ミスをしてしまう可能性も非常に高くなってしまう。

これらの問題点を解決するために、私たちのグループではプログラム上のそれぞれの値に定義づけを行い、プログラムの修正と確認をより容易なものとした。

  • ラインの基準

ライントレースを行う際に非常に大切な値となるものが、ラインの端の値である。今回は、ラインのもっとも黒い部分の値と、用紙のもっとも白い部分の値を入力することで中間の値が自動で出るような定義付けを行った。

#define black 30 // 黒基準
#define white 58 // 白基準
#define threshold (black+white)/2 // 基準線の明るさ
  • 速度の基準
#define speed_standardA 35 // モータA基準速度
#define speed_standardB 35 // モータB基準速度
#define corner_standardA 27 // モータA交差点基準速度
#define corner_standardB 27 // モータB交差点基準速度
  • 比例制御に必要な定義

私達のグループでは比例5段階制御を行っている。その際「基準線の値と現在の値の差」を利用し比例制御を行っているのだが、今回は比例5段階制御ということで各モータ毎に3つの比例制御用の値が必要となってくる。

また _speed◆,箸靴燭箸、,f→forward(前進用)、c→corner(カーブ用)、t→turning(急カーブ用)を表し、△脇阿しているモータを表している。

#define sensor2 SENSOR_2
#define f_speedA (sensor2-threshold)*1 // 直進 モータA
#define c_speedA (sensor2-threshold)*1.5 // corner モータA
#define t_speedA (sensor2-threshold)*2 // turning モータA
#define f_speedB (sensor2-threshold)*1 // 直進 モータB 
#define c_speedB (sensor2-threshold)*1.5 // corner モータB 
#define t_speedB (sensor2-threshold)*2 // turning モータB
  • 交差点の識別

私達のグループでは、交差点の識別を「どれほどの時間曲がり続けても黒のラインから白い部分にセンサが入らない」という時間を用いて行っている。そのために、交差点識別時間が必要となった。

また、交差点の識別時間が110と非常に短く設定されている理由は、これ以上の値にした場合に交差点と判別してくれない部分があるとともに、これ以下に下げると通常のカーブでも交差点と誤認してしまう可能性が高まるからである。

#define corner_time 110 // 交差点判別時間
#define corner_wait 1000 // 交差点待機時間
#define afterselect_time 750 // 交差点通過後左右ライン選択時間
  • コップの入手とリリース

私達のグループでは、コップの入手とリリースが電池残量によって左右されないように、モーターを何秒回すかではなく、モーターを何度回すかといった角度を利用している。

#define catch RotateMotor(OUT_C,50,-400);Wait(1000); // コップの取得
#define release RotateMotor(OUT_C,50,400);Wait(1000); // コップのリリース
#define finish OnFwd(OUT_AB,30);Wait(2500);Off(OUT_AB); // 全行程終了(Dへ入る)

比例制御と5段階制御を組み合わせるために…

   私達のグループでは、より滑らかな、より安定感のあるライントレースを行うために「比例制御」を使用したライントレースを行っている。これにより、滑らかな走行を可能にすることができたが、新たな課題も生まれた。

 それは「ある程度のカーブであれば対応できるが、急カーブでは対応することができない」という課題である。

 この課題を、解決するために私達が考えた解決策が「比例5段階制御」である。

  • 3つの比例制御プログラム

 「比例5段階制御」を行うためには、3段階に分けた比例制御が必要になる。

 また、_proportion(int )としたとき、,f→forward(前進用比例制御)、c→corner(カーブ用比例制御)、t→turning(急カーブ用比例制御)を表し、△魯薀ぅ鵐肇譟璽垢垢襯薀ぅ鵑魃βΔ砲垢襪左側にするかを選択(右側→1、左側→-1)できることを表している。

 例)右側のラインを走行中でカーブしている場合  forward_proportion(1);

 比例制御の方法については次のような計算法で行っている。

 モータA(基準速度)+(現在の明るさ−基準の明るさ)×曲がり方によって異なる値×1か‐1

 モータB(基準速度)−(現在の明るさ−基準の明るさ)×曲がり方によって異なる値×1か‐1

sub forward_proportion(int lineselect) // 前進の比例制御
{
    OnFwd(OUT_A,(speed_standardA)+f_speedA*lineselect);
    OnFwd(OUT_B,(speed_standardB)-f_speedB*lineselect);
}
sub corner_proportion(int lineselect) // 曲がり道の比例制御
{
    OnFwd(OUT_A,(speed_standardA-12)+c_speedA*lineselect);
    OnFwd(OUT_B,(speed_standardB-12)-c_speedB*lineselect);
}
sub turnning_proportion(int lineselect) // 急カーブの比例制御
{
    OnFwd(OUT_A,(speed_standardA-30)+t_speedA*lineselect);
    OnFwd(OUT_B,(speed_standardB-30)-t_speedB*lineselect);
}
  • 5段階の比例制御プログラムとライン選択

 「3つの比例制御プログラム」を用いて実際に5段階の比例制御プログラムを作成した。

5段階制御の説明

 この時、基準線から±10以上値が離れていた場合(画像の,鉢ァ法峙泪ーブの比例制御」を使用、基準線から±7以上値が離れていた場合(画像の△鉢ぁ法峩覆り道の比例制御」を使用、それ以下の場合(画像の)は前進の比例制御を使用するようにした。    また、linetrace_restriction(int )としたとき、,魯薀ぅ鵐肇譟璽垢垢襯薀ぅ鵑魃βΔ砲垢襪左側にするかを選択(右側→1、左側→-1)できることを表している。

 このサブルーチンは交差点にあたると停止するように制限されており、この性質からこのサブルーチン名は「制限」を表す「restriction」を用いた「linetrace_restriction」となっている。

 例)左側をライントレースする。  linetrace_restriction(-1);

sub linetrace_restriction(int lineselect) // ライントレース交差点識別(ライン選択)
{
    long t0=CurrentTick();
    while(CurrentTick()-t0<=corner_time){    
        if(sensor2<threshold-10){
            turnning_proportion(lineselect);
        }else if(sensor2<threshold-7){
            corner_proportion(lineselect);
            t0=CurrentTick();          
        }else if(sensor2<threshold+7){
            forward_proportion(lineselect);
            t0=CurrentTick();
        }else if(sensor2<threshold+10){
            corner_proportion(lineselect);
            t0=CurrentTick();
        }else{
            turnning_proportion(lineselect);
            t0=CurrentTick();
        } 
        Wait(10);    
    }
    Off(OUT_AB);
    PlaySound(SOUND_DOUBLE_BEEP);
}

 しかし、交差点にあたると停止する上のサブルーチン「linetrace_restriction」では走行することのできないコースができてしまった。それは「」のs字カーブである。これは、交差点識別時間が110と非常に短く設定されていることからも容易に想定できる結果であり、これに対応するために新たなサブルーチンが必要となった。

  • s字カーブに対応するために…

 新しくs字カーブ用に作成したサブルーチンは、指定した時間の間交差点認識の機能を停止するといった非常に簡単なものである。しかしこれにより、s字カーブでも安定して走行することに成功した。また、交差点時に次の動作へ移る際の動作をより確実なものにすることにも成功した(交差点識別にて詳しく説明)。

 このサブルーチンは、指定した時間の間ライントレースを続けるという部分以外は上のサブルーチン「linetrace_restriction」と全く同じものである。

 また、linetrace_release(int ,int )としたとき、,聾鮑硬声永未魏鮟する時間(交差点識別をしないプログラムを動作させる時間)を表し、△魯薀ぅ鵐肇譟璽垢垢襯薀ぅ鵑魃βΔ砲垢襪左側にするかを選択(右側→1、左側→-1)できることを表している。

 このサブルーチンは、指定した時間の間交差点の識別から解放するといったものであり、この性質からこのサブルーチン名は「解放」を表す「release」を用いた「linetrace_release」となっている。

 例)左側を10秒間ライントレース(ただし交差点識別は無し) linetrace_release(10000,-1);

 

sub linetrace_release(int timelimit,int lineselect) // ライントレース識別解除(時間制限,
ライン選択)
{
    long t0=CurrentTick();
    while(CurrentTick()-t0<=timelimit){
             if(sensor2<threshold-10){
            turnning_proportion(lineselect);
        }else if(sensor2<threshold-7){
            corner_proportion(lineselect);         
        }else if(sensor2<threshold+7){
            forward_proportion(lineselect);
        }else if(sensor2<threshold+10){ 
            corner_proportion(lineselect);
        }else{
            turnning_proportion(lineselect);
        } 
        Wait(10);    
    }
}

電池残量に左右されない交差点の通過

 ここでは「課題Α仝鮑硬生紊瞭虻遒鯏澱啝栂未砲茲辰栃儔修靴覆い茲Δ砲垢襦」と「課題ァ仝鮑硬整奮阿如屬海海聾鮑硬世澄廚噺軫Г靴覆い茲Δ淵廛蹈哀薀爐鮑鄒する。」の解決を目指す。

 今回は、交差点識別後に以下の3つの行動が必要となる。

  仝鮑硬声永霧紂∩或覆轡薀ぅ鵐肇譟璽垢魍始する。

 ◆仝鮑硬声永霧紂右折しライントレースを開始する。

  交差点識別後、左折しライントレースを開始する。

 この時、「指定された速度で指定された時間前進する」というようなプログラムを使用すると、電池の残量により移動距離が変化してしまい、安定した動作ができなくなってしまう。

 また、それにより黒線の中にセンサがある状態でライントレースを開始してしまった場合、交差点識別時間が非常に短く設定されていることから、その場所を交差点と誤認してしまう危険性がある。

 この問題を解決するために私たちのグループでは、光センサを使用し交差点の通過を行うようなプログラムを作成し、電池残量によらず安定し交差点を通過することに成功した。

 仝鮑硬声永霧紂∩或覆轡薀ぅ鵐肇譟璽垢魍始する。

交差点を前進通過する際のセンサの動き

交差点を識別→交差点で停止するかしないか→白い部分に出るまで前進(画像での 泡基準線に乗るまで回転(画像での◆

 以上のような流れで交差点を通過する。

 また、go_corner(int )としたとき、,聾鮑硬税Ъ瓜に1秒間停止するかしないかを選択できる(停止する→1、停止しない→0)ことを表している。

 例)交差点識別後、1秒間停止後、前進し交差点を通過する。 go_corner(1);

sub go_corner(int cornerselect) // wait→「1」 through→「0」
{
    Wait(corner_wait*cornerselect);  // 交差点で停止するかしないか
    while(sensor2<white-3){      // 白い部分に出るまで前進
        OnFwd(OUT_A,corner_standardA);
        OnFwd(OUT_B,corner_standardB);
    }
    Off(OUT_AB);
    Wait(500);             // 基準線に乗るまで回転
    while(sensor2>threshold){
        OnFwd(OUT_A,corner_standardA);
        OnRev(OUT_B,corner_standardB*0.5);
    }
    Off(OUT_AB);
    Wait(500);
}

◆仝鮑硬声永霧紂右折しライントレースを開始する。

交差点を右折通過する際のセンサの動き

交差点を識別→交差点で停止するかしないか→白い部分に出るまで右旋回(画像での 泡基準線に乗るまで左旋回(画像での◆泡右左ライン選択

 以上のような流れで交差点を右折する。

 また、turn_right(int ,int )としたとき、,聾鮑硬税Ъ瓜に1秒間停止するかしないかを選択できる(停止する→1、停止しない→0)ことを表し、△魯薀ぅ鵐肇譟璽垢垢襯薀ぅ鵑魃βΔ砲垢襪左側にするかを選択(右側→1、左側→-1)できることを表している。

 例)交差点識別後、停止せずに交差点を右折し右側のラインの端に乗る。

   turn_right(0,1);

sub turn_right(int cornerselect,int after_lineselect) // (交差点待機選択,通過後ライン選択)
{
    Wait(corner_wait*cornerselect);
    while(sensor2<white-3){
        OnRev(OUT_A,corner_standardA);
        OnFwd(OUT_B,corner_standardB);
    }
    Off(OUT_AB);
    Wait(500);
    while(sensor2>threshold){
        OnFwd(OUT_A,corner_standardA);
        OnRev(OUT_B,corner_standardB);
    }
    Off(OUT_AB);
    Wait(500);
    linetrace_release(afterselect_time,after_lineselect);
}

 交差点識別後、左折しライントレースを開始する。

 流れ、動作ともに、「◆仝鮑硬声永霧紂右折しライントレースを開始する。」の中の右折を左折に入れ変えただけのものであるため、説明は省略する。

sub turn_left(int cornerselect, int after_lineselect) // (交差点待機選択,通過後ライン選択)
{
    Wait(corner_wait*cornerselect);
    while(sensor2<white-3){
        OnFwd(OUT_A,corner_standardA);
        OnRev(OUT_B,corner_standardB);
    }
    Off(OUT_AB);
    Wait(500);
    while(sensor2>threshold){
        OnRev(OUT_A,corner_standardA);
        OnFwd(OUT_B,corner_standardB);
    }
    Off(OUT_AB);
    Wait(500);
    linetrace_release(afterselect_time,after_lineselect);
}

●交差点通過後ライン選択について(課題イ硫魴茵

 何度も述べているように、このプログラム上では交差点識別時間が非常に短く、黒線に対しての機体の進入角度が大きいと、そこを交差点であると誤認してしまう危険性が高くなってしまう。このことから、交差点を通過した後に、黒線に対する機体の進入角度を滑らかにするための仕組みが必要になってきた。そのために、私が考えたものがこの「交差点通過後ライン選択」である。

 交差点通過後ライン選択とは、交差点を通過した後に左右どちらのラインの端をライントレースしていくかを決めるものであり、このプログラムを入れることで、交差点の通過後の機体の角度に関係なく、正確にライントレースを開始することに成功した。

  • 交差点通過後ライン選択の仕方

 交差点通過後ライン選択では、「比例制御と5段階制御を組み合わせるために…」の「・s字カーブに対応するために…」で説明した「linetrace_release」を使用している。

 「linetrace_release」では指定した時間の間、交差点認識の機能を解除しライントレースを行うというものである。この機能は通常の「交差点識別ライントレース」のプログラムから、交差点識別の機能を抜いただけのものであるため、このプログラムを短時間機能させることで、黒線に対する機体の進入角度を強制的に滑らかにできるのではないかと考えた。

  • 結果

 結果は、それまで交差点を通過した後に交差点だと誤認することがほとんどだったのに対し、このプログラムを使用することで交差点通過後に交差点だと誤認することが無くなった。

コップを入手する

 第3コースではコップを入手しライントレースに復帰するために、Uターンが必要となる。

 今回、Uターンにおいても「電池残量に左右されない交差点の通過」同様に電池によって動作が変化しないように、できる限り光センサを用いた動作を基本として取り入れたプログラムを作成した。(「課題ぁ.灰奪廚瞭手とリリースの動作を電池残量に左右されないようにする。」の解決)

  • 動作の流れ

コップ入手後の流れ

コップを入手(画像での 泡基準線の乗るまで左へ曲がる(画像での◆泡少し前へ進む(画像での)→白い部分に出るまで左旋回(画像でのぁ泡基準線に乗るまで左旋回(画像でのァ

 以上のような、左回りの流れでUターンしていく。また、この時「少し前へ進む」という動作が入る理由としては、この動作がないと本来DC区間でセンサをラインに乗せる必要があるのだが、回り切れずにCF区間のラインにセンサが乗ってしまうためである。

sub get_cup() // コップの獲得
{
    OnRev(OUT_A,corner_standardA); // 機首をコップに向ける
    OnFwd(OUT_B,corner_standardB);
    Wait(corner_time+120);
    Off(OUT_AB);
    Wait(1000);
    catch // コップの獲得
    PlaySound(SOUND_UP);
    U_turn(); // Uターン
}
sub U_turn() // Uターン
{
    while(sensor2<threshold){ // 基準線の乗るまで左へ曲がる
        OnRev(OUT_A,corner_standardA);
        OnFwd(OUT_B,20);
    }
    Off(OUT_AB);
    Wait(500);
    linetrace_release(500,1); // 少し前へ進む
    while(sensor2<white-2){ // 白い部分に出るまで左旋回
        OnRev(OUT_A,corner_standardA);
        OnFwd(OUT_B,corner_standardB);
    }
    Off(OUT_AB);
    Wait(500);
    while(sensor2>threshold){ // 基準線に乗るまで左旋回
        OnRev(OUT_A,corner_standardA);
        OnFwd(OUT_B,corner_standardB);
    }
    Off(OUT_AB);
    Wait(500);
}

コップのリリース

 第三コースではX地点にコップを運搬し円の中にコップを配置することになっている。そのために必要になるプログラムは「いかにしてコップを円の中に置き、ライントレースに復帰するか」である。

また、この際も他のプログラムと同様に「電池残量に左右されない交差点の通過」同様に電池によって動作が変化しないように、できる限り光センサを用いた動作を基本として取り入れたプログラムを作成するように注意した。(「課題ぁ.灰奪廚瞭手とリリースの動作を電池残量に左右されないようにする。」の解決)

  • 動作の流れ

コップリリースの流れの簡略図

円の内側をたどりライントレース(時間制限)→白の部分に出るまで後ろへ下がりつつ右回転(画像での 

→黒のラインに完全に乗るまで後ろへ下がりつつ右回転(画像での◆泡指定時間前進→コップのリリース(画像でのぁ

→黒のラインに完全に乗るまで後退(画像でのァ泡白の部分に出るまで右回転→基準線に乗るまで右回転(画像でのΑ泡右左ライン選択

という流れでコップを置いている。

sub put_cup(int after_lineselect) // コップリリース(行動終了後ライン選択)
{
    while(sensor2<white-2){ // 白の部分に出るまで後ろへ下がりつつ右回転
        OnRev(OUT_A,corner_standardA);
    }
    Off(OUT_B);
    Wait(250);
    while(sensor2>threshold-10){ // 黒のラインに完全に乗るまで後ろへ下がりつつ右回転
        OnRev(OUT_A,corner_standardA);
    }
    Off(OUT_AB); 
    Wait(250);
    OnFwd(OUT_A,30); // 指定時間前進
    OnFwd(OUT_B,30);
    Wait(500);
    Off(OUT_AB);
    Wait(500);
    release // コップのリリース
    PlaySound(SOUND_DOWN);
    while(sensor2>threshold-10){ // 黒のラインに完全に乗るまで後退
        OnRev(OUT_A,30);
        OnRev(OUT_B,30);
    }
    Off(OUT_AB);
     while(sensor2<white-2){ // 白の部分に出るまで右回転
        OnFwd(OUT_A,corner_standardA);
    }
    Off(OUT_B);
    Wait(250);
    while(sensor2>threshold){ // 基準線に乗るまで右回転
        OnFwd(OUT_A,corner_standardA);
    }
    Off(OUT_AB);
    linetrace_release(afterselect_time,after_lineselect); // 右左ライン選択
}

第三コース攻略

コースの区画分け

コース5分割の色分け

 今回、プログラミングをより訂正のしやすく、より見やすくするために以下のように第三コースを5分割して考えた。

 ‖1ステージ(A→D→C→D) ポイント「コップの取得とUターン」

◆‖2ステージ(D→C→F) ポイント「F交差点の直進」

 第3ステージ(F→E→R) ポイント「FE区間のs字カーブ」

ぁ‖4ステージ(R→P→Q) ポイント「コップのリリース」

ァ〆能ステージ(Q→S→F→C→D) ポイント「4連続の直角カーブ」

 それぞれのステージでの難点とそれに対する解決策を見ていこうと思う。

 ‖1ステージ(A→D→C→D)

  • A→D 難点:A→B→C→Dのようにたどると、合計2つもの交差点がありプログラミングが非常に長くなってしまう。

 解決策:ラインの右側でなく左側をたどることで、A→Dまで一度でたどり着くことができ、プログラミングの量も抑えることができる。

  • D 難点:コップの取得とUターン

 解決策:電池残量で動作に影響を及ぼさないようなプログラミングを作成。また、アームの改良によりコップの取得成功率を上昇させた。

sub the_first() // 第1ステージ コップの取得「A→D→C→D」
{
    linetrace_restriction(-1); // A→D
    get_cup(); // コップの獲得
}

◆‖2ステージ(D→C→F)

  • C 難点:DC区間の短さによるUターンの失敗

 解決策:Uターンプログラムの改良(「少しの前進」を加える)

  • F 難点:交差点直進後の動作の停止

 解決策:原因はわからなかったが、おそらく電池の消耗により20といった速度ではモーターが回転することができなかったためと考えられる。そのため、交差点通過時の速度を大きくすることで、動作の停止を抑えた。

sub the_second() // 第2ステージ コップの運搬「D→C→F」
{
    linetrace_restriction(-1);
    turn_left(0,1); // C
    linetrace_restriction(1);
    go_corner(1); // F 
}

 第3ステージ(F→E→R)

  • F→E 難点:s字カーブでの交差点誤認識

 解決策:「linetrace_release」を作成することで、指定した時間分交差点認識を解除した状態で走行することが可能となったため、s字カーブを曲がることが可能になった。またこの時の時間を15秒と設定しているが、これは何回かテスト走行させ決めた値である。

  • E 難点:E左折後に毎回発生する交差点誤認識

 解決策:「linetrace_release」を用いた行動終了後ライン選択機能の追加により、交差点の誤認を抑えることに成功した。

sub the_third() // 第3ステージ コップの運搬「F→E→R」
{
    PlaySound(SOUND_CLICK); 
    linetrace_release(15000,1); // F→E途中地点
    PlaySound(SOUND_LOW_BEEP);
    linetrace_restriction(1); // E途中地点→E
    turn_right(0,1); // E
    linetrace_restriction(1);
    OnFwd(OUT_AB,-30); // F
    Wait(50);
    Off(OUT_AB);
    turn_left(1,1);
}

ぁ‖4ステージ(R→P→Q)

  • P 難点:Pの交差点での交差点識別機能の未反応

 解決策:R→P→Qと円の外を回るのではなく、R→Qと円の内側をライントレースさせることで、P地点の通過に成功した。なお、PQ区間でのコップのリリースに関しては「linetrace_release」の時間制限の機能を用い、だいたいPQ区間内にいるであろう時間を指定してコップをリリースしている。

  • P→Q 難点:コップのリリース

 解決策:電池残量で動作に影響を及ぼさないようなプログラミングを作成することで、コップのリリースの成功率を高めることに成功した。

sub the_fourth() // 第4ステージ コップの配置「R→P→Q」
{
    PlaySound(SOUND_CLICK);
    linetrace_release(5000,1); // R→コップ配置場所
    Off(OUT_AB);
    PlaySound(SOUND_LOW_BEEP);
    Wait(500);
    put_cup(-1); // コップの配置
    linetrace_restriction(-1); // コップ配置場所→Q
}

ァ〆能ステージ(Q→S→F→C→D)

  • Q,S,F,C 難点:交差点の右折左折後に頻繁に発生する交差点誤認識

 解決策:第3ステージと同様に、「linetrace_release」を用いた行動終了後ライン選択機能の追加により、交差点の誤認を抑えることに成功した。

sub the_fifth() // 最終ステージ ゴール地点への移動「Q→S→F→C→D」
{
    turn_left(0,-1); // Q
    linetrace_restriction(-1);
    turn_right(1,1); // S
    linetrace_restriction(1);
    turn_left(1,-1); // F
    linetrace_restriction(-1);
    turn_right(1,1); // C 
    linetrace_release(500,1);
    finish // D ゴール
}

task main()第三コース攻略

 上記の区画分け(第1〜最終ステージ)までを合わせたものが、今回本番で使用されたプログラミングとなる。

task main()
{
    SetSensorLight(S2);
    the_first();
    the_second();
    the_third();
    the_fourth();
    the_fifth();
} 

まとめ

 今回は、より安定した、より正確なライントレースを目指してロボット、プログラミングの作成を行った。結果本番では、見事課題をクリアすることができたのであるが、もう一人の第3コースを担当している方に速さで負けてしまったということが非常に悔しかった。

 そのため、私は今回の課題で「速く、正確に」の重要性を知ることができた。いくら正確に仕事をこなすことができても、速くなければ意味はなく、逆も同じになってしまう。

 今回、プログラミングが完成したのが本番ぎりぎりであったため、速度にまで手を出すことができなったが、今後は正確さと速さの両方を備えたロボットを作成していきたいと考えている。


添付ファイル: filerobo_map6.jpg 51件 [詳細] filerobo_map5.jpg 51件 [詳細] filerobo_map4.jpg 109件 [詳細] filerob_mission2.png 57件 [詳細] filerobo_map3.png 64件 [詳細] filerobo_map2.png 46件 [詳細] filerobo1.jpg 50件 [詳細] filerobo1_sisaku1.2.jpg 47件 [詳細] filerobo1_sisaku1.1.jpg 48件 [詳細] filerobo1_sisaku2.jpg 60件 [詳細] filerobo_line1.png 84件 [詳細]

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