目次

今回の課題について

今回の課題は課題2で制作したコースを用いてボールを回収して缶に向けて投げるロボットと缶にぶつかったボールを回収してゴールまで向かうロボットを用いてミッションを行うものである。

2015b-mission3.png

今回、私が担当したのはSTART,B地点からスタートして缶にぶつかったボールを回収してGOAL,B地点に向かう方のロボットである。注意点としてはアルミ缶は5CM以上動かすこととボールを投げるロボットは半分の線を超えてはならないことである。
詳細

ロボットの構造について

今回私たちが制作したロボットの機能を実現するための部分が大きく分けて3箇所ある。
画像の ↓◆↓の部分である。

機体

,良分について

,良分は重りである。の部分が重いため重心がそちらに移動してタイヤが浮いてしまうためこれを取り付けた。ピンを留める間隔を広げるなどしてできるだけ部品への負担を減らすように心がけた。

△良分について

△良分はボールを捕まえる部分である。捕まえ方は単純に振り下ろすだけである。しかしこのロボットの最も重要な部分であり、片側がしっかり接続されていないところがポイントである。片側を接続しないことによってボールを捕まえた後に後進すると自動的に缶の重みで軸がしなり缶のみ排出されるという仕組みである。

の部分について

の部分は△農睫世靴進の反対側のアームである。こちら側は固定してある。こちら側は先端に超音波センサーを配置してある。プログラムで目標地点に到達したら稼働させて、何かがセンサーの前を横切るとモーターが動き捕まえるようになっている。またセンサーの下にバンパーのように丸みを帯びた部品を付けることでボールが缶を排出するときに一緒に出て行かないように工夫している。
また◆↓6δ未任△襪ボールが隙間から出ていかにようにギアをつけたり突起をつけたりしている。

IMG_4956.JPG

排出動作のアニメーション

Misson3_1.gif

この機構に至った経緯とメリット

はじめはしっかりボールを探して缶とボールをうまく判別して回収しようと考えたが、どこにボールが飛ぶかわからないため運の要素があることと缶とボールを探しながらうまく区別することが難しいように思われたため探すこともせず、缶とボールを判別することなくボールのみ回収できないかと考えた結果こうなった。こうすることによってボールを探すことと缶とボールの判別という無駄な動きをすることなくボールを運の要素を排除して回収できる。

プログラムについて

主な工夫点

プログラムでの主な工夫点は大きく3点あり、一つはプログラムの修正のしやすさととわかりやすさを追求するためにサブルーチンを多く使いそれぞれの動作を部品かしたことである。二つ目はより正確にボールを捕まえるために2台のロボットで通信を行ったことである。3つ目はできるだけ時間による動作を少なくしてバッテリーの減少による影響を少なくしたことである。 全てモーターの回転で制御してボールを探す動作を省いた結果常に同じ場所を移動することが可能になりライントレースで失敗する可能性の排除にも成功した。

プログラム部分

定義部分

 #define GO 10
 #define STOP 99
 #define ready 20
 #define speed 30

ここでは通信に使う数値とモーターの速度を定義している。モーターの速度をここで定義することによって機体が重いために電池が減ってきてパワー不足なった時にすぐにパワーを増やせるようにしている。


サブルーチン

 void move1() {
     int msg = STOP;
     Off(OUT_B);
     RotateMotorEx(OUT_AC,speed,850,0,true,true);
     while (msg != GO) {		//メッセージを受信
         Off(OUT_ABC);
         Wait(1);
         ReceiveRemoteNumber(MAILBOX1,true,msg);
     }
 }

この部分ではメッセージの受信と相手側が缶とロボットの誤認識をしない位置まで移動を行っている。ボールを投げるロボットが投げる位置についてからこちらがキャッチをする位置につくようになっている。理由は上で説明したの部分が誤って缶と認識される場合があったためである。最初にmsgという変数にSTOP(99)が入っており、向こうがGO(10)を送ってくると受信をするループを抜けるようになっている。


サブルーチン

 void move2() {
     RotateMotor(OUT_C,speed,-320);
     OnFwd(OUT_AC,1);
     Wait(1);
 }

この部分では回転を行っている。一瞬だけ最弱の力で動くようになっているのはこれがないと次の動作を行うときにこちらの意図しない動きをするからである。これを入れると正常に動作をしてくれるので全く意味がないような動作であるがこの動作が加えられている。


サブルーチン

 void move3(){
     RotateMotorEx(OUT_AC,speed,-200,0,true,true);
 }

この部分では前進を行っている。この動作終了後の位置がボールを捕まえる定位置である。


サブルーチン

 void catch() {
     long t = 0;
     SetSensorLowspeed(S4);
     SendResponseNumber(MAILBOX1,ready);		//メッセージを送信
     while(true) {
         if (SensorUS(S4) >= 30 && t <= 500){
             t++;
             Wait(1);
         } else {
             RotateMotor(OUT_B,80,140);
             break;
         }
     }
     OnFwd(OUT_B,10);
 }

この部分ではメッセージの受信とボールを捕まえる動作を行っている。
まずこちらが定位置に着いた時に投げる側のロボットに『ready(20)』送る。そして超音波センサーの値が30以上かつ変数tの値が500以下の時はボールを待つ。それ以外になったら腕を下ろしボールを捕まえるようになっている。
始めの方に宣言している変数tは万が一ボールをうまくセンサーが認識しなかった時のために時間で閉じるようにするためのものである。ただしこの時はボールが捕まえられる範囲になければならないため運の要素が強い。


サブルーチン

 void move4() {
     OnFwd(OUT_AC,1);
     Wait(1);
     RotateMotorEx(OUT_AC,speed,600,0,true,true);
     Off(OUT_B);
 }

この部分では後進を行っている。プログラム上は単純な動きであるがハード面でボールと缶を判別して缶のみを排出するというプログラムでは実現することの難しい動作を行っている。


サブルーチン

 void AfterCatch() {
     RotateMotor(OUT_C,speed,-340);
     OnFwd(OUT_AC,1);
     Wait(1);
     RotateMotorEx(OUT_AC,speed,-900,0,true,true);
 }

この部分ではボールを捕まえ缶を排出した後ゴールへ向かう動作を行っている。
このロボットは缶を探すという動作を排除しているため常に同じ場所を通ることができるためライントレースを行うことなくゴールへ辿りつくことができるためこのような角度での移動でゴールへ行くことができる。ライントレースは電池の残量や路面の状態などによってたまに誤作動を起こすことがあるので運の要素が少なからずあるがそれを排除することでより精度を上げている。


メイン関数

 task main()
 {
     move1();
     move2();
     move3();
     catch();
     move4();
     /*↓↓↓ゴールへ向かうプログラム↓↓↓*/
     AfterCatch();
 }

上で解説したサブルーチンを実行する。 このように全て部品化してあるため見やすく、修正が容易である。


動きの概要

機体

画像内の番号は上で解説した時のサブルーチンの番号に対応している。

感想と考察

感想

今回の課題は最後の課題であり今までの集大成である。
今回の課題ではハード面はかなり満足できるものとなったと思う。地味ではあるがプログラム面でもシンプルで判りやすいプログラムができたのではないかと思う。シンプルで読みやすく修正がしやすいプログラムを書くことは以外と難しいと思う。ただ、やはり今回のロボットは機能的には斬新で良いと思うが、見た目は自分でもあまりいいとは言えなかった。特に異様に大きな重りはなくせるようであれば無くしたかったが、無理であった。

考察

今回の課題は練習の時はほぼ100%缶を排出してボールのみを捕まえることができたが、本番では一回しか成功しなかった。できるだけ運の要素を排除したつもりであったがまだ甘かったようである。現実的に完全に運の要素を排除することは不可能であると思うが、もっと徹底的に繰り返し検証していたらその運のようをさらに排除できたと思う。


添付ファイル: fileRobo_Misson.png 78件 [詳細] fileIMG_4956.JPG 122件 [詳細] fileMisson3_1.gif 99件 [詳細] fileIMG_4947.JPG 71件 [詳細] file2015b-mission3.png 83件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-02-15 (月) 04:29:09