#contents
*課題2の内容 [#fb0bb097]
今回の課題はライントレースで決められた場所を走らせ、その途中で空き缶を認知し缶に向かってボールを投げさせるロボットを作成するというものであった。コースは2つあり、その内容や経路は経路は以下に表す通りである。

第1コース †
第1コース 
#ref(2018b/Member/prague/Mission2/robo street1.png,100%,経路1);


ロボットを長方形X内におき、Aをスタート

1,Bを右折

2,Kで一時停止して左折

3,Jを直進

4,Iを直進

5,Hを左折

6,Gで一時停止して左折

7,Eで一時停止して右折

8,Lを経て正方形Y内に入って停止

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

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


第2コース †
第2コース 
#ref(2018b/Member/prague/Mission2/robo street2.png,100%,経路2);


ロボットを正方形Y内におき、Lをスタート

1,Eを一時停止して直進

2,Iを一時停止して左折

3,Hを直進

4,Kを直進

5,Jを左折

6,Cを一時停止して右折

7,Eを一時停止して直進

8,Gを一時停止して直進

長方形X内に入って停止
(一時停止の指定がある場所は、1秒間停止すること)

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

*機体について [#ga36b92c]
**機体の全体図[#n28e5578]
#ref(2018b/Member/prague/Mission2/robobo.png,10%,機体の全体像)
#ref(2018b/Member/prague/Mission2/robo zentaizu .png,10%,機体の全体像〜後ろから〜)
**機体の特徴 [#fb1be886]
今回はライントレースということで色を読み取って機体を黒線に合わせながら進んでいくこと、さらに缶の位置を検知してボールを投げることが課題に挙げられているため超音波センサーとカラーセンサーをロボットに組み込まなければならない。
今回の課題ではきついカーブも存在するため、小回りが利く車体にする必要がある
*プログラミング [#t681e04a]
 #!/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
*考察と反省 [#m4a19783]


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS