- 追加された行はこの色です。
- 削除された行はこの色です。
#contents
*課題[#x66f4f8a]
~ボール運搬ロボット
~ボールを所定の位置から運び出し、決められた、ゴールに入れる。
*フィールドの説明 [#r091c709]
#ref(2008a/A8/ロボコン/コース.JPG,CENTER)
~フィールドの説明
~フィールドは約160cm×110cm
~1000mlの紙パックは約7.1cm×7.1cm×19.6cm
~ゴールの紙パックには約6cm四方の穴が2箇所開けられている
~ゴールの穴以外の部分は黒で覆われている
~フィールドの長辺の中央部におかれたゴールの紙パックの穴は上を向いている
~フィールドの短辺の中央部におかれたゴールの紙パックの穴は横を向いている
~外側の楕円の長径は128cm、短径は96cm
~内側の8の字の曲線部の曲率半径は24cmで、交差部は直交している
~黒い線の太さは約25mm
*[[フィールド:http://yakushi.shinshu-u.ac.jp/robotics/?2008a%2F%A5%ED%A5%DC%A5%B3%A5%F3]] [#x2104aa4]
*ルール [#fddb5105]
~ボールをそれぞれ向きの違う棒に挟まれた状態から運びだし、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 [#j4873845]
~予定
~�:ロボットは2台使用し、それぞれにボールを運ぶロボット、ボールを入れるロボットに役割分担する。
~�:ボールを入れるロボットは、得点の高い、上からボールを入れる方法のみを狙う。
-ロボットは2台使用し、それぞれにボールを運ぶロボット、ボールを入れるロボットに役割分担する。
-ボールを入れるロボットは、得点の高い、上からボールを入れる方法のみを狙う。
-直前のプログラム変更により、得点よりも技術点などに重点を置いた。
~
*ロボットの解説 [#ka77ecbd]
**ボールを運ぶロボット [#r99d4186]
#ref(2008a/A8/ロボコン/all.jpg)
-ロボットを上から見たロボットの全体の模様
~
~
~
#ref(2008a/A8/ロボコン/front.jpg)
-ボールを取っているロボットの前の模様
~
~
~
#ref(2008a/A8/ロボコン/front1.jpg)
-ロボットの腕が付いているロボットの前の模様
~
~
~
#ref(2008a/A8/ロボコン/side.jpg)
#ref(2008a/A8/ロボコン/side1.jpg)
-ロボットの左側と右側の模様
~
~
~
#ref(2008a/A8/ロボコン/back.jpg)
-ロボットを後から見た模様
~
~
~
#ref(2008a/A8/ロボコン/under.jpg)
-ロボットを下から見た模様
~
~
~
#ref(2008a/A8/ロボコン/arm1.jpg)
#ref(2008a/A8/ロボコン/arm2.jpg)
#ref(2008a/A8/ロボコン/arm3.jpg)
-ロボットの腕がボールを取っている模様
~
~
~
#ref(2008a/A8/ロボコン/front-ball1.jpg)
-ロボットの前に広い腕が二つあってボールを集めやすくように作った。
~
~
~
#ref(2008a/A8/ロボコン/front-ball.jpg)
-ロボットの腕がボールを取りやすくように付いた。
~
~
~
#ref(2008a/A8/ロボコン/gear.jpg)
-初めにはモーターから遠い腕に動力を伝えるためにゴムを使ってしたんだけど、うま伝えられなく、その代わりギアーを使った。
~
~
~
**ボールを入れるロボット [#u5d292e2]
#ref(2008a/A8/ロボコン/7.JPG)
~ボール運搬ロボットの全体
-ボール運搬ロボットの全体
~
~
~
#ref(2008a/A8/ロボコン/1.JPG)
~ボールが2個入ってもちょうどバランスがとれるようになっている。
-ボールが2個入ってもちょうどバランスがとれるようになっている。
~
~
~
#ref(2008a/A8/ロボコン/6.JPG)
箱の横を沿って動けるように、光センサーを右にずらした。
-箱の横を沿って動けるように、光センサーを右にずらした。
~
~
~
#ref(2008a/A8/ロボコン/4.JPG)
配線はゴムで縛ったり、パーツに巻きつけて、邪魔にならないようにした。
-配線はゴムで縛ったり、パーツに巻きつけて、邪魔にならないようにした。
~
~
~
#ref(2008a/A8/ロボコン/8.jpg)
~ボールを入れる部分がちょうど、箱の大きさとぴったり揃っているので・・・↓
-ボールを入れる部分がちょうど、箱の大きさとぴったり揃っているので・・・↓
~
~
~
#ref(2008a/A8/ロボコン/2.JPG)
~2個同時にボールを箱の中に入れることができる。
**ボールを入れるロボット [#u5d292e2]
-2個同時にボールを箱の中に入れることができる。
~
~
~
#ref(2008a/A8/ロボコン/9.JPG)
-RCXが重いので、ブロックでひっつけるだけでは不十分である。よって、写真の赤丸の部分のような部品を使って、本体とRCXを固定した。
~
~
~
*プログラムの解説 [#ofecf5c2]
**ボールを運ぶロボットのプログラム [#wd088372]
-初めにはラインとーレスをしながらボールを取ると思いました。
でも、ロボットを作るとき光センサーをつくところを考えず、付くために時間がたくさんかかってしまって直接移動してボールを取って他のロボットにあげるようにしました。それで、距離を計ることと失敗したらうまく動かなくなりました。
#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 );
}
**ボールを入れるロボットのプログラム [#q824b0ac]
***本番で使用したプログラム [#sdf303c6]
フィールドの端から上に穴のあいた箱の前まで行き、
もうひとつのロボットがボールをいれるの待ってから、箱にボールを入れるプログラムです。本番までにロボット等を完璧に作成できなかったため、このプログラムを作りました。~
この動作に関しては問題なく動きましたが、まっすぐ進まないといったロボット側の問題はありました。~
また本番に待つ時間を間違えるというミスもあり、本番ではうまくいきませんでした。
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);}
(作成者:三澤)
***最初に計画していたプログラム [#t126b594]
こちらが最初に計画していたプログラムで、外側の楕円をライントレースしながら箱にボールをいれる、というプログラムです。~
外側の楕円を時計回りに進み、ライントレースはロボット本体の左側についている光センサー1つで行います。~
ボールの受け渡しは外側の楕円と8の字が合流する部分で行います。両側の光センサーが黒を感知したら止まります。~
ボールを受け取ったら、上に穴の開いた箱の前に行くのですが、箱と黒い線が完全にくっついているため、ここで悩みました。~
タッチセンサーをつけ、箱を感知したらうまくよけて、箱の横に着くようにしてみましたが、これでうまくいくかは確認できてません。~
また、通信機能を使い、ボールの受け渡し地点まで来たら、ボールを運ぶロボットのほうにそれを伝えるようにしてみました。
#define BLACKLINE 45
#define SIGNAL_A 11
#define SIGNAL_B 12
#define TOUCH 1 + 1
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);
if(SENSOR_1 < BLACKLINE){ //左側の光センサーが黒線上なら直進
OnFwd(OUT_A+OUT_C); そうでない場合は右折
} else {
OnFwd(OUT_A);
Off(OUT_C);}
if((SENSOR_1 < BLACKLINE) && (SENSOR_3 < BLACKLINE)){
if((SENSOR_1 < BLACKLINE) && (SENSOR_3 < BLACKLINE)){ //両側の光センサーが黒線上なら停止する
Off(OUT_A+OUT_C);
ClearMessage();
while(Message() == 1){
while(Message() == 1){ //もう1つのロボットから返信があるまで、自分がボール受け渡し地点まで来たことを通信で伝える
SendMessage(SIGNAL_A);}
if(Message() == 1){
if(Message() == 1){ //返信が来たら、音を鳴らす
PlaySound(SOUND_CLICK);
ClearMessage();}
}
if(Message() == SIGNAL_B){
if(Message() == SIGNAL_B){ //相手から「ボールを乗せた」と通信があったら再びライントレースを始める
SendMessage(2);
OnFwd(OUT_A+OUT_C);}
if(SENSOR_2 == 1){
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);}
}
Wait(300);
Off(OUT_A+OUT_C);
OnFwd(OUT_B); //ボールを箱にいれる
Wait(30);
Off(OUT_B);
OnFwd(OUT_A+OUT_C);}
}
}
(作成者:三澤)
*工夫した点[#a1c33f0e]
-ボールを2個運ばせることにより、時間的にも見た目的にもすっきりする。
-ボールを運ぶロボットと、ボールを入れるロボットの連携を強調した。
-ボールを運ぶロボットがボールを適切にボールを伝えた後でボールを運ぶロボットはボールを入れるロボットが上から入れる箱にボールを入れている間に一人でボールを取って横からボールを入れる箱まで移動して一人で入れようと思った。
*難しかった点 [#g2349438]
~やはりボールを的確に受け渡し、的確にゴールするという精密さを追求するのが難しかった。
-やはりボールを的確に受け渡し、的確にゴールするという精密さを追求するのが難しかった。
-当初計画していたプログラムは、理論は完璧であるが、実際やってみるとどうしてもうまくいかず、結局、時間が足りなく即席で作ったプログラムに変更せざる負えなかった。
-思いをアルゴリズム化することがやはり難しかった。
*ロボコンの結果 [#f3455907]
~順位は惜しくも4位で、点数は10.5点でした。
-順位は惜しくも4位で、点数は10.5点でした。
*反省 [#a6b751b3]
~リハーサルではボールを箱に入れることができたが、本番では微妙な位置のずれや2つのロボットの連携のずれが要因で一点も得点することができなかった。
~本番前には入念なチェックが必要であった。
-リハーサルではボールを箱に入れることができたが、本番では微妙な位置のずれや2つのロボットの連携のずれが要因で一点も得点することができなかった。
-本番前には入念なチェックが必要であった。
-結果的に回転センサーや光センサーをうまく使えていたチームが優勝できたのだと思う。
*感想 [#bfdce8a8]
~理想を現実にするというのは、非常に難しいものであると思った。
-理想を現実にするというのは、非常に難しいものであると思った。大学でレゴブロックでこんなに悩むとは思ってなかった。でも、良い経験ができたと思う。
-今まで、プログラムを習ったんだけどまだ自分の考えをプログラム化することがうまく出来なかったことを見てまだまだだと思った。そして決まっている部品を使って新しいことを考えて作ることも大変だと思った。
*コメントをお願いします [#k1529703]
-フィールドの詳細な説明は必要ありません。ロボコンのページにリンクを張るだけで十分だと思います。このレポート内で必要な箇所(ルールなど)に限定して説明してください。 -- [[松本]] &new{2008-08-08 (金) 20:18:50};
#comment