課題2(第2コース)

下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。

ミッション

次のいずれかのコースで黒い線に沿って動き、途中でボールをゴール付近に立てた350mlの空き缶(黄色で表示)に当てるロボットを製作せよ。 (相棒と違うコースを選ぶこと) http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&page=2018b%2FMember%2FJerry%2FMission2&src=%A5%B3%A1%BC%A5%B9.png

  1. ロボットを正方形X内におき、Lをスタート
  2. Eを一時停止して直進
  3. Iを一時停止して左折
  4. Hを直進
  5. Kを直進
  6. Jを左折
  7. Cを一時停止して右折
  8. Eを一時停止して直進
  9. Gを一時停止して直進
  10. 長方形X内に入って停止

(一時停止の指定がある場所は、1秒間停止すること)

ボールはロボットが弧IHKJ上にある時にQ地点の空き缶に当てる

ロボットの説明

全体像

http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=C28CF2AD-EBF7-4DC6-BAD4-E41C3BCDE9D9.jpeg&refer=2018b%2FMember%2Fyamada%2FMission2 [#d0f606ea]

各種センサーの位置

http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=721D9563-2EBC-45A6-92F9-D74A4BE851C6.jpeg&refer=2018b%2FMember%2Fyamada%2FMission2

プログラムについて

基本動作に関する定義

#define THRESHOLD 54 [#o897b273]

#define SPEED 30

#define speed 20

#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);

#define LEFT OnRL(speed,-speed);

#define left OnRL(speed,0);

#define straight OnRL(SPEED,SPEED);

#define right OnRL(0,speed);

#define RIGHT OnRL(-speed,speed);

#define STEP 1

#define nMAX 300

#define short_break Off(OUT_BC);Wait(1000);

#define CROSS_TIME 700

#define cross_line OnFwd(OUT_BC,speed);Wait(CROSS_TIME);short_break;

#define turn_time 3000

#define turn_left LEFT;Wait(turn_time);short_break;

#define turn_right RIGHT;Wait(turn_time);short_break;

#define kaiten OnRL(SPEED,-SPEED);

#define kaiten_time 5500

#define arm_up OnRev(OUT_A,SPEED);Wait(500);Off(OUT_A);

まとまった動作に関する定義

黒線の右側をトレースするプログラム

sub line_trace_R() {

while (true) {
   if(SENSOR_3<THRESHOLD-8){RIGHT;}
   else if(SENSOR_3<THRESHOLD-3){right;}
   else if(SENSOR_3<THRESHOLD+2){straight;}
   else if(SENSOR_3<THRESHOLD+6){left;}
   else{LEFT;}
  Wait(STEP);

}

黒線の左側をトレースするプログラム

sub line_trace_L() {

while (true) {
   if(SENSOR_3<THRESHOLD-8){LEFT;}
   else if(SENSOR_3<THRESHOLD-3){left;}
   else if(SENSOR_3<THRESHOLD+2){straight;}
   else if(SENSOR_3<THRESHOLD+6){right;}
   else{RIGHT;}
  Wait(STEP);
  }

黒線の右側トレース時に交差点で一時停止して横断するプログラム

sub kousaten_trace_R() {

  SetSensorLight(S3);
  int nOnline=0;
while (nOnline < nMAX) {
  if (SENSOR_3 < THRESHOLD-10) {
   RIGHT;
   nOnline++;}
  else {
   if (SENSOR_3 < THRESHOLD-3) {right;}
   else if (SENSOR_3 < THRESHOLD+2) {straight;}
   else if (SENSOR_3 < THRESHOLD+6) {left;}
   else {LEFT;}
   nOnline=0;}
  Wait(STEP);
 }
 short_break;
 LEFT;
 Wait(nMAX*STEP);
 cross_line;
 nOnline=0;
}

黒線の左側トレース時に交差点で一時停止して横断するプログラム

sub kousaten_trace_() {

  SetSensorLight(S3);
  int nOnline=0;
while (nOnline < nMAX) {
  if (SENSOR_3 < THRESHOLD-10) {
   LEFT;
   nOnline++;}
  else {
   if (SENSOR_3 < THRESHOLD-3) {left;}
   else if (SENSOR_3 < THRESHOLD+2) {straight;}
   else if (SENSOR_3 < THRESHOLD+6) {right;}
   else {RIGHT;}
   nOnline=0;}
  Wait(STEP);
 }
 short_break;
 RIGHT;
 Wait(nMAX*STEP);
 cross_line;
 nOnline=0;
}

黒線の右側トレース時に一時停止して左折するプログラム

sub kousaten_sasetsu_R() {

  SetSensorLight(S3);
  int nOnline=0;
while (nOnline < nMAX) {
  if (SENSOR_3 < THRESHOLD-8) {
   RIGHT;
   nOnline++;}
  else {
   if (SENSOR_3 < THRESHOLD-3) {right;}
   else if (SENSOR_3 < THRESHOLD+2) {straight;}
   else if (SENSOR_3 < THRESHOLD+6) {left;}
   else {LEFT;}
   nOnline=0;}
  Wait(STEP);
 }
 short_break;
 LEFT;
 Wait(nMAX*STEP);
 turn_left;
 nOnline=0;
}

黒線の左側トレース時に一時停止して右折するプログラム

sub kousaten_usetsu_L() {

  SetSensorLight(S3);
  int nOnline=0;
while (nOnline < nMAX) {
  if (SENSOR_3 < THRESHOLD-8) {
   LEFT;
   nOnline++;}
  else {
   if (SENSOR_3 < THRESHOLD-3) {left;}
   else if (SENSOR_3 < THRESHOLD+2) {straight;}
   else if (SENSOR_3 < THRESHOLD+6) {right;}
   else {RIGHT;}
   nOnline=0;}
  Wait(STEP);
 }
 short_break;
 RIGHT;
 Wait(nMAX*STEP);
 turn_right;
 nOnline=0;
}

缶の位置を探すプログラム

sub serch_kan() { SetSensorLowspeed(S4); long t10,t11; int L=10000; while(CurrentTick()-t10<=kaiten_time){

OnRL(speed,-speed);
if(SensorUS(S4)<L)
{
 L=SensorUS(S4);
 t11=CurrentTick()-t10;
}

} OnRL(-speed,speed); Wait(kaiten_time-t11); Off(OUT_BC); }

ボールをシュートするプログラム

sub shoot() {

arm_up;
OnFwd(OUT_BC,100);
Wait(200);
Off(OUT_BC);
}

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-01-11 (金) 16:23:30 (5d)