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