2019b/Member/bearch/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2019b/Member]]
#contents
*課題2 [#ge4abbdc]
**ライントレースで二人目のミッションを達成する [#l881fc8d]
#ref(2019b-mission2.png)
-二人目のミッション
~1.A地点から出発
~2.J
~3.H (直進)
~4.I (ボール or キューボイドをつかんでUターン)
~5.H (右折)
~6.G (一時停止の後、直進)
~7.D (右折)
~8.E, F 通過
~9.G (一時停止の後、直進)
~10.C (一時停止の後、左折)
~11.B (一時停止)
*ロボットの説明 ハード面 [#rfe86f5b]
このロボットはEV3で作成されています。最新型での説明をしま...
#ref(12841_2.jpg)
**カラーセンサ [#g20383c1]
まず、図1を見てください。カラーセンサの高さを、近すぎず...
~図1
#ref(12839_2.jpg)
**超音波センサとカコイ [#v7139fc0]
次に、図2を見てください。超音波センサを地面に対して垂直...
~そして、キューボイドを掴む仕組みはモータでカコイを上げ下...
~図2
#ref(12846_2.jpg)
*ロボットの説明 プログラム面 [#w59e7b42]
**ロボットの強み [#u5f6eae8]
このロボットの最大の強みは汎用性の高さです。
~メインとなるプログラムは同じ班のメンバーと全く同じで、走...
**キューボイドを捕らえる [#w417cc11]
~そして、ロボットがキューボイドを捕らえる仕組みも工夫しま...
**Uターン [#m4b5fc9f]
~二人目のミッションはUターンをしなければいけないのでUター...
*実際のプログラム 全体 [#x747b325]
-メインプログラム
#!/usr/bin/env python3
from ev3dev2.motor import Motor,OUTPUT_A,MoveTank,La...
from ev3dev2.sensor.lego import ColorSensor,TouchSens...
from time import sleep
m_r = LargeMotor(OUTPUT_C)
m_l = LargeMotor(OUTPUT_B)
tank = MoveTank(OUTPUT_B,OUTPUT_C)
cs = ColorSensor()
ts =TouchSensor()
us = UltrasonicSensor()
fc_m = Motor(OUTPUT_A)
threshold = 45
v_s = 12.5
v_c = 5.0
k_s = 0.25
k_c = 2.25
cs_val_black = 15
cs_th_d_max = 20
csd_s_max = 3
v_is = 5
v_fc = 5
v_fc_m = 5
cs.mode ="COL-REFLECT"
us.mode ="US-DIST-CM"
a1_is=-0.2
a2_is=1
def intersection (sign,index_list_is,list_intersectio...
print(list_intersection[index_list_is])
n_w = int(list_intersection[index_list_is][0])
if list_intersection[index_list_is][1]=="r":
sign_is = 1
elif list_intersection[index_list_is][1]=="l":
sign_is = -1
tank.on((a1_is+sign)*v_is,(a1_is-sign)*v_is)
print("check1")
while True:
if cs.value()>threshold:
break
tank.on((a2_is-sign)*v_is,(a2_is+sign)*v_is)
for i in range(n_w):
while True:
if cs.value()<=cs_val_black:
break
while True:
if cs.value()>threshold:
break
if sign_is*sign==1:
tank.on(sign_is*v_is,-sign_is*v_is)
while True:
if cs.value()<=cs_val_black:
break
while True:
if cs.value()>threshold:
break
tank.on(0,0)
return sign_is
def fetch_cuboid(sign_fc):
fc_m.reset()
fc_m.on_to_position(v_fc_m,-90)
tank.on_for_degrees(v_fc,-v_fc,180)
while cs.value()>cs_val_black:
tank.on(v_fc,-v_fc)
while cs.value()<threshold:
tank.on(sign_fc*v_fc,-sign_fc*v_fc)
tank.on(0,0)
def fetch_cuboid3(sign_fc):
fc_m.reset()
fc_m.on_to_position(v_fc_m,-90)
tank.on_for_degrees(v_fc,v_fc,600)
tank.on_for_degrees(v_fc,-v_fc,180)
while cs.value()>cs_val_black:
tank.on(v_fc,-v_fc)
tank.on(0,0)
fc_m.on_to_position(v_fc_m,0)
tank.on_for_degrees(-v_fc,-v_fc,60)
tank.on_for_degrees(v_fc,-v_fc,180)
while cs.value()>cs_val_black:
tank.on(v_fc,-v_fc)
while cs.value()<threshold:
tank.on(sign_fc*v_fc,-sign_fc*v_fc)
tank.on(0,0)
def follow_line(sign_fl,fc_ab):
while True:
cs_d = max(min(cs.value(),threshold+cs_th_d_m...
if -csd_s_max < cs_d < csd_s_max:
v_fl=v_s
k_fl=v_fl*k_s/cs_th_d_max
else:
v_fl=v_c
k_fl=v_fl*k_c/cs_th_d_max
v_r_fl = v_fl+sign_fl*k_fl*cs_d
v_l_fl = v_fl-sign_fl*k_fl*cs_d
if fc_ab == "b" and us.value()<110:
after_fl_fl = "fc"
break
if cs.value()<cs_val_black:
after_fl_fl = "is"
break
if ts.is_pressed:
after_fl_fl = "ts_break"
break
tank.on(v_l_fl,v_r_fl)
tank.off()
return after_fl_fl
def main():
main_break_bool=False
index_list_is = 0
after_fl="after_fl"
fc_ab = "b"
#input
while True:
print("start:num")
try:
number = int(input("number(1~3):"))
if 0<number<4:
break
except:
pass
print("number:",number)
print("")
#read
#list_is
print("start:list_is")
list_intersection=[]
file_name = "list_is" + str(number)
try:
with open(file_name, "r") as f:
list_intersection_raw = f.readlines()
for i in list_intersection_raw:
list_intersection.append(i.strip().sp...
for n,i in enumerate(list_intersection):
list_intersection[n][0] = i[0].strip()
list_intersection[n][1] = i[1].strip()
if not ((i[0].strip() in {"1","2","3"...
print("file content error")
raise Exception
list_intersection.append("end")
print("raw list:",list_intersection_raw)
print("list:",list_intersection)
print("")
except:
print("file is_list error")
main_break_bool=True
#list_sign0
print("start:list_sign0")
try:
with open("sign0", "r") as f:
list_sign0_raw = f.readlines()
if list_sign0_raw[number-1].strip()=="r":
sign = 1
elif list_sign0_raw[number-1].strip()=="l":
sign = -1
else:
print("file content error")
raise Exception
except:
print("file sign0 error")
main_break_bool=True
print("sign0:",sign)
print("")
#u_turn_rl
print("start:u_turn_rl")
try:
with open("u_turn_rl", "r") as f:
list_ut_raw = f.readlines()
if list_ut_raw[number-1].strip()=="r":
sign_fc = 1
elif list_ut_raw[number-1].strip()=="l":
sign_fc = -1
else:
print("file content error")
raise Exception
except:
print("file u_turn_rl error")
main_break_bool=True
print("sign_fc:",sign_fc)
print("")
#move
if not main_break_bool:
while cs.value()>cs_val_black:
tank.on(10,10)
tank.on(0,0)
while True:
after_fl = follow_line(sign,fc_ab) #follo...
if after_fl == "fc" and fc_ab=="b": #fetc...
print("fetch cuboid")
if number<3:
fetch_cuboid(sign_fc)
else:
fetch_cuboid3(sign_fc)
sign = sign_fc
fc_ab = "a"
elif after_fl == "is": #intersection
if list_intersection[index_list_is]==...
tank.on_for_degrees(v_fc,v_fc,270)
print("list:end")
break
else:
print("intersection")
sign = intersection(sign,index_li...
print("index:",index_list_is)
index_list_is += 1
elif after_fl == "ts_break": #touch senso...
print("touch break")
break
else:
print("after_fl error")
after_fl="after_fl"
else:
print("main break")
print("end")
tank.on(0,0)
if __name__ == "__main__":
main()
-テキストファイル u_turn_rl
l
r
r
-テキストファイル sign0
r
r
r
-テキストファイル list_is2
2,r
1,l
2,l
1,r
2,r
1,l
2,l
1,l
*実際のプログラム 説明 [#r223136f]
-はじめのほうに書いてあることを読んでください。
#!/usr/bin/env python3
from ev3dev2.motor import Motor,OUTPUT_A,MoveTank,La...
from ev3dev2.sensor.lego import ColorSensor,TouchSens...
from time import sleep
"""
動作について
ラインの内側の境界をとりながら曲がる道は分岐点と...
プログラムを開始したとき白い場所にいる場合ライン...
list_is(n),sign0,u_turn_rlについて
list_is(n) :何回目の分岐でなにをするかを書く
sign0 :プログラムを実行してから最初にライン...
u_turn_rl :fetch_cuboid()またはfetch_cuboid3()...
このプログラムのコメントについて
#のコメントは大雑把にみるための簡単なメモ
""""""のコメントは説明
このプログラムのコメントの説明等について
関数の定義での引数に関する説明では「引数の名前=引...
変数の代入やreturnで:で区切ってある場合「どういう...
基本的には""""""の説明は空行で区切られている("""...
"""
**定数 [#s1b51dfa]
m_r = LargeMotor(OUTPUT_C)
m_l = LargeMotor(OUTPUT_B)
tank = MoveTank(OUTPUT_B,OUTPUT_C)
cs = ColorSensor()
ts =TouchSensor()
us = UltrasonicSensor()
fc_m = Motor(OUTPUT_A)
cs.mode ="COL-REFLECT"
us.mode ="US-DIST-CM"
threshold = 45
値 :境界として使う場所でのcsの値
使ってる場所 :intersection(),fetch_cuboid(),fetch...
v_s = 12.5
値 :まっすぐ進むときのtankの速さ
使ってる場所 :follow_line()
v_c = 5.0
値 :曲がるときのtankの速さ
使ってる場所 :follow_line()
k_s = 0.25
値 :まっすぐ進むときのtankの曲がりやすさ
使ってる場所 :follow_line()
k_c = 2.25
値 :曲がるときのtankの曲がりやすさ
使ってる場所 :follow_line()
cs_val_black = 15
値 :黒いと判断させたい場所でのcsの値の...
使ってる場所 :intersection(),fetch_cuboid(),fetch...
cs_th_d_max = 20
値 :csの値を使うときその値を-cs_th_d_ma...
するために使う値
使ってる場所 :follow_line()
csd_s_max = 3
値 :-csd_s_max<threshold-csの値<csd_s_m...
るために使う値
使ってる場所 :follow_line()
v_is = 5
値 :intersection()実行時のtankの速さ
使ってる場所 :intersection()
v_fc = 5
値 :fetch_cuboid()またはfetch_cuboid3()...
使ってる場所 :fetch_cuboid(),fetch_cuboid3()
v_fc_m = 5
値 :fetch_cuboid()またはfetch_cuboid3()...
使ってる場所 :fetch_cuboid(),fetch_cuboid3()
a1_is=-0.2
値 :基本的には0以下で-1より大きく、inte...
遠ざかる方向に外側に向くように回転...
せるかを決める値
使ってる場所 :intersection()
a2_is=1
値 :基本的には0より大きく、intersection...
周辺を回るときにどのくらい大きく回...
使ってる場所 :intersection()
**変数 [#f356ca28]
読み込みはmain()に含まれているが、ここではmain()と書いた...
&br;
fetch_cuboid()と書いたときはfetch_cuboid3()も含むとする。
&br;
使っている場所に書いてるものは関数実行時に引数として渡し...
***main_break_bool [#tb48aef1]
main_break_bool
とりうる値 :True,False
どんな値か :main()でファイルを読み込みそこで...
あったときTrueとなり、main()の動...
する。
使っている場所 :読み込み,main()
***index_list_is [#n8813258]
index_list_is
とりうる値 :0,1,2,...
どんな値か :最初は0でありintersection()が行わ...
行時、list_intersection[index_lis...
使っている場所 :intersection(),main()
***after_fl [#x4385fc5]
after_fl
とりうる値 :"after_fl","fc","is","ts_break"
どんな値か :follow_line()実行時に交差点に差し...
りfollow()を終了するが、そのあと...
"fc" :fetch_cuboid()を実行する
"is" :intersection()を実行する
"ts_break":タッチセンサーが押され...
らせる
"after_fl":初期化のときに使い、fo...
特に意味のある値ではな...
使っている場所 :intersection(),読み込み
***fc_ab [#xfc5ab5a]
fc_ab
とりうる値 :"a","b"
どんな値か :最初は"b"でありfetch_cuboid()が実...
fetch_cuboid()が複数回実行される...
使っている場所 :fetch_cuboid(),follow_line(),main()
***number [#i313be51]
number
とりうる値 :1,2,3
どんな値か :プログラム実行開始時に入力する値...
か、その他の読み込むファイルの何...
使っている場所 :main(),読み込み
***list_intersection [#kf0c1c59]
list_intersection
とる値の例 :[[2,l],[2,l],[1,l],[1,l],[1,r],[1...
どんな値か :何回目の分岐(分岐と判断される場所...
でファイルlist_isから読み込む("en...
で追加される)
[数字n,文字a]:進行方向に合わせて...
n番目の道でa=rなら...
"end" :ゴールに着いたこと...
使っている場所 :intersection(),main(),読み込み
***sign [#p452b771]
sign
とりうる値 :-1,1
どんな値か :follow_line()実行時右と左のどっち...
右の時1、左の時-1をとる。
使っている場所 :intersection(),follow_line(),main...
***sign_fc [#m3a21398]
sign_fc
とりうる値 :-1,1
どんな値か :(),fetch_cuboid3()の実行後に右と...
かを表す値で、右の時1、左の時-1を...
む。
使っている場所 :fetch_cuboid(),main(),読み込み
**関数 [#s5d875de]
***intersection() [#de5621fa]
def intersection (sign,index_list_is,list_intersectio...
print(list_intersection[index_list_is]) """道の番...
n_w = int(list_intersection[index_list_is][0]) ""...
if list_intersection[index_list_is][1]=="r": """...
sign_is = 1
elif list_intersection[index_list_is][1]=="l":
sign_is = -1
tank.on((a1_is+sign)*v_is,(a1_is-sign)*v_is) ""...
print("check1")
while True:
if cs.value()>threshold:
break
tank.on((a2_is-sign)*v_is,(a2_is+sign)*v_is) """...
for i in range(n_w):
while True:
if cs.value()<=cs_val_black:
break
while True:
if cs.value()>threshold:
break
if sign_is*sign==1: """指定された道の右か左の境界...
tank.on(sign_is*v_is,-sign_is*v_is)
while True:
if cs.value()<=cs_val_black:
break
while True:
if cs.value()>threshold:
break
tank.on(0,0)
return sign_is """1か-1:intersectiont()実行後に...
***fetch_cuboid() [#n7dab819]
def fetch_cuboid(sign_fc): """sign_fc=1か-1:fetch_cub...
fc_m.reset() """fc_mの角度をリセットする"""
fc_m.on_to_position(v_fc_m,-90) """cuboidを捕まえ...
tank.on_for_degrees(v_fc,-v_fc,180) """tankの向き...
while cs.value()>cs_val_black: """tank.on_for_de...
tank.on(v_fc,-v_fc)
while cs.value()<threshold: """黒いラインの中か...
tank.on(sign_fc*v_fc,-sign_fc*v_fc)
tank.on(0,0)
***fetch_cuboid3() [#be2b1a85]
def fetch_cuboid3(sign_fc): """sign_fc=1か-1:fetch_cu...
fc_m.reset() """fc_mの角度をリセットする"""
fc_m.on_to_position(v_fc_m,-90) """cuboidを捕まえ...
tank.on_for_degrees(v_fc,v_fc,600) """tankを前に...
tank.on_for_degrees(v_fc,-v_fc,180) """tankの向き...
while cs.value()>cs_val_black: """tank.on_for_de...
tank.on(v_fc,-v_fc)
tank.on(0,0)
fc_m.on_to_position(v_fc_m,0) """cuboidを放す"""
tank.on_for_degrees(-v_fc,-v_fc,60) """tankを少し...
tank.on_for_degrees(v_fc,-v_fc,180) """tankの向...
while cs.value()>cs_val_black: """tank.on_for_d...
tank.on(v_fc,-v_fc)
while cs.value()<threshold: """黒いラインの中か...
tank.on(sign_fc*v_fc,-sign_fc*v_fc)
tank.on(0,0)
***follow_line() [#cec601d2]
def follow_line(sign_fl,fc_ab): """sign_fl=1か-1:fol...
while True:
cs_d = max(min(cs.value(),threshold+cs_th_d_m...
if -csd_s_max < cs_d < csd_s_max: """tankの速...
v_fl=v_s
k_fl=v_fl*k_s/cs_th_d_max
else:
v_fl=v_c
k_fl=v_fl*k_c/cs_th_d_max
v_r_fl = v_fl+sign_fl*k_fl*cs_d """右のタイヤ...
v_l_fl = v_fl-sign_fl*k_fl*cs_d
if fc_ab == "b" and us.value()<110: """ある条...
after_fl_fl = "fc"
break
if cs.value()<cs_val_black:
after_fl_fl = "is"
break
if ts.is_pressed:
after_fl_fl = "ts_break"
break
tank.on(v_l_fl,v_r_fl) """v_l_flとv_r_flを使...
tank.off()
return after_fl_fl """fcかisかts_break:follow_li...
***main() [#vdea6671]
#inputでは何番目の人のミッションを行うか選べる
~1番目→"1"を入力
~2番目→"2"を入力
~3番目→"3"を入力
~というようにする。変数numberに1〜3の値が入力され、【読...
~【読み込み】で何をしているかは【読み込み】で説明していま...
def main():
main_break_bool=False """ファイル読み込みでエラー...
index_list_is = 0 """何番目の分岐点か"""
after_fl="after_fl" """:follow_line()が止まってか...
fc_ab = "b" """aかb:fetch_cuboid()またはfetch_cub...
#input
while True: """1か2か3を入力し、それをnumberに代...
print("start:num")
try:
number = int(input("number(1~3):"))
if 0<number<4:
break
except:
pass
print("number:",number)
print("")
--------------------------------------------------------...
読み込み
--------------------------------------------------------...
#move
if not main_break_bool: """ファイル読み込みでエラ...
while cs.value()>cs_val_black: """ラインに着...
tank.on(10,10)
tank.on(0,0)
while True: """このwhileの中がメインのプログ...
after_fl = follow_line(sign,fc_ab) """fol...
if after_fl == "fc" and fc_ab=="b": """us...
print("fetch cuboid")
if number<3:
fetch_cuboid(sign_fc)
else:
fetch_cuboid3(sign_fc)
sign = sign_fc
fc_ab = "a"
elif after_fl == "is": """list_intersecti...
if list_intersection[index_list_is]==...
tank.on_for_degrees(v_fc,v_fc,270)
print("list:end")
break
else:
print("intersection")
sign = intersection(sign,index_li...
print("index:",index_list_is)
index_list_is += 1
elif after_fl == "ts_break": """tsが押さ...
print("touch break")
break
else: """after_flに正しい値が入力されてい...
print("after_fl error")
after_fl="after_fl"
else:
print("main break")
print("end")
tank.on(0,0)
if __name__ == "__main__":
main()
**読み込み [#t5b8e99c]
こちらはテキストファイルではありません。main()の中の読み...
~#list_is、#sign0、#u_turn_rlでは与えられたnumberに応じて...
#read
***list_is [#i4f2528e]
与えられたnumberに応じて読み込みたいテキストファイルを読...
~(例)number = 2 →list_is2 を読み込む
~ぼくは2番目のミッションなのでlist_is2を読み込みました。
~そして、読み込んだテキストファイルからlist_intersection...
#list_is
print("start:list_is") """list_is(n)という名前の...
list_intersection=[]
file_name = "list_is" + str(number)
try:
with open(file_name, "r") as f:
list_intersection_raw = f.readlines()
for i in list_intersection_raw:
list_intersection.append(i.strip().sp...
for n,i in enumerate(list_intersection):
list_intersection[n][0] = i[0].strip()
list_intersection[n][1] = i[1].strip()
if not ((i[0].strip() in {"1","2","3"...
print("file content error")
raise Exception
list_intersection.append("end")
print("raw list:",list_intersection_raw)
print("list:",list_intersection)
print("")
except:
print("file is_list error")
main_break_bool=True
***sign0 [#w7280591]
#list_sign0
print("start:list_sign0") """sign0という名前のフ...
try:
with open("sign0", "r") as f:
list_sign0_raw = f.readlines()
if list_sign0_raw[number-1].strip()=="r":
sign = 1
elif list_sign0_raw[number-1].strip()=="l":
sign = -1
else:
print("file content error")
raise Exception
except:
print("file sign0 error")
main_break_bool=True
print("sign0:",sign)
print("")
***u_turn_rl [#rddc2e62]
#u_turn_rl
print("start:u_turn_rl") """u_turn_rlという名前の...
try:
with open("u_turn_rl", "r") as f:
list_ut_raw = f.readlines()
if list_ut_raw[number-1].strip()=="r":
sign_fc = 1
elif list_ut_raw[number-1].strip()=="l":
sign_fc = -1
else:
print("file content error")
raise Exception
except:
print("file u_turn_rl error")
main_break_bool=True
print("sign_fc:",sign_fc)
print("")
**読み込むファイル [#dd6932d8]
次のようなファイルプログラム実行前に用意する必要がある。
***list_is(list_is3) [#a7135842]
list_isは自分がライントレースする道が何人目の課題かによっ...
付け加えたものをファイル名として保存する。今回は3人目の...
2,r
1,l
2,r
1,r
2,r
1,l
2,l
1,r
***sign0 [#ufc8a57f]
r
r
r
***u_turn_rl [#va57fd0d]
l
r
r
*もともと目指していたロボット [#dac968c8]
僕らの班ではもともと別の機構を採用したロボットを目指して...
#ref(12872_2.jpg)
もともと僕たちが作ろうとしていたロボットはモータでカラー...
~一応、図3が振動させる仕組みです。モータに歯車をかみ合わ...
~図3
#ref(12871_2.jpg)
*反省点 [#i642ea52]
-発表までに自分たちの目指していた機構を実現できなく、もう...
-班員に任せっきりになってしまう部分があった。班員に感謝。
-ライントレースする紙を本番までに書いて来なかった。他の班...
-ロボットの性能でもっと移動スピードをあげたかった。変数調...
*さいごに [#b9a23a3b]
この課題2は大変楽しかった。プログラミングではpythonの知...
~課題1ではたった一つの命令だけでやっていたので成長を感じ...
終了行:
[[2019b/Member]]
#contents
*課題2 [#ge4abbdc]
**ライントレースで二人目のミッションを達成する [#l881fc8d]
#ref(2019b-mission2.png)
-二人目のミッション
~1.A地点から出発
~2.J
~3.H (直進)
~4.I (ボール or キューボイドをつかんでUターン)
~5.H (右折)
~6.G (一時停止の後、直進)
~7.D (右折)
~8.E, F 通過
~9.G (一時停止の後、直進)
~10.C (一時停止の後、左折)
~11.B (一時停止)
*ロボットの説明 ハード面 [#rfe86f5b]
このロボットはEV3で作成されています。最新型での説明をしま...
#ref(12841_2.jpg)
**カラーセンサ [#g20383c1]
まず、図1を見てください。カラーセンサの高さを、近すぎず...
~図1
#ref(12839_2.jpg)
**超音波センサとカコイ [#v7139fc0]
次に、図2を見てください。超音波センサを地面に対して垂直...
~そして、キューボイドを掴む仕組みはモータでカコイを上げ下...
~図2
#ref(12846_2.jpg)
*ロボットの説明 プログラム面 [#w59e7b42]
**ロボットの強み [#u5f6eae8]
このロボットの最大の強みは汎用性の高さです。
~メインとなるプログラムは同じ班のメンバーと全く同じで、走...
**キューボイドを捕らえる [#w417cc11]
~そして、ロボットがキューボイドを捕らえる仕組みも工夫しま...
**Uターン [#m4b5fc9f]
~二人目のミッションはUターンをしなければいけないのでUター...
*実際のプログラム 全体 [#x747b325]
-メインプログラム
#!/usr/bin/env python3
from ev3dev2.motor import Motor,OUTPUT_A,MoveTank,La...
from ev3dev2.sensor.lego import ColorSensor,TouchSens...
from time import sleep
m_r = LargeMotor(OUTPUT_C)
m_l = LargeMotor(OUTPUT_B)
tank = MoveTank(OUTPUT_B,OUTPUT_C)
cs = ColorSensor()
ts =TouchSensor()
us = UltrasonicSensor()
fc_m = Motor(OUTPUT_A)
threshold = 45
v_s = 12.5
v_c = 5.0
k_s = 0.25
k_c = 2.25
cs_val_black = 15
cs_th_d_max = 20
csd_s_max = 3
v_is = 5
v_fc = 5
v_fc_m = 5
cs.mode ="COL-REFLECT"
us.mode ="US-DIST-CM"
a1_is=-0.2
a2_is=1
def intersection (sign,index_list_is,list_intersectio...
print(list_intersection[index_list_is])
n_w = int(list_intersection[index_list_is][0])
if list_intersection[index_list_is][1]=="r":
sign_is = 1
elif list_intersection[index_list_is][1]=="l":
sign_is = -1
tank.on((a1_is+sign)*v_is,(a1_is-sign)*v_is)
print("check1")
while True:
if cs.value()>threshold:
break
tank.on((a2_is-sign)*v_is,(a2_is+sign)*v_is)
for i in range(n_w):
while True:
if cs.value()<=cs_val_black:
break
while True:
if cs.value()>threshold:
break
if sign_is*sign==1:
tank.on(sign_is*v_is,-sign_is*v_is)
while True:
if cs.value()<=cs_val_black:
break
while True:
if cs.value()>threshold:
break
tank.on(0,0)
return sign_is
def fetch_cuboid(sign_fc):
fc_m.reset()
fc_m.on_to_position(v_fc_m,-90)
tank.on_for_degrees(v_fc,-v_fc,180)
while cs.value()>cs_val_black:
tank.on(v_fc,-v_fc)
while cs.value()<threshold:
tank.on(sign_fc*v_fc,-sign_fc*v_fc)
tank.on(0,0)
def fetch_cuboid3(sign_fc):
fc_m.reset()
fc_m.on_to_position(v_fc_m,-90)
tank.on_for_degrees(v_fc,v_fc,600)
tank.on_for_degrees(v_fc,-v_fc,180)
while cs.value()>cs_val_black:
tank.on(v_fc,-v_fc)
tank.on(0,0)
fc_m.on_to_position(v_fc_m,0)
tank.on_for_degrees(-v_fc,-v_fc,60)
tank.on_for_degrees(v_fc,-v_fc,180)
while cs.value()>cs_val_black:
tank.on(v_fc,-v_fc)
while cs.value()<threshold:
tank.on(sign_fc*v_fc,-sign_fc*v_fc)
tank.on(0,0)
def follow_line(sign_fl,fc_ab):
while True:
cs_d = max(min(cs.value(),threshold+cs_th_d_m...
if -csd_s_max < cs_d < csd_s_max:
v_fl=v_s
k_fl=v_fl*k_s/cs_th_d_max
else:
v_fl=v_c
k_fl=v_fl*k_c/cs_th_d_max
v_r_fl = v_fl+sign_fl*k_fl*cs_d
v_l_fl = v_fl-sign_fl*k_fl*cs_d
if fc_ab == "b" and us.value()<110:
after_fl_fl = "fc"
break
if cs.value()<cs_val_black:
after_fl_fl = "is"
break
if ts.is_pressed:
after_fl_fl = "ts_break"
break
tank.on(v_l_fl,v_r_fl)
tank.off()
return after_fl_fl
def main():
main_break_bool=False
index_list_is = 0
after_fl="after_fl"
fc_ab = "b"
#input
while True:
print("start:num")
try:
number = int(input("number(1~3):"))
if 0<number<4:
break
except:
pass
print("number:",number)
print("")
#read
#list_is
print("start:list_is")
list_intersection=[]
file_name = "list_is" + str(number)
try:
with open(file_name, "r") as f:
list_intersection_raw = f.readlines()
for i in list_intersection_raw:
list_intersection.append(i.strip().sp...
for n,i in enumerate(list_intersection):
list_intersection[n][0] = i[0].strip()
list_intersection[n][1] = i[1].strip()
if not ((i[0].strip() in {"1","2","3"...
print("file content error")
raise Exception
list_intersection.append("end")
print("raw list:",list_intersection_raw)
print("list:",list_intersection)
print("")
except:
print("file is_list error")
main_break_bool=True
#list_sign0
print("start:list_sign0")
try:
with open("sign0", "r") as f:
list_sign0_raw = f.readlines()
if list_sign0_raw[number-1].strip()=="r":
sign = 1
elif list_sign0_raw[number-1].strip()=="l":
sign = -1
else:
print("file content error")
raise Exception
except:
print("file sign0 error")
main_break_bool=True
print("sign0:",sign)
print("")
#u_turn_rl
print("start:u_turn_rl")
try:
with open("u_turn_rl", "r") as f:
list_ut_raw = f.readlines()
if list_ut_raw[number-1].strip()=="r":
sign_fc = 1
elif list_ut_raw[number-1].strip()=="l":
sign_fc = -1
else:
print("file content error")
raise Exception
except:
print("file u_turn_rl error")
main_break_bool=True
print("sign_fc:",sign_fc)
print("")
#move
if not main_break_bool:
while cs.value()>cs_val_black:
tank.on(10,10)
tank.on(0,0)
while True:
after_fl = follow_line(sign,fc_ab) #follo...
if after_fl == "fc" and fc_ab=="b": #fetc...
print("fetch cuboid")
if number<3:
fetch_cuboid(sign_fc)
else:
fetch_cuboid3(sign_fc)
sign = sign_fc
fc_ab = "a"
elif after_fl == "is": #intersection
if list_intersection[index_list_is]==...
tank.on_for_degrees(v_fc,v_fc,270)
print("list:end")
break
else:
print("intersection")
sign = intersection(sign,index_li...
print("index:",index_list_is)
index_list_is += 1
elif after_fl == "ts_break": #touch senso...
print("touch break")
break
else:
print("after_fl error")
after_fl="after_fl"
else:
print("main break")
print("end")
tank.on(0,0)
if __name__ == "__main__":
main()
-テキストファイル u_turn_rl
l
r
r
-テキストファイル sign0
r
r
r
-テキストファイル list_is2
2,r
1,l
2,l
1,r
2,r
1,l
2,l
1,l
*実際のプログラム 説明 [#r223136f]
-はじめのほうに書いてあることを読んでください。
#!/usr/bin/env python3
from ev3dev2.motor import Motor,OUTPUT_A,MoveTank,La...
from ev3dev2.sensor.lego import ColorSensor,TouchSens...
from time import sleep
"""
動作について
ラインの内側の境界をとりながら曲がる道は分岐点と...
プログラムを開始したとき白い場所にいる場合ライン...
list_is(n),sign0,u_turn_rlについて
list_is(n) :何回目の分岐でなにをするかを書く
sign0 :プログラムを実行してから最初にライン...
u_turn_rl :fetch_cuboid()またはfetch_cuboid3()...
このプログラムのコメントについて
#のコメントは大雑把にみるための簡単なメモ
""""""のコメントは説明
このプログラムのコメントの説明等について
関数の定義での引数に関する説明では「引数の名前=引...
変数の代入やreturnで:で区切ってある場合「どういう...
基本的には""""""の説明は空行で区切られている("""...
"""
**定数 [#s1b51dfa]
m_r = LargeMotor(OUTPUT_C)
m_l = LargeMotor(OUTPUT_B)
tank = MoveTank(OUTPUT_B,OUTPUT_C)
cs = ColorSensor()
ts =TouchSensor()
us = UltrasonicSensor()
fc_m = Motor(OUTPUT_A)
cs.mode ="COL-REFLECT"
us.mode ="US-DIST-CM"
threshold = 45
値 :境界として使う場所でのcsの値
使ってる場所 :intersection(),fetch_cuboid(),fetch...
v_s = 12.5
値 :まっすぐ進むときのtankの速さ
使ってる場所 :follow_line()
v_c = 5.0
値 :曲がるときのtankの速さ
使ってる場所 :follow_line()
k_s = 0.25
値 :まっすぐ進むときのtankの曲がりやすさ
使ってる場所 :follow_line()
k_c = 2.25
値 :曲がるときのtankの曲がりやすさ
使ってる場所 :follow_line()
cs_val_black = 15
値 :黒いと判断させたい場所でのcsの値の...
使ってる場所 :intersection(),fetch_cuboid(),fetch...
cs_th_d_max = 20
値 :csの値を使うときその値を-cs_th_d_ma...
するために使う値
使ってる場所 :follow_line()
csd_s_max = 3
値 :-csd_s_max<threshold-csの値<csd_s_m...
るために使う値
使ってる場所 :follow_line()
v_is = 5
値 :intersection()実行時のtankの速さ
使ってる場所 :intersection()
v_fc = 5
値 :fetch_cuboid()またはfetch_cuboid3()...
使ってる場所 :fetch_cuboid(),fetch_cuboid3()
v_fc_m = 5
値 :fetch_cuboid()またはfetch_cuboid3()...
使ってる場所 :fetch_cuboid(),fetch_cuboid3()
a1_is=-0.2
値 :基本的には0以下で-1より大きく、inte...
遠ざかる方向に外側に向くように回転...
せるかを決める値
使ってる場所 :intersection()
a2_is=1
値 :基本的には0より大きく、intersection...
周辺を回るときにどのくらい大きく回...
使ってる場所 :intersection()
**変数 [#f356ca28]
読み込みはmain()に含まれているが、ここではmain()と書いた...
&br;
fetch_cuboid()と書いたときはfetch_cuboid3()も含むとする。
&br;
使っている場所に書いてるものは関数実行時に引数として渡し...
***main_break_bool [#tb48aef1]
main_break_bool
とりうる値 :True,False
どんな値か :main()でファイルを読み込みそこで...
あったときTrueとなり、main()の動...
する。
使っている場所 :読み込み,main()
***index_list_is [#n8813258]
index_list_is
とりうる値 :0,1,2,...
どんな値か :最初は0でありintersection()が行わ...
行時、list_intersection[index_lis...
使っている場所 :intersection(),main()
***after_fl [#x4385fc5]
after_fl
とりうる値 :"after_fl","fc","is","ts_break"
どんな値か :follow_line()実行時に交差点に差し...
りfollow()を終了するが、そのあと...
"fc" :fetch_cuboid()を実行する
"is" :intersection()を実行する
"ts_break":タッチセンサーが押され...
らせる
"after_fl":初期化のときに使い、fo...
特に意味のある値ではな...
使っている場所 :intersection(),読み込み
***fc_ab [#xfc5ab5a]
fc_ab
とりうる値 :"a","b"
どんな値か :最初は"b"でありfetch_cuboid()が実...
fetch_cuboid()が複数回実行される...
使っている場所 :fetch_cuboid(),follow_line(),main()
***number [#i313be51]
number
とりうる値 :1,2,3
どんな値か :プログラム実行開始時に入力する値...
か、その他の読み込むファイルの何...
使っている場所 :main(),読み込み
***list_intersection [#kf0c1c59]
list_intersection
とる値の例 :[[2,l],[2,l],[1,l],[1,l],[1,r],[1...
どんな値か :何回目の分岐(分岐と判断される場所...
でファイルlist_isから読み込む("en...
で追加される)
[数字n,文字a]:進行方向に合わせて...
n番目の道でa=rなら...
"end" :ゴールに着いたこと...
使っている場所 :intersection(),main(),読み込み
***sign [#p452b771]
sign
とりうる値 :-1,1
どんな値か :follow_line()実行時右と左のどっち...
右の時1、左の時-1をとる。
使っている場所 :intersection(),follow_line(),main...
***sign_fc [#m3a21398]
sign_fc
とりうる値 :-1,1
どんな値か :(),fetch_cuboid3()の実行後に右と...
かを表す値で、右の時1、左の時-1を...
む。
使っている場所 :fetch_cuboid(),main(),読み込み
**関数 [#s5d875de]
***intersection() [#de5621fa]
def intersection (sign,index_list_is,list_intersectio...
print(list_intersection[index_list_is]) """道の番...
n_w = int(list_intersection[index_list_is][0]) ""...
if list_intersection[index_list_is][1]=="r": """...
sign_is = 1
elif list_intersection[index_list_is][1]=="l":
sign_is = -1
tank.on((a1_is+sign)*v_is,(a1_is-sign)*v_is) ""...
print("check1")
while True:
if cs.value()>threshold:
break
tank.on((a2_is-sign)*v_is,(a2_is+sign)*v_is) """...
for i in range(n_w):
while True:
if cs.value()<=cs_val_black:
break
while True:
if cs.value()>threshold:
break
if sign_is*sign==1: """指定された道の右か左の境界...
tank.on(sign_is*v_is,-sign_is*v_is)
while True:
if cs.value()<=cs_val_black:
break
while True:
if cs.value()>threshold:
break
tank.on(0,0)
return sign_is """1か-1:intersectiont()実行後に...
***fetch_cuboid() [#n7dab819]
def fetch_cuboid(sign_fc): """sign_fc=1か-1:fetch_cub...
fc_m.reset() """fc_mの角度をリセットする"""
fc_m.on_to_position(v_fc_m,-90) """cuboidを捕まえ...
tank.on_for_degrees(v_fc,-v_fc,180) """tankの向き...
while cs.value()>cs_val_black: """tank.on_for_de...
tank.on(v_fc,-v_fc)
while cs.value()<threshold: """黒いラインの中か...
tank.on(sign_fc*v_fc,-sign_fc*v_fc)
tank.on(0,0)
***fetch_cuboid3() [#be2b1a85]
def fetch_cuboid3(sign_fc): """sign_fc=1か-1:fetch_cu...
fc_m.reset() """fc_mの角度をリセットする"""
fc_m.on_to_position(v_fc_m,-90) """cuboidを捕まえ...
tank.on_for_degrees(v_fc,v_fc,600) """tankを前に...
tank.on_for_degrees(v_fc,-v_fc,180) """tankの向き...
while cs.value()>cs_val_black: """tank.on_for_de...
tank.on(v_fc,-v_fc)
tank.on(0,0)
fc_m.on_to_position(v_fc_m,0) """cuboidを放す"""
tank.on_for_degrees(-v_fc,-v_fc,60) """tankを少し...
tank.on_for_degrees(v_fc,-v_fc,180) """tankの向...
while cs.value()>cs_val_black: """tank.on_for_d...
tank.on(v_fc,-v_fc)
while cs.value()<threshold: """黒いラインの中か...
tank.on(sign_fc*v_fc,-sign_fc*v_fc)
tank.on(0,0)
***follow_line() [#cec601d2]
def follow_line(sign_fl,fc_ab): """sign_fl=1か-1:fol...
while True:
cs_d = max(min(cs.value(),threshold+cs_th_d_m...
if -csd_s_max < cs_d < csd_s_max: """tankの速...
v_fl=v_s
k_fl=v_fl*k_s/cs_th_d_max
else:
v_fl=v_c
k_fl=v_fl*k_c/cs_th_d_max
v_r_fl = v_fl+sign_fl*k_fl*cs_d """右のタイヤ...
v_l_fl = v_fl-sign_fl*k_fl*cs_d
if fc_ab == "b" and us.value()<110: """ある条...
after_fl_fl = "fc"
break
if cs.value()<cs_val_black:
after_fl_fl = "is"
break
if ts.is_pressed:
after_fl_fl = "ts_break"
break
tank.on(v_l_fl,v_r_fl) """v_l_flとv_r_flを使...
tank.off()
return after_fl_fl """fcかisかts_break:follow_li...
***main() [#vdea6671]
#inputでは何番目の人のミッションを行うか選べる
~1番目→"1"を入力
~2番目→"2"を入力
~3番目→"3"を入力
~というようにする。変数numberに1〜3の値が入力され、【読...
~【読み込み】で何をしているかは【読み込み】で説明していま...
def main():
main_break_bool=False """ファイル読み込みでエラー...
index_list_is = 0 """何番目の分岐点か"""
after_fl="after_fl" """:follow_line()が止まってか...
fc_ab = "b" """aかb:fetch_cuboid()またはfetch_cub...
#input
while True: """1か2か3を入力し、それをnumberに代...
print("start:num")
try:
number = int(input("number(1~3):"))
if 0<number<4:
break
except:
pass
print("number:",number)
print("")
--------------------------------------------------------...
読み込み
--------------------------------------------------------...
#move
if not main_break_bool: """ファイル読み込みでエラ...
while cs.value()>cs_val_black: """ラインに着...
tank.on(10,10)
tank.on(0,0)
while True: """このwhileの中がメインのプログ...
after_fl = follow_line(sign,fc_ab) """fol...
if after_fl == "fc" and fc_ab=="b": """us...
print("fetch cuboid")
if number<3:
fetch_cuboid(sign_fc)
else:
fetch_cuboid3(sign_fc)
sign = sign_fc
fc_ab = "a"
elif after_fl == "is": """list_intersecti...
if list_intersection[index_list_is]==...
tank.on_for_degrees(v_fc,v_fc,270)
print("list:end")
break
else:
print("intersection")
sign = intersection(sign,index_li...
print("index:",index_list_is)
index_list_is += 1
elif after_fl == "ts_break": """tsが押さ...
print("touch break")
break
else: """after_flに正しい値が入力されてい...
print("after_fl error")
after_fl="after_fl"
else:
print("main break")
print("end")
tank.on(0,0)
if __name__ == "__main__":
main()
**読み込み [#t5b8e99c]
こちらはテキストファイルではありません。main()の中の読み...
~#list_is、#sign0、#u_turn_rlでは与えられたnumberに応じて...
#read
***list_is [#i4f2528e]
与えられたnumberに応じて読み込みたいテキストファイルを読...
~(例)number = 2 →list_is2 を読み込む
~ぼくは2番目のミッションなのでlist_is2を読み込みました。
~そして、読み込んだテキストファイルからlist_intersection...
#list_is
print("start:list_is") """list_is(n)という名前の...
list_intersection=[]
file_name = "list_is" + str(number)
try:
with open(file_name, "r") as f:
list_intersection_raw = f.readlines()
for i in list_intersection_raw:
list_intersection.append(i.strip().sp...
for n,i in enumerate(list_intersection):
list_intersection[n][0] = i[0].strip()
list_intersection[n][1] = i[1].strip()
if not ((i[0].strip() in {"1","2","3"...
print("file content error")
raise Exception
list_intersection.append("end")
print("raw list:",list_intersection_raw)
print("list:",list_intersection)
print("")
except:
print("file is_list error")
main_break_bool=True
***sign0 [#w7280591]
#list_sign0
print("start:list_sign0") """sign0という名前のフ...
try:
with open("sign0", "r") as f:
list_sign0_raw = f.readlines()
if list_sign0_raw[number-1].strip()=="r":
sign = 1
elif list_sign0_raw[number-1].strip()=="l":
sign = -1
else:
print("file content error")
raise Exception
except:
print("file sign0 error")
main_break_bool=True
print("sign0:",sign)
print("")
***u_turn_rl [#rddc2e62]
#u_turn_rl
print("start:u_turn_rl") """u_turn_rlという名前の...
try:
with open("u_turn_rl", "r") as f:
list_ut_raw = f.readlines()
if list_ut_raw[number-1].strip()=="r":
sign_fc = 1
elif list_ut_raw[number-1].strip()=="l":
sign_fc = -1
else:
print("file content error")
raise Exception
except:
print("file u_turn_rl error")
main_break_bool=True
print("sign_fc:",sign_fc)
print("")
**読み込むファイル [#dd6932d8]
次のようなファイルプログラム実行前に用意する必要がある。
***list_is(list_is3) [#a7135842]
list_isは自分がライントレースする道が何人目の課題かによっ...
付け加えたものをファイル名として保存する。今回は3人目の...
2,r
1,l
2,r
1,r
2,r
1,l
2,l
1,r
***sign0 [#ufc8a57f]
r
r
r
***u_turn_rl [#va57fd0d]
l
r
r
*もともと目指していたロボット [#dac968c8]
僕らの班ではもともと別の機構を採用したロボットを目指して...
#ref(12872_2.jpg)
もともと僕たちが作ろうとしていたロボットはモータでカラー...
~一応、図3が振動させる仕組みです。モータに歯車をかみ合わ...
~図3
#ref(12871_2.jpg)
*反省点 [#i642ea52]
-発表までに自分たちの目指していた機構を実現できなく、もう...
-班員に任せっきりになってしまう部分があった。班員に感謝。
-ライントレースする紙を本番までに書いて来なかった。他の班...
-ロボットの性能でもっと移動スピードをあげたかった。変数調...
*さいごに [#b9a23a3b]
この課題2は大変楽しかった。プログラミングではpythonの知...
~課題1ではたった一つの命令だけでやっていたので成長を感じ...
ページ名: