[[2019a/Member]]
目次
#contents
*課題3 [#pae9cfc7]
-赤と青のボールを運搬し、所定の容器の中に入れる。


**フィールドの説明 [#jae1939e]
-フィールドは課題2で使用した紙を使用する。
-生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方に玉を2個入れる。
-残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤやプレートの上に置いてもよい。
-プラ容器には色をつけたり文字や記号を書いてもよい。
-プラ容器は両面テープ等でフィールドに固定してもよい。
-2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよい。

#ref(ruuto3.png)

**基本ルール [#y68f3f41]
-競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。
-図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域-内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。
-開始の合図から5秒以内にスタートボタンを押す作業を完了すること。
-競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
-途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。
-競技終了後、ロボットが、ゴールのプラ容器に触れていてはいけない。
-競技終了後、もともと玉が入っていたプラ容器が、のプラ容器に触れていてはいけない。

**基本得点の計算方法 [#n44bde02]
-プラ容器内の玉を1個運べば8点。二つとも運べば20点。
-地点とL'地点の玉をどちらか1個運べば4点、2個とも運べば12点。
-競技終了後、ゴールのプラ容器が完全に円から出しまった場合、もとの基本点の1/4を減点。
-競技終了後、ゴールのプラ容器の半分以上が円から出ていれば、もとの基本点の3/4を減点。
-競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。
-競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。
-競技終了後、ゴールのプラ容器にロボットが触れていれば、もとの基本点の1/4を減点。
-技術点の計算方法
-以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチ-ム(5チーム)が20点満点で採点し、その平均点を求める。

-得点の目安:
**得点の目安: [#r4fe0d10]
--玉を探し取りにいくまでの動作 (3点)
--玉を掴む動作 (3点)
--玉をを運ぶ動作 (2点)
--玉を容器の中に入れる動作 (2点)
--2台のRIS、NXT、EV3の連携の良さ(2点)
--自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
--その他 (3点)

*作戦 [#fa46dfb5]
**ルート [#q3d32318]
自分たちは容器内のボールで点数を獲得しようとした。そのためにまず容器ごと掴み、ボールをロボット内に回収、そして移動してボールを別の容器に入れるという作戦を考えた。ロボットを動かすルートは以下のようにした。
#ref(ruuto.png)

**ロボットの説明 [#y4d65ed4]
比較的大型のロボットであるので多少カーブが苦手になるが四輪の二輪駆動の車体である。前輪の少し前にライントレースように光センサーをつけている。
#ref(image1.jpeg)
まず、手前にあるアームの開いた部分で容器をつかめるようになっている。容器をつかんだままアームを持ち上げ、アームをレールにしてボールを転がし車体にボールを回収する。
#ref(image5a.jpg)
ここで問題となったことはアームが重く簡単に持ち上がらないということだ。そこでギアをモーターとアームの間に挟み少ない力で重いものを動かせるように改良した。下の画像がそのギアの部分である。
#ref(image2.jpeg)
最後に集めたボールを少ない手間で別の容器に移すため、ボールを回収する部分の底を斜めにすることで蓋を開けるだけで勝手に転がるようになっている。また、ボールを回収したケースの出口の高さは所定の容器の高さより高くなっているのでボールを移しやすくなっている。
#ref(image4a.jpg)
*プログラム [#l451e791]
マスター側にラインセンサーと車輪のためのモーター2つ、スレーブ側にアーム用のモーター3つをつけている。主にマスター側で移動を担当し、スレーブ側でアームの動作の役割分担を行っている。

このメリットとしてアーム動作と車体移動を明確に分けることができ、移動中にアームが動いてしまうといった誤作動を防止してくれる。
**マクロ [#tcfdf134]
***マスター側(マクロ) [#h7caa456]
 #define CONN 1
 #define on1 1
 #define on2 2
 #define on3 3
 
 #define zenshin OnFwd(OUT_BC,60); //前進
 #define koushin OnFwd(OUT_BC,-60); //後進
 #define migi OnFwd(OUT_B,-70);OnFwd(OUT_C,40); //右回転 
 #define hidari OnFwd(OUT_B,40);OnFwd(OUT_C,-70); //左回転
 #define mi OnFwd(OUT_C,40);Off(OUT_B);//右に進む
 #define hi OnFwd(OUT_B,40);Off(OUT_C); //左に進む
 #define tomaru Off(OUT_BC); //ストップ
 long A=0;//コーナーで止まる時間を計測する変数
 long B=0;//ライントレースしている時間を計測する変数

***スレーブ側(マクロ) [#j77a0f02]
 #define on1 1
 #define on2 2
 #define on3 3
 
 #define tomaru Off(OUT_AB);Wait(100);//ストップ
**サブルーチン [#q86bcd04]

 void re_stop_corner(){
    SetSensorLight(S1);
    while(A<400){//角のタイマーが400になると繰り返し終わり
        if(SENSOR_1>40){
            hi;//白の時左へ
            A=0;//角のタイマーをリセット         
            B=B+1;ライントレース時間追加
                       }else{
                                mi;//黒の時右へ
                                A=A+1;//角のタイマーに1追加
                                B=B+1;
                               
                                 }
                   }
    tomaru;//停止
    Wait(1000);
    B=0;
                   }//コーナーで止まるライントレース(ラインの右側を進む)




 void re_cross_line(){
    SetSensorLight(S1);
 
        if(SENSOR_1>40){
            hi;//白の時左へ
            B=B+1;
                       }else{
                                mi;//黒の時右へ
                                B=B+1;
                                 }
                           }//コーナーを直進するライントレース(ラインの右側を進む)
**メインプログラム [#sfbeb843]
***マスター側(メイン) [#fa98ff6e]
 task main()
 {
   SetSensorLight(S1);
 
 
 while(B<8000){//ライントレースをしている時間をはかるタイマーが8000未満の時
        re_cross_line();//ライントレース、交差点渡る
                    }
 
    while(B>=8000){//8000以上の時
        re_stop_corner();
                     }//ライントレース、交差点止まる

   tomaru;
     Wait(500);
   koushin;
    Wait(1600);
   mi;
     Wait(300);
   zenshin;
    Wait(1300);  
   migi;
    Wait(1300);
   tomaru;
    Wait(100);
   koushin;
    Wait(300);
   tomaru;
    Wait(100);
   zenshin;
    Wait(300);
   tomaru;
     Wait(100);//容器をつかむ位置に移動するための動作

(アームが移動中に容器に当たらないようアームは上に上げた状態でスタートする)

 SendRemoteNumber(CONN,MAILBOX1,on2);//スレーブにアームを下げる指示を出す
  Wait(18000);

   zenshin;//容器の前まで移動
    Wait(300);
    tomaru;
     Wait(100);

   SendRemoteNumber(CONN,MAILBOX1,on1); //容器をつかむ、アームをあげる(ここでボールが転がり回収部分に回収)、アームを下げる動作の指示
    Wait(30000);

 OnFwd(OUT_B,50);OnFwd(OUT_C,-80); 
      Wait(400);
    tomaru;
     Wait(100);
    koushin;
       Wait(1500); 
    tomaru;
     Wait(100);//空の容器に回収部分のボール出口が来るように移動

    SendRemoteNumber(CONN,MAILBOX1,on3);//ボールを止めていた蓋をあげて、ボールを空の容器に移す
     Wait(1000);

  tomaru;
   Wait(100);
 }

***スレーブ側(メイン) [#k32b6765]

 task main()
 {
  int msg1;
  int msg2;
 
   while(1){
       ReceiveRemoteNumber(MAILBOX1,true,msg1);
       if(msg1==on1){
           OnFwd(OUT_B,50);
           Wait(1500);//容器をつかむ
           tomaru;
           OnFwd(OUT_A,-100);アームをあげる
           Wait(20000);//
    
           OnFwd(OUT_A,100);
           Wait(20000);//アームを下げる
           tomaru;
           OnFwd(OUT_B,-50);
           Wait(1500);//容器を放す
           tomaru;
    
           msg1=100;//msg1に1,2,3以外の値を代入し、ifの外へ
    }
   
    if(msg1==on3){
        OnFwd(OUT_C,-30);
        Wait(200);//蓋を開ける動作
        
        msg1=100;
 }
 
     if(msg1==on2){
         OnFwd(OUT_A,100);
         Wait(20000);//アームを下げる動作
         
        msg1=100;
        }
    }
 }

*考察 [#f8eac18f]
ロボコン本番であと少しで計画通りボールが回収できそうというところまでいったが成功しなかったことがとても悔しい。

容器内のボールしか拾えないロボットとなってしまったが容器内のボールを回収すると言う点ではアイデアは良かったと思う。

問題点は、上でも少し触れたがアームの重量にある。容器をつかむなどで必要な要素をアームに取り込むとどうしてもどんどん重くなってしまった。ギアを活用してアームを持ち上げることに成功したことは良かったが改善の余地はまだあるとは思う。

今回のロボティクス入門ゼミでロボットとプログラミングをさわり、機械の信頼できる面とそうでない面の両方見ることができて、不安定な部分に苦戦はしたが面白かった。

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