[[2014a/MemberOnly/進行状況]]
目次
#contents
*メンバー紹介 [#zc529555]
須賀健太(sugaken)
坂川航平(sakar)
松本善和(yokkun)

* 課題の説明 [#a26960c6]
図のようなコースを各自で作成した上で、次のような動作をするロボットを作成せよ。 (下の図において、黒い線の太さは20mmで、線の中央までの距離がcm表示されている)。

1.スタート地点から出発し、黒い線をトレースしていく。

2.一つ目の十字の交差点と二つめの十字の交差点の間に置かれたピンポン玉をつかむ。

3.さらに黒線をトレースしていきゴール地点を目指す。

4.ゴールに向けてピンポン玉をシュートする。

ただしT字路では、直進、右折、左折を正しく判断させること。また二人または三人一組で同じロボットを使用し、ロボット本体は共通のものを使うとする。

&ref(2014a/Member/sugaken/Mission1/2014a-mission1.png);


* ロボット本体 [#xf1a24b1]
&ref(2014a/Member/sugaken/Mission1/IMG_0345[1].JPG,30%);
** ドライブベース [#ucd7af01]
私たちが使用したドライブベースは、八の字のライントレースをしたときに使った4輪の基本的な形のドライブベースです。アームを取り付けることが初期のままだと困難だったので、光センサーを本体に近づけて設置しました。本体に近づけたことでトレースの誤差を小さくできているとおもいます
** アーム [#afe90714]
はじめはモーターを一つ追加して前後に動く力をアームの上げ下げに利用してかごのような物を上からかぶせるような構造にしていましたが、アームがどうこうの前にライントレースをすることがうまくできていなかったのでとりあえず先にライントレースができるようにプログラムを考えていたらアームを自動で動かすような構造を考える時間がなくなってしまい、アームはとりあえずクワガタの角のようなものを取り付けたものになってしまいました。
* プログラム [#af3f957e]
黒線上を直進するようにしました、そのことでだいぶプログラムを短くすることができたと思います。また、スタートからシュートをする位置までの時間をあらかじめはかっておいてタイマーにセットしておき時間になったらシュート動作に入るようなプログラムにしました。なので交差点と直角カーブ判断の仕方は、交差点はただの直線のように進み、直角カーブは光センサーが白いところにはみ出たら左右に黒線を探しにいって進んでいくというようにしています。

 #define BLACK 40  //閾値
 #define turn_right OnFwd(OUT_A);OnRev(OUT_C);  //右折
 #define turn_left OnFwd(OUT_C);OnRev(OUT_A);  //左折
 #define search_time 50  //右回りに回ってラインを探す。
 #define MOVE_TIME 2000  //スタートからシュートする場所までにかかる時間。

**ライントレースのプログラム [#hf793647]
黒線上を直進するようにすることで、交差点を通過することができた。カーブや直角カーブは光センサーが黒線からはみ出たらまず右に旋回して黒線を探しに行き、ある程度探してなっかたら左に旋回して探しに行くプログラムにしました。
 task main()
 {
    if (SENSOR_1 < BLACK) {
    OnFwd(OUT_AC);}  //黒線上なら直進
    else if (SENSOR_1 > BLACK) {
    turn_right;  //白のところになったら、右に回って黒線を探す。
  ClearTimer(0);
    while (FastTimer(0) <= search_time){  //ある程度右回りに探してなかったら止まる。  
    if (SENSOR_1 < BLACK) {
    Wait(15);
    Off(OUT_AC);
   }
 }
    turn_left;
    until (SENSOR_1 < BLACK);  //右回りして見つからなかったら、左回りをして黒線を探す。
    Float(OUT_AC);}

**シュートをするプログラム [#z502e9a0]
スタートからシュート位置までの時間を計っておき、時間が来たらラインを無視して直進したのちに急停車した勢いでピンポン玉をシュートするプログラムにしました。

  ClearTimer(1);
   while (FastTimer(1) <= MOVE_TIME) {  //シュート位置までの時間を測っておいて時間がきた
   OnFwd(OUT_AC);              ら直進後に停車した勢いでシュートする。 
   Wait(200);
   Off(OUT_AC);}
 }
* まとめ  [#t95da382]
 黒線の上を直進させるようにすることで、プログラムをかなり短くすることができた。しかし、まだまだ閾値の設定がうまく行かずライントレースが必ず成功するわけでわない、そのためスタートからシュート位置につくまでの時間が定まらずスタートからシュートを決めるまで行く事がなかなかできなかったし、最初に考えていた自動アームもできなかった。
 ロボット本体としての失敗点ははタイヤどうしの距離が離れていたために小回りがきかなっかったことやアームをあまり考えもせずに作ってしまったことだと思うのでドライブベースをタイヤどうしの距離を近づけたものにして、アームはもっと時間をかけて考えて納得のいくものを作っていきたいと思います。
 プログラム上の失敗としては、ライントレースのプログラムとシュートをするプログラムの二つが同時に動作していてシュートする時間になってもライントレースするプログラムが実行されていたことが失敗の原因だと思いました。それを改善するには、ライントレースするタスクとシュートをするタスクの二つに分けてプログラムを作ってさらに、タスクに優先順位をつけることでこの失敗は解決できたのではないかと思います。
 今回の課題は期限までに完璧に仕上げることができなっかので次回の課題はより成功率が高くなるようなプログラムやロボットをつくっていきたい。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS