*Mission2(ロボコン)レポート [#kdb5cd9e] 目次一覧 #contents **メンバー紹介 [#zf7cd4f1] -blackcat…ネタ担当。積極的にアイデアを出すがその内容が意味不明だったり、おかしな発言を繰り返す内に使えない子ポジションが確立してしまった。今回は音楽制作も担当。&br;レポートのページは[[2012b/Member/blackcat/Mission2]] -scar…blackcatくんと共同で音楽制作をし、その類稀なる才能を発揮してくれた。なんでもドラマーらしい。かっこいいですね。&br;レポートのページは[[2012b/Member/scar/Mission2]] -toshi…プログラムの原案を出し、さらに機体の改良にも携わった。また、何度も素晴らしいアイデアを出し、チームに希望の光を見せてくれた。&br;レポートのページは[[2012b/Member/toshi/Mission2]] -yoshi…このレポートの作成者。機体の原案を出した。toshiくんのアドバイスをもとに機体の改良、プログラムの修正作業に携わった。&br; (アルファベット順) **課題の内容 [#b9b0d6b8] ***概要 [#dd83266e] 紙パックを所定の位置から所定の位置に運搬する。 ロボコンのフィールド平面図 #ref(./robocon2012b.png,80%,robocon_field) ''フィールドの説明'' --フィールドは課題1で使用した紙を2枚つなぎ合わせる (向きは自由) --白い紙パックと黒い紙パックがそれぞれ3個づつ対角のゴール(課題1のゴール)に置かれている (前1個、後2個の2列に配置する) --2枚の紙のつなぎ目に断面が約3cm×4cmの角材を両面テープまたは押しピンで貼り付ける。 --黒い線の幅は20mmとする ***ルール [#gb56c77a] ''基本ルール'' --白い紙パックと黒い紙パックを入れ替える。 --競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 --課題1のスタート地点からスタートする。 --スタート時のロボットは2個を越えないこと (スタート後はいくつに分裂してもかまわない)。 --開始の合図から5秒以内にスタートボタンを押す作業を完了すること。 --競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 --途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 --最終的にゴールに運び込まれた紙パックの数で点数を計算する。 ''基本得点の計算方法'' --運びこまれた紙パックに1個つき5点。 --紙パックが半分以上ゴールからはみ出している場合は、1個1点、はみ出している部分が半分未満の場合は1個3点とする ''技術点の計算方法'' -以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。 &br;得点の目安: --紙パックまでたどり着く動作 (3点) --紙パックを運ぶ動作(2点) --障害物を越える動作 (4点) --2台以上のロボット、あるいは単体のロボットの場合は2台のRCX,NXTの連携の良さ(3点) --自立型のロボットとしての形や動作の美しさ、斬新さ(3点) --その他 (4点) RIGHT:(画像及び文章は[[2012b/ロボコン]]より引用(一部変更有)) **ロボットの紹介 [#l7fe4118] 今回の課題は角材を超えて紙パックを運ぶ必要があったため、角材の両側にロボットを各一体ずつ、計2体のロボットを使用しています。&br; 機体を作成する段階で既にロボコンの期日が迫っていたので、プログラム作成の負担を軽くするためロボットは2台とも同じ構造にしました。 ***全体ついて [#w9c564b1] -コンセプト&br; まず、走行するための機構については、機体の大きさを気にする必要がないため、NXT付属のテキストに載っているモデルをそのまま引用することにしました。&br; 本体は、前方に配置するアームのスペースを確保するため、横向きにして後ろの方に配置しようと考えました。 &br;そして、パック回収のための機構を動作させるモータは、本体の前部に固定しようと思いつきました。 -構造の説明&br; 全体の構造としてはかなり単純なものになりました。&br; 本体を後方に固定し、駆動させるタイヤは本体の前方下部、パックを運ぶ機構は本体の前方上部に設置し、後部にキャスターを設けてあります。&br; タイヤの前方に光センサが取り付けられていますが、実際にはこれは使用しませんでした。&br; プログラム作成の最後の最後まで「もしかしたら使うかもしれない」と考えていたので、最後まで残る羽目となりました。&br; 完全に蛇足です。いらない子です。(付いたままでも全く問題ないので、悪い子ではないです。) #ref(./12bm233.jpg,100%,left_side) この写真はロボットの左側から撮影したものです。この写真の左がロボットの前方(進行方向)となります。 &ref(./12bm214.JPG,60%,top);&ref(./12bm208.JPG,60%,back);&br; 左の写真は上方から、右の写真は後方から撮影したものです。 ***パックを運ぶ機構について [#w85034af] -コンセプト -構造の説明 ***工夫・苦労した点 [#vabeb7eb] ***反省点と考察 [#c83abdcd] -機体に負荷がかかるとタイヤのモータ近くのパーツがモータの回転を阻害してしまうことがある。 **プログラムの紹介 [#o721ccc9] ***概要 [#e9ff5d03] 今回の課題は、プログラムを作成する段階で私達の能力では高得点を取ることは不可能だと判断したので、&br;とりあえずパックを最低2個(最高も2個)は運ぶ、といったプログラムとなっています。&br;また、ロボットは2台ですがプログラムはほとんど同じものを使っています。&br; 最初は所々でライントレースをすることで位置を調節するようなプログラムを組んだのですが、何回か試すうちにライントレースをすると逆に精度が下がってしまうと判明したので、&br;全ての動作を値を指定して実行させることにしました。&br;その際に、モータの回転角制御や左右のモータの同期を活用して、各動作の誤差を最小限にしようと努めました。 全体の動作の流れとしては +パックの前まで直進 +パックを回収 +その場で90度右旋回して直進 +パックを押して壁際に設置し、その後後退 ここで、ロボット2のみ7秒半ほど待機(パック回収の際ロボット同士が接触するのを防ぐため)&br; +90度右旋回して、スタート地点手前まで前進 +90度左旋回して、壁際まで前進 +反対側のロボットが設置したパックを回収 +後退して90度左旋回 +前進してパックを所定の位置まで運び、パックを放す +終了 といった様になります。 ***作成したプログラムとその詳しい説明 [#w5cbcf5d] ポートAはパックを運ぶ機構、ポートBは右タイヤ、ポートCは左タイヤに接続されています。 ''定数、サブルーチン等'' #define SPEED_H 45 //高速 #define SPEED_L 35 //低速 #define pi 180 //π=180° モータの稼働スピードと、モータの回転角制御のための角度の定数を用意。&br;各場面で最適な動作をするために、スピードを2段階設けてあります。 #define catch1 RotateMotor(OUT_A,SPEED_H,2*pi); 初期の位置に置いてあるパックを回収する動作。 sub catch2() { OnFwdSync(OUT_BC,SPEED_H,0); //前進 Wait(2000); Off(OUT_BC); OnFwd(OUT_A,SPEED_L); //パックをアーム内に取り込む Wait(1500); Off(OUT_A); Wait(200); OnFwdSync(OUT_BC,-SPEED_H,0); //後退 Wait(2000); Off(OUT_BC); OnRev(OUT_A,SPEED_L); //アームを上げる Wait(1200); Off(OUT_A); OnFwdSync(OUT_BC,SPEED_H,0); //前進 Wait(1000); Off(OUT_BC); OnFwd(OUT_A,SPEED_L); //パックを回収 Wait(1200); Off(OUT_A); Wait(200); OnFwdSync(OUT_BC,-SPEED_H,0); Wait(1000); Off(OUT_BC); } 角材の向こう側にあるパックを回収する動作。一回目の後退でパックを角材の自分側に引き込んで落とし、その後パックを回収します。 ''実行する動作'' task main() { OnFwdSync(OUT_BC,SPEED_H,0); //パックの前まで前進 Wait(2800); Off(OUT_BC); catch1; //パックを回収 Off(OUT_ABC); Wait(100); RotateMotor(OUT_B,-SPEED_L,2*pi); //右旋回 OnFwdSync(OUT_BC,SPEED_H,0); //少し前進 Wait(800); Off(OUT_BC); RotateMotor(OUT_A,-SPEED_H,3*pi); //アームを上げる OnFwdSync(OUT_BC,SPEED_L,0); //角材の前まで前進してパックを設置 Wait(900); Off(OUT_BC); OnFwdSync(OUT_BC,-SPEED_L,0); //後退 Wait(1000); Off(OUT_BC); RotateMotor(OUT_B,-SPEED_L,2*pi); //右旋回 ここまでが1〜4の動作です。&br;パックをより真っ直ぐに設置するため、途中までアームを下げた状態で運ぶようにしています。 ここで、一方のロボットは&br; Wait(7500); が入り、7秒半ほど待機します。 OnFwdSync(OUT_BC,SPEED_H,0); //スタート地点手前まで前進 Wait(1800); Off(OUT_BC); RotateMotor(OUT_C,-SPEED_L,2*pi); //左旋回 catch2(); //反対側のロボットが運んだパックを回収 RotateMotor(OUT_C,-SPEED_L,2*pi); //左旋回 OnFwdSync(OUT_BC,SPEED_H,0); //パックを運ぶ目的地まで前進 Wait(2000); Off(OUT_BC); RotateMotor(OUT_A,-SPEED_H,2*pi); //パックを設置 } ここまでで5〜9の動作です。もともとパックを2個運ぶことだけを目的としたプログラムなので、ここで終了です。&br; (ここに載せたプログラムは、ロボコンで実行したプログラムではなくそこから不要な部分を取り除いたものです。&br;使っていない定数や動作の定義を削っただけなので実際の動作は全く同じものとなっています。) ***工夫・苦労した点 [#e62e201e] -正確に旋回してくれるよう、モータの回転角を何度も調整した。 -アームがしっかり回ってくれるようにモータの回転速度を早くする、回転角を大きくする等の調整をした。 ***反省点と考察 [#i05dad03] -前進及び後退が時間を指定して動いているので、電池の残量によって移動距離が変わってしまう。&br;本番直前に調整の時間があったからいいものの、本来はこのような不確実な要素は入れるべきではなかったと思います。 -せっかく授業で学んだライントレースや通信を、取り入れて活用することができなかった。&br;学んだことを積極的に取り入れてより高度な動きをさせれば、もっと高い点数を取ることは可能だったと思います。&br;通信の仕方をよく理解していなかったので、その辺をしっかり学習しておくべきでした。 **ロボコンの結果 [#c8f96604] 反対側のパックを回収後、片方のロボットが旋回に失敗したため、最後まで運べたパックは1個だけでした。&br;点数は基本得点5点、技術点15.8点の合計20.8点となり、6チーム中3位となりました。 3位の景品をもらったので写真を載せておきます。 #ref(./12bm231.JPG,40%,robocon_prize) **全体の感想・反省等 [#v0cbb671]