2015b/Member/S_Toya/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2015b/Member]]
*課題 ロボコン [#oddecb87]
**課題内容 [#r2364005]
課題2で用いたマップを2枚用いて、ボールをバトン代わりにリ...
*目次 [#nc45f072]
#contents
*ルール [#wb3173fe]
**フィールド [#c2a69dd8]
#ref(2015b/Member/S_Toya/Mission3/2015b-mission3.png)
これが今回のロボコンで用いるマップとなる。細かいルールは...
**基本ルール(要上図参照) [#f68bcdab]
・&size(12){競技時間はロボ...
・&size(12){ロボットAはSTAR...
・&size(12){その後、ロボッ...
・&size(12){引き続き青いボ...
・&size(12){ロボットBはボー...
・&size(12){アルミ缶は中身...
・&size(12){RISのチームはア...
・&size(12){ボールがアルミ...
・&size(12){ロボットAはセン...
・&size(12){アルミ缶を5cm以...
以上が基本ルールである。これに、細かな技術点が付き得点を...
*ロボット紹介 [#c1c364dd]
**ロボットA(球を発射する側) [#x188e83e]
ロボットAは、ドライブベースのようにモータ二つからなる足回...
足回りはライントレースの際に利用した形が基礎となっている。
ロボットAの最も大きな特徴は前方にある爪である。この爪のよ...
#ref(2015b/Member/S_Toya/Mission3/hanasu01_1.jpg)
上図の爪のようなパーツは左タイヤについた回転センサと連動...
したがって、タイヤが何回転したかによって球を回収させるよ...
球の回収方法は、まず指定の回数だけタイヤが回転したら爪パ...
言葉だ毛ではわかりにくいと思われるので、下図を参照してい...
CENTER:&size(20){回収する動作};
CENTER:#ref(2015b/Member/S_Toya/Mission3/A_kaishu.gif)
CENTER:&size(20){放出する動作};
#ref(2015b/Member/S_Toya/Mission3/A_keru.gif)
**ロボットB(球を回収するロボット) [#f0ec869c]
ロボットは、ドライブベースのようなモータ二つからなる足回...
足回りはAと同様のライントレースが行えるような形になってい...
ロボットBの最も大きな特徴は球を回収するために用いるコンベ...
外観は下図である。
#ref(2015b/Member/S_Toya/Mission3/tsukamu06.jpg)
当初、Aから放たれた球を光センサで探索しようとしたものの...
広範囲をカバーし、且つ缶を倒すことがないようにするために...
#ref(2015b/Member/S_Toya/Mission3/tsukamu05_1.jpg)
*ロボットAのプログラム [#y3e4370d]
次に、プログラムの方を説明する。定数やマクロについてを説...
**ライントレース用 [#c6430f7d]
#define shiki 48//閾値
#define tomaru(t) Off(OUT_AC);Wait(t);//t秒間停止
#define FWD OnFwd(OUT_AC);//直進
#define BACK OnRev(OUT_AC);//後退
#define LEFT_t OnRev(OUT_A); OnFwd(OUT_C);//左旋回
#define LEFT Off(OUT_A); OnFwd(OUT_C);//左回転
#define RIGHT_t OnRev(OUT_C); OnFwd(OUT_A); //右旋回
#define RIGHT Off(OUT_C); OnFwd(OUT_A);//右回転
#define power(s) SetPower(OUT_A+OUT_C,s);//出力制御
ライントレース用の定数設定は課題2と同じであるため、説明は...
**ロボコン独自の機構 [#od875156]
この節では課題2では用いなかった機構についてを説明する。
#define open(t) OnFwd(OUT_B);Wait(t);//爪をt秒間開く回...
#define close(t) OnRev(OUT_B);Wait(t);Off(OUT_B);//爪を...
#define stop_B Off(OUT_B);//爪を固定する
#define SUN 50//ランタンの輝度を表す定数
#define shoot power(2);open(15);Wait(10);close(15);//球...
これらを基にプログラムを組んだ。
**trace_0 (スタート地点から赤い球を見つける迄) [#c27a65...
次にライントレースを行うサブルーチンについてを説明してい...
?球をとるまで
?球を発射するまで
とプログラムが別れていて、それが二つの球においてあるため...
#ref(2015b/Member/S_Toya/Mission3/MAP_A.jpg)
今回の節は「スタート地点から赤い球を見つける迄」のプログ...
sub trace_0()
{
power(2);//出力を2にする
ClearSensor(SENSOR_1);//回転センサをリセットする
/*ライントレース*/
while(1){
if (SENSOR_2 < shiki -7){
LEFT_t;
} else if (SENSOR_2 < shiki -4){
LEFT;
} else if (SENSOR_2 < shiki){
FWD;
} else if(SENSOR_2 < shiki +4){
RIGHT;
} else {
RIGHT_t;
}
ここまでは課題2のライントレースと大体同じである。したがっ...
if(SENSOR_1 > 335){//回転センサが335を越えたら
power(3);
close(50);//0.5秒だけ爪を閉じる
ClearSensor(SENSOR_1);//回転センサをリセット
break;//trace_0終了
}
}
}
これがtrace_0独自のプログラムとなる部分である。回転センサ...
**trace_1(赤球を放す迄) [#a64fdbb7]
sub trace_1()
{
ClearSensor(SENSOR_1);
close(10);//0.1秒球を締める
Off(OUT_B);//爪を固定する
power(2);
/*ライントレース*/
while(1){
if (SENSOR_2 < shiki -7){
LEFT_t;
} else if (SENSOR_2 < shiki -4){
LEFT;
} else if (SENSOR_2 < shiki){
FWD;
} else if(SENSOR_2 < shiki +4){
RIGHT;
} else {
RIGHT_t;
}
if(SENSOR_1 > 62){//回転センサが62以上の時作動
tomaru(10);//停止させる
break;//トレース終了
}
}
}
trace_0との違いは、SENSOR_1の上限と、ライントレースを開始...
**trace_2(青球を掴む迄) [#ldba1061]
sub trace_2()
{
power(1);
ClearSensor(SENSOR_1);
while(1){
if (SENSOR_2 < shiki -7){
RIGHT_t;
} else if (SENSOR_2 < shiki -4){
RIGHT;
} else if (SENSOR_2 < shiki){
FWD;
} else if(SENSOR_2 < shiki +4){
LEFT;
} else {
LEFT_t;
}
if(SENSOR_1 > 44){
power(3);
close(50);
ClearSensor(SENSOR_1);
break;
}
}
}
trace_2は前述の二つと大体同じである。回転センサの上限が62...
**trace_3(青球を放す迄) [#r0c70456]
sub trace_3()
{
power(2);
ClearSensor(SENSOR_1);
while(1){
close(1);//少しだけ爪を締める
Off(OUT_B);
if (SENSOR_2 < shiki -7){
RIGHT_t;
} else if (SENSOR_2 < shiki -4){
RIGHT;
} else if (SENSOR_2 < shiki){
FWD;
} else if(SENSOR_2 < shiki +4){
LEFT;
} else {
LEFT_t;
}
if(SENSOR_1 > 110){
power(3);
close(50);
ClearSensor(SENSOR_1);
break;
}
}
}
trace_3が他の3つと異なる点はライントレースを行うたびに爪...
しかし、これはロボット本体に大きなダメージを与えることに...
**光源探査 [#j12be024]
次に缶を見つける動作についての説明をする。NQCには超音波セ...
しかしながら、少しでもずれると球は缶の脇をすり抜けてしま...
したがって、回転センサと光センサを連動させて最大値を特定...
sub LIGHT()
{
PlaySound(SOUND_UP);//動作確認用
int sun_MAX = 0;//明るさの最大値
int sensor_MAX = 0;//明るさの最大値を示したときの回転セ...
close(20);//球が逃げないように、再度爪を締め付ける
ClearSensor(SENSOR_1);//回転センサのリセット
power(1);//出力1
while(SENSOR_1 < 85){//SENSOR_1が85で大体1回転となる
RIGHT_t;//右旋回
if(SENSOR_3 > sun_MAX){//明るさの最大値の変更手続き
sun_MAX = SENSOR_3;//現在地を最大値として記憶
sensor_MAX = SENSOR_1//現在地の角度を記憶
}
}
tomaru(10);//一回転終了後、一時停止
LEFT_t;//左旋回
until(SENSOR_1 < sensor_MAX);//角度が上で記憶した値にな...
tomaru(10);//停止
}
まず、現在地の明るさを測定する。つぎに時計回りで一回転を...
こうすることで、缶に球が当たる確率が上がる。
図にすると下図のようになる。
#ref(2015b/Member/S_Toya/Mission3/LIGHT.gif)
**main関数 [#g2dac7f7]
いよいよmain関数の説明に入る。
task main()
{
/*回転センサ*/
SetSensor(SENSOR_1,SENSOR_ROTATION);
/*トレース用センサ*/
SetSensor(SENSOR_2,SENSOR_LIGHT);
/*探索用センサ*/
SetSensor(SENSOR_3,SENSOR_LIGHT);
/*行動開始*/
FWD;Wait(150);//スタートの枠からの脱出
trace_0();//赤玉へ向かうトレース
tomaru(50);//一時停止
trace_1();//赤玉をホールドした状態
LIGHT();//ランタンの探索
shoot;//球を放す
ここまでは普通に、
''球を掴む位置まで進み、球を掴み、その状態のまま一定程度...
という普通の流れである。
しかしながら、次の青色の球に向かうまでは少し工夫を凝らし...
tomaru(20);//0.2秒停止
ClearSensor(SENSOR_1);//回転センサリセット
RIGHT_t;//右旋回
until(SENSOR_1 > 28);//回転センサが28以上になるまで回転...
tomaru(10);//0.1秒停止
ココでは、ロボットAの車体を、缶の方向から右方の円のように...
このことによって、円状になったコース上を反時計回りにライ...
参考画像(再掲)
#ref(2015b/Member/S_Toya/Mission3/MAP_A.jpg)
ClearSensor(SENSOR_1);//回転センサをリセット
FWD;//直進
until(SENSOR_1 > 26);//回転数が26以上になるまで
Off(OUT_B);//爪をふらつかせない
FWD;//直進させる
until(SENSOR_2 < 48);//黒い線にぶつかるまで
open(7);//爪を開く
Off(OUT_B);//爪を止める
trace_2();//ライントレース
先ほど右下方を向かせた。しかしながら、青い球が置いてある...
まず、回転数が26以上になるまでタイヤを進める。このことに...
次に、黒線を踏むまで強制的に直進させる。
そうすることにより、黒い線にたどり着いたロボットAは無事に...
なお、誤差が生じやすく成功率がとても低い。しかし、コース...
tomaru(10);//0.1秒停止
FWD;Wait(100);//1秒前進。
trace_3();//ライントレース
tomaru(10);//0.1秒停止
LIGHT();//缶を探索
shoot;//玉を放す
trace_1();//ライントレース
}
基本的につかんで離す動作である。
途中で1秒間直進させるのは交差点から強制的に脱出させるため...
以上がロボットAの動きである。
*ロボットB [#sc73631e]
ロボットBもロボットAと同様に先に定数等を述べ、サブルーチ...
**ライントレース用 [#f0a95638]
#define CHECKCROSSTIME 25//交差点か否かを見定める時間
#define fwd(OUT) Off(OUT);OnFwd(OUT)//モータの正回転
#define rev(OUT) Off(OUT);OnRev(OUT)//モータの負回転
#define TURNLEFT fwd(OUT_AC)//左旋回
#define LEFT Off(OUT_C);fwd(OUT_A)//左回転
#define TURNRIGHT rev(OUT_AC)//右旋回
#define RIGHT Off(OUT_A);rev(OUT_C)//右回転
#define STRAIGHT rev(OUT_C);fwd(OUT_A)//直進
#define BACK fwd(OUT_C);rev(OUT_A)//後退
#define ISNOTCROSS FastTimer(0) <= CHECKCROSSTIME || Fas...
ライントレースの時に用いられる定数
**ロボコン独自の機構 [#e5ebe7a1]
#define RELEASE rev(OUT_B);//コンベアの逆回転
#define LOADING fwd(OUT_B);//コンベアの順回転
コンベアを順回転させることにより球を回収でき、逆回転させ...
**ライントレース [#b55a58dd]
ロボットBもライントレースで移動を行う。ライントレースの方...
sub trace(){
ClearTimer(0);
while(ISNOTCROSS){
if(FastTimer(1) < startime){
ClearTimer(0);
}
if(52 <= SENSOR_1){
TURNRIGHT;
}else if(50 <= SENSOR_1){
RIGHT;
}else if(41 <= SENSOR_1){
STRAIGHT;
}else if(39 <= SENSOR_1){
LEFT;
}else {
TURNLEFT;
}
if(39 <= SENSOR_1) ClearTimer(0);
}
Off(OUT_AC);
ClearTimer(0);
Wait(100);
}
一部違うのは、ライントレースが行われる条件文である。この...
**交差点での対応 [#dc38f254]
前節では交差点を判断するまでのプログラムを示した。つぎに...
まず直進について説明する。
/* 直進する */
sub go_straight(){
STRAIGHT;//直進する
Wait(30);//0.3秒
ClearTimer(1);//タイマーリセット
}
直線の動作はいたってシンプルである。交差点を判断したらそ...
次に左折について説明する。
/* 左折する */
sub turn_left(){
ClearTimer(1);//タイマーリセット
ClearTimer(0);//タイマーリセット
}
ロボットBは線の左側でライントレースを行う。したがって、左...
今回右折はしなかった。
**main関数 [#e2e5d2af]
最後にmain関数の説明をする。
task main(){
SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサをセット
ClearTimer(0);//タイマーをセット
LOADING;//コンベアの順回転開始
go_straight();//スタート地点からの脱出
trace();//ライントレース
go_straight();//直進
Off(OUT_AC);//停止
Wait(2300);//23秒停止。停止することでロボットAとの衝突を...
ClearTimer(1);//タイマをセット
startime=900;//変数設定。
ここで、今「startime」とあるが、これは交差点かどうかの判...
trace();//ライントレース
startime=300;//3秒間、交差点判断を無視
go_straight();//直進
trace();//ライントレース
go_straight();//直進
trace();//ライントレース
go_straight();//直進
startime=1400;//14秒間、交差点判断を無視
trace();//ライントレース
startime=300;//3秒間交差点判断を無視
TURNRIGHT;//右旋回
Wait(10);
Off(OUT_AC);//停止
RELEASE;//コンベアを逆回転して、球を排出。
Wait(300);//3秒
これで一周が終了となる。競技中ではここまでの動作で一区切...
しかしながら、ロボットBを担当したugwis君は万が一のための...
BACK;
Wait(100);//1秒後退
TURNRIGHT;
Wait(40);//0.4秒右旋回
LOADING;//コンベア順回転開始
ClearTimer(0);//タイマーリセット
trace();//ライントレース
turn_left();//左折
startime=900;//9秒間、交差点判断を無視
trace();//ライントレース
startime=300;//3秒間、交差点判断を無視
go_straight();//直進
trace();//ライントレース
go_straight();//直進
trace();//ライントレース
go_straight();//直進
startime=1400;//14秒間、交差点判断を無視
trace();//ライントレース
startime=300;//3秒間、交差点判断を無視
TURNRIGHT;
Wait(10);//右旋回0.1秒
Off(OUT_AC);//停止
RELEASE;//コンベア逆回転により、球放出
Wait(300);//3秒間逆回転
go_straight();
Wait(10);//直進0,1秒
Off(OUT_ABC);//全動作停止
}
*感想 [#d35d9d43]
テスト期間であったため、いつもより準備時間がとても短かっ...
また、今回私はロボットAのプログラムを主に政策を進めた。し...
最後までお世話になった皆さんとどこかで再開できる日を願っ...
次会う日まで、お元気で。
終了行:
[[2015b/Member]]
*課題 ロボコン [#oddecb87]
**課題内容 [#r2364005]
課題2で用いたマップを2枚用いて、ボールをバトン代わりにリ...
*目次 [#nc45f072]
#contents
*ルール [#wb3173fe]
**フィールド [#c2a69dd8]
#ref(2015b/Member/S_Toya/Mission3/2015b-mission3.png)
これが今回のロボコンで用いるマップとなる。細かいルールは...
**基本ルール(要上図参照) [#f68bcdab]
・&size(12){競技時間はロボ...
・&size(12){ロボットAはSTAR...
・&size(12){その後、ロボッ...
・&size(12){引き続き青いボ...
・&size(12){ロボットBはボー...
・&size(12){アルミ缶は中身...
・&size(12){RISのチームはア...
・&size(12){ボールがアルミ...
・&size(12){ロボットAはセン...
・&size(12){アルミ缶を5cm以...
以上が基本ルールである。これに、細かな技術点が付き得点を...
*ロボット紹介 [#c1c364dd]
**ロボットA(球を発射する側) [#x188e83e]
ロボットAは、ドライブベースのようにモータ二つからなる足回...
足回りはライントレースの際に利用した形が基礎となっている。
ロボットAの最も大きな特徴は前方にある爪である。この爪のよ...
#ref(2015b/Member/S_Toya/Mission3/hanasu01_1.jpg)
上図の爪のようなパーツは左タイヤについた回転センサと連動...
したがって、タイヤが何回転したかによって球を回収させるよ...
球の回収方法は、まず指定の回数だけタイヤが回転したら爪パ...
言葉だ毛ではわかりにくいと思われるので、下図を参照してい...
CENTER:&size(20){回収する動作};
CENTER:#ref(2015b/Member/S_Toya/Mission3/A_kaishu.gif)
CENTER:&size(20){放出する動作};
#ref(2015b/Member/S_Toya/Mission3/A_keru.gif)
**ロボットB(球を回収するロボット) [#f0ec869c]
ロボットは、ドライブベースのようなモータ二つからなる足回...
足回りはAと同様のライントレースが行えるような形になってい...
ロボットBの最も大きな特徴は球を回収するために用いるコンベ...
外観は下図である。
#ref(2015b/Member/S_Toya/Mission3/tsukamu06.jpg)
当初、Aから放たれた球を光センサで探索しようとしたものの...
広範囲をカバーし、且つ缶を倒すことがないようにするために...
#ref(2015b/Member/S_Toya/Mission3/tsukamu05_1.jpg)
*ロボットAのプログラム [#y3e4370d]
次に、プログラムの方を説明する。定数やマクロについてを説...
**ライントレース用 [#c6430f7d]
#define shiki 48//閾値
#define tomaru(t) Off(OUT_AC);Wait(t);//t秒間停止
#define FWD OnFwd(OUT_AC);//直進
#define BACK OnRev(OUT_AC);//後退
#define LEFT_t OnRev(OUT_A); OnFwd(OUT_C);//左旋回
#define LEFT Off(OUT_A); OnFwd(OUT_C);//左回転
#define RIGHT_t OnRev(OUT_C); OnFwd(OUT_A); //右旋回
#define RIGHT Off(OUT_C); OnFwd(OUT_A);//右回転
#define power(s) SetPower(OUT_A+OUT_C,s);//出力制御
ライントレース用の定数設定は課題2と同じであるため、説明は...
**ロボコン独自の機構 [#od875156]
この節では課題2では用いなかった機構についてを説明する。
#define open(t) OnFwd(OUT_B);Wait(t);//爪をt秒間開く回...
#define close(t) OnRev(OUT_B);Wait(t);Off(OUT_B);//爪を...
#define stop_B Off(OUT_B);//爪を固定する
#define SUN 50//ランタンの輝度を表す定数
#define shoot power(2);open(15);Wait(10);close(15);//球...
これらを基にプログラムを組んだ。
**trace_0 (スタート地点から赤い球を見つける迄) [#c27a65...
次にライントレースを行うサブルーチンについてを説明してい...
?球をとるまで
?球を発射するまで
とプログラムが別れていて、それが二つの球においてあるため...
#ref(2015b/Member/S_Toya/Mission3/MAP_A.jpg)
今回の節は「スタート地点から赤い球を見つける迄」のプログ...
sub trace_0()
{
power(2);//出力を2にする
ClearSensor(SENSOR_1);//回転センサをリセットする
/*ライントレース*/
while(1){
if (SENSOR_2 < shiki -7){
LEFT_t;
} else if (SENSOR_2 < shiki -4){
LEFT;
} else if (SENSOR_2 < shiki){
FWD;
} else if(SENSOR_2 < shiki +4){
RIGHT;
} else {
RIGHT_t;
}
ここまでは課題2のライントレースと大体同じである。したがっ...
if(SENSOR_1 > 335){//回転センサが335を越えたら
power(3);
close(50);//0.5秒だけ爪を閉じる
ClearSensor(SENSOR_1);//回転センサをリセット
break;//trace_0終了
}
}
}
これがtrace_0独自のプログラムとなる部分である。回転センサ...
**trace_1(赤球を放す迄) [#a64fdbb7]
sub trace_1()
{
ClearSensor(SENSOR_1);
close(10);//0.1秒球を締める
Off(OUT_B);//爪を固定する
power(2);
/*ライントレース*/
while(1){
if (SENSOR_2 < shiki -7){
LEFT_t;
} else if (SENSOR_2 < shiki -4){
LEFT;
} else if (SENSOR_2 < shiki){
FWD;
} else if(SENSOR_2 < shiki +4){
RIGHT;
} else {
RIGHT_t;
}
if(SENSOR_1 > 62){//回転センサが62以上の時作動
tomaru(10);//停止させる
break;//トレース終了
}
}
}
trace_0との違いは、SENSOR_1の上限と、ライントレースを開始...
**trace_2(青球を掴む迄) [#ldba1061]
sub trace_2()
{
power(1);
ClearSensor(SENSOR_1);
while(1){
if (SENSOR_2 < shiki -7){
RIGHT_t;
} else if (SENSOR_2 < shiki -4){
RIGHT;
} else if (SENSOR_2 < shiki){
FWD;
} else if(SENSOR_2 < shiki +4){
LEFT;
} else {
LEFT_t;
}
if(SENSOR_1 > 44){
power(3);
close(50);
ClearSensor(SENSOR_1);
break;
}
}
}
trace_2は前述の二つと大体同じである。回転センサの上限が62...
**trace_3(青球を放す迄) [#r0c70456]
sub trace_3()
{
power(2);
ClearSensor(SENSOR_1);
while(1){
close(1);//少しだけ爪を締める
Off(OUT_B);
if (SENSOR_2 < shiki -7){
RIGHT_t;
} else if (SENSOR_2 < shiki -4){
RIGHT;
} else if (SENSOR_2 < shiki){
FWD;
} else if(SENSOR_2 < shiki +4){
LEFT;
} else {
LEFT_t;
}
if(SENSOR_1 > 110){
power(3);
close(50);
ClearSensor(SENSOR_1);
break;
}
}
}
trace_3が他の3つと異なる点はライントレースを行うたびに爪...
しかし、これはロボット本体に大きなダメージを与えることに...
**光源探査 [#j12be024]
次に缶を見つける動作についての説明をする。NQCには超音波セ...
しかしながら、少しでもずれると球は缶の脇をすり抜けてしま...
したがって、回転センサと光センサを連動させて最大値を特定...
sub LIGHT()
{
PlaySound(SOUND_UP);//動作確認用
int sun_MAX = 0;//明るさの最大値
int sensor_MAX = 0;//明るさの最大値を示したときの回転セ...
close(20);//球が逃げないように、再度爪を締め付ける
ClearSensor(SENSOR_1);//回転センサのリセット
power(1);//出力1
while(SENSOR_1 < 85){//SENSOR_1が85で大体1回転となる
RIGHT_t;//右旋回
if(SENSOR_3 > sun_MAX){//明るさの最大値の変更手続き
sun_MAX = SENSOR_3;//現在地を最大値として記憶
sensor_MAX = SENSOR_1//現在地の角度を記憶
}
}
tomaru(10);//一回転終了後、一時停止
LEFT_t;//左旋回
until(SENSOR_1 < sensor_MAX);//角度が上で記憶した値にな...
tomaru(10);//停止
}
まず、現在地の明るさを測定する。つぎに時計回りで一回転を...
こうすることで、缶に球が当たる確率が上がる。
図にすると下図のようになる。
#ref(2015b/Member/S_Toya/Mission3/LIGHT.gif)
**main関数 [#g2dac7f7]
いよいよmain関数の説明に入る。
task main()
{
/*回転センサ*/
SetSensor(SENSOR_1,SENSOR_ROTATION);
/*トレース用センサ*/
SetSensor(SENSOR_2,SENSOR_LIGHT);
/*探索用センサ*/
SetSensor(SENSOR_3,SENSOR_LIGHT);
/*行動開始*/
FWD;Wait(150);//スタートの枠からの脱出
trace_0();//赤玉へ向かうトレース
tomaru(50);//一時停止
trace_1();//赤玉をホールドした状態
LIGHT();//ランタンの探索
shoot;//球を放す
ここまでは普通に、
''球を掴む位置まで進み、球を掴み、その状態のまま一定程度...
という普通の流れである。
しかしながら、次の青色の球に向かうまでは少し工夫を凝らし...
tomaru(20);//0.2秒停止
ClearSensor(SENSOR_1);//回転センサリセット
RIGHT_t;//右旋回
until(SENSOR_1 > 28);//回転センサが28以上になるまで回転...
tomaru(10);//0.1秒停止
ココでは、ロボットAの車体を、缶の方向から右方の円のように...
このことによって、円状になったコース上を反時計回りにライ...
参考画像(再掲)
#ref(2015b/Member/S_Toya/Mission3/MAP_A.jpg)
ClearSensor(SENSOR_1);//回転センサをリセット
FWD;//直進
until(SENSOR_1 > 26);//回転数が26以上になるまで
Off(OUT_B);//爪をふらつかせない
FWD;//直進させる
until(SENSOR_2 < 48);//黒い線にぶつかるまで
open(7);//爪を開く
Off(OUT_B);//爪を止める
trace_2();//ライントレース
先ほど右下方を向かせた。しかしながら、青い球が置いてある...
まず、回転数が26以上になるまでタイヤを進める。このことに...
次に、黒線を踏むまで強制的に直進させる。
そうすることにより、黒い線にたどり着いたロボットAは無事に...
なお、誤差が生じやすく成功率がとても低い。しかし、コース...
tomaru(10);//0.1秒停止
FWD;Wait(100);//1秒前進。
trace_3();//ライントレース
tomaru(10);//0.1秒停止
LIGHT();//缶を探索
shoot;//玉を放す
trace_1();//ライントレース
}
基本的につかんで離す動作である。
途中で1秒間直進させるのは交差点から強制的に脱出させるため...
以上がロボットAの動きである。
*ロボットB [#sc73631e]
ロボットBもロボットAと同様に先に定数等を述べ、サブルーチ...
**ライントレース用 [#f0a95638]
#define CHECKCROSSTIME 25//交差点か否かを見定める時間
#define fwd(OUT) Off(OUT);OnFwd(OUT)//モータの正回転
#define rev(OUT) Off(OUT);OnRev(OUT)//モータの負回転
#define TURNLEFT fwd(OUT_AC)//左旋回
#define LEFT Off(OUT_C);fwd(OUT_A)//左回転
#define TURNRIGHT rev(OUT_AC)//右旋回
#define RIGHT Off(OUT_A);rev(OUT_C)//右回転
#define STRAIGHT rev(OUT_C);fwd(OUT_A)//直進
#define BACK fwd(OUT_C);rev(OUT_A)//後退
#define ISNOTCROSS FastTimer(0) <= CHECKCROSSTIME || Fas...
ライントレースの時に用いられる定数
**ロボコン独自の機構 [#e5ebe7a1]
#define RELEASE rev(OUT_B);//コンベアの逆回転
#define LOADING fwd(OUT_B);//コンベアの順回転
コンベアを順回転させることにより球を回収でき、逆回転させ...
**ライントレース [#b55a58dd]
ロボットBもライントレースで移動を行う。ライントレースの方...
sub trace(){
ClearTimer(0);
while(ISNOTCROSS){
if(FastTimer(1) < startime){
ClearTimer(0);
}
if(52 <= SENSOR_1){
TURNRIGHT;
}else if(50 <= SENSOR_1){
RIGHT;
}else if(41 <= SENSOR_1){
STRAIGHT;
}else if(39 <= SENSOR_1){
LEFT;
}else {
TURNLEFT;
}
if(39 <= SENSOR_1) ClearTimer(0);
}
Off(OUT_AC);
ClearTimer(0);
Wait(100);
}
一部違うのは、ライントレースが行われる条件文である。この...
**交差点での対応 [#dc38f254]
前節では交差点を判断するまでのプログラムを示した。つぎに...
まず直進について説明する。
/* 直進する */
sub go_straight(){
STRAIGHT;//直進する
Wait(30);//0.3秒
ClearTimer(1);//タイマーリセット
}
直線の動作はいたってシンプルである。交差点を判断したらそ...
次に左折について説明する。
/* 左折する */
sub turn_left(){
ClearTimer(1);//タイマーリセット
ClearTimer(0);//タイマーリセット
}
ロボットBは線の左側でライントレースを行う。したがって、左...
今回右折はしなかった。
**main関数 [#e2e5d2af]
最後にmain関数の説明をする。
task main(){
SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサをセット
ClearTimer(0);//タイマーをセット
LOADING;//コンベアの順回転開始
go_straight();//スタート地点からの脱出
trace();//ライントレース
go_straight();//直進
Off(OUT_AC);//停止
Wait(2300);//23秒停止。停止することでロボットAとの衝突を...
ClearTimer(1);//タイマをセット
startime=900;//変数設定。
ここで、今「startime」とあるが、これは交差点かどうかの判...
trace();//ライントレース
startime=300;//3秒間、交差点判断を無視
go_straight();//直進
trace();//ライントレース
go_straight();//直進
trace();//ライントレース
go_straight();//直進
startime=1400;//14秒間、交差点判断を無視
trace();//ライントレース
startime=300;//3秒間交差点判断を無視
TURNRIGHT;//右旋回
Wait(10);
Off(OUT_AC);//停止
RELEASE;//コンベアを逆回転して、球を排出。
Wait(300);//3秒
これで一周が終了となる。競技中ではここまでの動作で一区切...
しかしながら、ロボットBを担当したugwis君は万が一のための...
BACK;
Wait(100);//1秒後退
TURNRIGHT;
Wait(40);//0.4秒右旋回
LOADING;//コンベア順回転開始
ClearTimer(0);//タイマーリセット
trace();//ライントレース
turn_left();//左折
startime=900;//9秒間、交差点判断を無視
trace();//ライントレース
startime=300;//3秒間、交差点判断を無視
go_straight();//直進
trace();//ライントレース
go_straight();//直進
trace();//ライントレース
go_straight();//直進
startime=1400;//14秒間、交差点判断を無視
trace();//ライントレース
startime=300;//3秒間、交差点判断を無視
TURNRIGHT;
Wait(10);//右旋回0.1秒
Off(OUT_AC);//停止
RELEASE;//コンベア逆回転により、球放出
Wait(300);//3秒間逆回転
go_straight();
Wait(10);//直進0,1秒
Off(OUT_ABC);//全動作停止
}
*感想 [#d35d9d43]
テスト期間であったため、いつもより準備時間がとても短かっ...
また、今回私はロボットAのプログラムを主に政策を進めた。し...
最後までお世話になった皆さんとどこかで再開できる日を願っ...
次会う日まで、お元気で。
ページ名: