2018b/Member/shaymin/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#contents
*コースの説明 [#n7caae60]
&ref(2018b/Member/shaymin/Mission3/s_-uwKn4Dt.jpg,100%);
?赤のボールを拾う
?青のボールを拾う
?索敵を行い、目的の缶に近づき赤いボールを乗せる。その後、...
?再び索敵を行い、目的の缶に近づき青いボールを乗せる。
*ルール [#k75c299e]
**基本ルール [#o22db514]
競技時間は審判が続行不能と判断するまで、あるいはリタイア...
図のX地点または(および)Y地点からスタートする。ただし接...
赤いボールを図のピンクのいずれかに置いた缶に、青いボール...
開始の合図から5秒以内にスタートボタンを押す作業を完了す...
競技が終了するまで、ロボットに触ったり人間が遠隔で操作し...
。
途中でうまく動かなくなった場合、1回限り再スタートするこ...
**基本得点の計算方法 [#u4b0bdbf]
ボールを一つ乗せればそれぞれ10点、二つとも乗せればボーナ...
ダミーの缶を設置した上で、正しい缶に乗せれば、それぞれさ...
ボールを目的の缶に当てることができれば、それぞれ4点。
ボールを同じ領域内の間違った缶に乗せた場合は、それぞれ6点。
ボールを同じ領域内の間違った缶に当てた場合は、それぞれ2点。
ボールを違う領域内の缶に乗せた場合は、それぞれ2点。
ボールを違う領域内の缶に当てた場合は、0点。
目的の缶をもとの位置(直径7cmの円)から少し出してしまった...
ダミーの缶がもとの位置から移動しても減点はしない。
**技術点の計算方法 [#p7a5e6db]
以下の動作の精度・スピード・確実性などを含めた技術的な工...
得点の目安:
ボール探し取りにいくまでの動作 (3点)
ボール掴む動作 (3点)
ボールを運ぶ動作 (2点)
ボールを缶に置く動作 (2点)
2台のNXT、EV3の連携の良さ(2点)
自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
その他 (3点)
*ロボットの説明 [#d696e17a]
**ロボットの外見 [#had9efa4]
&ref(2018b/Member/shaymin/Mission3/s_hdnTaVh2.jpg,100%);
ロボットを横から見た写真
写真左側にロボットの正面があり、写真右側、ロボットの後方...
&ref(2018b/Member/shaymin/Mission3/s_AYmB6K74.jpg,80%);
ロボットを上から見た写真
一枚目の写真の上部、この写真の中央に写っているのがジャイ...
このジャイロセンサーの下を通っている白いレールのようなも...
&ref(2018b/Member/shaymin/Mission3/s_9oPsKB0z.jpg,80%);
ロボットを正面から見た時の写真
ロボット中央についている目のような部品が超音波センサーで...
しかしロボットなので誤差は生じる。
そこでその誤差をカバーし、より確実に缶の上に乗せるため、...
超音波センサーの両隣の灰色の部品は缶をよりロボットの中心...
**ボールを持ち上げる機構 [#ge0f91ce]
&ref(2018b/Member/shaymin/Mission3/s_8P536Ai6.jpg,100%);
ベルトコンベアに爪のようなものを取り付け、ベルトコンベア...
詳しくは下記の『ボールを拾いあげる流れ』を参照
**ボールを拾いあげる流れ [#feee1b9f]
&ref(2018b/Member/shaymin/Mission3/s_CFfxxwMg.jpg,100%);...
↓
&ref(2018b/Member/shaymin/Mission3/s_He8G1L6q.jpg,100%);...
↓
&ref(2018b/Member/shaymin/Mission3/s_rQ0CRyaG.jpg,100%);...
↓
&ref(2018b/Member/shaymin/Mission3/s_bCs47u-C.jpg,100%);...
**ボールを缶に乗せる一連の動き [#t381e9aa]
&ref(2018b/Member/shaymin/Mission3/s_xwclcbeT.jpg,100%);
?缶に超音波センサーが接触するところまで近づく
&ref(2018b/Member/shaymin/Mission3/s_MU8g2zoU.jpg,63%);
?ベルトコンベアを回転させ、球を射出する
&ref(2018b/Member/shaymin/Mission3/s_1HURzn1T.jpg,100%);
?勢いのついた球を白い可動式の部品が受け止め、缶の上に乗せる
&ref(2018b/Member/shaymin/Mission3/s_70MwRcJd.jpg,100%);
?白い部分は可動式になっているので缶の上に乗せた球を落とす...
*プログラム [#gac64291]
**ライントレースのプログラム [#v553580c]
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='bra...
mr.run_forever(speed_sp=r,stop_action='bra...
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='bra...
mr.run_forever(speed_sp=r,stop_action='bra...
stop()
def linetrace_rout():
c1=cs.value()
while c1<40:
c1=cs.value()
x=(abs(c1-10)/70)*100
if x>100:
x=100
l=(x/100)*120-40
r=40-l
ml.run_forever(speed_sp=l,stop_action='bra...
mr.run_forever(speed_sp=r,stop_action='bra...
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='bra...
mr.run_forever(speed_sp=r,stop_action='bra...
stop()
赤いボールを5,6番の缶に乗せるために、設定した時間で終了す...
def linetrace_ltime(j):
c1=cs.value()
t1=time.time() #プログラムがスタートした時刻を定義
t2=time.time() #プログラムの経過時間を定義
while t2-t1<j: #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='bra...
mr.run_forever(speed_sp=r,stop_action='bra...
stop()
**ベルトコンベアのプログラム [#u3042d27]
def roll(s):
ma.run_to_rel_pos(position_sp=s,speed_sp=80,stop_a...
time.sleep(3)
ベルトコンベアを回転させるプログラム。220°回転させるのが...
**ボールを射出するプログラム [#lf5f9b4f]
電池の残量などによってモーターの回転数が一定に定まらず安...
def discover_l(s,t): #左回りの場合
u1=us.value() #超音波センサーの値を先に定義する
g1=gs.value() #プログラムスタート時の角度を定義
g2=gs.value() #プログラムの途中経過の角度をあらか...
while g1-g2<s: #g1-g2は回った角度を表していて、そ...
u2=us.value() #プログラムの進行中に逐次超...
ml.run_forever(speed_sp=-70,stop_action='h...
mr.run_forever(speed_sp=70,stop_action='ho...
g2=gs.value() #ジャイロセンサーの値を逐次...
if u2<u1: #超音波センサーを更新した時、そ...
u1=u2
g3=gs.value() #その時の角度もg3に...
g4=gs.value() #缶発見後に右回転する時のスタート地...
g5=gs.value() #右回転している時の角度を定義
if u1<=t: #指定した範囲内に缶が存在していた場合
while g5-g4<g3-g2-6: #缶の位置に到達するま...
mr.run_forever(speed_sp=-70,stop_a...
ml.run_forever(speed_sp=70,stop_ac...
g5=gs.value()
stop()
u3=us.value() #超音波センサーの値をあらか...
t1=time.time() #この時の時間を保存
while u3<2550: #※1
ml.run_forever(speed_sp=100,stop_a...
mr.run_forever(speed_sp=100,stop_a...
u3=us.value() #超音波センサーの値...
t2=time.time() #進んだ経過時間を測...
stop()
roll(220) #ベルトコンベアを回してボールを...
ml.run_timed(speed_sp=-100,time_sp=(t2-t1)...
mr.run_timed(speed_sp=-100,time_sp=(t2-t1)...
time.sleep(t2-t1) #後退している間プログラ...
g6=gs.value() #初期位置に戻るためのスター...
g7=gs.value() #初期位置に戻る時の経過時間...
while g7-g6<=g1-g3-6: #初期位置に戻るまで...
mr.run_forever(speed_sp=-70,stop_a...
ml.run_forever(speed_sp=70,stop_ac...
g7=gs.value()
stop()
else: #測定した範囲内で缶が見つからなかった場合
while g5-g4<g1-g2: #測り始めた位置まで戻る
mr.run_forever(speed_sp=-70,stop_a...
ml.run_forever(speed_sp=70,stop_ac...
g5=gs.value()
stop()
def discover_r(s,t): #右回転の場合 基本的に左回転の時と...
u1=us.value()
g1=gs.value()
g2=gs.value()
while g2-g1<s: #今回は右回転となるためg2>g1となる
u2=us.value()
ml.run_forever(speed_sp=70,stop_action='ho...
mr.run_forever(speed_sp=-70,stop_action='h...
g2=gs.value()
if u2<u1:
u1=u2
g3=gs.value()
g4=gs.value()
g5=gs.value()
if u1<=t:
while g4-g5<g2-g3-6:
mr.run_forever(speed_sp=70,stop_ac...
ml.run_forever(speed_sp=-70,stop_a...
g5=gs.value()
stop()
u3=us.value()
t1=time.time()
while u3<2550:
ml.run_forever(speed_sp=100,stop_a...
mr.run_forever(speed_sp=100,stop_a...
u3=us.value()
t2=time.time()
stop()
roll(220)
ml.run_timed(speed_sp=-100,time_sp=(t2-t1)...
mr.run_timed(speed_sp=-100,time_sp=(t2-t1)...
time.sleep(t2-t1)
g6=gs.value()
g7=gs.value()
while g6-g7<=g3-g1-6:
mr.run_forever(speed_sp=70,stop_ac...
ml.run_forever(speed_sp=-70,stop_a...
g7=gs.value()
stop()
else:
while g4-g5<90:
mr.run_forever(speed_sp=70,stop_ac...
ml.run_forever(speed_sp=-70,stop_a...
g5=gs.value()
stop()
**プログラムの全体 [#n62ff5fd]
#!/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='bra...
mr.run_forever(speed_sp=r,stop_action='bra...
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='bra...
mr.run_forever(speed_sp=r,stop_action='bra...
stop()
def linetrace_rout():
c1=cs.value()
while c1<40:
c1=cs.value()
x=(abs(c1-10)/70)*100
if x>100:
x=100
l=(x/100)*120-40
r=40-l
ml.run_forever(speed_sp=l,stop_action='bra...
mr.run_forever(speed_sp=r,stop_action='bra...
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='bra...
mr.run_forever(speed_sp=r,stop_action='bra...
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='br...
mr.run_forever(speed_sp=r,stop_action='br...
stop()
def runtime(l,r): #指定した時間分タイヤを動かす
ml.run_timed(time_sp=l*1000,speed_sp=70,stop_acti...
mr.run_timed(time_sp=r*1000,speed_sp=70,stop_acti...
time.sleep((l+r)/2)
def angle(l,r,t): #指定した角度分タイヤを動かす lは左タ...
ml.run_to_rel_pos(position_sp=l,speed_sp=115,stop...
mr.run_to_rel_pos(position_sp=r,speed_sp=115,stop...
time.sleep(t)
def kaiten_r(s,t): 右回りに回転
g1=gs.value() #ジャイロセンサーの値をあらかじめ定義
g2=gs.value() #ジャイロセンサーの値をあらかじめ別...
while g2-g1<s: #g2とg1を比較してg2-g1が指定した角...
ml.run_forever(speed_sp=t,stop_action='ho...
mr.run_forever(speed_sp=-t,stop_action='h...
g2=gs.value() #ループする度にg2の値を更新...
stop() #止まる
def kaiten_l(s,t): 左回りに回転
g1=gs.value()
g2=gs.value()
while g1-g2<s: #ジャイロセンサーは時計回りだと値...
ml.run_forever(speed_sp=-t,stop_action='h...
mr.run_forever(speed_sp=t,stop_action='ho...
g2=gs.value() #ループする度にg2の値を更新...
stop() #止まる
def roll(s): ベルトコンベアを動かすプログラム
ma.run_to_rel_pos(position_sp=s,speed_sp=80,stop_...
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='...
mr.run_forever(speed_sp=70,stop_action='h...
g2=gs.value()
if u2<u1:
u1=u2
g3=gs.value()
g4=gs.value()
g5=gs.value()
if u1<=t:
while g5-g4<g3-g2-6:
mr.run_forever(speed_sp=-70,stop_...
ml.run_forever(speed_sp=70,stop_a...
g5=gs.value()
stop()
u3=us.value()
t1=time.time()
while u3<2550:
ml.run_forever(speed_sp=100,stop_...
mr.run_forever(speed_sp=100,stop_...
u3=us.value()
t2=time.time()
stop()
roll(220)
ml.run_timed(speed_sp=-100,time_sp=(t2-t1...
mr.run_timed(speed_sp=-100,time_sp=(t2-t1...
time.sleep(t2-t1)
g6=gs.value()
g7=gs.value()
while g7-g6<=g1-g3-6:
mr.run_forever(speed_sp=-70,stop_...
ml.run_forever(speed_sp=70,stop_a...
g7=gs.value()
stop()
else:
while g5-g4<90:
mr.run_forever(speed_sp=-70,stop_...
ml.run_forever(speed_sp=70,stop_a...
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='h...
mr.run_forever(speed_sp=-70,stop_action='...
g2=gs.value()
if u2<u1:
u1=u2
g3=gs.value()
g4=gs.value()
g5=gs.value()
if u1<=t:
while g4-g5<g2-g3-6:
mr.run_forever(speed_sp=70,stop_a...
ml.run_forever(speed_sp=-70,stop_...
g5=gs.value()
stop()
u3=us.value()
t1=time.time()
while u3<2550:
ml.run_forever(speed_sp=100,stop_...
mr.run_forever(speed_sp=100,stop_...
u3=us.value()
t2=time.time()
stop()
roll(220)
ml.run_timed(speed_sp=-100,time_sp=(t2-t1...
mr.run_timed(speed_sp=-100,time_sp=(t2-t1...
time.sleep(t2-t1)
g6=gs.value()
g7=gs.value()
while g6-g7<=g3-g1-6:
mr.run_forever(speed_sp=70,stop_a...
ml.run_forever(speed_sp=-70,stop_...
g7=gs.value()
stop()
else:
while g4-g5<90:
mr.run_forever(speed_sp=70,stop_a...
ml.run_forever(speed_sp=-70,stop_...
g5=gs.value()
def Redball(): #スタートから赤ボールを取りに行くプログラム
angle(250,250,3) #赤ボールの位置まで進む
kaiten_r(180,110) #ボールを掬う部分は車体の後ろに...
roll(220) #ボールを掬う
kaiten_r(195,110) #車体の向きを戻す ライントレー...
linetrace_lin() #G地点まで線の右側をライントレー...
def Blueball(): 青ボールを取りに行くまでのプログラム
angle(-20,160,2) #Gの交差点をまたぐために位置を調...
linetrace_lin() #GからHまで線の右側をライントレー...
angle(-35,-35,1.5) #Hの交差点を認識したら車体を回...
kaiten_r(175,110) #車体を180度回転させる
roll(220) #ボールを掬う
def move(): 青ボールを拾った後、Eの交差点に行くまでのプ...
kaiten_r(190,110) #車体の向きを元に戻す
angle(-50,-50,1) #ライントレースが安定するように...
linetrace_lin() #Hまで線の右側をライントレースする
linetrace_lout() #Hを認識後、linetrace_lin()では...
linetrace_lin() #HからI間の線の境界線上まで来たら...
linetrace_lout() #Iを認識後、こちらに先ほどと同じ...
linetrace_lin() #Eを認識するまでライントレース
def BlueZone(): #赤ボールを缶に乗せて分岐から帰ってきた...
linetrace_rin() #EからI間の線の左側をライントレー...
linetrace_rout() #Iを認識後、linetrace_rin()では...
linetrace_rin() #IからH間の線の境界線上まで来たら...
angle(70,0,1) #交差点を跨ぐ
linetrace_rin() #HからKまでライントレースする
def discover2(): #青ボールを射出するプログラム
kaiten_l(60,100) #角度を調整しておく
discover_r(90,500) #缶に乗せるプログラム 上で説明...
def start():
r=int(input("insert numbera")) #赤は番号の場合分...
Redball()
Blueball()
move()
if r<=2: #缶1缶2に置く時 Eの位置で缶を探し始める
kaiten_l(90,110) #E地点で上の方向を向く
discover_l(90,250) #缶を乗せるプログラム...
kaiten_l(95,100) #E地点で左側を向く
if r==3: #缶3に置く時 Dまで進んで缶3がある範囲の...
angle(-40,180,2) #Eの左下から右上に車体を...
linetrace_lin() #EからD間の線の右側をライ...
discover_r(60,250) #D地点で缶を乗せるプロ...
angle(-150,-150,2) #後に車体を180度回転さ...
kaiten_l(195,110) #195度左回転をする
linetrace_rin() #DからEの間を線の左側をラ...
angle(230,-40,2) #Eの右上から左下に移動
if r==4: #缶4に置く時 Dまで進んで缶4がある範囲の...
angle(-40,180,2) #Eの左下から右上に車体を...
linetrace_lin() #EからD間の線の右側をライ...
discover_l(60,250) #D地点で缶に乗せるプロ...
kaiten_l(195,110) #195度左回転する
linetrace_rin() #DからEの間を線の左側をラ...
angle(230,-40,2) #Eの右上から左下に移動
if 5<=r: #缶5缶6に置く時 Uターンの手前まで進み、...
angle(-40,180,2) #Eの左下から右上に車体を...
linetrace_lin() #EからD間の線の右側をライ...
linetrace_lout() #Dの交差点を認識後、line...
linetrace_ltime(3) #Dから急カーブ前の間で...
discover_l(60,190) #缶に乗せるプログラム...
angle(-130,-130,3) #後に車体を180度回転す...
kaiten_l(180,110) #車体を左に180度回転する
linetrace_rin() #D地点までライントレース
linetrace_rout() #D地点を認識後、角を曲が...
linetrace_rin() #E地点までライントレース
angle(230,-40,2) #Eの右上から左下に移動
BlueZone()
discover2()
start() #起動
*結果と振り返りと感想 [#h0d88539]
&ref(2018b/Member/shaymin/Mission3/s_COjGEQdM.jpg,100%);
写真にある通り、私たちE3E4班がボールをひとつ缶の上に乗せ...
最初の実行でプログラムのミスが見つかり、短時間で修正した...
色々なアクシデントが起こりスムーズに進まなかったこともあ...
&ref(2018b/Member/shaymin/Mission3/xxCGTEuL.jpg,20%);
終了行:
#contents
*コースの説明 [#n7caae60]
&ref(2018b/Member/shaymin/Mission3/s_-uwKn4Dt.jpg,100%);
?赤のボールを拾う
?青のボールを拾う
?索敵を行い、目的の缶に近づき赤いボールを乗せる。その後、...
?再び索敵を行い、目的の缶に近づき青いボールを乗せる。
*ルール [#k75c299e]
**基本ルール [#o22db514]
競技時間は審判が続行不能と判断するまで、あるいはリタイア...
図のX地点または(および)Y地点からスタートする。ただし接...
赤いボールを図のピンクのいずれかに置いた缶に、青いボール...
開始の合図から5秒以内にスタートボタンを押す作業を完了す...
競技が終了するまで、ロボットに触ったり人間が遠隔で操作し...
。
途中でうまく動かなくなった場合、1回限り再スタートするこ...
**基本得点の計算方法 [#u4b0bdbf]
ボールを一つ乗せればそれぞれ10点、二つとも乗せればボーナ...
ダミーの缶を設置した上で、正しい缶に乗せれば、それぞれさ...
ボールを目的の缶に当てることができれば、それぞれ4点。
ボールを同じ領域内の間違った缶に乗せた場合は、それぞれ6点。
ボールを同じ領域内の間違った缶に当てた場合は、それぞれ2点。
ボールを違う領域内の缶に乗せた場合は、それぞれ2点。
ボールを違う領域内の缶に当てた場合は、0点。
目的の缶をもとの位置(直径7cmの円)から少し出してしまった...
ダミーの缶がもとの位置から移動しても減点はしない。
**技術点の計算方法 [#p7a5e6db]
以下の動作の精度・スピード・確実性などを含めた技術的な工...
得点の目安:
ボール探し取りにいくまでの動作 (3点)
ボール掴む動作 (3点)
ボールを運ぶ動作 (2点)
ボールを缶に置く動作 (2点)
2台のNXT、EV3の連携の良さ(2点)
自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
その他 (3点)
*ロボットの説明 [#d696e17a]
**ロボットの外見 [#had9efa4]
&ref(2018b/Member/shaymin/Mission3/s_hdnTaVh2.jpg,100%);
ロボットを横から見た写真
写真左側にロボットの正面があり、写真右側、ロボットの後方...
&ref(2018b/Member/shaymin/Mission3/s_AYmB6K74.jpg,80%);
ロボットを上から見た写真
一枚目の写真の上部、この写真の中央に写っているのがジャイ...
このジャイロセンサーの下を通っている白いレールのようなも...
&ref(2018b/Member/shaymin/Mission3/s_9oPsKB0z.jpg,80%);
ロボットを正面から見た時の写真
ロボット中央についている目のような部品が超音波センサーで...
しかしロボットなので誤差は生じる。
そこでその誤差をカバーし、より確実に缶の上に乗せるため、...
超音波センサーの両隣の灰色の部品は缶をよりロボットの中心...
**ボールを持ち上げる機構 [#ge0f91ce]
&ref(2018b/Member/shaymin/Mission3/s_8P536Ai6.jpg,100%);
ベルトコンベアに爪のようなものを取り付け、ベルトコンベア...
詳しくは下記の『ボールを拾いあげる流れ』を参照
**ボールを拾いあげる流れ [#feee1b9f]
&ref(2018b/Member/shaymin/Mission3/s_CFfxxwMg.jpg,100%);...
↓
&ref(2018b/Member/shaymin/Mission3/s_He8G1L6q.jpg,100%);...
↓
&ref(2018b/Member/shaymin/Mission3/s_rQ0CRyaG.jpg,100%);...
↓
&ref(2018b/Member/shaymin/Mission3/s_bCs47u-C.jpg,100%);...
**ボールを缶に乗せる一連の動き [#t381e9aa]
&ref(2018b/Member/shaymin/Mission3/s_xwclcbeT.jpg,100%);
?缶に超音波センサーが接触するところまで近づく
&ref(2018b/Member/shaymin/Mission3/s_MU8g2zoU.jpg,63%);
?ベルトコンベアを回転させ、球を射出する
&ref(2018b/Member/shaymin/Mission3/s_1HURzn1T.jpg,100%);
?勢いのついた球を白い可動式の部品が受け止め、缶の上に乗せる
&ref(2018b/Member/shaymin/Mission3/s_70MwRcJd.jpg,100%);
?白い部分は可動式になっているので缶の上に乗せた球を落とす...
*プログラム [#gac64291]
**ライントレースのプログラム [#v553580c]
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='bra...
mr.run_forever(speed_sp=r,stop_action='bra...
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='bra...
mr.run_forever(speed_sp=r,stop_action='bra...
stop()
def linetrace_rout():
c1=cs.value()
while c1<40:
c1=cs.value()
x=(abs(c1-10)/70)*100
if x>100:
x=100
l=(x/100)*120-40
r=40-l
ml.run_forever(speed_sp=l,stop_action='bra...
mr.run_forever(speed_sp=r,stop_action='bra...
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='bra...
mr.run_forever(speed_sp=r,stop_action='bra...
stop()
赤いボールを5,6番の缶に乗せるために、設定した時間で終了す...
def linetrace_ltime(j):
c1=cs.value()
t1=time.time() #プログラムがスタートした時刻を定義
t2=time.time() #プログラムの経過時間を定義
while t2-t1<j: #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='bra...
mr.run_forever(speed_sp=r,stop_action='bra...
stop()
**ベルトコンベアのプログラム [#u3042d27]
def roll(s):
ma.run_to_rel_pos(position_sp=s,speed_sp=80,stop_a...
time.sleep(3)
ベルトコンベアを回転させるプログラム。220°回転させるのが...
**ボールを射出するプログラム [#lf5f9b4f]
電池の残量などによってモーターの回転数が一定に定まらず安...
def discover_l(s,t): #左回りの場合
u1=us.value() #超音波センサーの値を先に定義する
g1=gs.value() #プログラムスタート時の角度を定義
g2=gs.value() #プログラムの途中経過の角度をあらか...
while g1-g2<s: #g1-g2は回った角度を表していて、そ...
u2=us.value() #プログラムの進行中に逐次超...
ml.run_forever(speed_sp=-70,stop_action='h...
mr.run_forever(speed_sp=70,stop_action='ho...
g2=gs.value() #ジャイロセンサーの値を逐次...
if u2<u1: #超音波センサーを更新した時、そ...
u1=u2
g3=gs.value() #その時の角度もg3に...
g4=gs.value() #缶発見後に右回転する時のスタート地...
g5=gs.value() #右回転している時の角度を定義
if u1<=t: #指定した範囲内に缶が存在していた場合
while g5-g4<g3-g2-6: #缶の位置に到達するま...
mr.run_forever(speed_sp=-70,stop_a...
ml.run_forever(speed_sp=70,stop_ac...
g5=gs.value()
stop()
u3=us.value() #超音波センサーの値をあらか...
t1=time.time() #この時の時間を保存
while u3<2550: #※1
ml.run_forever(speed_sp=100,stop_a...
mr.run_forever(speed_sp=100,stop_a...
u3=us.value() #超音波センサーの値...
t2=time.time() #進んだ経過時間を測...
stop()
roll(220) #ベルトコンベアを回してボールを...
ml.run_timed(speed_sp=-100,time_sp=(t2-t1)...
mr.run_timed(speed_sp=-100,time_sp=(t2-t1)...
time.sleep(t2-t1) #後退している間プログラ...
g6=gs.value() #初期位置に戻るためのスター...
g7=gs.value() #初期位置に戻る時の経過時間...
while g7-g6<=g1-g3-6: #初期位置に戻るまで...
mr.run_forever(speed_sp=-70,stop_a...
ml.run_forever(speed_sp=70,stop_ac...
g7=gs.value()
stop()
else: #測定した範囲内で缶が見つからなかった場合
while g5-g4<g1-g2: #測り始めた位置まで戻る
mr.run_forever(speed_sp=-70,stop_a...
ml.run_forever(speed_sp=70,stop_ac...
g5=gs.value()
stop()
def discover_r(s,t): #右回転の場合 基本的に左回転の時と...
u1=us.value()
g1=gs.value()
g2=gs.value()
while g2-g1<s: #今回は右回転となるためg2>g1となる
u2=us.value()
ml.run_forever(speed_sp=70,stop_action='ho...
mr.run_forever(speed_sp=-70,stop_action='h...
g2=gs.value()
if u2<u1:
u1=u2
g3=gs.value()
g4=gs.value()
g5=gs.value()
if u1<=t:
while g4-g5<g2-g3-6:
mr.run_forever(speed_sp=70,stop_ac...
ml.run_forever(speed_sp=-70,stop_a...
g5=gs.value()
stop()
u3=us.value()
t1=time.time()
while u3<2550:
ml.run_forever(speed_sp=100,stop_a...
mr.run_forever(speed_sp=100,stop_a...
u3=us.value()
t2=time.time()
stop()
roll(220)
ml.run_timed(speed_sp=-100,time_sp=(t2-t1)...
mr.run_timed(speed_sp=-100,time_sp=(t2-t1)...
time.sleep(t2-t1)
g6=gs.value()
g7=gs.value()
while g6-g7<=g3-g1-6:
mr.run_forever(speed_sp=70,stop_ac...
ml.run_forever(speed_sp=-70,stop_a...
g7=gs.value()
stop()
else:
while g4-g5<90:
mr.run_forever(speed_sp=70,stop_ac...
ml.run_forever(speed_sp=-70,stop_a...
g5=gs.value()
stop()
**プログラムの全体 [#n62ff5fd]
#!/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='bra...
mr.run_forever(speed_sp=r,stop_action='bra...
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='bra...
mr.run_forever(speed_sp=r,stop_action='bra...
stop()
def linetrace_rout():
c1=cs.value()
while c1<40:
c1=cs.value()
x=(abs(c1-10)/70)*100
if x>100:
x=100
l=(x/100)*120-40
r=40-l
ml.run_forever(speed_sp=l,stop_action='bra...
mr.run_forever(speed_sp=r,stop_action='bra...
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='bra...
mr.run_forever(speed_sp=r,stop_action='bra...
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='br...
mr.run_forever(speed_sp=r,stop_action='br...
stop()
def runtime(l,r): #指定した時間分タイヤを動かす
ml.run_timed(time_sp=l*1000,speed_sp=70,stop_acti...
mr.run_timed(time_sp=r*1000,speed_sp=70,stop_acti...
time.sleep((l+r)/2)
def angle(l,r,t): #指定した角度分タイヤを動かす lは左タ...
ml.run_to_rel_pos(position_sp=l,speed_sp=115,stop...
mr.run_to_rel_pos(position_sp=r,speed_sp=115,stop...
time.sleep(t)
def kaiten_r(s,t): 右回りに回転
g1=gs.value() #ジャイロセンサーの値をあらかじめ定義
g2=gs.value() #ジャイロセンサーの値をあらかじめ別...
while g2-g1<s: #g2とg1を比較してg2-g1が指定した角...
ml.run_forever(speed_sp=t,stop_action='ho...
mr.run_forever(speed_sp=-t,stop_action='h...
g2=gs.value() #ループする度にg2の値を更新...
stop() #止まる
def kaiten_l(s,t): 左回りに回転
g1=gs.value()
g2=gs.value()
while g1-g2<s: #ジャイロセンサーは時計回りだと値...
ml.run_forever(speed_sp=-t,stop_action='h...
mr.run_forever(speed_sp=t,stop_action='ho...
g2=gs.value() #ループする度にg2の値を更新...
stop() #止まる
def roll(s): ベルトコンベアを動かすプログラム
ma.run_to_rel_pos(position_sp=s,speed_sp=80,stop_...
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='...
mr.run_forever(speed_sp=70,stop_action='h...
g2=gs.value()
if u2<u1:
u1=u2
g3=gs.value()
g4=gs.value()
g5=gs.value()
if u1<=t:
while g5-g4<g3-g2-6:
mr.run_forever(speed_sp=-70,stop_...
ml.run_forever(speed_sp=70,stop_a...
g5=gs.value()
stop()
u3=us.value()
t1=time.time()
while u3<2550:
ml.run_forever(speed_sp=100,stop_...
mr.run_forever(speed_sp=100,stop_...
u3=us.value()
t2=time.time()
stop()
roll(220)
ml.run_timed(speed_sp=-100,time_sp=(t2-t1...
mr.run_timed(speed_sp=-100,time_sp=(t2-t1...
time.sleep(t2-t1)
g6=gs.value()
g7=gs.value()
while g7-g6<=g1-g3-6:
mr.run_forever(speed_sp=-70,stop_...
ml.run_forever(speed_sp=70,stop_a...
g7=gs.value()
stop()
else:
while g5-g4<90:
mr.run_forever(speed_sp=-70,stop_...
ml.run_forever(speed_sp=70,stop_a...
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='h...
mr.run_forever(speed_sp=-70,stop_action='...
g2=gs.value()
if u2<u1:
u1=u2
g3=gs.value()
g4=gs.value()
g5=gs.value()
if u1<=t:
while g4-g5<g2-g3-6:
mr.run_forever(speed_sp=70,stop_a...
ml.run_forever(speed_sp=-70,stop_...
g5=gs.value()
stop()
u3=us.value()
t1=time.time()
while u3<2550:
ml.run_forever(speed_sp=100,stop_...
mr.run_forever(speed_sp=100,stop_...
u3=us.value()
t2=time.time()
stop()
roll(220)
ml.run_timed(speed_sp=-100,time_sp=(t2-t1...
mr.run_timed(speed_sp=-100,time_sp=(t2-t1...
time.sleep(t2-t1)
g6=gs.value()
g7=gs.value()
while g6-g7<=g3-g1-6:
mr.run_forever(speed_sp=70,stop_a...
ml.run_forever(speed_sp=-70,stop_...
g7=gs.value()
stop()
else:
while g4-g5<90:
mr.run_forever(speed_sp=70,stop_a...
ml.run_forever(speed_sp=-70,stop_...
g5=gs.value()
def Redball(): #スタートから赤ボールを取りに行くプログラム
angle(250,250,3) #赤ボールの位置まで進む
kaiten_r(180,110) #ボールを掬う部分は車体の後ろに...
roll(220) #ボールを掬う
kaiten_r(195,110) #車体の向きを戻す ライントレー...
linetrace_lin() #G地点まで線の右側をライントレー...
def Blueball(): 青ボールを取りに行くまでのプログラム
angle(-20,160,2) #Gの交差点をまたぐために位置を調...
linetrace_lin() #GからHまで線の右側をライントレー...
angle(-35,-35,1.5) #Hの交差点を認識したら車体を回...
kaiten_r(175,110) #車体を180度回転させる
roll(220) #ボールを掬う
def move(): 青ボールを拾った後、Eの交差点に行くまでのプ...
kaiten_r(190,110) #車体の向きを元に戻す
angle(-50,-50,1) #ライントレースが安定するように...
linetrace_lin() #Hまで線の右側をライントレースする
linetrace_lout() #Hを認識後、linetrace_lin()では...
linetrace_lin() #HからI間の線の境界線上まで来たら...
linetrace_lout() #Iを認識後、こちらに先ほどと同じ...
linetrace_lin() #Eを認識するまでライントレース
def BlueZone(): #赤ボールを缶に乗せて分岐から帰ってきた...
linetrace_rin() #EからI間の線の左側をライントレー...
linetrace_rout() #Iを認識後、linetrace_rin()では...
linetrace_rin() #IからH間の線の境界線上まで来たら...
angle(70,0,1) #交差点を跨ぐ
linetrace_rin() #HからKまでライントレースする
def discover2(): #青ボールを射出するプログラム
kaiten_l(60,100) #角度を調整しておく
discover_r(90,500) #缶に乗せるプログラム 上で説明...
def start():
r=int(input("insert numbera")) #赤は番号の場合分...
Redball()
Blueball()
move()
if r<=2: #缶1缶2に置く時 Eの位置で缶を探し始める
kaiten_l(90,110) #E地点で上の方向を向く
discover_l(90,250) #缶を乗せるプログラム...
kaiten_l(95,100) #E地点で左側を向く
if r==3: #缶3に置く時 Dまで進んで缶3がある範囲の...
angle(-40,180,2) #Eの左下から右上に車体を...
linetrace_lin() #EからD間の線の右側をライ...
discover_r(60,250) #D地点で缶を乗せるプロ...
angle(-150,-150,2) #後に車体を180度回転さ...
kaiten_l(195,110) #195度左回転をする
linetrace_rin() #DからEの間を線の左側をラ...
angle(230,-40,2) #Eの右上から左下に移動
if r==4: #缶4に置く時 Dまで進んで缶4がある範囲の...
angle(-40,180,2) #Eの左下から右上に車体を...
linetrace_lin() #EからD間の線の右側をライ...
discover_l(60,250) #D地点で缶に乗せるプロ...
kaiten_l(195,110) #195度左回転する
linetrace_rin() #DからEの間を線の左側をラ...
angle(230,-40,2) #Eの右上から左下に移動
if 5<=r: #缶5缶6に置く時 Uターンの手前まで進み、...
angle(-40,180,2) #Eの左下から右上に車体を...
linetrace_lin() #EからD間の線の右側をライ...
linetrace_lout() #Dの交差点を認識後、line...
linetrace_ltime(3) #Dから急カーブ前の間で...
discover_l(60,190) #缶に乗せるプログラム...
angle(-130,-130,3) #後に車体を180度回転す...
kaiten_l(180,110) #車体を左に180度回転する
linetrace_rin() #D地点までライントレース
linetrace_rout() #D地点を認識後、角を曲が...
linetrace_rin() #E地点までライントレース
angle(230,-40,2) #Eの右上から左下に移動
BlueZone()
discover2()
start() #起動
*結果と振り返りと感想 [#h0d88539]
&ref(2018b/Member/shaymin/Mission3/s_COjGEQdM.jpg,100%);
写真にある通り、私たちE3E4班がボールをひとつ缶の上に乗せ...
最初の実行でプログラムのミスが見つかり、短時間で修正した...
色々なアクシデントが起こりスムーズに進まなかったこともあ...
&ref(2018b/Member/shaymin/Mission3/xxCGTEuL.jpg,20%);
ページ名: