2018a/Member

課題:空き缶運搬ロボット

フィールドの説明

コース

基本ルール

基本得点の計算方法

技術点の計算方法

  1. 空き缶を探し取りにいくまでの動作 (3点)
  2. 空き缶を掴む動作 (3点)
  3. 空き缶を運ぶ動作 (2点)
  4. 空き缶を置く動作 (2点)
  5. 空き缶を積む動作 (3点)
  6. 2台のRCXまたはNXT、EV3の連携の良さ(2点)
  7. 自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
  8. その他 (3点)

機体

機体

光センサでライントレースを基本として動かせるように二輪と支えを持った三輪車型にした。ギアが浮かないようにストッパーをつけていたが、負荷がかかると稀に取れてしまうことがあったのでもう少し改良が必要だったかもしれない。

コース

機体は2台を同時に動かしそれらの連携によって缶を動かす方法ではなく2つの核部品を組み合わせて1つの機体を作り完全1台のみでミッションをこなすようにした。 モータを4つ使うため、機体は本体を重ね合わせた形になっている。 アーム部分はミッション2のものをそのまま用いており、クワガタ型である。

機体

なるべくブレが出ないようにタイヤ周りとセンサーとの位置調整を施した。タイヤ間の中心にセンサをつけることにかなり苦労した。

機体

ハサミは缶の摩擦を頼りにしているので輪ゴムをつけるとともに先端にタイヤをつけて確実性を上げた。

機体

下にある本体がマスター側で、足となるモータとセンサ、ハサミの上げ下げをつかさどっている。 上の本体がスレイブであり、ハサミの開閉のみを担当している。

作戦

コース

緑の矢印の順でライントレースをしてXにある缶をYに持っていき、重ねるようにした。 ライントレース途中の小さなカーブ二つ目を通る際に、缶の塔に構造上どうしても当たってしまったので、それを逆に利用して、満点を狙わない代わりに、動作を少ないままに、点数を狙えるようにした。 満点は狙えないのだが、確実に一点以上を出せるようになっている。 予行練習では、最高で6点を出すこともできた。 その後の試行錯誤でも電池残量にあまり影響なく、一定以上の点数を出すことができた。 積み重ねられるかどうかはかなりの運要素であったが、そこを抜きにしても一点以上を狙うことができると踏んでいた。

プログラム

マスター(ライントレース、ハサミの上げ下げ)

#define CONN 1   // スレーブの接続番号
#define SIGNALON 11   // ハサミで持ち上げるためのメッセージ
#define SIGNALOFF 12  // 缶を落とすためのメッセージ
#define llt OnFwd(OUT_A,50); OnRev(OUT_C,30); Wait(1);//大きく左に回る
#define lrt OnRev(OUT_A,30); OnFwd(OUT_C,50);  Wait(1);//大きく右に回る
#define ternleft  OnFwd(OUT_A,50); OnRev(OUT_C,10);//左に回る
#define ternright  OnRev(OUT_A,10); OnFwd(OUT_C,50);//右に回る
#define go OnFwd(OUT_A,50); OnFwd(OUT_C,50);//直進する
#define back OnRev(OUT_A,50); OnRev(OUT_C,50);//後退する
#define trase_R  {if(SENSOR_2<36){lrt;  n++;} else if(SENSOR_2<50) {go; n=0;} else {llt;  
n=0;}}        //右側トレース
#define trase_L  {if(SENSOR_2<36){llt;  n++;} else if(SENSOR_2<50) {go; n=0;} else {lrt;  
n=0;}}        //左側トレース
#define open RotateMotor(OUT_B,25,80); Off(OUT_B);Wait(1000);  //ハサミ開く
#define close RotateMotor(OUT_B,25,-80); Off(OUT_B);Wait(1000); //ハサミ閉じる
#define UP RotateMotor(OUT_C,40,90); Off(OUT_C); Wait(1000);  //ハサミ持ち上げ
#define DOWN RotateMotor(OUT_C,20,-100);Off(OUT_C); Wait(1000); //ハサミ下げ
  task main()
{ 
SetSensorLowspeed(S1);
SetSensorLight(S2);
int n=0;
while(n<=100)
{                                   // H
  trase_R;
}
Off(OUT_AC); 
Wait(1000);
OnFwdSync(OUT_AC, 50, 0);
Wait(500);
Off(OUT_AC);
n=0;
while(n<=100)
{                                   // s2
  trase_R;
}
Off(OUT_AC); 
Wait(1000);
OnFwd(OUT_AC,50);                                 //線をまたぐ
Wait(500);
n=0;
while(n<=90)
{
  trase_L                                               //L字路で止まる
}
Off(OUT_AC); 
Wait(1000);
RotateMotor(OUT_A, 60, 300); 
Off(OUT_AC);
n=0;
while(n<=150)
{                                           //十字路で止まる
  trase_R
}
Off(OUT_AC); 
Wait(1000);
RotateMotor(OUT_C, 60, 300); 
Off(OUT_AC); 
n=0;
while(n<=70)
{                                            //Fで止まる
  trase_L
}
Off(OUT_AC);
close;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON);            //持ち上げる
Off(OUT_ABC); 
Wait(3000);
OnRev(OUT_AC,50);                                   //バックで距離を取る
Wait(1000);
Off(OUT_AC);

RotateMotorEx(OUT_AC, 75, 1860, 100, true, false);  //振り返る
Off(OUT_AC);

n=0;
while(n<=70)
{                                            //Gで止まる
  trase_L
}
Off(OUT_AC); 
RotateMotorEx(OUT_AC, 75, 400, -100, true, false );  
Off(OUT_AC);
 
SendRemoteNumber(CONN,MAILBOX1,SIGNALOFF);
Off(OUT_ABC); 
Wait(3000);
open;
Off(OUT_ABC);
Wait(3000);
}

スレイブ (ハサミの開閉)

#define CONN 1   // スレーブの接続番号
#define SIGNALON 11   // ハサミで持ち上げるためのメッセージ
#define SIGNALOFF 12  // 缶を落とすためのメッセージ
#define llt OnFwd(OUT_A,50); OnRev(OUT_C,30); Wait(1);//大きく左に回る
#define lrt OnRev(OUT_A,30); OnFwd(OUT_C,50);  Wait(1);//大きく右に回る
#define ternleft  OnFwd(OUT_A,50); OnRev(OUT_C,10);//左に回る
#define ternright  OnRev(OUT_A,10); OnFwd(OUT_C,50);//右に回る
#define go OnFwd(OUT_A,50); OnFwd(OUT_C,50);//直進する
#define back OnRev(OUT_A,50); OnRev(OUT_C,50);//後退する
#define trase_R  {if(SENSOR_2<35){lrt;  n++;} else if(SENSOR_2<50) {go; n=0;} else {llt;  
n=0;}} 
#define trase_L  {if(SENSOR_2<35){llt;  n++;} else if(SENSOR_2<50) {go; n=0;} else {lrt;  
n=0;}} 
#define open RotateMotor(OUT_B,25,85); Off(OUT_B);Wait(1000);
#define close RotateMotor(OUT_B,25,-85); Off(OUT_B);Wait(1000);
#define UP RotateMotor(OUT_C,40,90); Off(OUT_C); Wait(1000);
#define DOWN RotateMotor(OUT_C,20,-90);Off(OUT_C); Wait(1000);
  task main ()
{
 int msg;  // 受け取った値を格納する変数
while (true) {
   ReceiveRemoteNumber(MAILBOX1,true,msg);  // 
   if (msg == SIGNALON) {
     UP;
   }
   if (msg == SIGNALOFF) {
     DOWN;
   }
 }
}

結果と反省

本番当日には立ち会うことができなかったのだが、メンバーから話を聞くと散々だったようである。ライントレースの途中でミスをしたり、缶を倒した際の衝撃で下の段の缶も倒れて、積み重ねができなったようだ。練習ではかなりうまくいっていたのだが、本番前の調整に立ち会えなかったため、不完全な状態で本番を迎えてしまった。メンバーにもっと、何処の機構がどうなれば正しいのか、プログラムの段階での調整項目などをもっとしっかり共有するべきであった。今回の反省は、チームメンバーとの協力をもっとしておくべきであったということだ。せっかくのチームであったのだから、意見交換のみならず、プログラムの意味などについても話しておくべきだった。本番で結果を残せなかったことが非常に悔やまれるのだが、多くのことを学ぶ機会とすることができた。


添付ファイル: file2018a-mission3-1.png 141件 [詳細] fileIMG_2869.JPG 96件 [詳細] fileIMG_2868.JPG 118件 [詳細] fileIMG_2867.JPG 126件 [詳細] fileIMG_2866.JPG 176件 [詳細] fileIMG_2865.JPG 148件 [詳細] fileIMG_2864.JPG 127件 [詳細] file2018a-mission3.png 119件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-08-13 (月) 20:31:33