- 追加された行はこの色です。
- 削除された行はこの色です。
目次
#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()