2018a/MemberOnly 課題3

コース・ルール

2018a-mission3.png

・競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 ・図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。
・上空部分は領域からはみ出していてもよい。
・Aタイプの空き缶を円Y内に、Bタイプの空き缶を円X内に運ぶ。
・開始の合図から5秒以内にスタートボタンを押す作業を完了すること。
・競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
・途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。

基本得点の計算方法
・運んだ空き缶の数×3点
・空き缶を積み重ねて置くことができば場合、2段目の空き缶一つにつき2点加算、3段目の空き缶一つにつき3点加算する。
・円内からはみ出している場合、半分以下なら1点減点、半分以上なら2点減点。
・間違った円内に空き缶を置いた場合は、1個につき1点減点。
・間違った円内の2段目に空き缶を置いた場合は1個につき3点減点、その上にある空き缶は0点

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

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

ロボットの概要

全体

ダウンロード (1).png

今回のロボットは基本的には前回の課題からの反省をもとに発展させたものである.機体を一つにすることでプログラムの量や調整時間の短縮を目指した. カンの移動,ライントレースをする際の障害にならないようにできる限り小型で床に対してスペースを取らないように工夫した.
当初は超音波センサでカンの位置を特定して行う予定であったが,構造上の折り合いなどから断念している.

背面

ダウンロード.png

下部がマスター,上部がスレイブでありマスターについては本体の移動について担当しスレイブについてはカンを挟む機構を担当している.
後輪部分は車輪だと安定せずカンの移動に支障をきたすため摩擦ができるだけ少なくなるようなパーツを設置させている.結果的にこれがブレーキのような役割になりモータを停止した時のブレを少なくすることが出来た.

下部

ダウンロード (2).png

移動については基本的に前方につけている赤外線センサを利用して走行している
モーターにギアを噛ませることで,カンの移動時に本体を動かす必要がなく,一度回転の軸となる位置決定すればいいので余計なプログラムやブレを少なくしている.
また減速ギアになっていることから急な動きを抑えることができ,特に急カーブの際やカンを掴む際の失敗を抑えている.

はさみ

ダウンロード (3).png

ギアを追加することで左右のはさみが同じ角度で動くようにした.
カンの持ち上げ,下す動作のミスを減らすために挟むだけでなく上下にも動作するようになっている.
カンを挟んでいる間モーターは停止しているので,その間の力を輪ゴムの弾性力でゆとりを持たせ補っている.(ゴムタイヤだけでは不十分であった)

側面

ダウンロード (4).png

本体二つの重さは非常に大きいため,剛性(ブレ)に注意してロボットを作る必要があった.そのため本体,モーターとも強力に接続されている.

戦略

InkedInked2018a-mission3_LI.jpg

ロボットの概要で説明した通り回転時にはさみの位置がそのままになる構造になっているので,Gに到着した時点から回転のみでカンの移動を行うようにした.
カンを重ねて置く際の位置はモーターの角度などで調整したが基本運任せであった.

\通隶のじてんでYの二段目をはさみ部分で飛ばす.

G地点に到着

Xの二段目を掴み,三段目については回転する際の遠心力で飛ばす.^

Yの二段目にで掴んだカンを乗せる.

i以上の1〜4で二段+一段の得点.

プログラム

マスター(駆動部)

#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;
  }
}

}

解説

スレイブ側はマスターの命令を受けてはさみを動かす部分を担当している.

結果と反省点

ロボットの製作段階では戦略通り成功していたが,ロボコン本番ではG地点をうまく認識できなかったがために一つも移動することが出来なかった.G地点の認識は曲がり角からの時間で判定したが時間の経過や何らかの原因で調整が崩れてしまったようである.
ロボットやプログラムにも反省点はあるがこのような初歩的な失敗を犯してしまったのは,プログラム班とロボット班という風に分け結果意思の疎通が疎かになってしまったからだと思います.自分たちのやるべきことだけをやって半ば人任せのような形になったことが,時間の足りない中での作業に非常に非効率的であった.

0点という結果に終わってしまったことは非常に残念でなりません.技術点についても説明不足で点数がもらえず,上記のギアやはさみについてもしっかり説明するべきであったと反省しています.


添付ファイル: fileInkedInked2018a-mission3_LI.jpg 6件 [詳細] fileInked2018a-mission3_LI.jpg 4件 [詳細] file2018a-mission3.png 4件 [詳細] fileダウンロード (4).png 5件 [詳細] fileダウンロード (3).png 5件 [詳細] fileダウンロード (2).png 3件 [詳細] fileダウンロード (1).png 6件 [詳細] fileダウンロード.png 5件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-08-28 (火) 13:07:25 (54d)