***プログラム
SIS イギリス情報局秘密情報部 極東支部担当 第7兵站局
部隊長 階級中将
以下二名 しかし機密事項に相当するためコードネーム、階級、所属 その他一切の情報は一般の報告書には記載出来ない。
近年、その政治情勢に不穏な動向が確認されている中華人民共和国に主力部隊 人民解放軍の大規模な動きが見られた。
我が国はこの軍事行動を脅威と断定、急遽閣僚を召集、緊急閣議を開く。
SISの報告書によると中国は近頃活発にソビエト連邦と連絡を密にしていた。裏付けは取れなかったがKGBが河南省に潜入、何らかの工作を行っていた可能性もある。
不確定要素が多すぎる為に予想を裏切らず議会は紛糾を極めたが閣議を開いてから45時間後、事態は急展開を見せた。防衛省管轄の兵器開発局にCIA諜報員が接触。何らかの機密情報に対して取引を持ちかけ模様。詳細は不明
閣僚召集から57時間後 王室海兵隊に予備命令が下された、発令元は英国海軍省幕僚総長。その更に3時間後事態の詳細は伏せたままで次の要件を満たす偵察機の開発を要請される。~
主任務 この条件をクリアすることが任務達成の最低条件
1、光センサーを用いた特定経路のみの走行を可能とする自律可動型特殊装甲車の作成
2、その際遭遇するであろう各障害物の撤去及び運搬を自在に行いうる機能、構造を備えること
副次目標 必ずしもクリアする必要は無いが満たしている事が望まれる~
3、1 2の諸条件を満たしつつ可能な限り迅速に任務を遂行できる機動性を持つこと
4、戦場に置いて任務の際に各種メンテを取り行う主任エンジニアが専属するとは限らないために専門の知識を持たない者も容易に管理、運用出来る高い利便性を付与すること
5、割り振られる予算を考えると製造する偵察機の生産コスト+機体の総重量は可能な限り落とすものとする
期限、14日
初め開いていたアームを紙パックが入ってきたら(写真の矢印の)モーターで閉じてしっかりと紙パックを挟みます。
紙パックに当たったらセンサーが押されます。
後輪駆動で前に小さな車輪を付けた三輪で走ります。
アームが長すぎてカーブの途中・直後に紙パックがあると、アームが当たってしまい取れませんでした。
初め光センサーは黒い線上にくるようにして、どちらかが白に反応したら方向修正するという方法をとっていました。 でもそれだと線が細くて脱線してしまったので、二つの光センサーで黒の線を挟むようにして、どちらかが黒に反応したら方向修正するようにしました。
本体の上にモーターをつけて回転できるようにしました。
歯車を使ってアームの回る速さを調節。こんな感じです。 ただ、それでも回る速さは少し速いです。
一機目は軽すぎてなかなかうまく反応してくれなかったので重くしました。
今度は前輪駆動で後ろに小さい車輪を付けました。 光センサーの位置(センサーとセンサーとの距離)は多少調節可能です。
紙パックを運ぶときはアームを使って紙パックを挟みます。 そして紙パックを後ろに置くときはアームを一回転させます。
紙パックを後ろに置くとき『一機目』は挟んでから光センサーを使って後ろの線上に置くことができましたが、 『最終型』はアームを時間を決めて回しているので、後ろには置けても線の上にうまく置くことができません。
コース上の紙パックを後ろにどかして進む #define go OnFwd(OUT_A+OUT_C); //前進 #define stay Off(OUT_A+OUT_C); //停止 #define arm_l OnFwd(OUT_B);Wait(160);Off(OUT_B);//腕を左回り(反時計回り)に180度回転 #define arm_r OnRev(OUT_B);Wait(160);Off(OUT_B);//腕を右回り(時計回り)に180度回転 #define eye_l SENSOR_1 #define eye_r SENSOR_3 #define THRESHOLD 45 task main() { SetSensor(eye_l,SENSOR_LIGHT); //センサー1を光センサー SetSensor(SENSOR_2,SENSOR_TOUCH);//センサー2をタッチセンサー SetSensor(eye_r,SENSOR_LIGHT); //センサー3を光センサー while (true) { start follow_line; //線のトレースを開始 until(SENSOR_2 == 1);//紙パックにぶつかるまで続ける stop follow_line; stay; //ぶつかったら停止 arm_l; //腕を左回りに回転、紙パックを後ろへ Wait(100); arm_r; //腕を右回りに回転して元の位置に戻す Wait(100); } } task follow_line() //線をたどるプログラム { int k=0; //整数kを定義(交差点にいく度に1増える) while(k<7){ //交差点を通った回数が7回より小さいとき Wait(50); go; //光センサーが両方白い所にある場合前進 until((eye_l < THRESHOLD)||(eye_r < THRESHOLD)); stay; if(eye_l < THRESHOLD){ //左の光センサーが線に乗った場合 OnFwd(OUT_C);OnRev(OUT_A); //右に方向修正 until((eye_l > THRESHOLD)||((eye_l < THRESHOLD)&&(eye_r < THRESHOLD)));//左の光センサーが白に行くまで //両方の光センサーが黒に行くまで stay; } if(eye_r < THRESHOLD){ //右の光センサーが線に乗った場合 OnFwd(OUT_A);OnRev(OUT_C); //左に方向修正 until((eye_r > THRESHOLD)||((eye_l < THRESHOLD)&&(eye_r < THRESHOLD)));//右の光センサーが白に行くまで //両方の光センサーが黒に行くまで stay; } if((eye_l < THRESHOLD)&&(eye_r < THRESHOLD)){ //両方の光センサーが線上にきた場合 //つまり交差点にきた場合 Wait(20); k++; //交差点にきたらkに1をたす go; //前進 until((eye_l > THRESHOLD)&&(eye_r > THRESHOLD));//交差点を過ぎるまで stay; } } stay; //7個目の交差点にきたとき停止 }
本体作りはゆあ君がとてもがんばって作ってくれました。 タッチセンサーは重くしすぎると走行の振動で反応してしまうし、軽いと紙パックに 反応しなかったりと大変でした。 紙パックを後ろに置く、というよりは後ろに投げるという感じになってしまいました。 あとモーターが悪いのか、他に理由があるのかわからないけど、ロボットがまっすぐ 走ってくれませんでした。 交差点をうまく通過させるのが大変でした。
プログラムの説明
方向修正する時、二つの場合があります。 一つは一本線を辿っていてそれてしまった時。 もう一つは交差点に入った時。(片方の光センサーが交差点に入った時)
sub go_st() { OnFwd(OUT_A+OUT_C); } //前に進む sub left(){ OnFwd(OUT_B); Wait(180); Float(OUT_B); } //腕を左に回す sub right(){ Rev(OUT_B); Wait(90); Float(OUT_B);} //腕を右に回す int n=0; task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサー SetSensor(SENSOR_2,SENSOR_TOUCH); //センサ−2をタッチセンサー SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサー while(n<=6){ //6回繰り返したら終わりにする。(nが6を超えたら終わり) go_st(); until((SENSOR_1 <45)||(SENSOR_3 <45)); if (SENSOR_1 <45){ //センサー1が黒い線に入ったら Off(OUT_A+OUT_C); Wait(35); //左に曲がる OnFwd(OUT_C); Rev(OUT_A); until((SENSOR_1 >45)||((SENSOR_1<45)&&(SENSOR_3<45))); Off(OUT_C+OUT_A); } if (SENSOR_3 <45){ //センサー3が黒い線に入ったら Off(OUT_A+OUT_C); Wait(35);//左に曲がる OnFwd(OUT_A); Rev(OUT_C); until((SENSOR_3 >45)||((SENSOR_1<45)&&(SENSOR_3<45))); Off(OUT_A+OUT_C); } if (SENSOR_2 == 1){ //タッチセンサーが反応したら Off(OUT_A+OUT_C); 腕を右に回して箱をつかむ right(); } if ((SENSOR_1<45) && (SENSOR_3<45)){//交差点に入ったら Off(OUT_A+OUT_C); Wait(10);//腕を左に回して箱をおく left(); right(); PlaySound(SOUND_UP) ; go_st(); until((SENSOR_1>45) && (SENSOR_3>45)); Off(OUT_A+OUT_C); n++; //nを1増やす(終わるまでのカウントを1増やす) } } }
今回のプログラムでは腕を回す力の調整が大変でした。モーターを回す時間が長すぎ るとパックが飛びすぎたり、短すぎると後ろまで届かなかったり…… 線上を動かすのも、方向転換の前にいったん停止させるなど、線をオーバーしない工夫 が大変でした。 まさや君のプログラムでも僕のプログラムでもきついカーブなど線をオーバーしてし まうことがあります… センサーに問題があるのか、走る速度が速すぎるのか……
task main(){
SetSensor(SENSOR_1,SENSOR_LIGHT);; SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3,SENSOR_LIGHT);
while(true){
start follow_line; until(SENSOR_2 ==1);
stop follow_line;
} }
task follow_line(){
while(SENSOR_2 ==0){
OnFwd(OUT_A+OUT_C); if((SENSOR_1 <45)&&(SENSOR_3 <45)){ Off(OUT_A+OUT_C); Wait(15); OnFwd(OUT_A+OUT_C); Wait(5 ); until((SENSOR_1 >45)&&(SENSOR_3 >45)); } if((SENSOR_1 <45)&&(SENSOR_3 >45)){ Off(OUT_A); Wait(5); if((SENSOR_1 <45)&&(SENSOR_3 <45)){ Off(OUT_A+OUT_C); Wait(15); OnFwd(OUT_A+OUT_C); Wait(5 ); until((SENSOR_1 >45)&&(SENSOR_3 >45)); } if((SENSOR_1 <45)&&(SENSOR_3 >45)){ OnRev(OUT_A); Wait(5); if((SENSOR_1 <45)&&(SENSOR_3 <45)){ Off(OUT_A+OUT_C); Wait(15); OnFwd(OUT_A+OUT_C); Wait(5 ); until((SENSOR_1 >45)&&(SENSOR_3 >45)); } if((SENSOR_1 <45)&&(SENSOR_3 >45)){ Wait(5); until((SENSOR_1 >45)&&(SENSOR_3 >45)); }}} if((SENSOR_1 >45)&&(SENSOR_3 <45)){ Off(OUT_C); Wait(5); if((SENSOR_1 <45)&&(SENSOR_3 <45)){ Off(OUT_A+OUT_C); Wait(15); OnFwd(OUT_A+OUT_C); Wait(5 ); until((SENSOR_1 >45)&&(SENSOR_3 >45)); } if((SENSOR_1 >45)&&(SENSOR_3 <45)){ OnRev(OUT_C); Wait(5); if((SENSOR_1 <45)&&(SENSOR_3 <45)){ Off(OUT_A+OUT_C); Wait(15); OnFwd(OUT_A+OUT_C); Wait(5 ); until((SENSOR_1 >45)&&(SENSOR_3 >45)); } if((SENSOR_1 <45)&&(SENSOR_3 >45)){ Wait(5); until((SENSOR_1 >45)&&(SENSOR_3 >45)); }}}}
}
こまかくifを使って分けているのは十字路においてまっすぐ走行する為。例えば十字路に直面してもコースの関係で光センサーが同時に作用するとは限らない。 だから光センサーがひとつだけ反応してもいきなり大きくは曲がらずまずはほんのちょっと曲がる。そして光センサーが二つ反応するようなら直進、相変わらず反応がひとつならそのままカーブを続けるといった。可変型プログラムを構築した。