2011b

目次一覧

メンバー紹介

  • t.s・・・工学部機械システム工学科。一年生最後として良い思い出にしたいです。
  • ひろ・・・情報工学科。テストの疲れに負けずに頑張りたい。
  • 鍾馗・・・電気電子工学科。プログラム圧縮できたらいいなといつも思う。

競技内容

紙パックを収集して目的地まで運び積み上げる

フィールドの説明

  • フィールドは約160cm×110cm
  • 運搬する500mlの紙パック(以下単に紙パックと呼ぶ)は約7cm×7cm×10.3cm
  • 紙パックはすべての面に白あるいは黒の画用紙がはられている
  • 中央の壁、ゴール近くの障害壁の断面は約89mm x 38mm、長さ50cm
  • 黒い線の太さは約20mm
  • スタート地点は32cm四方の正方形
  • 紙パックは32cm四方の正方形の内部に置かれている
  • 積み上げる場所は16cm四方の正方形

基本ルール

  • 紙パックを所定の場所に運ぶ。
  • 競技時間は審判が続行不能と判断するまで、あるいはリタイアするまでとする。
  • スタート時は上空も含め「スタート地点」からはみ出さないこと。
  • スタート時のロボットは2個を越えないこと (スタート後はいくつに分裂してもかまわない)。
  • 開始の合図から5秒以内にRCXのスタートボタンを押す作業を完了すること。
  • 競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
  • 途中でうまく動かなくなった場合、1回限り再スタートすることができる。
  • 競技終了時点で、運んだ紙パックにロボットの一部が触れていてはならない。触れている場合は、その紙パックは加算しない。
  • ゴール内のフィールドに接地している紙パックだけを得点の対象とする。

基本得点の計算方法

  • 一段目の紙パックは2点、2段目は4点、3段目は6点とする。
  • 1段目の紙パックで枠よりはみ出しているで半分以上枠内に入っている場合は点数は1点とする。その紙パックに触れている上段の紙パックはそれぞれ点数を半分にする。 技術点の計算方法 以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について自身を含む全てのチーム(4チーム)が20点満点で採点し、平均点を求める。得点の目安:
  • 紙パックを集める動作 (5点)
  • 紙パックを運ぶ動作 (3点)
  • 紙パックを積み上げる動作 (3点)
  • 2台以上のロボット、あるいは単体のロボットの場合は2台のRCXの連携の良さ(3点)
  • 自立型のロボットとしての形や動作の美しさ、斬新さ(3点)
  • その他 (3点)

ロボットの紹介

一作目

一作目

一番最初に製作したロボット。

後ろにRCX本体を設置してバランスを整えたが、全体的に重いため動かしにくいのと、一台で持ち運んで積み上げるのは無理があると判断し、失敗作としてロボコンには使われなかったが、チーム内のアイデアが詰まっており、人型ロボットの形をした大型ロボットには独特のユニークさがあって、今後の良い参考作品となった。

このロボットには、牛乳パックを挟んで持ち上げる動作と牛乳パックを押す動作とアーム全体を横に動かす動作が一度にできるようになっており、持ち上げてから積み上げるまでの動作を一台で行えるようにした。

持ち上げる動作は以下の通り

持ち上げ1

挟む部分はディファレンシャルギアを使用。互いの摩擦の違いによって一気に挟まず、片っ端から動作するようになっている。持ち上げるのは平行クランク機構を利用して、垂直な方向に持ち上げるようになっている。

持ち上げ1‐図1
持ち上げ1‐図2

押す動作は以下の通り

押し

小さいギアとラック(ギザギザ)と白い筒型のパーツを用いて、前方に水平に押せるようになっている。

押し‐図

アーム全体を動かす動作は以下の通り

アーム動作

持ち上げる部分にラック(ギザギザ)を用いて、モーターで横に動かせるようになっている。

アーム‐図

二作目

二作目ー運び 二作目ー持ち上げ

二作目のロボット。

一作目では一台ですべての動作を行うようにしたが、二作目ではこの一台を二台に分離する形で、一台に対する役割を軽減した。左の画像がブロックを引っ張って目的地まで運ぶロボットで、右の画像が運ばれたブロックを上に持ち上げて積み上げるロボットである。

ブロックを運ぶ仕組みは以下の通り (画像が切り替わります)

運び‐図

ブロックを積み上げる動作は以下の通り   (画像が切り替わります)

積み上げ‐図

プログラム

持ち運びロボット

ブロックはいつも違う配置なので、ブロックを取るたびにxyz座標が入れ替わることで、あらゆる配置のブロックを取ることができる。また、周りの壁を利用してわざと後ろに下がることで、進む向きをまっすぐにそろえている。

説明

順に青色→水色→緑色→黄色→桃色 です。この後は緑色→黄色→桃色を繰り返すと見てもらえれば。

説明
  • ^貪挂椶諒匹鰺用して向きをそろえる場所
  • 二度目の壁を利用して向きをそろえる場所
  • D命する場所

英字は変数が使われる部分

  • x:黄色の一番長い直線部分(最後)
  • y:桃色の一番長い直線部分(最後)
  • z:緑色の一番長い直線部分(中央? 2つ目の直線)
#define rota abs(SENSOR_1)					//回転センサーの絶対値を取ります
#define senb SENSOR_2						//ブロック(紙パック)に使用する光センサーです
#define senl SENSOR_3						//ライントレースに使用する光センサーです
#define zero ClearSensor(SENSOR_1);				//回転センサーの値を0にします
#define AAAL ClearSensor(SENSOR_1);until( abs(SENSOR_1) > 260);	//回転センサーで90度曲がるときに使います。文字に意味はなし
#define AAAR ClearSensor(SENSOR_1);until( abs(SENSOR_1) > 240);	//最初の回転の時、なぜか上の値では曲がりすぎるので
#define siro 49							//白ブロックを判断するための値です
#define kuro 36							//黒ブロックを判断するための値です
#define line 45							//ラインを判断するための値です
#define fwdr OnFwd(OUT_C);					//右折
#define fwdl OnFwd(OUT_A);					//左折
#define fwdw OnFwd(OUT_AC);					//前進
#define revr OnRev(OUT_C);					//後進右折
#define revl OnRev(OUT_A);					//後進左折
#define revw OnRev(OUT_AC);					//後進
#define ueni OnFwd(OUT_B);Wait(140);Off(OUT_B);			//ブロックを抑えるアームを上げます
#define sita OnRev(OUT_B);Wait(136);Off(OUT_B);			//ブロックを抑えるアームを下げます
#define time Off(OUT_AC);Wait(50);				//合間合間に停止時間を入れた方が正確なのでまとめてあります
#define otoA PlaySound(SOUND_UP);				//音を鳴らします

int phase=1;							//ブロックは運ぶのが何回目かを表しています
int i=1;							//for(繰り返し)の時に使います)

void angle(int t){			//回転センサーで任意の角度、距離を測るときに使う関数です
ClearSensor(SENSOR_1);until( abs(SENSOR_1) > t);
}

void senl_traceR(int t){		//ブロックに近づく時の関数です。最初、ライントレースをしていた時の名前を変え忘れています。
	revw;angle(700);otoA;			//まずある程度下がってから
	revw;Wait(320);time;			//後ろの壁にぶつかります( 
	fwdw;angle(t);time;			//tだけ前進した後
	revr;AAAL;time;				//ぶっろくの方に向きます
}

void attack_lamp(int t){		//最初邪魔なランプをどかす時に使う関数です
	fwdr;AAAR;time;ueni;			//初期位置から90度右折したのちアームを上げます(壁にアームがぶつかるんを防ぐため)
	fwdw;Wait(100);until(senl < line);until(senl > line);
	 angle(50);time;			//angle(50);は微調整
	fwdl;until(senl < line);time;		//ラインまで来たらほぼ90度左折します
	zero;						
	while(rota < t){			//ライントレースである程度まで進みます
		if(senl < line)	{Off(OUT_AC);fwdr;}	
		else		{Off(OUT_AC);fwdl;}
	}
	time;otoA;sita;				//アームを下げてランプを押す準備をしています
	fwdw;angle(1700);time;			//この全身途中でランプにぶつかります
	revw;angle(340);time;ueni;		//アームを上げてブロックをとる準備をしています
	revr;AAAL;time;
}

void approach_block(int t){		//ブロックに近づく→取る→離れるをしています
	revw;Wait(250);time;			//まず後ろの壁に当てて角度を正します(◆
	fwdw;angle(270);time;otoA;		//ブロックに近づく
	fwdw;angle(t);				//光センサーでブロックが手前にあるか判断します
		if(phase==3 || phase==4){until(senb < kuro);}	//3,4回目は黒ブロックが来ます
		else			{until(senb > siro);}	//それ以外は白ブロックです
	time;zero;
	sita;revw;angle(t);time;		//アームを下げてブロックを抑えつけたのちバックします
}

void come_back(int t){			//ブロックを積み上げ場所まで移動させます
	revr;AAAL;time;				//積み上げ場所まで移動します(*まで)
	fwdw;angle(t);time;
	if(phase != 4){	for(i=1; i<=5; i++){SendMessage(11);Wait(16);}}		//通信を行っています()
	else{			for(i=1; i<=5; i++){SendMessage(12);Wait(16);}}	//最後は違うものを送信します
	fwdr;AAAL;time;				//*
	revw;Wait(400);				//後ろの壁にぶつかり角度を正します(ぁ
	fwdw;angle(370);time;ueni;		//そのまま持っていくとアームが積み上げのロボットに
	revw;angle(350);time;sita;		//ぶつかるので後ろからアームで押し込みます
	fwdw;angle(450);until(senl < line);time;//積み上げ場所まで持っていきます
	revw;angle(50);until(senl < line);time;	//下がります
	fwdr;AAAR;time;ueni;
}


task main(){
int x;		//x:ブロックに近づく時の距離
int y;		//y:ブロックに近づく時の距離
int z;		//z:ブロックを運ぶ時の距離

SetSensor(SENSOR_1,SENSOR_ROTATION);
SetSensor(SENSOR_2,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);

attack_lamp(780);

while(phase<=4){
if(phase==1){y=230;z=1830;}
if(phase==2){x=3350;y=130;z=2190;}
if(phase==3){x=2985;y=350;z=1790;}
if(phase==4){x=3355;y=350;z=2205;}
if(phase==5){x=2985;y=500;z=1790;}
if(phase==6){x=3355;y=500;z=2295;}	//積み上げロボットが持ち上げることができるのならば6回×2個=12個全部積み上げれるので数値だけは入れてあります。

if(phase!=1){senl_traceR(x);}		//phase=1はattack_lampでブロックに近づきます。 
approach_block(y);
come_back(z);

phase++;
}
sita;					//最初アームは下がっているので最後もそうします。
}
 

積み上げロボット

sub up() {OnFwd(OUT_C);Wait(765);Float(OUT_C);Wait(20);Off(OUT_ABC);}
sub down() {OnRev(OUT_C);Wait(200);Float(OUT_C);}
sub cat() {OnFwd(OUT_A);Wait(115);Off(OUT_A);}
sub hanasu() {OnRev(OUT_A);Wait(100);Float(OUT_A);Wait(20);}
task main(){
	ClearMessage();
	SetPower(OUT_ABC,7);
	SetSensor(SENSOR_2,SENSOR_LIGHT);
	SetSensor(SENSOR_3,SENSOR_LIGHT);
	Off(OUT_BC);
	Wait(700);//取りにいくロボットが出て行くのを待つ
	OnRev(OUT_B);
	Wait(120);
	while(true){
		Off(OUT_ABC);
		if(Message()==11){//持ってきたとき
		PlaySound(SOUND_UP);
			Wait(2000);//紙パックを入れる待ち時間
			down();
			Wait(230);
			Off(OUT_C);
			hanasu();
			OnRev(OUT_C);
			Wait(130);
			Float(OUT_C);
			Wait(50);
			cat();
			up();
			ClearMessage();	
		}
		if(Message()==12){//終わったとき
			PlaySound(SOUND_FAST_UP);
			Wait(2000);
			down();
			Wait(230);
			Off(OUT_C);
			hanasu();
			OnRev(OUT_B);
			Wait(500);
			Off(OUT_B);
			break;
		}
	}
}
	

今までのロボット製作に関しての感想、学んだことなど

  • いかにパーツを無駄遣いせずに製作していくか、電池の残量・ギアの組み合わせなどによる誤差によって動作そのものにできるだけ支障が出ないようにどのような製作・プログラムをするべきか、機能を増やすこと以外にも考えることがたくさん生まれ、思った通りのロボットを製作することがいかに難しいことかが実感できた。
  • 自分は主に持ち運びロボットのプログラムを担当していたのだが、最終的に光センサーはほとんど使わずに回転センサーだけで進ませるプログラムになったのが残念に思っている。他には、積み上げロボットに関して、持ち上げるアームの部分がどうしても斜めになったりして大変だった。上記のプログラム作成が忙しかったため、結局この部分はほかのメンバーに丸投げしてしまった。
  • 方針が定まっていなかったために時間をかなり浪費してしまった。企画段階でもう少しきちんとした見通しを立てることができなかったことを悔やんでいる。ロボットが完成したのが本番の5時間前で、2つのロボットの連携のテストすらできなかった。実際通信の送受信のプログラムは書いてあるが、それがうまくいっていないことを本番の時初めて知った。時間だけは他班よりも多く費やした自信があるが、このような結果になってしまい残念です。
  • 自分の担当は組み立てロボットのプログラムとアームでした。2個は掴めても、6個は落とす事があったので、持ち上げるアームを何度も作り直してしっかり掴める様に時間をかけすぎた。組み立てに失敗した原因は通信の距離が把握できず、通信できなかったからでした。後で近づけてみたら動いたので、基本の動作が完成してから細かい修正をするべきだったと感じた。
  • 自分たちでロボットを製作したり、プログラムを組んだりする機会はめったにないので、このような講義に参加できたことが、とても嬉しいです。ロボティクスは確かに難しくて大変でしたが、製作を通じて学ぶことが沢山出来、ますますロボットに興味を持つことができました。半年間、ありがとうございました。

最後にコメントがありましたら何でもどうぞ!



添付ファイル: fileアーム‐図.png 439件 [詳細] file持ち上げ1-図2.png 459件 [詳細] file持ち上げ1-図1.png 535件 [詳細] file押し‐図.png 339件 [詳細] file持ち上げ.gif 462件 [詳細] file運び‐図.gif 424件 [詳細] file二作目ー持ち上げ.JPG 334件 [詳細] fileアーム.JPG 349件 [詳細] file押し.JPG 435件 [詳細] file持ち上げ1.JPG 408件 [詳細] file二作目ー運び.JPG 418件 [詳細] file行動図.gif 435件 [詳細] file説明1.png 412件 [詳細] file一作目.JPG 425件 [詳細] filerobot03下.nqc 67件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-02-19 (日) 15:56:47 (2684d)