フィールドの説明
◦フィールドは約160cm×110cm
◦15個のピンポン玉は19mm角の角材に囲まれた領域にある (角材の外周の一辺は約20cm)。
◦スタート地点の壁および中央の障害壁の断面は約89mm x 38mm
◦中央の障害壁のは中央付近の20cmのみ高さが約半分(45mm)になっている
◦黒い線の太さは約25mm
基本ルール
◦スタート時は「スタート地点」の内部以外に接していないこと。
◦スタート時のロボットは1個を越えないこと (スタート後はいくつに分裂してもかまわない)。
◦開始の合図から5秒以内にRCXのスタートボタンを押す作業を完了すること。
◦競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
◦途中でうまく動かなくなった場合、1回限り再スタートすることができる。
◦競技時間は無制限。ただし審判が、競技続行不能と判断した場合は途中で終了する。 基本得点の計算方法 (ロボット本体の帰還)
◦最低1個のRCXを含むロボットが右側に移動できれば+5点、障壁を越えて右側に移動した場合はさらに+5点。
◦ピンポン玉に少しでも触れることができれば+5点。ピンポン玉に触れることができなかった場合は以下の得点はなし。
◦最低1個のRCXを含むロボットが図の右側から左側に帰還できれば+5点、障壁を越えて左側に移動した場合はさらに+5点。
◦最低1個のRCXを含むロボットがゴールに帰還できれば+10点。
◦複数回往復した場合は、2回目以降の往復は一回あたり+1点とし、最大で+5点 (合計6往復の場合)とする。
◦スタート時のロボットが全てゴールに帰還できれば+5点。ロボットの一部(半分以下)がゴールからはみ出している場合には2点減点(つまり+3点)。ただし帰還できない部分があればパーツ1個ごとに-1点、最大-5点。 基本得点の計算方法 (ピンポン玉)
◦ピンポン玉1個を持ち帰れば+3点。ピンポン玉を持っているロボットが完全にゴール内にあれば、地面に接触していない限りピンポン玉がゴール外の位置にあってもよい。
◦ゴール外側の黒線の内部にまで移動できているピンポン玉があれば+1点
◦ゴールに運んだボール5個ごとにボーナス点10点 技術点の計算方法 以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(9チーム)+TAが20点満点で採点し平均点を求める。得点の目安:
◦壁を越える動作 (3点)
◦ピンポン玉の収集 (3点)
◦ピンポン玉の運搬 (3点)
◦帰還の動作(3点)
◦2台のRCXの連携 (3点)
◦その他 (5点)
カンウ 機械システム工学科
ドン 機械システム工学科
K.H 電気電子工学科
D.Y 情報工学科
てらすぃー 芸術教育専攻
色々案は出たのですが、そのなかから現実的だったものをいくつか紹介します。
1.中央の壁の乗り越え、ボールの回収、集積などすべての動作が可能なオールマイティータイプのロボットを1台作る。
2.片方のロボットが中央の壁の乗り越えの補佐とボール集積を担当し、もう片方が壁を乗り越えてのボール回収作業を担当する、さらに中央で互いにボールの受け渡しをするロボット。
3.片方のロボットは中央の壁を越えるための橋をかける作業だけを担当し、もう片方が集積と回収を担当するロボット。
4.片方のロボットは中央の壁を越えるための橋をかける作業だけを担当し、もう片方が1回の回収で大量のボールをとるタイプのロボット。
最終的に4番の案でいくことに決まりました。
■これがこのロボット最大の特徴である中央の壁を越えるための橋です。
■橋を下ろした状態です。滑り台のようになっています。ちなみに上の平らな部分をもう片方のロボットが行き来します。
■橋などの部分が網目構造になってしまっていますが、今回上に乗る機体はキャタピラー移動なので大きな問題にはならず、むしろパーツの節約に一役買っています。
■横から見るとL字型になります。
■開始時に橋は上がった状態ですが、上に待機しているロボットが発車時に橋を押すことで橋が倒れます。戦国時代に城攻めをする際に使用された橋(梯子?)からヒントを得ました。
■ベースとなる車体部分にはやはり説明書に乗っている旋回性能が優秀なドライブベースを使用しています。
■橋を下ろす前の状態です。大きな壁のような威圧感があります。
■橋にモーターなどがついていないことが分かると思います。
■そのため、この橋は基本的に1度下ろすと上げることはできませんが、移動時の揺れ程度では橋は下りません。またこれによりモーターの節約が出来たため他の部分に回すことができました。
■この写真では台部分の後方に壁パーツが付いていませんが、本番では玉回収ロボのタッチセンサーを当てるための小さな壁が付けられていました。
■また、本番では思ったより大きくなってしまった玉回収ロボを載せるため台部分が拡大し、傾斜を緩やかにするため橋部分を長くしたりしました。それにより中央の壁がへこんだ部分以外からでも反対側にわたれるようになるという事態も発生しましたが、低い部分があったらそこから渡りたいという人間の性質には逆らえず結局中央から渡りました。
■まずまたもや真っ先に目に入るであろう大きな網状の構造が特徴の一つです。この大きな網のおかげで1回でピンポン玉をがっつり12個(理論上の最大値)も取れるのでいちいち他の場所に1度ピンポン玉を集積する必要がありません。
■上でも述べたようにこの機体のサスペンション付きキャタピラーは道路条件の良くない橋を渡るのに役に立っています。
■この写真では少々見難いですが、網の下にタッチセンサーが付いていて、これをボールの前の板や橋ロボの壁部分に当てることで停止位置を判別します。
■後方に見えている大きなタイヤは実はそれ自体ではあまり大きな意味は無く、重量調節に乗せたモーターのおまけのようなものです。しかし、まったく無意味というわけではなく、理論はよくわかりませんが多少はバランス調節の役に立っているようで、付けていたほうが成功率は高かったです。
■写真からは見えませんが、中央下部には光センサーが前後に2基搭載されていて、端から降りた後、2つのセンサーが両方黒いラインを感知したら前進するという風になっています。しかし、前後直線型のセンサー配置ではなかなか両方が黒いラインを感知した状態にはならず、結局ぐるぐる回り続けてしまうという事態に陥ってしまいました。今思うと精度は多少すてて1つのセンサーで黒いラインを探したほうがよかったのかもしれません。ちなみに2つのセンサーを左右に配置するだけのスペースは下部にはありません。
■大量に見えているギアは網部分を上下させるためのものです。きっちりとかみ合う位置を探すことと、重い網部分を持ち上げても壊れないだけの強度を維持することが大変でした。
■また、上のほうでキャタピラーに関して利点をかなり述べましたが、実は光センサーで動かさないとまっすぐ進まないというデメリットもあります。
1.ロボットの移動距離が多くなるといろいろと動きがずれてくる可能性があるため、できるだけ少ない動作ですむような構造にした点。例えばボールは大きな網で1回掬うだけで大量に取得できるため、何回もボールをとる動作をしたりいちいち別のところに集積する必要がありません。
2.ドライブベース(車体部分)にこだわりました。橋ロボは旋回性能と上の台が水平に近い状態であることが必要なので教科書のドライブベースのタイヤを前後同じものにしたものを使用し、また玉回収ロボはパーツ数の制約上でこぼこな橋を渡らなければならないのでキャタピラーを使用しています。
3.橋ロボの橋部分をモーターを使用しなくても橋を下ろせる構造にした点。これによりモーターや構造に余裕ができました。
4.橋ロボはドライブベースに余裕があるため、センサー類の増設及び撤去が楽にできる構造になっている点。
5.橋ロボの橋は、上に乗っているロボットが押すと下ろせるが、移動中のゆれでは下ろせないという絶妙な固さになっている点。
1.まず、やはりこれだけ大掛かりなものになってくるとパーツ数の制約と機体の強度をうまくやりくりするのが難しかった点です。こればかりは数をこなして同じ働きでもよりパーツ数の少なくしたり、あるいは同じパーツ数でも固くしたりということをできるようにならないといけないと思います。
2.上に乗る玉回収ロボが大きくなりすぎたため、橋ロボの台に余裕が無く少しの移動ミスで転落してしまう点。やはり上に乗せるロボットなのでもっと小型化できるような構造が必要だったと思います。
3.橋ロボの橋部分の強度に難がある点。橋構造は平らなパーツを多く使うので、台座がエレベータのように動く構造にするなどが解決策になると思います。
4.玉回収ロボは前面に構造の余裕が無くタッチセンサーにバンパーを付けられずかなり反応がシビアになってしまった点。橋を上る関係上あまり下のほうにつけると引っかかってしまうので、中央を渡る手段を別のシステムにする、玉回収ロボの上方につけたタッチセンサーで下のほうの壁をタッチできるようなバンパーを作るというのが解決策になると思います。
5.橋ロボは一度橋を下ろすと橋を上げることができないため、帰りはゴールまでの移動がとてもシビアである点と長すぎてぴったりゴールに入ってもゴールから橋の端がはみ出してしまう点。解決策としては橋を上下させられるようにする方法、エレベーター式にする方法、いっそ使い終わった橋はゴール側の地面にパージしてしまう方法などがあると思います。
プログラミングを説明する大まかな絵です。
#define turn_right(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_A+OUT_C); //t秒右回転をturn_right(t)と定義 #define turn_left(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C); //t秒左回転をturn_left(t)と定義 #define limit 40 //光センサーの閾値を40とする task main() { SetSensor(SENSOR_1, SENSOR_LIGHT); //センサー1に光センサーをセット SetSensor(SENSOR_2, SENSOR_TOUCH); //センサー2にタッチセンサーをセット SetSensor(SENSOR_3, SENSOR_LIGHT); //センサー3に光センサーをセット int j=0; //交差点に到達した回数初期値は0 ClearMessage(); ClearTimer(0); OnFwd(OUT_A+OUT_C); until((SENSOR_1 < limit) && (SENSOR_3 < limit)); //スタート支点の黒線 Off(OUT_A+OUT_C);Wait(10); OnFwd(OUT_A+OUT_C); until((SENSOR_1 < limit) && (SENSOR_3 < limit)); //コースの黒線 Off(OUT_A+OUT_C);Wait(10); turn_right(100); //90度旋回 Off(OUT_A+OUT_C);Wait(10); while(J<1){ //jが一より小さい間 if ((SENSOR_1 < limit) && (SENSOR_3 < limit)){ //交差点の条件 Off(OUT_A+OUT_C); turn_left(100); j++; }else if ((SENSOR_1 > limit) && (SENSOR_3 < limit)){ //左回転 OnRev(OUT_A);OnFwd(OUT_C); }else if ((SENSOR_1 < limit) && (SENSOR_3 > limit)){ //右回転 OnFwd(OUT_A);OnRev(OUT_C); }else{ //直線条件 OnFwd(OUT_A+OUT_C); } Wait(5); } go_straight(50); //壁にぶつける Off(OUT_A+OUT_B+OUT_C); ClearTimer(0); until(Timer(0) == 150); //玉回収ロボットが戻ってくるまで OnRev(OUT_A+OUT_C); //バックさせるが、ここからは前と後ろが逆になる until(SENSOR_2 == 1); //壁にぶつかるまで Off(OUT_A+OUT_C); turn_right(100); //回します OnRev(OUT_A+OUT_C);Wait(100); while(SENSOR_2 == 0){ //壁にぶつかるまでライントレース if ((SENSOR_1 < limit) && (SENSOR_3 < limit)){ OnFwd(OUT_A);OnRev(OUT_C); //もし両方かかってもゴールのほうに回ります。 }else if ((SENSOR_1 > limit) && (SENSOR_3 < limit)){ OnFwd(OUT_A);OnRev(OUT_C); }else if ((SENSOR_1 < limit) && (SENSOR_3 > limit)){ OnRev(OUT_A);OnFwd(OUT_C); }else{ OnFwd(OUT_A+OUT_C); } Wait(5); } OnFwd(OUT_A+OUT_C);Wait(300); //バックして、 OnRev(OUT_C);Wait(150); //右折してゴールに入ります。 Off(OUT_A+OUT_B+OUT_C); }
#define GO_STRAIGHT(t) OnFwd(OUT_A+OUT_C);Wait(t); Off(OUT_A+OUT_C); //t秒前進をgo_straight(t)と定義 #define GO_BACK(t) OnRev(OUT_A+OUT_C);Wait(t); Off(OUT_A+OUT_C); //t秒後退をgo_straight(t)と定義 #define Do 523 //音楽のための定義 #define Re 587 #define Mi 659 #define Fa 698 #define Sol 784 task main() { SetSensor(SENSOR_2,SENSOR_TOUCH); ClearMessage(); ClearTimer(0); start lift; //ずっとリフトを持ち上げてます Off(OUT_A+OUT_B+OUT_C); until(Timer(0) == 160); GO_BACK(200) //後進で橋から降ります OnFwd(OUT_A);OnRev(OUT_C);Wait(180); //回ります OnFwd(OUT_A+OUT_C); //ピンポン玉がある壁にぶつかるまで前進します until(SENSOR_2 == 1); Off(OUT_A+OUT_C); GO_BACK(130); //バックします stop lift; //リフトを下ろします Off(OUT_B); GO_STRAIGHT(100); //掬います start lift; //リフトを上げます GO_BACK(30); OnFwd(OUT_A);OnRev(OUT_C);Wait(180); //戻ります OnFwd(OUT_A+OUT_C); until(SENSOR_2 == 1); //橋ロボの上の壁にぶつかるまで Off(OUT_A+OUT_B+OUT_C); play_music(); //音楽を演奏します } sub play_music() // 音楽を演奏するタスク { while (true) { PlayTone(Mi,25); Wait(30); PlayTone(Re, 5); Wait(10); PlayTone(Do,15); Wait(20); PlayTone(Re,15); Wait(20); PlayTone(Mi,15); Wait(20); PlayTone(Mi,15); Wait(20); PlayTone(Mi,35); Wait(40); PlayTone(Re,15); Wait(20); PlayTone(Re,15); Wait(20); PlayTone(Re,35); Wait(40); PlayTone(Mi,15); Wait(20); PlayTone(Sol,15); Wait(20); PlayTone(Sol,35); Wait(40); PlayTone(Mi,25); Wait(30); PlayTone(Re, 5); Wait(10); PlayTone(Do,15); Wait(20); PlayTone(Re,15); Wait(20); PlayTone(Mi,15); Wait(20); PlayTone(Mi,15); Wait(20); PlayTone(Mi,35); Wait(40); PlayTone(Re,15); Wait(20); PlayTone(Re,15); Wait(20); PlayTone(Mi,25); Wait(30); PlayTone(Re, 5); Wait(10); PlayTone(Do,55); Wait(60); Wait(20); } } task lift() //持ち上げるタスク { OnFwd(OUT_B); }
まず、みんなと議論をしていっしょにロボットを作って楽しい時間だったと思います。やっぱり今回も時間をあわせるのも難しかったし、ちゃんとしたロボットを作れなかったのがとても残念ですが、ロボコンも含めてこの授業でロボットは思ったとおり動いてくれないとか、こんな動きをさせるにはこのような仕組みが必要だとかいろいろ学んだことがあったし、プログラミングのほうにももっと興味を持つことができたのもよかったと思います。
帰省するための飛行機のチケットをロボコンがいつあるかも知らないうちに予約したため、本当に最初しか参加することができなくて残念だった。同じチームの人がうまくやってくれていて非常に助かりました。この講義を通して、もちろん、ロボットに対する関心もかなり湧きましたし、なによりチームワークの大切さを学べたと思います。
最初はテスト週終了後まるまる4日もあれば余裕で完成すると思い、テスト週の日曜日までを過去のページの再編集時間に割り当て、月曜日から集まれる人で集まれば余裕で完成すると思っていました。しかし連絡やスケジュールがうまく行かず結局水曜日と木曜日に3人がたったの18時間程度集まっただけということになり、結局最終調整をする時間がほとんど無かったのが残念でした。また全体としては、初めこの授業を取った時は「課外時間が多い」といってもせいぜい10時間もやれば余裕だろうと思っていたので、実は30時間以上余裕で必要だということにびっくりしましたが、ものづくりの楽しさと厳しさを味わえた貴重な時間だったと思います。
機体に一日、プログラムと微調整に一日。余裕。なんて思ったのが運のつきで、せめてプログラムと微調整は別日程にするべきでした。得意分野の工作は割と生かせたと思いました。プログラムはあまりでしたが。 全体を通してチームメイトとの密な連絡を要求される授業で、将来社会に出てから必要とされる能力を学べた感じました。また今までまったく知らなかったプログラミングを端っこだけでも齧れたので、良い経験になりました。
コメントをお願いします。