2019a/Member/ofuse/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2019a/Member]]
#contents
*課題の解説 [#md50f4e0]
**内容 [#pe98ebdd]
A地点を出発し、下図の赤い矢印にそって動くロボットを作成す...
&ref(001.png);
**コースの概要 [#y5275963]
A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(...
**注意点 [#d825c545]
交差点では1秒間停止し、丁字路では直角方向に進入する時のみ...
*ロボット作成の方針 [#tc268f06]
**ライントレース [#l8ceb661]
ライントレースをするためにカラーセンサーを使用する。この...
&ref(003.png);
ライントレースをするにはカラーセンサーの値が常に一定にな...
ラインを滑らかにトレースするためにはラインに対して本体が...
**交差点認識、判別 [#l47d0d15]
基本はライントレースをしているので交差点に入ったことをロ...
&ref(004.png);
普通はtime関数を使って黒色を示す時間を計測して判別すると...
**ボールキャッチ・シュート [#p72435c8]
ボールをつかみ、シュートするという複雑な動きをたった一つ...
&ref(005.png);
&ref(007.png);
*実際に作成されたロボット [#e3377703]
**全体像 [#v414259a]
できるだけシンプルな構造になるように意識した。特に重要だ...
&ref(006.JPG);
**アーム部分 [#u9d1e749]
カタパルト式をとっているためアームは少し長めである。
ボールを乗せた状態
&ref(008.JPG);
*プログラム [#s92d962a]
**導入部分 [#ja2bc69b]
#!/usr/bin/env python3
from ev3dev.ev3 import
from time import sleep #スリープを使うには必要。
mL = LargeMotor('outA') #進行方向を向いて右側のタイヤを...
mR = LargeMotor('outB') #進行方向を向いて左側のタイヤを...
mM = MediumMotor('outC') #アームを動かすモーター(mM)をou...
cs = ColorSensor('in1') #カラーセンサー(cs)をin1に接続。
**定義部分 [#p0e0256a]
プログラム作成を円滑にし、かつ第三者に見やすくするために...
***基本的な動作 [#ib9e3d2f]
特によく使うものをまとめた。関数の中でも使っている。
def rs(): #resetの略。各モーターをまとめてリセットする関...
mL.reset() #各モーターに対して指示。
mR.reset()
mM.reset()
def stop():ロボットの移動を停止をする関数。
mL.stop()
mR.stop()
def turn_left(llsp,lrsp): #。カーブを左に曲がるための関...
mR.run_forever(speed_sp=lrsp, stop_action='brake')
mL.run_forever(speed_sp=llsp, stop_action='brake')
def turn_right(rrsp,rlsp): #カーブを右に曲がるための関数...
mL.run_forever(speed_sp=rlsp, stop_action='brake')
mR.run_forever(speed_sp=rrsp, stop_action='brake')
def st(): #直進する関数。
mL.run_forever(speed_sp=200, stop_action='brake')
mR.run_forever(speed_sp=200, stop_action='brake')
***ライントレース部分 [#n801bcde]
4つ目の分岐でiに0.1足しているのは気分である。ここは足さな...
upper_limitの部分は交差点やカーブの有無によって変動するの...
def follow_line_left(upper_limit): #ラインの左側をトレー...
i = 0 #変数iを定義
rs()
while i < upper_limit: #iがupper_limitになるまでトレ...
if cs.value() >= 20: #csの値が20以上なら大きく右...
turn_right(200,-20)
i = 0 #iをリセット。
elif 20 > cs.value() >= 17: #csの値が17以上20未...
turn_right(200,100)
i = 0 #iをリセット。
elif 17 > cs.value() >= 14: #csの値が14以上17未...
st()
i = 0 #iをリセット。
elif 14 > cs.value() >= 11: #csの値が11以上14未...
turn_left(200,100)
i += 0.1 #iに0.1足す。
else: #csの値がそれ以外、つまり11未満であれば大...
turn_left(200,-100)
i += 1.0 #iに1.0足す。
sleep(0.001) #csの条件判断を0.001秒ごと行う。
stop()
***交差点部分 [#f9ca592e]
今回は右折する場面がないので右折は省略。一応aの値をマイナ...
def cross_left(a): #交差点で左折する関数。
while cs.value() < 20: #カラーセンサー(以後cs)の値が...
mL.run_forever(speed_sp=a, stop_action='brake')
mR.run_forever(speed_sp=-1*a, stop_action='brake')
stop()
交差点に入って少し左に曲がってから止まるので向きを調整す...
def cross_st(): #交差点で直進する関数。
st()
sleep(0.2) #0.2秒だけ直進。
stop()
while cs.value() < 15: #csの値が15になるまで右に転回。
mL.run_forever(speed_sp=-70, stop_action='brake')
mR.run_forever(speed_sp=70, stop_action='brake')
stop()
***アーム部分 [#a65696fc]
def catch_ball(): #ボールをつかむ関数。
mM.run_forever(speed_sp=300, stop_action='brake') #...
sleep(1)
mM.stop()
def throw_ball(): #ボールをシュートする関数。
mM.run_to_rel_pos(speed_sp=1000, position_sp=-80, st...
sleep(0.5)
mM.stop()
**実際に動作するプログラム [#q11d195c]
#の後ろの記述は説明のために書いてあるので、実際に書く必要...
follow_line_left(10.0) #MK間をトレース。
turn_left(90,-90) #-------------------------
sleep(1) #ボールにアームの向きを合わせる。
stop() #------------------------------------
catch_ball() #ボールをつかむ。
turn_left(100,-100) #---------------
sleep(1) #Jの方向に向きを合わせる。
stop() #----------------------------
follow_line_left(10.0) #KJ間を移動。
turn_left(70,-70) #------------------
sleep(1) #Jで左折。
stop() #-----------------------------
follow_line_left(7.0) #JI間を移動。
sleep(1) #Iで一時停止。
cross_st() #Iを直進
follow_line_left(4.0) #IH間を移動。
sleep(1) #Hで一時停止。
cross_st() #Hを直進。
follow_line_left(4.0) #HG間を移動。
cross_left(100) #Gを左折。
follow_line_left(7.0) #GF間を移動。
cross_left(100) #Fはカーブであるが実質的な左折として扱う。
follow_line_left(10.0) #FE間を移動。
cross_left(100) #Eはカーブであるが実質的な左折として扱う。
follow_line_left(10.0) #ED間を移動。
sleep(1) #Dで一時停止。
cross_st() #Dを直進。
follow_line_left(8.0) #DC間を移動。
sleep(1) #Cで一時停止。
cross_st() #Cを直進。
follow_line_left(7.0) #CB間を直進。
sleep(1) #Bで一時停止。
turn_left(100,-100) #----------------------
sleep(3) #180°回転して、シュートの準備。
stop() #-----------------------------------
srow_ball() #Aに向かってシュート。
mL.run_forever(speed_sp=-150, stop_action='brake') #----...
mR.run_forever(speed_sp=-150, stop_action='brake') #バッ...
sleep(2) #st()のスピード部分を変数にして使ってもよかった...
stop() #------------------------------------------------...
*感想 [#y10f67bc]
定義の甘さが目立った。ただ cross_left()を使って左折しよう...
終了行:
[[2019a/Member]]
#contents
*課題の解説 [#md50f4e0]
**内容 [#pe98ebdd]
A地点を出発し、下図の赤い矢印にそって動くロボットを作成す...
&ref(001.png);
**コースの概要 [#y5275963]
A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(...
**注意点 [#d825c545]
交差点では1秒間停止し、丁字路では直角方向に進入する時のみ...
*ロボット作成の方針 [#tc268f06]
**ライントレース [#l8ceb661]
ライントレースをするためにカラーセンサーを使用する。この...
&ref(003.png);
ライントレースをするにはカラーセンサーの値が常に一定にな...
ラインを滑らかにトレースするためにはラインに対して本体が...
**交差点認識、判別 [#l47d0d15]
基本はライントレースをしているので交差点に入ったことをロ...
&ref(004.png);
普通はtime関数を使って黒色を示す時間を計測して判別すると...
**ボールキャッチ・シュート [#p72435c8]
ボールをつかみ、シュートするという複雑な動きをたった一つ...
&ref(005.png);
&ref(007.png);
*実際に作成されたロボット [#e3377703]
**全体像 [#v414259a]
できるだけシンプルな構造になるように意識した。特に重要だ...
&ref(006.JPG);
**アーム部分 [#u9d1e749]
カタパルト式をとっているためアームは少し長めである。
ボールを乗せた状態
&ref(008.JPG);
*プログラム [#s92d962a]
**導入部分 [#ja2bc69b]
#!/usr/bin/env python3
from ev3dev.ev3 import
from time import sleep #スリープを使うには必要。
mL = LargeMotor('outA') #進行方向を向いて右側のタイヤを...
mR = LargeMotor('outB') #進行方向を向いて左側のタイヤを...
mM = MediumMotor('outC') #アームを動かすモーター(mM)をou...
cs = ColorSensor('in1') #カラーセンサー(cs)をin1に接続。
**定義部分 [#p0e0256a]
プログラム作成を円滑にし、かつ第三者に見やすくするために...
***基本的な動作 [#ib9e3d2f]
特によく使うものをまとめた。関数の中でも使っている。
def rs(): #resetの略。各モーターをまとめてリセットする関...
mL.reset() #各モーターに対して指示。
mR.reset()
mM.reset()
def stop():ロボットの移動を停止をする関数。
mL.stop()
mR.stop()
def turn_left(llsp,lrsp): #。カーブを左に曲がるための関...
mR.run_forever(speed_sp=lrsp, stop_action='brake')
mL.run_forever(speed_sp=llsp, stop_action='brake')
def turn_right(rrsp,rlsp): #カーブを右に曲がるための関数...
mL.run_forever(speed_sp=rlsp, stop_action='brake')
mR.run_forever(speed_sp=rrsp, stop_action='brake')
def st(): #直進する関数。
mL.run_forever(speed_sp=200, stop_action='brake')
mR.run_forever(speed_sp=200, stop_action='brake')
***ライントレース部分 [#n801bcde]
4つ目の分岐でiに0.1足しているのは気分である。ここは足さな...
upper_limitの部分は交差点やカーブの有無によって変動するの...
def follow_line_left(upper_limit): #ラインの左側をトレー...
i = 0 #変数iを定義
rs()
while i < upper_limit: #iがupper_limitになるまでトレ...
if cs.value() >= 20: #csの値が20以上なら大きく右...
turn_right(200,-20)
i = 0 #iをリセット。
elif 20 > cs.value() >= 17: #csの値が17以上20未...
turn_right(200,100)
i = 0 #iをリセット。
elif 17 > cs.value() >= 14: #csの値が14以上17未...
st()
i = 0 #iをリセット。
elif 14 > cs.value() >= 11: #csの値が11以上14未...
turn_left(200,100)
i += 0.1 #iに0.1足す。
else: #csの値がそれ以外、つまり11未満であれば大...
turn_left(200,-100)
i += 1.0 #iに1.0足す。
sleep(0.001) #csの条件判断を0.001秒ごと行う。
stop()
***交差点部分 [#f9ca592e]
今回は右折する場面がないので右折は省略。一応aの値をマイナ...
def cross_left(a): #交差点で左折する関数。
while cs.value() < 20: #カラーセンサー(以後cs)の値が...
mL.run_forever(speed_sp=a, stop_action='brake')
mR.run_forever(speed_sp=-1*a, stop_action='brake')
stop()
交差点に入って少し左に曲がってから止まるので向きを調整す...
def cross_st(): #交差点で直進する関数。
st()
sleep(0.2) #0.2秒だけ直進。
stop()
while cs.value() < 15: #csの値が15になるまで右に転回。
mL.run_forever(speed_sp=-70, stop_action='brake')
mR.run_forever(speed_sp=70, stop_action='brake')
stop()
***アーム部分 [#a65696fc]
def catch_ball(): #ボールをつかむ関数。
mM.run_forever(speed_sp=300, stop_action='brake') #...
sleep(1)
mM.stop()
def throw_ball(): #ボールをシュートする関数。
mM.run_to_rel_pos(speed_sp=1000, position_sp=-80, st...
sleep(0.5)
mM.stop()
**実際に動作するプログラム [#q11d195c]
#の後ろの記述は説明のために書いてあるので、実際に書く必要...
follow_line_left(10.0) #MK間をトレース。
turn_left(90,-90) #-------------------------
sleep(1) #ボールにアームの向きを合わせる。
stop() #------------------------------------
catch_ball() #ボールをつかむ。
turn_left(100,-100) #---------------
sleep(1) #Jの方向に向きを合わせる。
stop() #----------------------------
follow_line_left(10.0) #KJ間を移動。
turn_left(70,-70) #------------------
sleep(1) #Jで左折。
stop() #-----------------------------
follow_line_left(7.0) #JI間を移動。
sleep(1) #Iで一時停止。
cross_st() #Iを直進
follow_line_left(4.0) #IH間を移動。
sleep(1) #Hで一時停止。
cross_st() #Hを直進。
follow_line_left(4.0) #HG間を移動。
cross_left(100) #Gを左折。
follow_line_left(7.0) #GF間を移動。
cross_left(100) #Fはカーブであるが実質的な左折として扱う。
follow_line_left(10.0) #FE間を移動。
cross_left(100) #Eはカーブであるが実質的な左折として扱う。
follow_line_left(10.0) #ED間を移動。
sleep(1) #Dで一時停止。
cross_st() #Dを直進。
follow_line_left(8.0) #DC間を移動。
sleep(1) #Cで一時停止。
cross_st() #Cを直進。
follow_line_left(7.0) #CB間を直進。
sleep(1) #Bで一時停止。
turn_left(100,-100) #----------------------
sleep(3) #180°回転して、シュートの準備。
stop() #-----------------------------------
srow_ball() #Aに向かってシュート。
mL.run_forever(speed_sp=-150, stop_action='brake') #----...
mR.run_forever(speed_sp=-150, stop_action='brake') #バッ...
sleep(2) #st()のスピード部分を変数にして使ってもよかった...
stop() #------------------------------------------------...
*感想 [#y10f67bc]
定義の甘さが目立った。ただ cross_left()を使って左折しよう...
ページ名: