[[2018a/Member]]
#contents
*課題3 [#i2f4f1a4]
#ref(2018a-mission2.png)
課題2で使用した上の画像のフィールドを使用してAから出発したロボットが円�勝�円YにそれぞれABA、BABの順で積まれた空き缶をAAA、BBBにして円X、円Y内にそれぞれいれる。ただし、積んでおいた場合は加点される。
詳しいルールについては[[ルール:http://yakushi.shinshu-u.ac.jp/robotics/?2018a%2FMission3]]を参照していただいたほうがいいだろう。
*ロボット概要 [#n3a60d1a]
ロボットは2台を同時に動かしそれらの連携によって缶を動かす方法ではなく2つの核部品を組み合わせて1つのロボットを作り完全1台のみでミッションをこなすようにした。こうした理由は、2台にすることで位置ずれが片方に起きた時などのような予期せぬことが起きた時への対応力をあげるためや1台にすることでプログラミングや機体の設計を同時に考える必要がなくなるので準備にかかる手間を減らすことができるためである。
また、核部品は分散させないでくっつけておおきな核部品をつくった。こうすることで過去の課題で使用した機体の設計をなるべく活かそうとした。
今回は過去の課題よりも準備にとれる時間が非常に少なかったためロボットにあまり時間割けなかったために過去のアイデアをなるべく取り入れるようにした。
**背面 [#v40c7343]
#ref(s_image1 (1)-min.jpeg)
2つ核部品があるがそのうち下側がマスター、上側がスレイブになっている。マスター側は基本的に車輪を動かす動作や光センサーによる白黒判定をし、それによってトレースを行う。スレイブ側はアームの開閉や上下移動を行う。このように2つの役割を完全にわけている。
また、よくみてみると車輪が2つしかないことに気づくだろう。通常車輪が3つ以上ないと機体は支えられない。しかし、この機体は2つしか車輪がないが三角形のような部品が見えるがそれが機体を支える第3のポイントとなっている。なぜ、車輪を3つ付けなかったかというと、そもそも機体の構造的につけることができなかったのもあるが、もう1つの問題がNXTにはボール状の部品がないためそれによって小回りがききづらくなってしまうという点である。タイヤ部品では可動範囲に限界があったため、摩擦が発生してはしまうがタイヤの部品は取り付けなかった。
**側面 [#x2c73d1e]
#ref(s_image3-min.jpeg)
#ref(s_image4-min.jpeg)
タイヤ部分のモーターに直接タイヤがついているのではなく歯がある小さな部品がついていることが見てわかると思うが、こうした理由はあのおおきなタイヤをそのままとりつけようとすると機体の別の部品にぶつかってしまってうまくタイヤが回らなくなってしまったからである。そのため歯がついてる部品とタイヤの部品でかみ合わせ歯車の仕組みでタイヤの回転をおこなった。これによってプログラムした方向とは逆方向にタイヤが回ってしまう若干面倒が発生してしまったが、機体構造上仕方ないことである。これはアームのモーターにもいえることである。アームの場合はタイヤではないが場所の問題上そうした。
**前面&上面 [#f0269329]
#ref(s_image5-min.jpeg)
上面からは2つタイヤのモーターではないモーターが見えると思うがこれらの役割は一番高いところにあるのはアームの開閉を行うモーターでその少し下に見えるのはアームを上下に動かすためのモーターである。開閉のモーターはそれぞれのアームをモーターに直接接続し、上下のモーターは歯車部品をつかい間接的に接続した。
また、それぞれのアームには細いタイヤが2つついているがこれは缶をつかむ際にプラスチック部品では摩擦的に滑って落ちてしまうためにつけた。しかし、それでもつかみどころが悪いときには缶を落としてしまうため輪ゴム部品を画像のように取り付けることでゴムの伸縮性で缶をうまくつかんで確実に落とさないようなアームをつくった。
**下面 [#t48626af]
#ref(s_image2-min.jpeg)
下面からはマスターの核部品がみえる。マスターがしたにあるためにプログラムを起動するとき毎回手を機体の下に入れなければならなかったのですこし大変になってしまった。
また、課題2の時と同じように光センサーを床に限りなく近づけることでセンサーの白黒判定を正確に行えるようにしてある。
そして、2つのタイヤモーターを棒のような部品でつなぐことで機体下部の安定さを増させ、上部の非常に重い部品たちを安定して持てるようにした。
*プログラミング [#o63592ff]
**マスター [#i4e8d68a]
#define CONN 1 // スレーブの接続番号
#define SIGNALON 11 // ハサミで持ち上げるためのメッセージ
#define SIGNALOFF 12 // 缶を落とすためのメッセージ
#define llt OnFwd(OUT_A,50); OnRev(OUT_C,30); Wait(1);//大きく左に回る
#define lrt OnRev(OUT_A,30); OnFwd(OUT_C,50); Wait(1);//大きく右に回る
#define ternleft OnFwd(OUT_A,50); OnRev(OUT_C,10);//左に回る
#define ternright OnRev(OUT_A,10); OnFwd(OUT_C,50);//右に回る
#define go OnFwd(OUT_A,50); OnFwd(OUT_C,50);//直進する
#define back OnRev(OUT_A,50); OnRev(OUT_C,50);//後退する
#define trase_R {if(SENSOR_2<36){lrt; n++;} else if(SENSOR_2<50) {go; n=0;} else
{llt; n=0;}}
#define trase_L {if(SENSOR_2<36){llt; n++;} else if(SENSOR_2<50) {go; n=0;} else
{lrt; n=0;}}
#define open RotateMotor(OUT_B,25,80); Off(OUT_B);Wait(1000);
#define close RotateMotor(OUT_B,25,-80); Off(OUT_B);Wait(1000);
#define UP RotateMotor(OUT_C,40,90); Off(OUT_C); Wait(1000);
#define DOWN RotateMotor(OUT_C,20,-100);Off(OUT_C); Wait(1000);
task main()
{
SetSensorLowspeed(S1);
SetSensorLight(S2);
int n=0;
while(n<=100)
{ // H
trase_R;
}
Off(OUT_AC);
Wait(1000);
OnFwdSync(OUT_AC, 50, 0);
Wait(500);
Off(OUT_AC);
n=0;
while(n<=100)
{ // s2
trase_R;
}
Off(OUT_AC);
Wait(1000);
OnFwd(OUT_AC,50); //線をまたぐ
Wait(500);
n=0;
while(n<=90)
{
trase_L //L字路で止まる
}
Off(OUT_AC);
Wait(1000);
RotateMotor(OUT_A, 60, 300);
Off(OUT_AC);
n=0;
while(n<=150)
{ //十字路で止まる
trase_R
}
Off(OUT_AC);
Wait(1000);
RotateMotor(OUT_C, 60, 300);
Off(OUT_AC);
n=0;
while(n<=70)
{ //Fで止まる
trase_L
}
Off(OUT_AC);
close;
SendRemoteNumber(CONN,MAILBOX1,SIGNALON); //持ち上げる
Off(OUT_ABC);
Wait(3000);
OnRev(OUT_AC,50); //バックで距離を取る
Wait(1000);
Off(OUT_AC);
RotateMotorEx(OUT_AC, 75, 1860, 100, true, false); //振り返る
Off(OUT_AC);
n=0;
while(n<=70)
{ //Gで止まる
trase_L
}
Off(OUT_AC);
RotateMotorEx(OUT_AC, 75, 400, -100, true, false );
Off(OUT_AC);
SendRemoteNumber(CONN,MAILBOX1,SIGNALOFF);
Off(OUT_ABC);
Wait(3000);
open;
Off(OUT_ABC);
Wait(3000);
}
このプログラムは多くつかうプログラムをすべて定義しているため実際のプログラムは簡潔かつ分かりやすくしてある。前回の反省を活かしてトレースのプログラムも定義した。
前述の通りマスターは線をトレースするプログラムを中心に動くようになっている。また、缶を持ち上げた際にトレースしてきた線から別の位置へ移動してしまっているためRotateMotorのプログラムを用いることで中心位置を固定したまま回転し、さらに機体を前進したり後退したりすることで線の位置へ移動しまたトレースして移動できるようにした。
また、課題2では私たちのペアはトレースする際の交差点判断基準は黒判定の時間によって行ってきたが、今回の課題ではもう一つのペアが黒を判断した回数によって判断するプログラムかつ白、黒、グレー判断のプログラムを用いていたためそっちのプログラムを採用した。
ロボット概要でも述べたようにタイヤに歯車部品を取り付けたため、プログラムの方向とは逆方向に実際は動く。また、
ロボット概要でも述べたようにタイヤに歯車部品を取り付けたため、プログラムの方向とは逆方向に実際は動く。また、満点を取りに行くプログラムではなく、確実に点を取りに行けるようなプログラムにしたため、わざとアームを円Yの2段目の缶にあてることで別の色の缶を円外へとばし、原点をさけるようにした。
**スレイブ [#xc61f910]
#define CONN 1 // スレーブの接続番号
#define SIGNALON 11 // ハサミで持ち上げるためのメッセージ
#define SIGNALOFF 12 // 缶を落とすためのメッセージ
#define llt OnFwd(OUT_A,50); OnRev(OUT_C,30); Wait(1);//大きく左に回る
#define lrt OnRev(OUT_A,30); OnFwd(OUT_C,50); Wait(1);//大きく右に回る
#define ternleft OnFwd(OUT_A,50); OnRev(OUT_C,10);//左に回る
#define ternright OnRev(OUT_A,10); OnFwd(OUT_C,50);//右に回る
#define go OnFwd(OUT_A,50); OnFwd(OUT_C,50);//直進する
#define back OnRev(OUT_A,50); OnRev(OUT_C,50);//後退する
#define trase_R {if(SENSOR_2<35){lrt; n++;} else if(SENSOR_2<50) {go; n=0;} else
{llt;
n=0;}}
#define trase_L {if(SENSOR_2<35){llt; n++;} else if(SENSOR_2<50) {go; n=0;} else
{lrt;
n=0;}}
#define open RotateMotor(OUT_B,25,85); Off(OUT_B);Wait(1000);
#define close RotateMotor(OUT_B,25,-85); Off(OUT_B);Wait(1000);
#define UP RotateMotor(OUT_C,40,90); Off(OUT_C); Wait(1000);
#define DOWN RotateMotor(OUT_C,20,-90);Off(OUT_C); Wait(1000);
task main ()
{
int msg; // 受け取った値を格納する変数
while (true) {
ReceiveRemoteNumber(MAILBOX1,true,msg); //
if (msg == SIGNALON) {
UP;
}
if (msg == SIGNALOFF) {
DOWN;
}
}
}
こちらも定義によって多く使われるプログラムは定義してしまい、わかりやすくした。
これも前述したとおりスレイブ側はアームの上げ下げや、開閉のようなアーム関係のプログラムで構成されている。
アームは課題1のようにモーターの回転によって上下動くようにして、アームの開閉もモーターの回転によってしている。なので、モーターを2つ用いることでxyz軸方向すべて動かせるようになっている。
*結果 [#a99a82b1]
#ref(s_image1-min.jpeg)
少し画像からは分かりづらいが私たちのグループはN3N4であるからビリから2番目のブービーという結果で終わってしまった。
*感想、反省など [#dc6fe4e9]
今回頑張ったと思ったがこのような結果で終わってしまってかなり残念で悔しかった。
こうなってしまったのには理由が
こうなってしまったのには理由が個人、グループ、ロボット、プログラムのそれぞれで反省すべき点があったからだと思う。
まず、個人では私自身テスト前最後のみんなで集まれる課外の時間に別の用事の関係で参加することができなかったからだ。今回の課題のようなグループ活動においては非常に互いに協力し合う姿勢が大事であるのに、その日自分だけ参加しなかったのはとても失敗だったと思う。次に、グループにおいては、準備する際にロボット班、プログラミング班と分けてしまったためロボットの準備の際にはプログラミングはなにもできず、プログラミングの際にはロボットはなにもできずといった感じになっていしまい有効に時間を使えなかったほか、当日ロボット班の一人が参加できなかったため他のメンバーで準備する必要があったのだが、いままでどのようにプログラムしてきたのかわからなくなってしまいそこで時間を食って最終チェックもろくに行えなかったのは大きな失敗であった。そして、ロボットに関してはアームを缶にあてて減点を防ごうとしたが完全に缶の重みなどで運要素が強くなってしまい、結果的には下の段までくずれ全く点を入れることができなかった。最初から完全に得点を狙いに行くよう努力したほうがよかったかもしれないと後悔した。最後にプログラムに関してだが、微調整を多く重ねた結果とてもうまくいったときがあってそれで満足してしまい何回も試行をしなかったことによって当日ではうまくプログラムが動かなかった。これも大きな失敗である。
また、以上の点以外でも当日きちんとロボットの工夫した点をプレゼンできなかったため他の班から評価してもらう技術点がのびず、このような結果になってしまった。ロボットはちゃんと動くか以外にも周りに今までの努力をどれだけ伝えられるかが大事だということを知った。
しかし、これまでの課題でロボットについてすこし興味がわいたのでこれからのニュースなどにも注目していきたいと思えるようなった。その点では非常に楽しかった。