課題

ボール運搬ロボット

ボールを所定の位置から運び出し、決められた、ゴールに入れる。

フィールド

ルール

ボールをそれぞれ向きの違う棒に挟まれた状態から運びだし、4箇所あるゴールの箱に入れる。

競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 4隅のコーナー(半径30cmの1/4円)のいずれかからスタートする。 スタート時のロボットは2個を越えないこと (スタート後はいくつに分裂してもかまわない)。

開始の合図から5秒以内にRCXのスタートボタンを押す作業を完了すること。 競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 途中でうまく動かなくなった場合、1回限り再スタートすることができる。

基本得点の計算方法

半分以上箱に入ったボールだけを得点の対象とする。

横から入れるゴールについてはボール1個2点、上から入れるゴールについては1個4点で計算する。ただし同じ箱に3個のボールを入れた場合には、その箱に限り点数を倍にする。

技術点の計算方法 以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(9チーム+TAor教員)が20点満点で採点し、その平均点を求める。

得点の目安:

ボールを取り出す動作 (3点)

ボールを運ぶ動作 (3点)

ボールを紙パックに押し込む動作 (3点)

2台以上のロボット、あるいは単体のロボットの場合は2台のRCXの連携の良さ(3点) 自立型のロボットとしての形や動作の美しさ、斬新さ(3点)

その他 (5点)

STRATEGY

  • ロボットは2台使用し、それぞれにボールを運ぶロボット、ボールを入れるロボットに役割分担する。
  • ボールを入れるロボットは、得点の高い、上からボールを入れる方法のみを狙う。
  • 直前のプログラム変更により、得点よりも技術点などに重点を置いた。

ロボットの解説

ボールを運ぶロボット

all.jpg
  • ロボットを上から見たロボットの全体の模様


front.jpg
  • ボールを取っているロボットの前の模様


front1.jpg
  • ロボットの腕が付いているロボットの前の模様


side.jpg
side1.jpg
  • ロボットの左側と右側の模様


back.jpg
  • ロボットを後から見た模様


under.jpg
  • ロボットを下から見た模様


arm1.jpg
arm2.jpg
arm3.jpg
  • ロボットの腕がボールを取っている模様


front-ball1.jpg
  • ロボットの前に広い腕が二つあってボールを集めやすくように作った。


front-ball.jpg
  • ロボットの腕がボールを取りやすくように付いた。


gear.jpg
  • 初めにはモーターから遠い腕に動力を伝えるためにゴムを使ってしたんだけど、うま伝えられなく、その代わりギアーを使った。


ボールを入れるロボット

7.JPG
  • ボール運搬ロボットの全体


1.JPG
  • ボールが2個入ってもちょうどバランスがとれるようになっている。


6.JPG
  • 箱の横を沿って動けるように、光センサーを右にずらした。


4.JPG
  • 配線はゴムで縛ったり、パーツに巻きつけて、邪魔にならないようにした。


8.jpg
  • ボールを入れる部分がちょうど、箱の大きさとぴったり揃っているので・・・↓


2.JPG
  • 2個同時にボールを箱の中に入れることができる。


9.JPG
  • RCXが重いので、ブロックでひっつけるだけでは不十分である。よって、写真の赤丸の部分のような部品を使って、本体とRCXを固定した。


プログラムの解説

ボールを運ぶロボットのプログラム

  • 初めにはラインとーレスをしながらボールを取ると思いました。 でも、ロボットを作るとき光センサーをつくところを考えず、付くために時間がたくさんかかってしまって直接移動してボールを取って他のロボットにあげるようにしました。それで、距離を計ることと失敗したらうまく動かなくなりました。
#define		ROTATION_GET		60
#define		ROTATION_PUT		10
#define		ROTATION_KICK	      500
#define		ROTATION_GIVE	         130
#define		FRONT			1
#define		BACK			2
#define		DEGREE_OF_LIGHT	         53 

// ロボットの腕を動く関数
// iRotation : 腕を動く角度の変数
// iDirection : 腕を動く方向
void move_arm ( int iRotation, int iDirection )
{	 
	int	iTime = iRotation;
	
	ClearSensor ( SENSOR_2 );
	if ( iDirection == FRONT ) {
			OnFwd ( OUT_B );
	}
	else {
		OnRev ( OUT_B );
	}	
	
	Wait ( iRotation );
	Off ( OUT_B );

} 

// ロボットを前進する関数
// iTime : 前進する時間
void go ( int iTime )
{
	OnFwd ( OUT_A );
	OnFwd ( OUT_C );
	Wait ( iTime );
	Off ( OUT_A + OUT_C );
} 

// ロボットを後進する関数
// iTime : 後進する時間
void back ( int iTime )
{
	OnRev ( OUT_A );
	OnRev ( OUT_C  );
	Wait ( iTime );
	Off ( OUT_A + OUT_C );
} 

// ロボットを左に曲がる関数
void left ( )
{
	OnRev ( OUT_A );
	OnFwd ( OUT_C );
	Wait ( 46 );
	Off ( OUT_A + OUT_C );
} 

// ロボットを右に曲がる関数
void right ()
{
	OnFwd ( OUT_A );
	OnRev ( OUT_C );
	Wait ( 46 );
	Off ( OUT_A + OUT_C );
} 

task main()
{

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

	go ( 145 );
	left ( );
	go ( 60 );
	move_arm ( ROTATION_GET, FRONT );
	back ( 20 );
	right ( );
	go ( 150 );
	left ();
	go ( 200 );
	move_arm ( ROTATION_GIVE, FRONT );
	move_arm ( ROTATION_GIVE, BACK );
	Wait ( 30 );
	move_arm ( ROTATION_GIVE, FRONT );
	move_arm ( ROTATION_GIVE, BACK );
	
	back (90 );
	right ( );
	go (70 );
	move_arm ( ROTATION_GET, FRONT );
	back ( 30 );
	left ( );
	go ( 130 );
	move_arm ( ROTATION_GIVE, FRONT );
	move_arm ( ROTATION_GIVE, BACK );
	Wait ( 30 );
	move_arm ( ROTATION_GIVE, FRONT );
	move_arm ( ROTATION_GIVE, BACK );
	
	back ( 90 );
	right ();
	go (70 );
	move_arm(ROTATION_KICK, BACK );
	go ( 30 );
	move_arm(ROTATION_KICK, BACK );
	go (30 );
	move_arm(ROTATION_KICK, BACK );
		

} 

ボールを入れるロボットのプログラム

本番で使用したプログラム

フィールドの端から上に穴のあいた箱の前まで行き、 もうひとつのロボットがボールをいれるの待ってから、箱にボールを入れるプログラムです。本番までにロボット等を完璧に作成できなかったため、このプログラムを作りました。
この動作に関しては問題なく動きましたが、まっすぐ進まないといったロボット側の問題はありました。
また本番に待つ時間を間違えるというミスもあり、本番ではうまくいきませんでした。

task main(){
OnFwd(OUT_A+OUT_C);        //箱の前まで直進
Wait(575);
Off(OUT_A+OUT_C);
Wait(1600);                //ボールが乗るまで待機
OnRev(OUT_B);
Wait(30);
Off(OUT_B);
OnFwd(OUT_B);              //ボールを箱にいれる
Wait(30);
Off(OUT_B);}

(作成者:三澤)

最初に計画していたプログラム

こちらが最初に計画していたプログラムで、外側の楕円をライントレースしながら箱にボールをいれる、というプログラムです。
外側の楕円を時計回りに進み、ライントレースはロボット本体の左側についている光センサー1つで行います。
ボールの受け渡しは外側の楕円と8の字が合流する部分で行います。両側の光センサーが黒を感知したら止まります。
ボールを受け取ったら、上に穴の開いた箱の前に行くのですが、箱と黒い線が完全にくっついているため、ここで悩みました。
タッチセンサーをつけ、箱を感知したらうまくよけて、箱の横に着くようにしてみましたが、これでうまくいくかは確認できてません。
また、通信機能を使い、ボールの受け渡し地点まで来たら、ボールを運ぶロボットのほうにそれを伝えるようにしてみました。

#define BLACKLINE 45
#define SIGNAL_A 11
#define SIGNAL_B 12

task main ()
{
    SetSensor(SENSOR_1,SENSOR_LIGHT);
    SetSensor(SENSOR_2,SENSOR_TOUCH);
    SetSensor(SENSOR_3,SENSOR_LIGHT);
 
    while (true) {
        if(SENSOR_1 < BLACKLINE){   //左側の光センサーが黒線上なら直進
           OnFwd(OUT_A+OUT_C);           そうでない場合は右折  
        } else {
           OnFwd(OUT_A);
           Off(OUT_C);} 

        if((SENSOR_1 < BLACKLINE) && (SENSOR_3 < BLACKLINE)){      //両側の光センサーが黒線上なら停止する
           Off(OUT_A+OUT_C);
           ClearMessage();
           
            while(Message() == 1){         //もう1つのロボットから返信があるまで、自分がボール受け渡し地点まで来たことを通信で伝える
               SendMessage(SIGNAL_A);}
            
            if(Message() == 1){      //返信が来たら、音を鳴らす
               PlaySound(SOUND_CLICK);
               ClearMessage();}
        }

        if(Message() == SIGNAL_B){     //相手から「ボールを乗せた」と通信があったら再びライントレースを始める
           SendMessage(2);
           OnFwd(OUT_A+OUT_C);}
        
        if(SENSOR_2 == 1){                 //タッチセンサーが箱に触ったら箱を回避して横付けする
           OnRev(OUT_A+OUT_C);
           Wait(100);
           Off(OUT_C);
           OnFwd(OUT_A);
           Wait(190);
           OnFwd(OUT_A+OUT_C);
           Wait(50);
           Off(OUT_A);
           OnFwd(OUT_C);
           OnFwd(OUT_A+OUT_C);
           Wait(300);
      Off(OUT_A+OUT_C);
           OnFwd(OUT_B);              //ボールを箱にいれる
           Wait(30);
           Off(OUT_B);
           OnFwd(OUT_A+OUT_C);}
     }
}

(作成者:三澤)

工夫した点

  • ボールを2個運ばせることにより、時間的にも見た目的にもすっきりする。
  • ボールを運ぶロボットと、ボールを入れるロボットの連携を強調した。
  • ボールを運ぶロボットがボールを適切にボールを伝えた後でボールを運ぶロボットはボールを入れるロボットが上から入れる箱にボールを入れている間に一人でボールを取って横からボールを入れる箱まで移動して一人で入れようと思った。

難しかった点

  • やはりボールを的確に受け渡し、的確にゴールするという精密さを追求するのが難しかった。
  • 当初計画していたプログラムは、理論は完璧であるが、実際やってみるとどうしてもうまくいかず、結局、時間が足りなく即席で作ったプログラムに変更せざる負えなかった。
  • 思いをアルゴリズム化することがやはり難しかった。

ロボコンの結果

  • 順位は惜しくも4位で、点数は10.5点でした。

反省

  • リハーサルではボールを箱に入れることができたが、本番では微妙な位置のずれや2つのロボットの連携のずれが要因で一点も得点することができなかった。
  • 本番前には入念なチェックが必要であった。
  • 結果的に回転センサーや光センサーをうまく使えていたチームが優勝できたのだと思う。

感想

  • 理想を現実にするというのは、非常に難しいものであると思った。大学でレゴブロックでこんなに悩むとは思ってなかった。でも、良い経験ができたと思う。
  • 今まで、プログラムを習ったんだけどまだ自分の考えをプログラム化することがうまく出来なかったことを見てまだまだだと思った。そして決まっている部品を使って新しいことを考えて作ることも大変だと思った。

コメントをお願いします

  • フィールドの詳細な説明は必要ありません。ロボコンのページにリンクを張るだけで十分だと思います。このレポート内で必要な箇所(ルールなど)に限定して説明してください。 -- 松本 2008-08-08 (金) 20:18:50


添付ファイル: fileunder.jpg 285件 [詳細] fileside1.jpg 292件 [詳細] fileside.jpg 314件 [詳細] filegear.jpg 306件 [詳細] filefront-ball1.jpg 334件 [詳細] filefront-ball.jpg 309件 [詳細] filefront1.jpg 362件 [詳細] filefront.jpg 285件 [詳細] fileback.jpg 309件 [詳細] filearm3.jpg 299件 [詳細] filearm2.jpg 282件 [詳細] filearm1.jpg 290件 [詳細] fileall.jpg 293件 [詳細] file9.JPG 291件 [詳細] file8.jpg 282件 [詳細] file7.JPG 282件 [詳細] file6.JPG 293件 [詳細] file5.JPG 150件 [詳細] file4.JPG 301件 [詳細] file3.JPG 143件 [詳細] file2.JPG 285件 [詳細] file1.JPG 338件 [詳細] file積載部分全体.JPG 136件 [詳細] file積載部分上部.JPG 124件 [詳細] file積載部分前面.JPG 141件 [詳細] file積載部分アーム.JPG 137件 [詳細] file積載部分ギア.JPG 128件 [詳細] file車体全体.JPG 136件 [詳細] file車体上部.JPG 135件 [詳細] file車体側面.JPG 119件 [詳細] fileRCXと本体の接合部分.JPG 135件 [詳細] fileコース.JPG 146件 [詳細]

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