[[2012b/Member]]
#contents
*メンバー紹介 [#ua5aa52d]
-KARINA:現場監督
-tada0:変態
-mokomiti:変態
-shief:変態

*課題の内容 [#s133236e]
紙パックを所定の位置から所定の位置に運搬する。

**フィールドの説明 [#p5a6a870]
-フィールドは課題1で使用した紙を2枚つなぎ合わせる (向きは自由)
-白い紙パックと黒い紙パックがそれぞれ3個づつ対角のゴール(課題1のゴール)に置かれている (前1個、後2個の2列に配置する)
-2枚の紙のつなぎ目に断面が約3cm×4cmの角材を両面テープまたは押しピンで貼り付ける。
-黒い線の幅は20mmとする


**基本ルール [#rfe15230]
-白い紙パックと黒い紙パックを入れ替える。
-競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。
-課題1のスタート地点からスタートする。
-スタート時のロボットは2個を越えないこと (スタート後はいくつに分裂してもかまわない)。
-開始の合図から5秒以内にスタートボタンを押す作業を完了すること。
-競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
-途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。
-最終的にゴールに運び込まれた紙パックの数で点数を計算する。

**基本得点の計算方法 [#bb4c95a9]

-運びこまれた紙パックに1個つき3点5点。ただし、紙パックを2段または3段に積み上げた場合は、2段目の紙パックを6点、3段目の紙パックを9点とする。
-紙パックが半分以上ゴールからはみ出している場合は、1個2点1点、はみ出している部分が半分未満の場合は1個2点3点とする
-一部がゴールの外にはみ出た出た紙パックの上に積み上げられた紙パックは、何段目であっても各3点とする。

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

-紙パックまでたどり着く動作 (3点)
-紙パックを運ぶ動作(2点)
-障害物を越える動作 (4点)
-2台以上のロボット、あるいは単体のロボットの場合は2台のRCX,NXTの連携の良さ(3点)
-自立型のロボットとしての形や動作の美しさ、斬新さ(3点)
-その他 (4点)

2012年度後期ロボコンのページより引用

*ロボットの説明 [#u379c6e0]
これが私たちの作ったロボットです。

&ref(2012b/Member/tada0/Mission2/robo1.jpg,100%,画像の説明);
&ref(2012b/Member/tada0/Mission2/robo2.jpg,100%,画像の説明);
&ref(2012b/Member/tada0/Mission2/robo3.jpg,100%,画像の説明);

アームの動作は開閉だけですが、以下のようにして角材の障壁を超えます。

&ref(2012b/Member/tada0/Mission2/arm1.png,100%,画像の説明);
&ref(2012b/Member/tada0/Mission2/arm2.png,100%,画像の説明);

パックを引き抜く際にある程度の力をかけ続ける必要があるため、ギアが空回りしないようアーム周りを強化するのに苦労しました。

タッチセンサーはロボットの機体と角材の向きが垂直になるようにするため2つ使用しています。
#ref(2012b/Member/tada0/Mission2/robo4.jpg,100%,画像の説明);
アームが通信の邪魔になったため通信部分は後ろにつけました。(通信機能は使いませんでした)

*プログラムの説明 [#rb936de1]
私たちはフィールドを下図のように設置したため、ロボットのプログラムのほとんどを共有することができました。それぞれのプログラムで異なった点といえば、モーターや光センサーの個体差による稼働時間や値の変更だけでした。よってここではプログラムの片方を紹介したいと思います。
#ref(2012b/Member/tada0/Mission2/robo_c_1.png,100%,画像の説明);
プログラムの内容は大きく分けて8つに分かれています。また目標を1セットのパックの交換としています。

1:目標のパックのある位置まで移動

2:パックをつかむ

3:180度回転し向かいのラインのある位置まで移動

4:パックの受け渡し場所まで移動

5:パックをはなす

6:パックの受け取り場所まで移動

7:パックをつかみ角材の向こうから引き抜く&向きを修正する

8:ゴール地点までパックを運ぶ

&ref(2012b/Member/tada0/Mission2/robo_c_3.png,100%,画像の説明);
&ref(2012b/Member/tada0/Mission2/robo_c_4.png,100%,画像の説明);

図はロボットの大まかな動きを表しています。(ラインの塗りつぶしはライントレースを意味しています)

また、使用したプログラムは以下の通りとなっています。
ライントレース関連のプログラムについては前回を参照してください。

 #define ikichi 39
 #define HIPOWER 7
 #define LOWPOWER 2
 #define set_power_H SetPower(OUT_AC,HIPOWER);
 #define set_power_L SetPower(OUT_AC,LOWPOWER);
 #define set_power_H_2 SetPower(OUT_B,LOWPOWER);
 #define go set_power_H;OnFwd(OUT_AC);
 #define t_l_hp set_power_L;OnRev(OUT_A);OnFwd(OUT_C);
 #define t_l_lp set_power_L;Off(OUT_A);OnFwd(OUT_C);
 #define t_r_hp set_power_L;OnFwd(OUT_A);OnRev(OUT_C);
 #define t_r_lp set_power_L;OnFwd(OUT_A);Off(OUT_C);
 #define step 1
 #define t_l_90 OnRev(OUT_A);OnFwd(OUT_C);Wait(90);
 #define t_r_90 OnRev(OUT_C);OnFwd(OUT_A);Wait(90);
 #define p_1 PlaySound(SOUND_CLICK);
 #define p_2 PlaySound(SOUND_UP);
 #define set_b_lp SetPower(OUT_B,LOWPOWER);
 #define set_b_hp SetPower(OUT_B,HIPOWER);
  int n=0;
 task main()
 {
 SetSensor(SENSOR_2,SENSOR_LIGHT);
 SetSensor(SENSOR_1,SENSOR_TOUCH);
 SetSensor(SENSOR_3,SENSOR_TOUCH);
 OnFwd(OUT_AC);
 Wait(200);
 until(SENSOR_2<=ikichi-2);
 ClearTimer(0);
 while(FastTimer(0)<450){
    if (SENSOR_2 < ikichi -5){t_l_hp}
    else if (SENSOR_2 < ikichi -2){t_l_lp}
    else if (SENSOR_2 < ikichi +2){go}
    else if (SENSOR_2 < ikichi +5){t_r_lp}
    else {t_r_hp}
    Wait(step);
 }
    //1:ラインの左側をトレース&直角だと次へ//
 do{
    if (SENSOR_2 < ikichi -5){t_l_hp;n +=1;p_1;}
    else if (SENSOR_2 < ikichi -2){t_l_lp;int n=0;}
    else if (SENSOR_2 < ikichi +2){go;int n=0;}
    else if (SENSOR_2 < ikichi +5){t_r_lp;int n=0;}
    else {t_r_hp;int n=0;}
    Wait(step);
 }while(n<3);
 p_2;
 n=0;
    //2:紙パックを探しだし掴む//
 Off(OUT_AC);
 t_r_hp;
 Wait(15);
 Off(OUT_AC);
 Wait(100);
 set_b_lp;
 OnFwd(OUT_B);
 Wait(100);
 Off(OUT_B);
    //3:180度回転&前身後線の上でとまる//
 OnRev(OUT_AC);
 Wait(30);
 t_r_hp;
 Wait(190);
 OnFwd(OUT_AC);
 Wait(100);
 until(SENSOR_2 < ikichi -5);
 Off(OUT_AC);
 Wait(100);
    //この点を基準に行動//
 ClearTimer(2);
    //4:一定時間内ラインの左側をトレース//
 while(FastTimer(2)<100){
    if (SENSOR_2 < ikichi -5){t_l_hp}
    else if (SENSOR_2 < ikichi -2){t_l_lp}
    else if (SENSOR_2 < ikichi +2){go}
    else if (SENSOR_2 < ikichi +5){t_r_lp}
    else {t_r_hp}
    Wait(step);
 }
    //4:ラインの左側をトレース&タッチセンサーで判断//
 do{
    if ((SENSOR_1==1)&&(SENSOR_3==1)){n +=5;}
    else if (SENSOR_2 <= ikichi -5){t_l_hp;int n=0;p_1;}
    else if (SENSOR_2 <= ikichi -2){t_l_lp;int n=0;}
    else if (SENSOR_2 <= ikichi +2){go;int n=0;}
    else if (SENSOR_2 <= ikichi +5){t_r_lp;int n=0;}
    else {t_r_hp;int n=0;}
    Wait(step);
 }while(n<3);
 Off(OUT_ABC);
 Wait(100);
    //5:パックを離す//
 OnRev(OUT_B);
 Wait(80);
 Off(OUT_B);
    //6:パックの引き抜き場所へ//
 OnRev(OUT_AC);
 Wait(100);
 Off(OUT_AC);
 t_l_hp;
 Wait(70);
 OnFwd(OUT_AC);
 Wait(175);
 t_r_hp;
 Wait(70);
 OnFwd(OUT_AC);
 until((SENSOR_1==1)||(SENSOR_3==1));
 Off(OUT_AC);
    //7:パックの引き抜き//
 set_power_H_2;
 OnFwd(OUT_B);
 Wait(80);
 OnRev(OUT_AC);
 Wait(200);
 Off(OUT_C);
 OnRev(OUT_A);
 Wait(150);
 Off(OUT_A);    
    //8:ラインを探す//
 OnFwd(OUT_AC);
 until(SENSOR_2<=ikichi-2);
 Off(OUT_AC);
 OnFwd(OUT_AC);
 Wait(20);
 Off(OUT_AC);
 }

*まとめ・感想 [#gb158836]
難しかったです。どうやって角材の向こう側からパックを運んでくるか、どうやってその動きを効率よくプログラムで表すことができるのか、構想の段階でかなり多くの時間を使ってしまいました。また、6つのパックの入れ替えを目標とすると本体のメモリー不足に悩まされました。結果として目標を1セットのパックの入れ替えとしましたが、成功したため良かったと思ってます。余談ですが、新型機はライントレースをあまり利用せずきちんと動くことに驚きました。あれはずるいです。

ちなみにこれが6つのパックの入れ替えを目標としたプログラムの構想です

パック黒�,�Aまで持っていく。
パック黒�△魄唾錬欧泙濃�っていく。
パック黒��を安地1まで持っていく。
Gで通信をする。

Kからパック白�,鮖�ってくる。
パック白�,鬟僖奪�黒��のあった場所に置く。
パック黒�△魄唾孱欧�らAまで持っていく。
Gで通信をする。

Kからパック白�△鮖�ってくる。
パック白�△鬟僖奪�黒�△里△辰疹貊蠅肪屬�。
パック黒��を安置1からAまで持っていく。
Gで通信をする。

Kからパック白��を持ってくる。
パック白��をパック黒�,里△辰疹貊蠅肪屬�。
すべての動作が完了


#ref(2012b/Member/tada0/Mission2/robocon2012b.png,100%,画像の説明);
#ref(2012b/Member/tada0/Mission2/robocon2012b.png,60%,画像の説明);

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS