[[2018b/Member]] *ロボットの説明 [#z113c707] 高さ 31.5cm 幅 20.2cm ***ロボットのサイズ [#pc8d310e] *** ライントレースの原理と工夫[#u91be52a] &ref(2018b/Member/shaymin/Mission2/18-12-22-16-07-52-897_deco.jpg,20%); 私たちのグループはラインの境目をたどり、ラインを進んでいくプログラムを作りました。 カラーセンサーで紙の上を読み取り、値を5つの範囲に場合分けしました。(5段階) ですが、これだけだと十字路などの交差点を思い通りの方向に進むことはできません。 思い通りの方向に進むためには交差点を認識しなければなりません。 交差点のの一般的な認識方法として挙げられたものにtime.time()関数を用いた方法があります。 一定の『秒数』以上黒側を認識し続けると交差点とみなす、といったものですが、私はこの方法は最初の調整が簡単な反面、プログラムが難しく、その後のプログラムを書く上でとても不便だと考え少し違う方法でEV3に交差点を認識させました。 私のとった方法は『b=0』という値を用意し、黒側の値を検知した場合、bに数値を足し、白側の値や直線の値を検知した場合、bを0に戻します。 そして、bの値が一定の数値を超えたとき、交差点と認識するようにしました。 この方式をとる主な利点は一定時間bの値を上昇させないという操作が可能な点にあります。 カラーセンサーが一つしかないので交差点ではないのに交差点と誤って判断してしまうケースが多々あります。 実際、発表時に交差点を正しく認識できなかった班もありました。 ですが、bの値を任意の時間固定しておけば誤って交差点を認知することはありません。 time.time()と比べ、こちらの方法のほうが簡単で理解しやすいと思います。 ***ロボット本体の説明と工夫について [#ifbc1176] &ref(2018b/Member/shaymin/Mission2/s_18-12-22-16-14-53-708_deco.jpg,100%); &ref(2018b/Member/shaymin/Mission2/s_18-12-22-16-21-01-069_deco.jpg,100%); &ref(2018b/Member/shaymin/Mission2/s_18-12-22-16-25-18-100_deco.jpg,100%); &ref(2018b/Member/shaymin/Mission2/s_18-12-22-16-28-18-127_deco.jpg,100%); ***ボールを射出する機構 [#t5b84b79] &ref(2018b/Member/shaymin/Mission2/s_20181222_153103175.jpg,100%); 射出→ &ref(2018b/Member/shaymin/Mission2/s_20181222_153121600.jpg,100%); *プログラムとプログラムの説明 [#ncfb5e9a] **コース1 [#e34eb78d] #!/usr/bin/env python3 from ev3dev.ev3 import * from time import sleep mL = LargeMotor('outA') mR = LargeMotor('outB') mi = MediumMotor('outD') s1 = TouchSensor('in3') s2 = ColorSensor('in4') U1 = UltrasonicSensor('in2') def laf(t): mL.run_timed(time_sp=30,speed_sp=120+20*t,stop_action='brake') mR.run_timed(time_sp=30,speed_sp=120-20*t,stop_action='brake') def raf(t): mL.run_timed(time_sp=30,speed_sp=120-20*t,stop_action='brake') mR.run_timed(time_sp=30,speed_sp=120+20*t,stop_action='brake') def tl(t): mL.run_timed(time_sp=20,speed_sp=-150*t,stop_action='brake') mR.run_timed(time_sp=20,speed_sp=150*t,stop_action='brake') def tr(t): mL.run_timed(time_sp=20,speed_sp=100*t,stop_action='brake') mR.run_timed(time_sp=20,speed_sp=-100*t,stop_action='brake') def fd(): mL.run_timed(time_sp=20,speed_sp=150,stop_action='brake') mR.run_timed(time_sp=20,speed_sp=150,stop_action='brake') def roll(t,s): mL.run_to_rel_pos(position_sp=t,speed_sp=150,stop_action='brake') mR.run_to_rel_pos(position_sp=s,speed_sp=150,stop_action='brake') def throwing(s,t): mi.run_timed(time_sp=s,speed_sp=t,stop_action='brake') def turn(s,t): mL.run_timed(time_sp=s,speed_sp=t,stop_action='brake') mR.run_timed(time_sp=s,speed_sp=-t,stop_action='brake') roll(150,150) sleep(3) w = 0 b = 0 i = 0 while i <= 1: t0 = time.time() if i==0: e=6 else: e=9 while s1.value() == 0: if time.time()-t0 <= e: b=0 if 65 < s2.value(): tl(1) w=w+1 b=0 if 55 < s2.value() <= 65: laf(1) w=w+1 b=0 if 50 < s2.value() <= 55: fd() w=0 b=0 if 40 < s2.value() <= 50: raf(1) b=b+0.6 w=0 if s2.value() <= 40: tr(1) b=b+1 w=0 elif b>35: i=i+1 break if i == 1: roll(60,20) sleep(2) roll(60,-110) sleep(2) roll(0,-90) if i == 2: sleep(1) roll(-100,130) sleep(3) roll(20,20) sleep(3) while 2 <= i <= 8: t1 = time.time() if i==3: s=1.2 elif i==6: s=8 sleep(2) elif i==7: s=1.2 elif i==8: s==0.3 else: s=1.0 while s1.value() == 0: if time.time()-t1 <= 7*s: b=0 if 65 < s2.value(): tl(-1) w=w+1 b=0 if 55 < s2.value() <=65: laf(-1) w=w+1 b=0 if 50 <s2.value() <=55: fd() w=0 b=0 if 40 <s2.value() <=50: raf(-1) w=0 if s2.value()<=40: tr(-1.2) b=b+1 w=0 elif b>35: i=i+1 print(i) break if i==3: roll(200,0) sleep(3) if i==4: roll(200,0) sleep(3) I=0 while s1.value()==0: u=100000 t0=time.time() print(I) turn(12000,70) while time.time()-t0 <= 12: if u >=U1.value(): u=U1.value() t1= time.time() print(u) else: continue sleep(0.5) t2=time.time() sleep(1) print(t1) print(t2) t3=t2-t1 print(t3) turn(t3*(1050+5*i),-70) sleep(t3*1.2) if u+25>U1.value(): throwing(1000,50) sleep(3) throwing(1000,-50) break elif I == 3: throwing(1000,50) sleep(3) throwing(1000,-50) break else: I=I+2 roll(180,-180) sleep(3) if i==8: roll(-10,-10) sleep(2) roll(350,-20) sleep(5) roll(95,-95) sleep(2) roll(300,300) **コース2 [#j88bd7c7] #!/usr/bin/env python3 from ev3dev.ev3 import * from time import sleep mL = LargeMotor('outA') mR = LargeMotor('outB') mi = MediumMotor('outD') s1 = TouchSensor('in3') s2 = ColorSensor('in4') U1 = UltrasonicSensor('in2') def laf(t): mL.run_timed(time_sp=30,speed_sp=120+20*t,stop_action='brake') mR.run_timed(time_sp=30,speed_sp=120-20*t,stop_action='brake') def raf(t): mL.run_timed(time_sp=30,speed_sp=120-20*t,stop_action='brake') mR.run_timed(time_sp=30,speed_sp=120+20*t,stop_action='brake') def tl(t): mL.run_timed(time_sp=20,speed_sp=-150*t,stop_action='brake') mR.run_timed(time_sp=20,speed_sp=150*t,stop_action='brake') def tr(t): mL.run_timed(time_sp=20,speed_sp=100*t,stop_action='brake') mR.run_timed(time_sp=20,speed_sp=-100*t,stop_action='brake') def fd(): mL.run_timed(time_sp=20,speed_sp=150,stop_action='brake') mR.run_timed(time_sp=20,speed_sp=150,stop_action='brake') def roll(t,s): mL.run_to_rel_pos(position_sp=t,speed_sp=150,stop_action='brake') mR.run_to_rel_pos(position_sp=s,speed_sp=150,stop_action='brake') def throwing(s,t): mi.run_timed(time_sp=s,speed_sp=t,stop_action='brake') def turn(s,t): mL.run_timed(time_sp=s,speed_sp=t,stop_action='brake') mR.run_timed(time_sp=s,speed_sp=-t,stop_action='brake') roll(150,150) sleep(3) w=0 b=0 i=0 while s1.value() == 0: t0 = time.time() if i == 0: s=0.2 elif i == 3: s=1.0 elif i == 6: s=3 elif i == 7: s=1.1 elif i == 8: s=6.5 elif i == 9: s=0.7 else: s=0.8 while i <= 9: if time.time()-t0 <= 7*s: b=0 if 65 < s2.value(): tl(-1) w=w+1 b=0 if 55 < s2.value() <= 65: laf(1) w=w+1 b=0 if 50 < s2.value() <= 55: fd() w=0 b=0 if 40 < s2.value() <= 50: raf(1) b=b+0.6 if s2.value() <= 40: tr(-1) b=b+1 w=0 elif b>33: i=i+1 print(i) break if i == 1: sleep(2) roll(30,-30) sleep(1) roll(50,50) sleep(2) if i == 3: roll(200,0) sleep(2) I=0 while s1.value()==0: u = 100000 t0=time.time() print(I) turn(12000,70) while time.time()-t0<= 12: if u >=U1.value(): u = U1.value() t1 = time.time() print(u) else: continue sleep(0.5) t2=time.time() sleep(1) print(t1) print(t2) t3=t2-t1 print(t3) turn(t3*(1040+10*i),-70) sleep(t3*1.2) if u+20>U1.value(): throwing(1000,50) sleep(3) throwing(1000,-50) break elif I == 3: throwing(1000,50) sleep(3) throwing(1000,-50) break else: I=I+2 sleep(2) roll(-30,-30) sleep(3) if i == 4: roll(200,0) sleep(2) if i == 6: roll(-10,-10) sleep(2) roll(420,-20) sleep(6) if 8 <= i <= 9: roll(30,-30) sleep(1) roll(70,70) sleep(2) if i == 10: roll(50,-50) sleep(1) roll(250,250) break