2016a/Member

はじめに

課題の説明

課題:紙コップを運ぶロボット~

課題2で作成したコースを用いてタイムレースを行う。

ルール

  • 基本ルール
    ◦紙コップをC地点、D地点にそれぞれ3個(合計6個)置き、C地点に置いた紙コップにはCを、D地点に置いた紙コップにはDを紙コップの底面にマークする
    ◦紙コップは上下どちらにおいてもかまわない
    ◦2台のロボットの場合はA地点とB地点からスタート、一体型の場合はA地点とB地点のいずれかからスタートする
    ◦最終的に黒線で囲まれた輪の中にC地点からの紙コップとD地点からの紙コップを交互に重ねる (下側から数えて奇数番目はC地点からのコップ、偶数番目はD地点からのコップになるようにする)
    ◦紙コップを重ねる場所は、必ずしも目的地点の輪の中でなくてもかまわない
    ◦最終的に紙コップが自力で立っていること、またロボットが紙コップに触れていないこと、ただしスタート時と上下逆になっていてもかまわない
    ◦競技時間はすべてのコップを重ね終わるまで、あるいは審判が続行不能と判断するまで。
    ◦審判の合図の後、5秒以内にロボットをスタートさせ、それ以降はロボットや紙コップに触ってはいけない
    ◦EV3のチームはA,B,Cにそれぞれマークした紙コップをそれぞれ3個置く
    ◦EV3のチームはA,B,C,Dのどこからスタートしてもよいが、別の地点にある合計9個の紙コップを運ぶこと
    ◦紙コップに色を塗ったり文字や絵をかいてもよいが、穴を開けたり故意に変形させてはいけない
    ◦光センサは2セット合わせて2つまで使って良い、その他のセンサや部品はキットに含まれているものだけを使用すること
     
  • 基本得点の計算方法
    ◦1段目の紙コップ3点、2段目の紙コップ6点、・・、n段目のコップ3n点、6段目のコップ18点
    ◦奇数段目にあるDのコップと偶数段目にあるCのコップは0点
    ◦EV3は1段目のAのカップ2点、2段目のBのカップ4点、3段目のCのカップ6点、4段目のAのカップ8点、5段目のBのカップ10点、6段目のCのカップ12点、7段目のAのカップ14点、8段目のBのカップ16点、9段目のCのカップ18点、それ以外は0点
     
  • 技術点の計算方法
    以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチームが20点満点で採点し、その平均点を求める。 得点の目安:
    ◦スタートしてから紙コップの地点まで移動する速さ、正確さ (2点)
    ◦紙コップをつかむ動作 (3点)
    ◦紙コップをゴールまで運ぶ動作の速さ、正確さ (2点)
    ◦紙コップを重ねる動作 (3点)
    ◦2台のロボットの連携の良さ (3点)
    ◦自立型のロボットとしての形や動作の美しさ、斬新さ (3点)
    ◦ロボコン出場ロボットとしての完成度 (2点)
    ◦その他 (2点)

ロボットの説明

これが今回使ったロボットの機体である。
1470979350384.png
2台のロボットを1台にまとめ、Bluetoothを使って通信している。
センサは光センサと超音波センサを搭載した。
超音波センサが光センサを認識しないように気を付けた。

 

このロボットの一番工夫した点はアームの機構である。
以下の画像のように、タイヤを2個使ってモーターで紙コップを巻き上げるような機構にした。
1470979353990.png 1470979357186.png
ロボットの位置さえ気を付ければ6個全ての紙コップを巻き上げられた。

 

1470979355524.png
もう1つのモーターで掴む部分を回転させ、アームの上下を可能とした。

プログラムの説明

構想

最初は、アームが紙コップを全て重ねて運べるので、スタート地点(A地点)からライントレースを始め、P、Sの交差点を通りC地点へ行き紙コップを掴み半回転してD地点へライントレースをし紙コップを掴み半回転をし、またC地点へ…と繰り返し、全ての紙コップを掴みSからQへ行きゴールする、というのを目標としていた。しかし、車体の幅が広く、前回の課題(課題2)で使ったライントレースでは交差点でうまく曲がれなかった。そして一番問題だったのがロボットの重さである。機体を安定させようとしたせいなのか上部分が重くなってしまい、タイヤに負荷がかかってしまった。そのせいで、カーブになると動かなくなってしまった。

最終的なプログラム

最終的に紙コップを1個運ぶことを目標とし、ライントレースをあきらめた。
よって、B地点からC地点に向けて直進し、紙コップを持ちQへ向かうように変更した。
以下が今回使用した最終的なプログラムの全体である。

マスター

#define SPEED 50                                             //スピード50
#define go_forward OnFwd(OUT_BC,SPEED);                      //前進
#define CONN 1                               //スレーブを表している
#define SIGNALON 21                             //腕を動かすためにマスターがスレーブに送る信号
#define SIGNALOFF 22                                         //腕を動かし終わったことをスレーブがマスターに送る信号
#define SIGNALON2 31
#define SIGNALOFF2 32
#define turn_leftC  OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);  //左旋回
#define turn_rightC OnFwd(OUT_C,SPEED);OnRev(OUT_B,SPEED);  //右折

task main()
{
	int msg                          //MAILBOXに来る信号をmsgと定義する
	SetSensorLowspeed(S1);                                //端子1に超音波センサ               
	go_forward;                        //前進
	until(SensorUS(S1) <= 9);                 //センサの半径9cmに紙コップが入ったら停止
	Off(OUT_BC);
	SendRemoteNumber(CONN,MAILBOX1,SIGNALON );         //信号を送る
	while (true){
	ReceiveRemoteNumber(MAILBOX2,true,msg);              //msgを受け取っている間
	if (msg == SIGNALOFF ){                      //信号を受け取ったら左旋回する
	turn_leftC;
	Wait(1600);
	Off(OUT_BC);
	go_forward;                        //前進
	Wait(1000);
	Off(OUT_BC);
	SendRemoteNumber(CONN,MAILBOX1,SIGNALON2 );        //腕を動かすために信号を送る
	} if (msg == SIGNALOFF2 ){                    //信号を受け取ったら左旋回し、停止
	turn_leftC;
	Wait(1000);
	Off(OUT_BC);
	} else {                       //それ以外では停止したまま
	Off(OUT_BC);
	}
	}
}


マスター側は移動とセンサが中心のプログラムになっている。
ライントレースはあきらめたので光センサは使用していない。
超音波センサは今回初めて使用したが、距離がずれるので調整が大変だった。

スレーブ

#define SIGNALON 21                    //腕を動かすためにマスターがスレーブに送る信号
#define SIGNALOFF 22                    //腕を動かし終わったことをスレーブがマスターに送る信号
#define LIFT_up OnRev(OUT_C,35);Wait(520);Off(OUT_BC);   //腕を上げる
#define LIFT_down OnFwd(OUT_C,20);Wait(550);Off(OUT_BC);   //腕を下ろす
#define CATCH OnFwd(OUT_B,60);Wait(2000);Off(OUT_B);    //紙コップを持つ
#define RELEASE OnFwd(OUT_B,50);Wait(1500);Off(OUT_B);   //紙コップを離す
#define CONN 0                       //マスターとつながっている
#define SIGNALON2 31
#define SIGNALOFF2 32
void ude()                                                 //サブルーチン
{
	LIFT_down;
	CATCH;
	LIFT_up;
	CATCH;
	Off(OUT_B);
}

task main ()
{
	int msg;
	while (true) {
	ReceiveRemoteNumber(MAILBOX1,true,msg);         //msgを受けている間
	if (msg == SIGNALON) {                  //信号を受け取ったら紙コップを持ち上げる
	ude();
	SendResponseNumber(MAILBOX2,SIGNALOFF);         //本体に次の行動をするように信号を送る
	} if (msg == SIGNALON2) {                           //信号を受け取ったら紙コップを離す
	RELEASE;
	SendResponseNumber(MAILBOX2,SIGNALOFF2);         //本体に次の行動をするように信号を送る
	} else {                         //どちらでもなかったら動かない
	Off(OUT_BC);
	}
	}
}


スレーブはアーム専用だがプログラムは割と早い段階でできていたので良かった。

結果

紙コップは1個も運べなかった。
基本点は0点、技術点は2点で合計2点だった。

反省・感想

反省

機体が重くなってしまい、また幅がかなり広くなってしまっていたのでライントレースがまともにできなくなってしまった。うまく機体の軽量化と幅の改善をするか、それでも動くようなライントレースのプログラムを書ければよかったのだが、時間と技術力が足りず最初の構想から大きく変更せざるを得なくなってしまった。アームの機構は他のグループには無くオリジナリティがあり、その上6個の紙コップを全て運べるポテンシャルがあったにもかかわらず、それが活かせなかったのが残念だった。

感想

人数が多い上テスト前ということもあり、なかなか時間を作るのが大変だった。今更だが、この課題は役割分担が重要だということを痛感した。紙コップは運べず目標は達成できなかったが、試行錯誤ができて楽しかったと思う。今までの3つの課題を通じてプログラミングの基礎的なことを学ぶことができ、大変だったがこの経験を活かし今後の学習に役立てていきたい。


添付ファイル: file1470979357186.png 122件 [詳細] file1470979355524.png 159件 [詳細] file1470979353990.png 125件 [詳細] file1470979350384.png 136件 [詳細]

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