今回の課題

ピンポン玉と紙コップを別々に回収して所定の場所に運ぶ。 http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&page=2017b%2FMission3&src=2017b-mission3.png

マップ解説

図のマジェンタの円に逆さまにした紙コップを置き、その中にピンポン玉を2つずつ入れておく。

図の黄色い円に紙コップを通常の向きに置き、障害物とする。直径6cmの円の外周をペンまたは鉛筆でマークしておく。

紙コップには色をつけたり文字や記号を書いてもよい。

割り箸を使って一辺が14cmの正方形を作り、X地点を中心とした円に接するように置く。

ルール

競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。

◦図のA地点または(および)D地点からスタートする。ただし接地している部分はそれぞれの領域内

に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。

◦ピンポン玉をX地点に運び、割り箸で正方形に囲まれた領域に入れる。

◦紙コップをY地点がある黒線に囲まれた領域に運ぶ。

◦開始の合図から5秒以内にスタートボタンを押す作業を完了すること。

◦競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。

◦途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。

ロボットの説明

RIS1台ではモーターを3つまでしか動かせないので、2つのRISを一体化させた。しかし、通信機能が使えるのせ方ができなかったため、別々の動きをさせた。

車体部分

1.jpg 2.jpg

基本的にはライントレースのロボットである。センサー位置が固定されてしまい、数値を合わせるのに苦労した。アーム部分が重いためRISを後ろにつけて重心を安定させた。

アーム部分

3.jpg 4.jpg 5.jpg

アームを上げ下げするために棒を上下から押すしくみを作った。アームの中間部分にタイヤをつけることでコップをちゃんとつかめるようにした。しかし、軽さを求めたために車体との接続部分が弱くなってしまい、本番ではアーム部分が外れてしまった。

プログラム

アームを上げ下げするためのRISのプログラム

#define up(t) OnRev(OUT_A);Wait(t);Off(OUT_A);//アームを上げる
#define down(t) OnFwd(OUT_A);Wait(t);Off(OUT_A);//アームを下げる
task main () 
{
 Wait(870);//一つ目のコップに着くまでまで待つ
 up(30);//アームを上げる
 Wait(200);//円Xに着くまで待つ
 down(30);//アームを下す
}

マップ上を移動するためのRISのプログラム

#define leftSENKAI OnFwd(OUT_A);OnRev(OUT_C); //左旋回
#define leftMAGARU OnFwd(OUT_A);Off(OUT_C); //左折
#define rightSENKAI OnFwd(OUT_C);OnRev(OUT_A); //右旋回
#define rightMAGARU OnFwd(OUT_C);Off(OUT_A); //右折
#define ch OnFwd(OUT_B);Wait(30);Off(OUT_B); //アームを閉じる
#define re OnRev(OUT_B);Wait(20);Off(OUT_B); //アームを開く
#define go(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC); //t秒前進
#define back(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC); //t秒後退
#define cross_stop Off(OUT_AC);Wait(100); //1秒止まる
#define carb 46 //閾値

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

 sub r()
{
   SetSensor(SENSOR_2,SENSOR_LIGHT); //光センサを2にセット
   ClearTimer(0);
   while(FastTimer(0)<=20)  //0.2秒より小さければ以下をループ、それ以上で交差点と判断。
  {
     if(SENSOR_2>middle+5)      //閾値より大きい時左旋回 
  {
     leftSENKAI
     ClearTimer(0);
  }
    else if(SENSOR_2>middle+3)    //閾値より少し大きい時左折
  {
     leftMAGARU
     ClearTimer(0);
  }
    else if(SENSOR_2>middle)    //閾値の時直進
  {
     OnFwd(OUT_AC);
     ClearTimer(0);
  }
    else if(SENSOR_2>middle-3)    //閾値より少し小さい時右折
  {
    rightMAGARU
    ClearTimer(0);
  }
    else    
  {
    rightSENKAI         //閾値より小さい時右旋回
   }
 }
    Off(OUT_AC);         //0.2秒以上の時停止
}
task main ()
{
   go(30); //A地点の枠から出る
   r(); //A〜Bライントレース
   leftSENKAI;
   Wait(5); //左旋回して位置調整
   re; //アームを開く
   go(160); //直線ABの延長上にあるコップに近づく
   cross_stop; //一時停止
   ch; //アームを閉じコップをつかむ
   rightSENKAI;
   Wait(140); //右旋回して位置調整
   cross_stop; //一時停止
   ch; //コップを離さないように再びアームを閉じる
   go(90); //X地点に近づく
   cross_stop; //一時停止
   re; //アームを開きX地点にコップを置く
   back(100); //後退して位置調整
   leftSENKAI;
   Wait(30); //左旋回して位置調整
   go(200); //前進して位置調整
   rightSENKAI;
   Wait(40); //右旋回して障害物に当たらないようにする
   re; //アームを開く
   go(250); //交差点Qの上にあるコップを本体で押しながらY地点に向かう
}

結果と反省

ロボット制作に多くの時間を費やしたが、アームの重さにモーターが耐えられなかったりRISがうまく乗らなかったりという問題を解決できず、今回の形になった。時間が足りず、プログラムも途中までしか書けなかった。もっと調整できればうまくいったかもしれない。


添付ファイル: file5.jpg 59件 [詳細] file4.jpg 46件 [詳細] file3.jpg 50件 [詳細] file2.jpg 54件 [詳細] file1.jpg 45件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-02-11 (日) 18:28:58