目次
#contents

*課題 [#ra7beac2]
今回の課題はボールを運搬するロボットを作ることである。
青と赤のボールを運搬して、それぞれ所定の350ml缶の上に乗せる。

**コース [#i140229f]
&ref(2018b/Member/Yoshi/Mission3/ロボティクス課題3.png,100%,完成);

フィールドの説明~
◦フィールドは課題2で使用した紙を使用する。~
 ◦350ml缶(中が入っていても空でよい)は逆さまにして使い、ロボットのスタート直後にサイコロを振って出た目の番号の位置に置く。~
 ◦その番号の次の番号のところにもダミーの缶を置くことができる。ただし6の目が出た場合は6の位置と25cm以上離れていない場所なら~
どこに置いてもよいものとする。距離は缶と缶のもっとも近い部分で測る。~
 ◦空き缶には色をつけたり文字や記号を書いてもよい。あるいは周囲に紙を張ってもよい。~
 ◦赤と青のボールは、図のように所定の場所に置いておく。その際、キットに含まれない小さな輪ゴムを使用するものとする。~

**ルール[#df79f5bf]
基本ルール~
◦競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。~
◦図のX地点または(および)Y地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。~
◦赤いボールを図のピンクのいずれかに置いた缶に、青いボールを図の水色のいずれかに置いた缶に、それぞれ乗せる。~
◦開始の合図から5秒以内にスタートボタンを押す作業を完了すること。~
◦競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。~
◦途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。~

基本得点の計算方法~
◦ボールを一つ乗せればそれぞれ10点、二つとも乗せればボーナス点としてさらに10点。~
◦ダミーの缶を設置した上で、正しい缶に乗せれば、それぞれさらに6点加点する。~
◦ボールを目的の缶に当てることができれば、それぞれ4点。~
◦ボールを同じ領域内の間違った缶に乗せた場合は、それぞれ6点。~
◦ボールを同じ領域内の間違った缶に当てた場合は、それぞれ2点。~
◦ボールを違う領域内の缶に乗せた場合は、それぞれ2点。~
◦ボールを違う領域内の缶に当てた場合は、0点。~
◦目的の缶をもとの位置(直径7cmの円)から少し出してしまった場合は1点減点、半分以上出してしまった場合は2点または取得した得点の半分のいずれか少ないほうを減点、その缶を完全にだしてしまったときは点数を半分にする。~
◦ダミーの缶がもとの位置から移動しても減点はしない。~

技術点の計算方法~
◦以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。 得点の目安:~

◦ボール探し取りにいくまでの動作 (3点)~
◦ボール掴む動作 (3点)~
◦ボールを運ぶ動作 (2点)~
◦ボールを缶に置く動作 (2点)~
◦2台のNXT、EV3の連携の良さ(2点)~
◦自立型のロボットとしての形や動作の美しさ、斬新さ(2点)~
その他 (3点)~

**作戦 [#pe756174]

*ライントレースについて [#m7ad7c36]

**プログラムの説明 [#nf30f369]

**プログラムの導入 [#t49ebfe6]
 #!/usr/bin/env python3
 from ev3dev.ev3 import *
 import time
 mL=LargeMotor('outA') #装置AのモーターをmLとおく
 mR=LargeMotor('outD') #装置DのモーターをmRとおく
 mA=MediumMotor('outC') #装置CのモーターをmAとおく
 mC=MediumMotor('outB') #装置BのモーターをmCとおく
 csR=ColorSensor('in1') #装置1のモーターをcsRとおく
 #csL=ColorSensor('in2') #結局使わなかった
 us=UltrasonicSensor('in3') #装置3のモーターをusとおく

**定義の導入 [#ldeee58a]
 def turnR1(): #緩やかに右に曲がる関数を定義
    mL.run_forever(speed_sp=100,stop_action='brake')
    mR.stop()

 
 def turnL1(): #緩やかに左に曲がる関数を定義
    mR.run_forever(speed_sp=100,stop_action='brake')
    mL.stop()


 def run1(): #速めにまっすぐ進む関数を定義
    mR.run_forever(speed_sp=100,stop_action='brake')
    mL.run_forever(speed_sp=100,stop_action='brake')

 
 def turnR2(): #右に急カーブする関数を定義
    mL.run_forever(speed_sp=100,stop_action='brake')
    mR.run_forever(speed_sp=-70,stop_action='brake')


 def turnL2(): #左に急カーブする関数を定義
    mR.run_forever(speed_sp=100,stop_action='brake')
    mL.run_forever(speed_sp=-70,stop_action='brake')


 def traceR(): #右側をトレースする関数を定義
    t0=time.time()
    while time.time()-t0<0.35:
        if cs.value()<35:
            turnR2()
        if 35<=cs.value()<40:
            turnR1()
            t0=time.time()
        if 40<=cs.value()<=50:
            run1()
            t0=time.time()
        if 50<cs.value()<=60:
            turnL1()
            t0=time.time()
        if cs.value()>60:
            turnL2()
            t0=time.time()
    mR.stop()
    mL.stop()


 def traceRa(t):
    t1=time.time()
    while time.time()-t1<t:
            if cs.value()<35:
                turnR2()
            if 35<=cs.value()<40:
                turnR1()
            if 40<=cs.value()<=50:
                run1()
            if 50<cs.value()<=60:
                turnL1()
            if cs.value()>60:
                turnL2()
        mR.stop()
        mL.stop()


 def run2(): #遅めにまっすぐ進む関数を定義
    mL.run_forever(speed_sp=50, stop_action='brake')
    mR.run_forever(speed_sp=50, stop_action='brake')

 

 def forward():
    mL.run_to_rel_pos(position_sp=360, speed_sp=500, stop_action='brake')
    mR.run_to_rel_pos(position_sp=360, speed_sp=500, stop_action='brake')
 

 def forward_bit():
    mL.run_to_rel_pos(position_sp=20, speed_sp=500, stop_action='brake')
    mR.run_to_rel_pos(position_sp=200, speed_sp=500, stop_action='brake')

 

 def catchup():
    while us.value()>=50:
        run2()
    mR.stop()
    mL.stop()
    mC.reset()
    mC.run_to_abs_pos(position_sp=60 ,speed_sp=20, stop_action='brake')
    time.sleep(3)
    mA.run_to_abs_pos(position_sp=100, speed_sp=30, stop_action='brake')
    time.sleep(4)
    mC.run_to_abs_pos(position_sp=0, speed_sp=20, stop_action='brake')
    time.sleep(6)
    mA.run_to_abs_pos(position_sp=0, speed_sp=100, stop_action='hold')
    time.sleep(3)


 def puton_red():
    time4=time.time()
    while us.value>=40:
        run()
    time_kan=time.time()
    mC.run_to_rel_abs(position_sp=30, speed_sp=20, stop_action='brake')
    time.sleep(1)
    timenow=time.time()
    while time.time()-timenow<=time_kan-time4:
        mL.run_forever(speed_sp=-50, stop_action='brake')
        mR.run_forever(speed_sp=-50, stop_action='brake')


 def puton_blue():
    while us.value>=40:
        run()
     mC.run_to_rel_abs(position_sp=30, speed_sp=20, stop_action='brake')


 def direct_one():
    time1=time.time()
    while time.time()-time1<=20:
        mL.run_forever(speed_sp=-50, stop_action='brake')
        mR.run_forever(speed_sp=50, stop_action='brake')
 

 def Round_red():
    time1=time.time()
    while time.time()-time1<=fuga:
        mL.run_forever(speed_sp=50, stop_action='brake')
        mR.run_forever(speed_sp=-50, stop_action='brake')


 def direct_redkan():
    time1=time()
    while time.time()-time1<=fuga-(think_red()-time_start):
        mL.run_forever(speed_sp=-50, stop_action='brake')
        mR.run_forever(speed_sp=50, stop_action='brake')
 

 def direct_I():
    time1=time.time()
    while time.time()-time1<=think_red()-time_start+いくらか:
        mL.run_forever(speed_sp=-50, stop_action='brake')
        mR.run_forever(speed_sp=50, stop_action='brake')


 def direct_B():
    time1=time.time()
    while time.time()-time1<=20:
        mL.run_forever(speed_sp=-50, stop_action='brake')
        mR.run_forever(speed_sp=50, stop_action='brake')
 

 def Round_blue():
    time1=time.time()
    while time.time()-time1<=fuga2:
        mL.run_forever(speed_sp=50, stop_action='brake')
        mR.run_forever(speed_sp=-50, stop_action='brake')
 

 def direct_bluekan():
    time1=time()
    while time.time()-time1<=fuga2-(think_blue()-time_start):
        mL.run_forever(speed_sp=-50, stop_action='brake')
        mR.run_forever(speed_sp=50, stop_action='brake')
 

 time_start=0
 time_a=0
 time_b=0
 def search(fuga,hoge):
    global time_start
    global time_a
    global time_b
    a=1250
    b=1250
    time0=time_start=time.time()
    while us.value()>=hoge:
        continue
    while time.time()-time0<=fuga:
        if us.value()<=hoge:
            if us.value()<=a:
                a=us.value()
                time_a=time.time()
        else:
            break   
    while time.time()-time0<=fuga and us.value()>=hoge:
        continue
    while time.time()-time0<=fuga:
        if us.value()<=hoge:
            if us.value()<=b:
                b=us.value()
                time_b=time.time()
        else:
            break
 

 def think_red():
    if a<b:
        return time_a
    else:
        return time_b


 def think_blue():
    if a<150 and b<150:
        return time_b
    if a<150 and 150<=b<300:
        return time_a
    if 150<=a<300 and 150<=b<300:
        return time_a
    if a<300 and b=1250:
        return time_a
    if a>=300 and b=1250:
        return time_b
    if 450<b<550:
        return time_b
 
#以下本来したかった実行命令(一応) 


 catchup()
 forword()
 linetrace()
 direct_one()
 Round_red()
 search(fuga)
 direct_redkan()
 puton_red()
 direct_I()
 catchup()
 linetrace()
 forword_bit()
 linetrace()
 direct_B()
 Round_blue()
 search_blue()
 direct_bluekan()
 puton_blue()


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