乗松恵(途中リタイア) 松橋華世 朝妻陽
2台のロボットで紙コップを収集し、同じ番号の書かれている紙コップに重ねる
ロボコンのフィールド平面図
◦図の右半分の黄色い地点には、その数字と同じ数字が書いてある紙コップが置かれている。 また左半分のA,B,Cの地点にも1から3までの数字が書かれている紙コップが置かれているが、 どのコップをどの地点に置くかは直前にサイコロを振って次のように決める。
サイコロの目 A B C
1 .1 2 3
2 .1 3 2
3 .2 1 3
4 .2 3 1
5 .3 1 2
6 .3 2 1
基本ルール
◦競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。
◦図の右上のスタートエリアからスタートする(課題1と同じ)。接地している部分がスタートエリア内に入って入ればよい。
◦図の左半分にある紙コップを集めて、それぞれ右半分にある同じ番号の紙コップに重ねる。
◦右半分の紙コップは10cm内の移動は認める
◦開始の合図から5秒以内にスタートボタンを押す作業を完了すること。
◦競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
◦途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。
:基本得点の計算方法
◦同じ番号の紙コップに重ねることができれば、1組で10点
◦番号が1違いの紙コップに重ねれば、1組で2点
◦番号が2違いの紙コップに重ねれば、1組で0点
◦最終的な紙コップの位置が10cm以上動いた場合は、その1組の点数を半分にする 技術点の計算方法以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチームが20点満点で採点し、その平均点を求める。 得点の目安: ◦紙コップを取りにいくまでの動作 (2点)
◦紙コップを掴む動作 (4点)
◦紙コップをを運ぶ動作(3点)
◦紙コップを重ねる動作(4点)
◦2台のRCXまたはNXTの連携の良さ(3点)
◦自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
◦その他 (2点)
今回の課題の攻略の糸口はやはりライントレースにあると思った。というのも、前回、前々回のかだいでライントレースをしていたためこれは利用しないと損だなと思ったからだ。ラインとレースをするにあたって、まず中央の横線に注目した。基本この横線をライントレースし、途中少しそれて紙コップを取りに行く、そしてまた横線に戻り、紙コップを置きに行く、といった感じで進めていく。
そして、紙コップをつかみ、持ち上げるという機構を考えている時、先生が一つのモーターでできると言い出した。自分はつかむための動力源と持ち上げるための動力源のために二つのモーターを使用しようと考えていたのでひとつのモーターでできるというのは朗報だった。 先生によると、紙コップを掴んだギアに、さらに力を加え続けていくと掴む機構自体の重さで起き上がるという。言葉では説明しづらいので図で説明すると、
掴む方のギアが回り紙コップを掴むのは言うまでもないが、問題は持ち上げる方である。図の中央のギアはモーターの回転を紙コップを掴む動力に伝える役割をしているのだが、紙コップをつかみ終えるとモーターはそれ以上回らない。だが、モーターはギアを回そうとする。そうすることによって図中央のギアが回り紙コップを掴んだアームが浮き上がるというわけだ。
今回の課題での自分の役割は、主に紙コップを掴む方のロボットの制作だ。ただ単純に掴めばいいのではなく、掴んで持ち上げて決められた場所まで運んでいかなければならない。
まず最初に作った初号機。
写真が見にくいのはご了承していただきたい。初号機は掴む機構にウォームギア(画面中央の黒いネジのようなもの)を用いた。自分の考えではこのウォームギアを用いるのが左右のアームを違う方向に開かせるのに一番効率的で、最小限の重量で済むと思った。しかし、紙コップという、さして重くも固くもないものを掴むのにウォームギアを使うのは不適だった。なぜなら、ウォームギアは言ってしまえばかなり強力な力を要する部分に使われるパーツで、瓶とかならまだしも紙コップを掴むという動作でウォームギアを使うのはどう考えてもおかしかった(実際やってみたが、紙コップが潰れてしまった。恐るべしウォームギア!)さらに問題点はもうひとつあった。それは輪ゴムを使うということ。普通に考えてウォームギアでガチガチに締め上げた状態のアームにはものすごい負荷がかかっている。それを輪ゴムで持ち上げようとしていたのだ…。
よって初号機のようなものは今回の課題には不向きだということがわかった。だが、初号機の中にはなかなかいいアイデアもあったので、それらも使いながら改良に改良を重ねて作ったのが弐号機!
まず初号機と比べて大幅に改善された点はアーム部分の軽量化である。アーム部分は最終的には持ち上がるので少なくともアームがモーターの力で持ち上がらなくてはならなかった。そこで、ギアの数、固定ネジの数、アームの数、その他ブロックの数を減らした。おかげでだいぶ軽量化ができた。
さらに細かい工夫について触れていくと、上図のアーム部分の下にあるものについて触れていこう。 これは言ってしまえば、高さを調節するためにつけたものだ。ついでに紙コップが外れないように固定もしてくれるようになっている。そうすることによって無駄に安定感抜群の掴みの機構となっている。
よって
この通りスムーズに持ち上げられる。ちなみになぜ高さ調節する必要があったかというと、それは紙コップの重心の位置が関係してくる。もし仮に上図のようなのではなく、もう少し低い位置で紙コップを掴んだとする。そうすると少し紙コップが動いただけで重心がずれ、紙コップが傾いて設置してある紙コップに上手く被せることができない。なので、紙コップの重心よりも上に持ち、紙コップの向きを安定させた。
次は、アームを持ち上げるモーター周りについて触れていこう。今回は、モーターに直接ギアをつけるのではなく、青いパーツを使い、延長させて、さらに穴あきのブロックに通してギアをつけて、さらに穴あきのブロックに通してロックした。これにより、モーターの回転をほとんど無駄にすることなくほかのギアに伝えることができた。これで、ものすごい負荷がかかるモーター周りの補強ができた。
次は、アームの上の部分のギア周りについて。当初穴あきのブロックの上に直接ギアをおいていたが、ブロックの上の部分の凸部にあたって、回転がガタガタになっていた。なので高さ調整のため、のパーツを組み込んだ。こうしてとてもなめらかの回転するようになった。 このように様々な工夫をして紙コップを持ち上げることに成功した。
アームに関して工夫した点はもうほとんど述べてしまったので本体について述べたいと思う。見ていたところ、ほとんどの班が、アーム部分をRCXの上につけていた。だが、モーターにすごい負荷がかかりモーターごと浮き上がるのを恐れた自分はRCXのしたにモーターを設置した。こうすることでRCXの重みで、モーターがしっかりと固定され、安定感が増した。 さらに、ライントレースの時に学んだことで、地面に向ける光センサーの位置は車体が回転するときの回転の重心に近いところに設置した。さらに、光センサーの高さを自由に変えれるような作りにし、しきい値の調整をしやすくした。
なんといってもアーム部分だ。先生が持ってきた作りをそのまま真似るのは面白くないので自分なりに改良したのだが、モーターの大きさが合わなかったり、モーターどうしを噛み合わせるためにブロックで高さ調整をし、やや重量化してしまったりと色々な問題が浮上してきた。さらに、棒を通す位置を一個ずれていたのを気づかず、そのまま作業していき実際動かしてどこに問題があるのかを探すのが大変だった。そして、探し終えたあとせっかく作ったのを分解しなければならないとわかったときに、言い知れぬ絶望感に襲われた。
本来自分は紙コップを持ち上げるロボット作りが役割のはずだが、僕の班のプログラマーはのんびり進行というかほぼなにもしていないというか、ほとんどプログラムを打ち込まなかったので、僕が急遽プログラマーもすることにした。
#define set_power_AL SetPower(OUT_A,2);//右の車輪の力(弱) #define set_power_CL SetPower(OUT_C,2);//左の車輪の力(弱) #define set_power_AH SetPower(OUT_A,4);//右の車輪の力(強) #define set_power_CH SetPower(OUT_C,4);//左の車輪の力(強) #define go_forward set_power_AH;set_power_CH;OnFwd(OUT_AC);//前進(強) #define turn_right0 set_power_AL;set_power_CL;OnFwd(OUT_A);OnRev(OUT_C);//右へ急カーブ #define turn_right1 set_power_AL;OnFwd(OUT_A);Off(OUT_C);//右へカーブ #define turn_left0 set_power_CL;Off(OUT_A);OnFwd(OUT_C);//左へカーブ #define turn_left1 set_power_CL;OnFwd(OUT_C);OnRev(OUT_A);//左へ急カーブ #define nMax 7//ライントレースから他の動作に切り替える条件となる値 #define short_break Off(OUT_AC);Wait(10);//0.1秒運動停止 #define CROSS_TIME 15//交差点通過にかかる時間 #define cross_line set_power_AL;set_power_CL;OnFwd(OUT_AC);Wait(CROSS_TIME);short_brake;//交差点時の動作 #define STEP 1//一動作にかかる時間 #define THRESHOLD 45//しきい値
task main{} { OnFwd(OUT_AC,);Wait(200); OnRev(OUT_C);OnFwd(OUT_A);Wait(80); //スタートから中央の黒い線まで直進し、横を向く SetSensor(SENSOR_2,SENSOR_LIGHT);//光センサーを定義 int nOnline=0;//交差点判別に使用するカウンタ int kousa=0;//交差点判別に使用するカウンタ(2つ目)
↓一度交差点に差し掛かるまでライントレースし、さしかかったら紙コップを掴むプログラム
while(kousa < 1){//一つ目の交差点に差し掛かるまで、以下の動作をする while(nOnline<nMAX){ if(SENSOR_2<THRESHOLD-13){//定義した明るさの値より13低かったら turn_left1;左に急カーブ nOnline++;//カウントする }else{ if(SENSOR_2<TFRESHOLD-10){
//定義した明るさの値より10低かったら
turn_left0; //左にカーブ }else if(SENSOR_2<THRESHOLD-6){
//定義した明るさの値より6低かったら
go_forward; //前進する }else if(SENSOR_2<THRESHOLD){
//定義した明るさの値より低かったら
turn_right0; //右に急カーブ }else{
//その他なら
turn_right1; //右にカーブ } nOnline=0;//ライントレース } Wait(STEP); //STEP間待つ } short_break; //小休憩 turn_right0;Wait(50*STEP);50だけ右に急カーブ if(SENSOR_2<33){//光のしきい値が33より小さかったら PlaySound(SOUND_UP);//音を鳴らす turn_left0;Wait(30*STEP);//30だけ左にカーブ cross_line;//交差点をこえる OnRev(OUT_B);Wait(30);//アームを広げる OnFwd(OUT_B);Wait(50);Off(OUT_B);//紙コップをつかむ kousa++;//交差点のカウント }else{ turn_left0;Wait(85*STEP);//85だけ左に急カーブ } nOnline=0;カウント数を0に }//交差点を見分ける OnFwd(OUT_A);OnRev(OUT_C);Wait(160);//Uターン OnFwd(OUT_AC);Wait(100); Off(OUT_AC); OnRev(OUT_B);Wait(50); OffOUT_B); } }
なんといってもしきい値である。家で行った時はしっかりと交差点を認識したのだがロボコンの会場では、ロボットが向く向きによってしきい値が変わったり、部屋の照明、照明との近さなどでしきい値の調整が本当に難しかった。
やはり、班の連携が大事だったと思う。ロボコン間近は結構頻繁に集まって作業していたが、それまでは班で集まる機会が少な過ぎた。もう少し集まっていれば、プログラマーがどの程度プログラムを理解しているのかなどもわかっただろう。それにしても我が班のロボ制作はほとんど自分がやったような気がする。当初は2台のロボットを使うよていだったが、相方が結局作れませんでしたとロボコン当日になって言い出したりと大変だった。せめて、やれないならやれないで事前に連絡して欲しかった。このような災難が降りかかり、ロボコンの結果は散々だった。相方にもう少し働いて欲しかったというのが、率直な感想だ。 最後に、一人で作業に苦しんでいたとき助言等手伝ってくれた伊藤くんに感謝。