2019b/Member/zhiwen/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2019b/Member]]
#contents
*課題2 [#e95508c2]
次のように動くロボットの製作
&br;&br;
1人目,2人目,3人目で別々の道を通る課題であるが、ここでは3...
+A地点から出発
+J
+H (直進)
+I (ボール or キューボイドをつかんでそのまま直進)
+I' (ボール or キューボイドを離してそのまま直進)
+H' (右折)
+G' (一時停止の後、直進)
+D' (右折)
+E', F' 通過
+G' (一時停止の後、直進)
+C' (一時停止の後、左折)
+B' (一時停止)
+A'地点に入る(ゴール)
&br;
&ref(2019b-mission2.png);
*ロボット [#ycbf48fb]
下向きで前の下のほうについてるカラーセンサーによって線に...
&br;
&ref(1577342560377_3.jpg);
&br;
&br;
&ref(1577343278032_2.jpg);
*プログラム [#nfe0c5f8]
#!/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()
*プログラムの説明 [#r223136f]
**概要 [#n7177f29]
***動き [#r1a1cda3]
分岐点やカーブ(内側を回る場合)でない場所で線を辿るとき...
プログラム開始直後はAからラインまで進み、そこで時計回り...
***準備・動かし方 [#q91e54e0]
以下に書いてあるファイル:list_is,sign0 ,u_turn_rlを用意...
**定数(プログラム実行中や与えるデータによって値が変化し...
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()
**変数(プログラム実行中や与えるデータによって値が変化す...
読み込みはmain()に含まれているが、ここではmain()と書いた...
&br;
fetch_cuboid()と書いたときはfetch_cuboid3()も含むとする。
&br;
使っている場所に書いてるものは関数実行時に引数として渡し...
***main_break_bool [#jedc8414]
main_break_bool
とりうる値 :True,False
どんな値か :main()でファイルを読み込みそこで...
あったときTrueとなり、main()の動...
する。
使っている場所 :読み込み,main()
***index_list_is [#yadc0a62]
index_list_is
とりうる値 :0,1,2,...
どんな値か :最初は0でありintersection()が行わ...
行時、list_intersection[index_lis...
使っている場所 :intersection(),main()
***after_fl [#maaf36df]
after_fl
とりうる値 :"after_fl","fc","is","ts_break"
どんな値か :follow_line()実行時に交差点に差し...
りfollow()を終了するが、そのあと...
"fc" :fetch_cuboid()を実行する
"is" :intersection()を実行する
"ts_break":タッチセンサーが押され...
らせる
"after_fl":初期化のときに使い、fo...
特に意味のある値ではな...
使っている場所 :intersection(),読み込み
***fc_ab [#i4a4a770]
fc_ab
とりうる値 :"a","b"
どんな値か :最初は"b"でありfetch_cuboid()が実...
fetch_cuboid()が複数回実行される...
使っている場所 :fetch_cuboid(),follow_line(),main()
***number [#gddbe997]
number
とりうる値 :1,2,3
どんな値か :プログラム実行開始時に入力する値...
か、その他の読み込むファイルの何...
使っている場所 :main(),読み込み
***list_intersection [#kc00bd0c]
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 [#a8ede537]
sign
とりうる値 :-1,1
どんな値か :follow_line()実行時右と左のどっち...
右の時1、左の時-1をとる。
使っている場所 :intersection(),follow_line(),main...
***sign_fc [#iddbc59b]
sign_fc
とりうる値 :-1,1
どんな値か :(),fetch_cuboid3()の実行後に右と...
かを表す値で、右の時1、左の時-1を...
む。
使っている場所 :fetch_cuboid(),main(),読み込み
**関数 [#s5d875de]
***intersection() [#de5621fa]
引数について
sign
とる値 :1,-1
どんな値か :intersection()実行前にとってる境界が...
index_list_is
とる値 :整数
どんな値か :何回目の分岐かを表す値
list_intersection
とる値 :二次元リスト
どんな値か :何回目の分岐でなにをするかを表すリスト
戻り値について
sign_is
とる値 :1,-1
どんな値か :intersectiont()実行後にとる境界が右...
内容
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
***fetch_cuboid() [#n7dab819]
引数について
sign_fc
とる値 :1,-1
どんな値か :fetch_cuboid()が終わった後でとる境界...
内容
def fetch_cuboid(sign_fc):
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]
引数について
sign_fc
とる値 :1,-1
どんな値か :fetch_cuboid3()が終わった後でとる境...
内容
def fetch_cuboid3(sign_fc):
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]
引数について
sign_fl
とる値 :1,-1
どんな値か :follow_line()する境界が右か左かを表...
fc_ab
とる値 :"a","b"
どんな値か :fetch_cuboid()またはfetch_cuboid3()...
戻り値について
after_fl_fl
とる値 :"fc","is","ts_break"
どんな値か :follow_line()実行後になにをするかを...
内容
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: """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_...
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
***main() [#vdea6671]
def main():
main_break_bool=False """ファイル読み込みでエラー...
ときFalseをとるboolean型...
index_list_is = 0 """何番目の分岐点か"""
after_fl="after_fl" """:follow_line()が止まってか...
fc_ab = "b" """aかb:fetch_cuboid()またはf...
(a:すでに実行された,b:まだ...
#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("")
#read
--------------------------------------------------------...
読み込み
--------------------------------------------------------...
#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...
れ...
fe...
が...
じ...
る...
#f...
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...
少し進めてから...
でなければlist_...
せてintersectio...
#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": """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]
***list_is [#i4f2528e]
#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という名前のフ...
じてsignに1か-1を代...
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という名前の...
じてsign_fcに1か-1を...
力する数字とする"""
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("")
**読み込むファイル [#ddf72ff5]
次のようなファイルプログラム実行前に用意する必要がある。
***list_is(list_is3) [#sa8e8c0f]
list_isは自分がライントレースする道が何人目の課題かによっ...
付け加えたものをファイル名として保存する。今回は3人目の...
2,r
1,l
2,r
1,r
2,r
1,l
2,l
1,r
***sign0 [#t3686132]
r
r
r
***u_turn_rl [#jbd78aed]
l
r
r
*結果と感想 [#n92e680c]
**結果 [#w530b5e2]
発表ではプログラム自体はできていたが、細かいデバッグや定...
**感想 [#df2f80e9]
ハード面の工夫が苦手であり、ミッション1ではそれにより苦...
終了行:
[[2019b/Member]]
#contents
*課題2 [#e95508c2]
次のように動くロボットの製作
&br;&br;
1人目,2人目,3人目で別々の道を通る課題であるが、ここでは3...
+A地点から出発
+J
+H (直進)
+I (ボール or キューボイドをつかんでそのまま直進)
+I' (ボール or キューボイドを離してそのまま直進)
+H' (右折)
+G' (一時停止の後、直進)
+D' (右折)
+E', F' 通過
+G' (一時停止の後、直進)
+C' (一時停止の後、左折)
+B' (一時停止)
+A'地点に入る(ゴール)
&br;
&ref(2019b-mission2.png);
*ロボット [#ycbf48fb]
下向きで前の下のほうについてるカラーセンサーによって線に...
&br;
&ref(1577342560377_3.jpg);
&br;
&br;
&ref(1577343278032_2.jpg);
*プログラム [#nfe0c5f8]
#!/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()
*プログラムの説明 [#r223136f]
**概要 [#n7177f29]
***動き [#r1a1cda3]
分岐点やカーブ(内側を回る場合)でない場所で線を辿るとき...
プログラム開始直後はAからラインまで進み、そこで時計回り...
***準備・動かし方 [#q91e54e0]
以下に書いてあるファイル:list_is,sign0 ,u_turn_rlを用意...
**定数(プログラム実行中や与えるデータによって値が変化し...
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()
**変数(プログラム実行中や与えるデータによって値が変化す...
読み込みはmain()に含まれているが、ここではmain()と書いた...
&br;
fetch_cuboid()と書いたときはfetch_cuboid3()も含むとする。
&br;
使っている場所に書いてるものは関数実行時に引数として渡し...
***main_break_bool [#jedc8414]
main_break_bool
とりうる値 :True,False
どんな値か :main()でファイルを読み込みそこで...
あったときTrueとなり、main()の動...
する。
使っている場所 :読み込み,main()
***index_list_is [#yadc0a62]
index_list_is
とりうる値 :0,1,2,...
どんな値か :最初は0でありintersection()が行わ...
行時、list_intersection[index_lis...
使っている場所 :intersection(),main()
***after_fl [#maaf36df]
after_fl
とりうる値 :"after_fl","fc","is","ts_break"
どんな値か :follow_line()実行時に交差点に差し...
りfollow()を終了するが、そのあと...
"fc" :fetch_cuboid()を実行する
"is" :intersection()を実行する
"ts_break":タッチセンサーが押され...
らせる
"after_fl":初期化のときに使い、fo...
特に意味のある値ではな...
使っている場所 :intersection(),読み込み
***fc_ab [#i4a4a770]
fc_ab
とりうる値 :"a","b"
どんな値か :最初は"b"でありfetch_cuboid()が実...
fetch_cuboid()が複数回実行される...
使っている場所 :fetch_cuboid(),follow_line(),main()
***number [#gddbe997]
number
とりうる値 :1,2,3
どんな値か :プログラム実行開始時に入力する値...
か、その他の読み込むファイルの何...
使っている場所 :main(),読み込み
***list_intersection [#kc00bd0c]
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 [#a8ede537]
sign
とりうる値 :-1,1
どんな値か :follow_line()実行時右と左のどっち...
右の時1、左の時-1をとる。
使っている場所 :intersection(),follow_line(),main...
***sign_fc [#iddbc59b]
sign_fc
とりうる値 :-1,1
どんな値か :(),fetch_cuboid3()の実行後に右と...
かを表す値で、右の時1、左の時-1を...
む。
使っている場所 :fetch_cuboid(),main(),読み込み
**関数 [#s5d875de]
***intersection() [#de5621fa]
引数について
sign
とる値 :1,-1
どんな値か :intersection()実行前にとってる境界が...
index_list_is
とる値 :整数
どんな値か :何回目の分岐かを表す値
list_intersection
とる値 :二次元リスト
どんな値か :何回目の分岐でなにをするかを表すリスト
戻り値について
sign_is
とる値 :1,-1
どんな値か :intersectiont()実行後にとる境界が右...
内容
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
***fetch_cuboid() [#n7dab819]
引数について
sign_fc
とる値 :1,-1
どんな値か :fetch_cuboid()が終わった後でとる境界...
内容
def fetch_cuboid(sign_fc):
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]
引数について
sign_fc
とる値 :1,-1
どんな値か :fetch_cuboid3()が終わった後でとる境...
内容
def fetch_cuboid3(sign_fc):
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]
引数について
sign_fl
とる値 :1,-1
どんな値か :follow_line()する境界が右か左かを表...
fc_ab
とる値 :"a","b"
どんな値か :fetch_cuboid()またはfetch_cuboid3()...
戻り値について
after_fl_fl
とる値 :"fc","is","ts_break"
どんな値か :follow_line()実行後になにをするかを...
内容
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: """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_...
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
***main() [#vdea6671]
def main():
main_break_bool=False """ファイル読み込みでエラー...
ときFalseをとるboolean型...
index_list_is = 0 """何番目の分岐点か"""
after_fl="after_fl" """:follow_line()が止まってか...
fc_ab = "b" """aかb:fetch_cuboid()またはf...
(a:すでに実行された,b:まだ...
#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("")
#read
--------------------------------------------------------...
読み込み
--------------------------------------------------------...
#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...
れ...
fe...
が...
じ...
る...
#f...
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...
少し進めてから...
でなければlist_...
せてintersectio...
#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": """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]
***list_is [#i4f2528e]
#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という名前のフ...
じてsignに1か-1を代...
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という名前の...
じてsign_fcに1か-1を...
力する数字とする"""
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("")
**読み込むファイル [#ddf72ff5]
次のようなファイルプログラム実行前に用意する必要がある。
***list_is(list_is3) [#sa8e8c0f]
list_isは自分がライントレースする道が何人目の課題かによっ...
付け加えたものをファイル名として保存する。今回は3人目の...
2,r
1,l
2,r
1,r
2,r
1,l
2,l
1,r
***sign0 [#t3686132]
r
r
r
***u_turn_rl [#jbd78aed]
l
r
r
*結果と感想 [#n92e680c]
**結果 [#w530b5e2]
発表ではプログラム自体はできていたが、細かいデバッグや定...
**感想 [#df2f80e9]
ハード面の工夫が苦手であり、ミッション1ではそれにより苦...
ページ名: