*課題の内容 [#u9b90b8a] *ロボット [#a4e79040] **ロボットの全体図 [#m5f1452e] #ref(2018b/Member/prague/Mission3/s_mae.jpg,100%,経路1); #ref(2018b/Member/prague/Mission3/s_usiro.jpg,100%,経路1); **ロボットを作る過程 [#u63bad55] 今回の課題を進めるうえでまず作ろうとしたのはベルトコンベアを使ってフォークリフトのようにボールを上げるものだった。 #ref(2018b/Member/prague/Mission3/s_folk.jpg,100%,経路1); しかしこの機構は大きくかさばってしまったり重くてロボットのバランスが悪くなってしまったりと様々な問題が起こったのでこの機構は使わなかった。 そのあとに考えたのがコンベアを使ってボールをすくい上げ、それを転がして間の中に入れるというものである。 この見た目からもわかるように超音波センサがある方を前とするとボールを放つ機構が車体の前方に、ボール舗持ち上げるコンベアが車体の後方にあるので車体にかかる重心のバランスが良いという利点がある。 **車体 [#ae8477a6] 車体については全体図からもわかるように説明書でみられるような比較的スタンダードな形のものにしてある。基本的に装甲などはあまり必要がないのでここはあまり変更を加えることはなかった。 **ボールを扱う機構 [#ze37cd98] この機構を使う上でまず気を付けなければならないのはどのようにボールを上げるかということである。解決法としてはコンベアにかきづめのようなものを付け、車体とコンベアでボールを挟んで持ち上げることにした。コンベアと壁で挟まれているうちはボールを持ったまま保管でき、放つときにはボールを車体の上まで上げればよい。 #ref(2018b/Member/prague/Mission3/s_belt.jpg,100%,経路1); 図の黄色く囲まれた場所がかきづめの役割を果たす また後ろにコンベアを付けることで超音波センサーがボールを持つ機構の動きにとらわれずいつでも缶の位置を把握できるようになった。 *プログラミング [#vec07fde] #!/usr/bin/env python3 from ev3dev.ev3 import * import time ml=LargeMotor('outA') * mr=LargeMotor('outD') ma=LargeMotor('outB') cs=ColorSensor('in3') us=UltrasonicSensor('in4') gs=GyroSensor('in1') def stop(): #ロボットを停止させる ml.stop() mr.stop() def linetrace_rin(): #線の左側のライントレース c1=cs.value() while c1>13: c1=cs.value() x=(abs(c1-10)/70)*100 if x>100: x=100 l=(x/100)*210-30 r=150-l ml.run_forever(speed_sp=l,stop_action='brake') mr.run_forever(speed_sp=r,stop_action='brake') stop() def linetrace_lin(): #線の右側のライントレース c1=cs.value() while c1>13: c1=cs.value() x=abs((c1-10)/70)*100 if x>100: x=100 r=(x/100)*210-30 l=150-r ml.run_forever(speed_sp=l,stop_action='brake') mr.run_forever(speed_sp=r,stop_action='brake') stop() def linetrace_ltime(j): c1=cs.value() t1=time.time() t2=time.time() while t2-t1<j: c1=cs.value() t2=time.time() x=abs((c1-10)/70)*100 if x>100: x=100 r=(x/100)*210-30 l=150-r ml.run_forever(speed_sp=l,stop_action='brake') mr.run_forever(speed_sp=r,stop_action='brake') stop() def linetrace_lout(): c1=cs.value() while c1<40: c1=cs.value() x=(abs(c1-10)/70)*100 if x>100: x=100 r=(x/100)*120-40 l=40-r ml.run_forever(speed_sp=l,stop_action='brake') mr.run_forever(speed_sp=r,stop_action='brake') stop() def runtime(l,r): #ロボットを ml.run_timed(time_sp=l*1000,speed_sp=70,stop_action='brake') mr.run_timed(time_sp=r*1000,speed_sp=70,stop_action='brake') time.sleep((l+r)/2) def angle(l,r,t): #ロボットを回転させるプログラム ml.run_to_rel_pos(position_sp=l,speed_sp=115,stop_action='hold') mr.run_to_rel_pos(position_sp=r,speed_sp=115,stop_action='hold') time.sleep(t) def kaiten_r(s,t): g1=gs.value() g2=gs.value() while g2-g1<s: ml.run_forever(speed_sp=t,stop_action='hold') mr.run_forever(speed_sp=-t,stop_action='hold') g2=gs.value() stop() def kaiten_l(s,t): g1=gs.value() g2=gs.value() while g1-g2<s: ml.run_forever(speed_sp=-t,stop_action='hold') mr.run_forever(speed_sp=t,stop_action='hold') g2=gs.value() stop() def g(): g1=gs.value() while g1<10000: g1=gs.value() print(g1) def roll(s): ma.run_to_rel_pos(position_sp=s,speed_sp=80,stop_action='hold') time.sleep(3) def discover_l(s,t): u1=us.value() g1=gs.value() g2=gs.value() while g1-g2<s: u2=us.value() ml.run_forever(speed_sp=-70,stop_action='hold') mr.run_forever(speed_sp=70,stop_action='hold') g2=gs.value() if u2<u1: u1=u2 g3=gs.value() ml.run_forever(speed_sp=70,stop_action='hold') mr.run_forever(speed_sp=-70,stop_action='hold') g4=gs.value() g5=gs.value() if u1<=t: while g5-g4<g3-g2-6: mr.run_forever(speed_sp=-70,stop_action='hold') ml.run_forever(speed_sp=70,stop_action='hold') g5=gs.value() stop() u3=us.value() t1=time.time() while u3<2550: ml.run_forever(speed_sp=100,stop_action='hold') mr.run_forever(speed_sp=100,stop_action='hold') u3=us.value() t2=time.time() stop() roll(220) ml.run_timed(speed_sp=-100,time_sp=(t2-t1)*1000,stop_action='hold') mr.run_timed(speed_sp=-100,time_sp=(t2-t1)*1000,stop_action='hold') time.sleep(t2-t1) g6=gs.value() g7=gs.value() while g7-g6<=g1-g3-6: mr.run_forever(speed_sp=-70,stop_action='hold') ml.run_forever(speed_sp=70,stop_action='hold') g7=gs.value() stop() else: while g5-g4<90: mr.run_forever(speed_sp=-70,stop_action='hold') ml.run_forever(speed_sp=70,stop_action='hold') g5=gs.value() stop() def discover_r(s,t): u1=us.value() g1=gs.value() g2=gs.value() while g2-g1<s: u2=us.value() ml.run_forever(speed_sp=70,stop_action='hold') mr.run_forever(speed_sp=-70,stop_action='hold') g2=gs.value() if u2<u1: u1=u2 g3=gs.value() ml.run_forever(speed_sp=-70,stop_action='hold') mr.run_forever(speed_sp=70,stop_action='hold') g4=gs.value() g5=gs.value() if u1<=t: while g4-g5<g2-g3-6: mr.run_forever(speed_sp=70,stop_action='hold') ml.run_forever(speed_sp=-70,stop_action='hold') g5=gs.value() stop() u3=us.value() t1=time.time() while u3<2550: ml.run_forever(speed_sp=100,stop_action='hold') mr.run_forever(speed_sp=100,stop_action='hold') u3=us.value() t2=time.time() stop() roll(220) ml.run_timed(speed_sp=-100,time_sp=(t2-t1)*1000,stop_action='hold') mr.run_timed(speed_sp=-100,time_sp=(t2-t1)*1000,stop_action='hold') time.sleep(t2-t1) g6=gs.value() g7=gs.value() while g6-g7<=g3-g1-6: mr.run_forever(speed_sp=70,stop_action='hold') ml.run_forever(speed_sp=-70,stop_action='hold') g7=gs.value() stop() else: while g4-g5<90: mr.run_forever(speed_sp=70,stop_action='hold') ml.run_forever(speed_sp=-70,stop_action='hold') g5=gs.value() def Redball(): #スタートから赤いボールを取るまでの指令の定義 angle(250,250,3) kaiten_r(180,110) roll(220) kaiten_r(195,110) linetrace_lin() def Blueball(): #スタートから青いボールを取るまでの指令の定義 angle(-20,160,2) linetrace_lin() angle(-35,-35,1.5) kaiten_r(175,110) roll(220) def move(): kaiten_r(190,110) angle(-50,-50,1) linetrace_lin() linetrace_lout() linetrace_lin() linetrace_lout() linetrace_lin() def BlueZone(): linetrace_rin() linetrace_rout() linetrace_rin() angle(0,70,1) linetrace_rin() angle(70,0,1) linetrace_rin() def discover2(): kaiten_l(60,100) discover_r(90,500) def start(): #今回の課題でさせる命令の定義 r=int(input("insert numbera")) Redball() Blueball() move() if r<=2: kaiten_l(90,110) discover_l(90,250) kaiten_l(95,100) if r==3: angle(-40,180,2) linetrace_lin() discover_r(60,250) angle(-150,-150,2) kaiten_l(195,110) linetrace_rin() angle(230,-40,2) if r==4: angle(-40,180,2) linetrace_lin() discover_l(60,250) kaiten_l(195,110) linetrace_rin() angle(230,-40,2) if 5<=r: angle(-40,180,2) linetrace_lin() linetrace_lout() linetrace_ltime(3) discover_l(60,190) angle(-130,-130,3) kaiten_l(180,110) linetrace_rin() linetrace_rout() linetrace_rin() angle(230,-40,2) BlueZone() discover2() def vv(): u1=gs.value() while u1>0: u1=gs.value() print(u1) time.sleep(1) start()