- 追加された行はこの色です。
- 削除された行はこの色です。
[[2010b]]
#contents
*課題の内容 [#id2761c6]
ピンポン玉をできるだけたくさんカゴに入れる (単独競技およびリーグ対戦)
**フィールドの説明 [#s513a6a8]
・フィールドは約160cm×110cm
・カゴは2つで、ともに上面の高さは30cm,上面の外形は20cm四方の正方形
・ピンポン玉は14個で、2のカゴの支柱の間に2列に並べて置かれている。
・スタート地点は30cmx40cm
・黒い線の太さは約25mm
**ルール [#g2606a81]
***基本ルール [#l9afc238]
・スタート時は「スタート地点」の内部以外に接していないこと。
・スタート時のロボットは2個を越えないこと (スタート後はいくつに分裂してもかまわない)。
・開始の合図から5秒以内にRCXのスタートボタンを押す作業を完了すること。
・競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
・途中でうまく動かなくなった場合、1回限り再スタートすることができる。
・競技時間は無制限。ただし審判が、競技続行不能と判断した場合は途中で終了する。
***基本得点の計算方法 (単独競技) [#b538e259]
・ピンポン玉をスタート地点から遠い方のカゴに入れれば一つ2点、近い方のカゴに入れれば一つ1点
・1個のRCXを含むロボットが実際のスタート地点に帰還できれば+2点。
・すべてのロボットがスタート地点に帰還できればさらに+2点。ロボットの一部(半分以下)がゴールからはみ出している場合には1点減点(つまり+1点)。
***リーグ戦の得点 [#xf42008a]
・スタート地点から遠い方のカゴに入れたピンポン玉の個数を競う。近い方のカゴに入れれば相手のポイントになる。
・相手よりたくさんピンポン玉を入れれば勝点3点、引き分けの場合は1点、ただし共に一つも入れることができなければ、0点。
***技術点の計算方法 [#xdc8bab3]
以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(4チーム)+TAが10点満点で採点し平均点を求める。
<得点の目安>
・ピンポン玉の収集 (2点)
・ピンポン玉の運搬 (2点)
・ピンポン玉をカゴに入れる動作 (3点)
・その他 (3点)
*メンバー [#fcadf1f1]
・ヒカル
・理香
・小柳
・竹園
*ロボットについて [#id2145ce]
**本体 [#o15b0364]
***ピンポン玉を集めるロボット [#ba2580b3]
今回の課題で重要な点の一つである、ピンポン玉を集めるロボットを作りました。このロボットを作るに当たって、まずどういう風にピンポン玉を集めるかについて話し合いました。始めは一つ一つ丁寧に運んで行くロボットにしようと思っていましたが、それにすると非常にロボット自身が重くなり、運ぶのに時間がかかるので、個人競技はともかく、早さが勝負の鍵となるトーナメント戦ではそのことがネックになるので、少し遅いけど一気に運べるロボットを作ることにしました。その結果囲いを上から落として一気に全部運ぶロボットができました。少し重くなりましたが、一つ一つ運んで行くロボットよりずっと早く動けるようになりました.
#ref(201102021615000.jpg)
***ピンポン玉をカゴに入れるロボット [#u31ccb46]
試行錯誤しながらこの形になりました。アームがかごのふちにあたるとボールが落ちる仕組みです。もう一つのロボットの方で壁をつくり、それを利用してアームの先端でボールが拾えます。アームの速度によってはボールが落ちてしまうのでギアをつけ、アームの回転する速度を上げました。
今回の課題は高さがあるためスロープなども考えましたが、ロボットに設置するのが難しく断念しました。また、位置が正確であった方がボールがかごに入りやすいので光センサや回転センサを利用して、確実なものにできればよかったと思います。
**工夫点・苦労した点 [#l981f87f]
***ピンポン玉を集めるロボット [#xb750be3]
今回このロボットを作るに当たって、一番苦労したことは直前で今までの方針を変えて一気に運ぶロボットに作り変えたことです。今までは一つずつ運ぶロボットだったので一から作り直すのはとても苦労しました。そしてこのロボットの工夫した点は、囲いを上げても外に逃げないように側面だけ別の囲いを作り、前の部分を開けておいてもう一つのピンポン玉をカゴに入れるロボットと連結出きるようにしたところです。
#ref(201102021617000.jpg)
***ピンポン玉をカゴに入れるロボット [#hf7cb473]
*プログラム [#md91cc51]
**ピンポン玉を集めるプログラム [#dee484b1]
***右用 [#i3f1f904]
#define Catch OnRev(OUT_B);Wait(40);Off(OUT_B); //囲いを下ろす
#define Release OnFwd(OUT_B);Wait(50);Off(OUT_B); //囲いを上げる
#define Left(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);//右に回る
#define Right(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_A+OUT_C); //左に回る
#define Forward(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //前進する
#define Retreat(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //後退する
#define Turn_time 68
task main(){
Left(Turn_time); //90度旋回
Forward(175);
Right(Turn_time + 5); //90度旋回
Forward(350);
Right(15); //角度修正
Forward(210);
Right(Turn_time + 15); //90度旋回
Left(10); //角度修正
Forward(95);
Catch; //ピンポン玉キャッチ
Wait(30);
Retreat(120);
Left(Turn_time); //90度旋回
Forward(550);
Right(Turn_time + 10); //90度旋回
Forward(570);
Right(115);
Retreat(6000); //終了
}
***左用 [#w1f8f2a2]
#define TURN_TIME 068
#define go_straight(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //前進する
#define back(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //後退する
#define turn_left OnRev(OUT_C);OnFwd(OUT_A);Wait(TURN_TIME);Off(OUT_A+OUT_C); //左を向く
#define turn_right OnRev(OUT_A);OnFwd(OUT_C);Wait(TURN_TIME);Off(OUT_A+OUT_C); //右を向く
#define get OnRev(OUT_B);Wait(020);Float(OUT_B);Wait(050);Off(OUT_B); //枠を下ろす
#define release OnFwd(OUT_B);Wait(025);Off(OUT_B); //枠を上げる
task main()
{
go_straight(280); //右へ行く
turn_left;
OnFwd(OUT_C); //軌道修正
Wait(020);
go_straight(460); //奥へ移動
turn_left;
go_straight(060); //ピンポン玉に近づく
get; //ピンポン玉回収
back(200); //戻る
turn_right;
go_straight(200); //軌道修正しつつ、奥へ移動
OnFwd(OUT_C);
Wait(030);
go_straight(230);
turn_left;
go_straight(250); //軌道修正しつつ、左へ移動
OnFwd(OUT_C);
Wait(050);
go_straight(250);
OnFwd(OUT_A); //向きを調整
OnRev(OUT_C);
Wait(130);
back(1000); //角まで下がる
}
**ピンポン玉をゴールにいれるプログラム [#x97f5c03]
***右回り [#k07baf39]
#define go_forward(t) OnFwd(OUT_A+OUT_C); Wait(t); Off(OUT_A+OUT_C); //前進
#define go_back(t) OnRev(OUT_A+OUT_C); Wait(t); Off(OUT_A+OUT_C); //後進
#define turn_right(t) OnFwd(OUT_C); Wait(t); Off(OUT_C); //右に回る
#define turn_left(t) OnFwd(OUT_A); Wait(t); Off(OUT_A); //左に回る
#define turn_left(t) OnFwd(OUT_A); Wait(t); Off(OUT_A); //左に回る
task main()
{
SetSensor(SENSOR_2,SENSOR_ROTATION); //SENSOR_1は回転センサ
SetSensor(SENSOR_2,SENSOR_ROTATION); //SENSOR_2は回転センサ
SetSensor(SENSOR_1,SENSOR_TOUCH); //SENSOR_1はタッチセンサ
SetSensor(SENSOR_1,SENSOR_TOUCH); //SENSOR_2はタッチセンサ
ClearTimer(0);
until(Timer(0)>=20); //秒まってから移動開始
until(Timer(0)>=300); //30秒まってから移動開始
go_forward(130);
OnFwd(OUT_A); OnRev(OUT_C); Wait(89); Off(OUT_A+OUT_C);
go_forward(783); //右隅へ移動
OnFwd(OUT_A); OnRev(OUT_C); Wait(89); Off(OUT_A+OUT_C);
Off(OUT_A+OUT_C);
Wait(100); //いったん止まる
turn_right(88); //本体の角度を調節
Off(OUT_A+OUT_C);
Wait(100);
repeat(7)
{ //以下、ピンポン玉を拾いかごにいれる動作 30回繰り返す
go_forward(30);
Off(OUT_A+OUT_C);
Wait(100); //少し前に進む
go_forward(783); //右隅へ移動
OnRev(OUT_B); Wait(30); Float(OUT_B); Wait(10); Off(OUT_B);
//アームを後ろへ下ろす。この時フロートを使い動作をなめらかにする
go_back(100); //ボールの位置へアームを持っていく
go_forward(150); //ボールをすくう
go_back(300); //かごに向かう
OnRev(OUT_B); Wait(50); //アームを少し上げておく
if(SENSOR_1 == 1){ //この間、タッチセンサがかごの土台に触れたら
Off(OUT_A+OUT_C); //本体をとめ
OnFwd(OUT_B); Wait(50); //アームを前へ持っていく
}
go_forward(100); //次の繰り返しへ
}
}
***左回り [#g247fe2e]
#define go_forward(t) OnFwd(OUT_A+OUT_C); Wait(t); Off(OUT_A+OUT_C); //前進
#define go_back(t) OnRev(OUT_A+OUT_C); Wait(t); Off(OUT_A+OUT_C); //後進
#define turn_right(t) OnFwd(OUT_C); Wait(t); Off(OUT_C); //右に回る
#define turn_left(t) OnFwd(OUT_A); Wait(t); Off(OUT_A); //左に回る
task main()
{
SetSensor(SENSOR_2,SENSOR_ROTATION); //SENSOR_2は回転センサ
SetSensor(SENSOR_1,SENSOR_TOUCH); //SENSOR_1はタッチセンサ
ClearTimer(0);
until(Timer(0)>=300); //30秒まってから移動開始
go_forward(130);
OnFwd(OUT_C); OnRev(OUT_A); Wait(89); Off(OUT_A+OUT_C);
go_forward(783); //左隅へ移動
Off(OUT_A+OUT_C);
Wait(100); //いったん止まる
Wait(100); //いったん止まる
turn_right(88); //本体の角度を調節
turn_left(88); //本体の角度を調節
Off(OUT_A+OUT_C);
Wait(100);
repeat(2)
{ //以下、ピンポン玉を拾い、かごにいれる 回繰り返す
repeat(30)
{ //以下、ピンポン玉を拾いかごにいれる動作 30回繰り返す
go_forward(70);
Off(OUT_A+OUT_C);
Wait(100);
Wait(100); //少し前に進む
OnRev(OUT_B); Wait(30); Float(OUT_B); Wait(10); Off(OUT_B);
//アームを後ろへ下ろす。この時フロートを使い動作をなめらかにする
go_back(100);
go_back(100); //ボールの位置へアームを持っていく
go_forward(150);
go_forward(150); //ボールをすくう
go_back(300);
go_back(300); //かごに向かう
OnRev(OUT_B); Wait(50);
if(SENSOR_1 == 1){
Off(OUT_A+OUT_C);
OnFwd(OUT_B); Wait(50);
OnRev(OUT_B); Wait(50); //アームを少し上げておく
if(SENSOR_1 == 1){ //この間、タッチセンサがかごの土台に触れたら
Off(OUT_A+OUT_C); //本体をとめ
OnFwd(OUT_B); Wait(50); //アームを前へ持っていく
}
go_forward(100);
go_forward(100); //次の繰り返しへ
}
}
*感想 [#h3157b89]
**ヒカル [#x0ef6e56]
今回の授業でロボティクスゼミは最後になりましたが、今まで学んだことをしっかり生かせたと思います。今回の課題は今までとは違い4人で作るので、都合の合う日が少なくそれが一番大変なことだったと思います。ロボティクスは今回で終わりですが、プログラミングはこれからも続けていくとおもいます。その時にこのロボ手きくすゼミで学んだことを思い出していければいいとおもいます。ロボット作りに関してはチームメイトに頼ってばかりでしたが、プログラミングで役に立てたのはうれしかったです。
**理香 [#od516610]
ロボットの機構についてはほとんど任せてしまいました。今回はプログラミングを中心に考えましたが、センサを使うなどもう少し今までやってきたことを生かして確実なものを作れればよかったと思います。よりよいものにするためには、問題を一つずつ解決し工夫を重ねていくことが必要だと思います。このゼミでは慣れないことが多く、なるべく楽なほうに行ってしまいました。今後はこの経験を生かし、妥協せずよりよいものをつくっていけるようにしたいと思います。
**小柳 [#id0b196c]
**竹園 [#z55edada]
今回は4人で集まる機会が少なくて大変でした。2つのロボットの動きを連動させるのは、僅かな誤差でも失敗を招いてしまうのですが、プログラミングではあまり高度な工夫をせずにシンプルで確実性に欠けるものになってしまいました。
~ 今回に限らず、この授業ではバラバラのパーツから目的を果たせるロボットを組み立てる作業、そして誤差が少なくなるようなプログラミングを考えるのに大変苦労しました。でもその苦労は同時に貴重な体験でもありました。非常に良い勉強になったと思います。
*コメント [#c39788d3]
意見・感想等がありましたら、ご自由にお書きください。
#comment