- 追加された行はこの色です。
- 削除された行はこの色です。
[[2015a/Member/luminous/Mission2]]
*ロボコン課題 [#ha78ed24]
ルールは此方のページを参照↓
http://yakushi.shinshu-u.ac.jp/robotics/?2015a%2F%A5%ED%A5%DC%A5%B3%A5%F3
*ロボット本体 [#ref8aebd]
ロボット本体の外見は課題2を参照。
*走行動画 [#e7cb9d3c]
**https://www.youtube.com/watch?v=XnC5LGhUhQM [#i3976163]
*プログラミング [#ke6155a7]
プログラミングは私の手がけた方(1台目)のみを記す。
2台目のプログラミングについては↓URLを参照
今回ロボコンページは課題レポートではないので送信したプログラミングをほとんどそのまま記す。
2台目のプログラミングについてはチームメイトmorinokumasan↓URLを参照
http://yakushi.shinshu-u.ac.jp/robotics/?2015a%2FMember%2Fmorinokumasan%2FMission2
#define go_a OnFwd(OUT_AC);Wait(100);Off(OUT_AC); //前進
**マクロ [#a87935c1]
#define go_a OnFwd(OUT_AC);Wait(100);Off(OUT_AC); //前進
#define go_b OnFwd(OUT_AC);Wait(40);Off(OUT_AC); // シュート用前進
#define nMAX 7 //通常のカーブとして許容できる繰り返しの最大値
#define STEP 1 //一回の判断で動作させる時間(0.01秒)
#define THRESHOLD 34 //黒の値
#define HIPOWER 7 // 直線用のパワー
#define LOWPOWER 4 // カーブのパワー
#define set_power_H SetPower(OUT_AC,HIPOWER);
#define set_power_L SetPower(OUT_AC,LOWPOWER);
#define go_forward set_power_L; OnFwd(OUT_AC);
#define turn_left1 set_power_L; OnFwd(OUT_C); OnRev(OUT_A);
#define turn_left0 set_power_L; OnFwd(OUT_C); Off(OUT_A);
#define turn_right0 set_power_L; OnFwd(OUT_A); Off(OUT_C);
#define turn_right1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C);
#define go_b OnFwd(OUT_AC);Wait(40);Off(OUT_AC); // シュート用前進
**グローバル函数 [#ya95ba42]
#define nMAX 7 //通常のカーブとして許容できる繰り返しの最大値
int nOnline=0; //続けて黒になった回数をカウント
#define STEP 1 //一回の判断で動作させる時間(0.01秒)
**サブルーチン [#r7a0d037]
#define THRESHOLD 34 //黒の値
#define HIPOWER 7 // 直線用のパワー
#define LOWPOWER 4 // カーブのパワー
#define set_power_H SetPower(OUT_AC,HIPOWER);
#define set_power_L SetPower(OUT_AC,LOWPOWER);
#define go_forward set_power_L; OnFwd(OUT_AC);
#define turn_left1 set_power_L; OnFwd(OUT_C); OnRev(OUT_A);
#define turn_left0 set_power_L; OnFwd(OUT_C); Off(OUT_A);
#define turn_right0 set_power_L; OnFwd(OUT_A); Off(OUT_C);
#define turn_right1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C);
/* ライントレース部分は後に定数化して軽量化する */
int nOnline=0; //続けて黒になった回数をカウント
sub line_right()
{
sub line_right()
{
nOnline=0; //カウンタリセット
while(nOnline < nMAX) //右側付けのライントレースでPを直進しQの交差点まで行く
{
if (SENSOR_2 < THRESHOLD+2)
{
turn_right1; // 右旋回
nOnline++; //カウント+1
} else if (SENSOR_2 < THRESHOLD+10)
{
turn_right0; // 右折
nOnline=0;
} else if (SENSOR_2 < THRESHOLD+15)
{
go_forward; // 直進
nOnline=0;
} else if (SENSOR_2 < THRESHOLD+19)
{
turn_left0; // 左折
nOnline=0;
} else
{
turn_left1; // 左旋回
turn_left1; // 左旋回
nOnline=0;
}
Wait(STEP);
}
}
}
sub line_left()
{
sub line_left()
{
nOnline=0; //カウンタリセット
while(nOnline < nMAX) //左側をライントレース開始
{
if (SENSOR_2 < THRESHOLD+2)
{
turn_left1; // 左旋回
nOnline++; //カウント+1
} else if (SENSOR_2 < THRESHOLD+10)
{
turn_left0; // 左折
nOnline=0; //カウンタリセット
} else if (SENSOR_2 < THRESHOLD+15)
{
go_forward; // 直進
nOnline=0;
} else if (SENSOR_2 < THRESHOLD+19)
{
turn_right0; // 右折
nOnline=0;
} else
{
turn_right1; // 右旋回
nOnline=0;
}
Wait(STEP);
}
}
}
**メイン函数 [#ke7a5f13]
task main()
{
task main()
{
Off(OUT_ABC);
Wait(10);
SetSensor(SENSOR_2,SENSOR_LIGHT);
int nOnline=0; //続けて黒になった回数をカウント
/* Aからボールを取ってCまで向かう */
PlaySound(SOUND_UP);Wait(10); //スタート合図
OnRev(OUT_B);Wait(25);Off(OUT_B); //アームを開く
go_a;//最初のラインを越えてボールまで近づく
OnFwd(OUT_B);Wait(25);Off(OUT_B); //ボールを回収
line_right(); //右側のライントレース
Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(10); //交差点で小休止
OnRev(OUT_A);OnFwd(OUT_C);Wait(30);OnFwd(OUT_A);Wait(40); //交差点を渡る
Off(OUT_AC); PlaySound(SOUND_CLICK);
line_left(); //左側のライントレース
Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(30); //ゴール前の線で小休止
OnRev(OUT_AC);Wait(40);Off(OUT_AC);
OnRev(OUT_C);Wait(34); //進行方向修正Bのロボットに向く
Off(OUT_AC); PlaySound(SOUND_CLICK);OnRev(OUT_B);Wait(30);Off(OUT_B); //アームを開き シュートしつつAC小休止
Off(OUT_AC); PlaySound(SOUND_CLICK);OnRev(OUT_B);Wait(30);Off(OUT_B); //アームを開きシュートしつつAC小休止
go_b; //ボールをBにシュート
ClearTimer(0); //メッセージ1を送信後、メッセージ2の返信を1秒以内に受信して移動を開始する
ClearMessage();
while((Message() != 2)&&(FastTimer(0) < 100)) //返信が1秒以内に来なければ勝手に移動する
{
SendMessage(1);
}
if(Message() == 2)
{
PlaySound(SOUND_CLICK);
}
else
{
PlaySound(SOUND_DOWN);
}
/* 2台目が始動するので回避しながらCまで行く */
OnRev(OUT_AC);Wait(160);Off(OUT_AC); //後退秒数
OnFwd(OUT_A);Wait(230);OnFwd(OUT_C);Wait(210);Off(OUT_AC); //秒数調整してCへのライントレース右側へつける
line_right(); //右側つけのライントレース
Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(40);
OnFwd(OUT_C);OnRev(OUT_A);Wait(32);Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(50); //Cに垂直に向く
OnFwd(OUT_AC);Wait(150);Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(50); //Cの中央まで入る
OnFwd(OUT_A);OnRev(OUT_C);Wait(200);Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(30); //180度回転
OnRev(OUT_AC);Wait(45);Off(OUT_AC);OnRev(OUT_C);Wait(25);Off(OUT_AC);
OnFwd(OUT_B);Wait(5);Off(OUT_B);
Off(OUT_ABC);PlaySound(SOUND_DOWN);
/* 2台目が到着するまで待機 */
Wait(500);
ClearMessage(); //メッセージ3を受信後、メッセージ4を返信する
until(Message()==3);
PlaySound(SOUND_CLICK);
SendMessage(4);
Off(OUT_AC);PlaySound(SOUND_CLICK);
OnFwd(OUT_B);Wait(30);Off(OUT_ABC);
/* ↓以下2台目と調整部分↓ */
/* AからCまで。Qは直進で */
PlaySound(SOUND_CLICK);Wait(90); //2台目の逃げる時間をかせぐ
OnFwd(OUT_C);Wait(20);Off(OUT_C);
OnFwd(OUT_AC);Wait(205);Off(OUT_AC); //Cのライン越え
OnFwd(OUT_B);Wait(10);Off(OUT_B); //ボールを確実にキャッチ
nOnline=0;
while(nOnline < nMAX) //左側付けのライントレース。ここは狭いところを通るからカクカクで行かせるように敷居値を変える
{
if (SENSOR_2 < THRESHOLD+6)
{
turn_left1; // 左旋回
nOnline++; //カウント+1
} else if (SENSOR_2 < THRESHOLD+10)
{
turn_left0; // 左折
nOnline=0; //カウンタリセット
} else if (SENSOR_2 < THRESHOLD+15)
{
go_forward; // 直進
nOnline=0;
} else if (SENSOR_2 < THRESHOLD+15)
{
turn_right0; // 右折
nOnline=0;
} else
{
turn_right1; // 右旋回
nOnline=0;
}
Wait(STEP);
}
Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(30);
OnFwd(OUT_A);OnRev(OUT_C);Wait(60);OnFwd(OUT_AC);Wait(70);Off(OUT_AC);PlaySound(SOUND_CLICK); //進行方向修正
line_right(); //右側つけのライントレース
Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(40); //ゴール前の線で小休止
OnFwd(OUT_C);Wait(40);OnFwd(OUT_A);Wait(110);Off(OUT_AC);//ゴールのライン越え
PlaySound(SOUND_DOWN); //終了
}
*コメント [#yc493f7d]
受け渡しや秒数で移動している部分の微調整ポイントに印をつける
}
動作ごとに確認音を鳴らしてプログラミングを素早くチームワーク良くできた