2019b/Member/LaiHen/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
----
目次
#contents
----
* 課題2:ライントレース [#u7470bfe]
下の画像の指定されたコースを黒線に沿って進む
&ref(2019b/Member/LaiHen/Mission2/2019b-mission2.png,70%,...
** 指定コース [#vce05226]
+ A地点から出発
+ B
+ C (直進)
+ D (一時停止の後、直進)
+ E, F 通過
+ G (一時停止の後、左折)
+ H (一時停止の後、左折)
+ I (キューボイドをつかんでUターン)
+ H (直進)
+ J (一時停止)
+ A地点に入る(ゴール)
* ロボットについて [#h73f63eb]
** ロボットの構造 [#d613c006]
今回の課題でロボットに必要な物は本体を移動させるためのモ...
*** カラーセンサー [#h529f137]
カラーセンサーは今回のライントレースで最も重要な部分です...
*** 超音波センサー [#c9e9e386]
前提としてキューボイドとの測る際本体はライントレースをし...
*** アーム [#b9c5da66]
アームの設置位置は超音波センサーを基準にしたので簡単でし...
** 全体的な工夫点 [#x6509f6c]
EV3のセンサーは精度が高いため振れなどによって値が変化して...
&ref(2019b/Member/LaiHen/Mission2/KD22.jpg,25%,ロボットの...
&ref(2019b/Member/LaiHen/Mission2/KD21.jpg,25%,補助輪画像);
&ref(2019b/Member/LaiHen/Mission2/KD24.jpg,25%,センサー関...
** ロボットについてのまとめ [#c64c38da]
前回はあまりロボットにかかわらなかったのでいろいろと試行...
* プログラムについて [#f9aa9a86]
** プログラムのシステムについて [#i0b559db]
ライントレースは黒線の上を進むのではなく黒と白の境界部分...
#!/usr/bin/env python3
from ev3dev2.motor import *
from ev3dev2.sensor import *
from ev3dev2.sensor.lego import *
from time import *
Wmax,Bmax,spmax,spmin,brockch,tst=75,5,8,4,6,1.5
tw = MoveTank(OUTPUT_B, OUTPUT_C)
Mm= MediumMotor(OUTPUT_A)
cs,ts,us = ColorSensor(),TouchSensor(),UltrasonicSensor()
us.mode = 'US-DIST-CM'
Mv=(Wmax+Bmax)/2
Lp=(Wmax-Mv)/4
llp=2*Lp
spab=(spmax+spmin)/2
Clev=[Wmax,Wmax-Lp,Mv+Lp,Mv-Lp,Bmax+Lp,Bmax]
class Linetorace:
def __init__(self,a):
self.cv=a
self.colortyp,self.dcv,self.lesp,self.risp=0,0,0,0
self.typcheck()
self.movesp()
def typcheck(self):
for i in range(5):
if Clev[i+1]<=self.cv<Clev[i]:
self.colortyp=i
self.dcv=Clev[i]-self.cv
def movesp(self):
zuw=round(self.dcv/llp,1)
if self.colortyp==0:
self.lesp=spab-(spab-spmin)*zuw
self.risp=-spmin
elif self.colortyp==1:
self.lesp=spmax
self.risp=spab+(spmax-spab)*zuw
elif self.colortyp==2:
self.lesp=spmax
self.risp=spmax
elif self.colortyp==3:
self.lesp=spab+(spmax-spab)*zuw
self.risp=spmax
else:
self.lesp=-spmin
self.risp=spab-(spab-spmin)*zuw
class root:
def __init__(self,v1,v2):
self.typ,self.chst=v1,v2
def action(self):
if self.typ==0:
follow_line(self.chst,50)
elif self.typ==1:
closs(self.chst)
elif self.typ==2:
fetch_cuboid(self.chst)
else:
gostart()
def follow_line(chst,ched):#ライントレース用プログラム
sttime1,notime1 = time(),time()
bcon=0
while not (ts.is_pressed) and not ((notime1-sttime1)...
cvp = cs.reflected_light_intensity
MLT=Linetorace(cvp)
if MLT.colortyp==4:
bcon=bcon+1
else:
bcon=0
notime1=time()
if (chst <= (notime1-sttime1) <=ched) and (bcon=...
break
tw.on(MLT.lesp,MLT.risp)
sleep(0.1)
tw.off()
def closs(pp):#交差点と直角カーブの際の行動用プログラム
cvp= cs.reflected_light_intensity
MLT = Linetorace(cvp)
tw.on(-MLT.lesp,-MLT.risp)
sleep(0.1*brockch)
tw.off()
if pp==0:
follow_line(tst,tst+0.1)
else:
sleep(5)
if pp==1:
follow_line(tst,tst+0.1)
elif pp==2:
tw.on_for_seconds(spmax,spmax,1)
else:
sttime=time()
notime=time()
while (notime- sttime <=tst):
cvp= cs.reflected_light_intensity
MLT= Linetorace(cvp)
tw.on(MLT.risp,MLT.lesp)
sleep(0.1)
notime=time()
tw.off()
def fetch_cuboid(edti):#ライントレース後キューブを回収し...
sttime2 = time()
fase=0
while not (ts.is_pressed):
cvp= cs.reflected_light_intensity
MLT= Linetorace(cvp)
tw.on(MLT.risp,MLT.lesp)
notime2= time()
txle= us.distance_centimeters
if txle <= 4 :
tw.on(0,0)
Mm.on_for_seconds(-10,1.2)
tw.on_for_degrees(-spmax,spmax,360)
fase=1
break
if (notime2-sttime2) >= edti:
fase=1
break
sleep(0.1)
if fase==1:
follow_line(5,edti)
tw.off()
Mm.off()
def gostart():#スタート時の前進用プログラム
tw.on_for_seconds(spmax,spmax,2)
def main():
MAP=[root(4,0),root(0,0),root(1,0),root(0,0),root(1,...
for i in range(len(MAP)):
if not ts.is_pressed:
MAP[i].action()
else:
break
print("all clear")
if __name__ == '__main__':
main()
このプログラムについて以下で8つに分けて詳しく説明していき...
*** ?プログラムの事前設定と基準値の算出 [#xacf6790]
#!/usr/bin/env python3
from ev3dev2.motor import *
from ev3dev2.sensor import *
from ev3dev2.sensor.lego import *
from time import *
この部分で必要な物のインポートをする
Wmax,Bmax,spmax,spmin,brockch,tst=75,5,8,4,6,1.5
ここで使う数値を入力します。この部分以外では極力数値を直...
入力するのは
+ 白色のセンサーの値(Wmax) ==75
+ 黒色のセンサーの値(Bmax) ==5
+ モーターの最高速度(spmax) ==8
+ モーターの最低速度(spmin) ==4
+ 交差点判断する黒色のカウント値(brockch) ==6
+ 交差点等のコマンドの継続時間(tst) ==1.5~
上記の6つです。
これ以外の数値はこれらをもとに計算していきます
- モーターやセンサーを使うための準備を行います。
tw = MoveTank(OUTPUT_B, OUTPUT_C)
Mm= MediumMotor(OUTPUT_A)
cs,ts,us = ColorSensor(),TouchSensor(),UltrasonicSensor()
us.mode = 'US-DIST-CM'
- 入力された数値からプログラムで使うものの決定をしていき...
Mv=(Wmax+Bmax)/2
Lp=(Wmax-Mv)/4
llp=2*Lp
spab=(spmax+spmin)/2
Clev=[Wmax,Wmax-Lp,Mv+Lp,Mv-Lp,Bmax+Lp,Bmax]
-- 白色と黒色の境界線(灰色)でのセンサーの数値
灰色の値を計測する場合正確に境界線の中央を測ることは難し...
Mv=(Wmax+Bmax)/2
-- 色の段階を判断の範囲を決定する
白から黒までを均等に分けるのに使う。ここでは(白色の値-灰...
Lp=(Wmax-Mv)/4
llp=2*Lp
-- 速度の平均値を決定
ライントレースの速度の計算の際に最高速度と最低速度の平均...
spab=(spmax+spmin)/2
-- 色の範囲の基準値をリストとして決定する
白から黒までを5段階に分けるときの基準値を先に求めた数値か...
各段階の基準値は
+ Wmax〜Wmax-Lp
+ Wmax-Lp〜Mv+Lp
+ Mv+Lp〜Mv-Lp
+ Mv-Lp〜Bmax+Lp
+ Bmax+Lp〜Bmax
Clev=[Wmax,Wmax-Lp,Mv+Lp,Mv-Lp,Bmax+Lp,Bmax]
- これで今後使う変数の準備ができました。プログラムを起動...
*** ?ライントレース用のクラス [#dc918a51]
class Linetorace:
def __init__(self,a):
self.cv=a
self.colortyp,self.dcv,self.lesp,self.risp=0,0,0,0
self.typcheck()
self.movesp()
def typcheck(self):
for i in range(5):
if Clev[i+1]<=self.cv<Clev[i]:
self.colortyp=i
self.dcv=Clev[i]-self.cv
def movesp(self):
zuw=round(self.dcv/llp,1)
if self.colortyp==0:
self.lesp=spab-(spab-spmin)*zuw
self.risp=-spmin
elif self.colortyp==1:
self.lesp=spmax
self.risp=spab+(spmax-spab)*zuw
elif self.colortyp==2:
self.lesp=spmax
self.risp=spmax
elif self.colortyp==3:
self.lesp=spab+(spmax-spab)*zuw
self.risp=spmax
else:
self.lesp=-spmin
self.risp=spab-(spab-spmin)*zuw
カラーセンサーの値を5段階のうちどれに該当するかを判定する...
このクラスはセンサーの値から左右の速度、段階などを取得で...
このクラスのメインである段階分けと左右の速度決定を説明し...
+ 段階分け
カラーセンサーの値を以下の表と照らし合わせて段階数を決め...
|色の段階|白色|白色と灰色の中間|灰色|黒色と灰色の中間|黒色|
|段階数|0|1|2|3|4|
|値の範囲|Wmax〜Wmax-Lp|Wmax-Lp〜Mv+Lp|Mv+Lp〜Mv-Lp|Mv-Lp...
+ 左右の速度決定
段階数が決まったらその段階数ごとに決められた速度を求める...
''(決定した段階の上限-カラーセンサーの値)÷(範囲の幅×2...
|段階数|0|1|2|3|4|
|右の速度(文字)|-(最低速度)|速度の平均値+(最高速度-速...
|右の速度(式)|-spmin|spab+(spmax-spab)*zuw|spmax|spmax|sp...
|左の速度(文字)|速度の平均値-(速度の平均値-最低速度)×調...
|左の速度(式)|spab-(spab-spmin)*zuw|spmax|spmax|spab+(spm...
表からわかるように段階が0と4、1と3は式が左右反対だけで計...
- ''任意による左右の基準を変更可能''~
段階分けの対称および計算式の調整によってライントレースの...
-- 左側の時は右の速度を右のモーターに左の速度を左のモータ...
-- 右側の時は右の速度を左のモーターに左の速度を右のモータ...
*** ?ルート指定用のクラス [#o79a6f60]
class root:
def __init__(self,v1,v2):
self.typ,self.chst=v1,v2
def action(self):
if self.typ==0:
follow_line(self.chst,50)
elif self.typ==1:
closs(self.chst)
elif self.typ==2:
fetch_cuboid(self.chst)
else:
gostart()
main部分でルートのコードを打ち込んでいくのは大変なので2つ...
*** ?通常時のライントレース用の関数 [#z4db0b7e]
def follow_line(chst,ched):#ライントレース用プログラム
sttime1,notime1 = time(),time()
bcon=0
while not (ts.is_pressed) and not ((notime1-sttime1)...
cvp = cs.reflected_light_intensity
MLT=Linetorace(cvp)
if MLT.colortyp==4:
bcon=bcon+1
else:
bcon=0
notime1=time()
if (chst <= (notime1-sttime1) <=ched) and (bcon=...
break
tw.on(MLT.lesp,MLT.risp)
sleep(0.1)
tw.off()
2つの引数(交差点判定開始までの時間、関数の処理の制限時間...
- 1つ目は今のカラーセンサーの値から左右のモーターの速度を...
- 2つ目は交差点または直角カーブに来ているかどうか
の2つです。これらの処理について説明していきます。
+ ライントレース
ここでの処理はタッチセンサーが押されておらずまた、関数の...
while not (ts.is_pressed) and not ((notime1-sttime1)...
cvp = cs.reflected_light_intensity
MLT=Linetorace(cvp)
tw.on(MLT.lesp,MLT.risp)
sleep(0.1)
+ 交差点判定
交差点判定は最初はカラーセンサーの変化の具合から判定しよ...
ここでの処理は1つ目の処理で使ったクラスの段階が黒色の場合...
if MLT.colortyp==4:
bcon=bcon+1
else:
bcon=0
notime1=time()
if (chst <= (notime1-sttime1) <=ched) and (bcon=...
break
この関数は0.1秒おきに色のチェックをするため曲線部分での交...
*** ?直角カーブと交差点での行動用関数 [#ca2a43c6]
def closs(pp):#交差点と直角カーブの際の行動用プログラム
cvp= cs.reflected_light_intensity
MLT = Linetorace(cvp)
tw.on(-MLT.lesp,-MLT.risp)
sleep(0.1*brockch)
tw.off()
if pp==0:
follow_line(tst,tst+0.1)
else:
sleep(5)
if pp==1:
follow_line(tst,tst+0.1)
elif pp==2:
tw.on_for_seconds(spmax,spmax,1)
else:
sttime=time()
notime=time()
while (notime- sttime <=tst):
cvp= cs.reflected_light_intensity
MLT= Linetorace(cvp)
tw.on(MLT.risp,MLT.lesp)
sleep(0.1)
notime=time()
tw.off()
引数でカーブ、交差点を左折、右折、直進の4つを指示しそれぞ...
+ 現在のカラーセンサーの値からさっきまでの道を戻る
+ その後4つそれぞれの動きを実行する
といった流れです。~
なぜ交差点での処理で一旦道を戻るのはこの関数が呼び出され...
後は引数の値で処理を変えて4つの行動を分けます。
++ カーブ~
カーブの場合は一旦止まる必要はないのでそのまま黒線の左側...
++ 交差点を左折~
交差点なので一定時間停止後カーブと同様の処理をします。
++ 交差点を直進~
交差点なので一定時間停止後左右のモーターを最大速度で1秒間...
++ 交差点を右折~
交差点なので一定時間停止後黒線の右側を基準にライントレー...
*** ?キューブキャッチ用関数 [#s7a772b7]
def fetch_cuboid(edti):#ライントレース後キューブを回収し...
sttime2 = time()
fase=0
while not (ts.is_pressed):
cvp= cs.reflected_light_intensity
MLT= Linetorace(cvp)
tw.on(MLT.risp,MLT.lesp)
notime2= time()
txle= us.distance_centimeters
if txle <= 4 :
tw.on(0,0)
Mm.on_for_seconds(-10,1.2)
tw.on_for_degrees(-spmax,spmax,360)
fase=1
break
if (notime2-sttime2) >= edti:
fase=1
break
sleep(0.1)
if fase==1:
follow_line(5,edti)
tw.off()
Mm.off()
キューボイドをキャッチし、Uターンして戻る処理を行う関数で...
+ キューボイドまでライントレース~
ロボットについての説明で述べたように超音波センサーはライ...
cvp= cs.reflected_light_intensity
MLT= Linetorace(cvp)
tw.on(MLT.risp,MLT.lesp)
notime2= time()
txle= us.distance_centimeters
+ キューボイドの検知とキャッチ~
超音波センサーの値が決められた数値以下になったらミディア...
if txle <= 4 :
tw.on(0,0)
Mm.on_for_seconds(-10,1.2)
+ Uターン~
キューボイドをキャッチ後その場で反時計回りに半回転します
tw.on_for_degrees(-spmax,spmax,360)
+ 来た道を戻る~
Uターンして先ほどまで通ってきた線に戻ってきます。ですが先...
if fase==1:
follow_line(5,edti)
*** ?スタート用の関数 [#q7516c13]
def gostart():#スタート時の前進用プログラム
tw.on_for_seconds(spmax,spmax,2)
AからBに進むときライントレースで進むのは大変のなのでただ...
*** ?メインプログラム [#y525a140]
def main():
MAP=[root(4,0),root(0,0),root(1,0),root(0,0),root(1,...
for i in range(len(MAP)):
if not ts.is_pressed:
MAP[i].action()
else:
break
print("all clear")
if __name__ == '__main__':
main()
メインプログラムで今回のルートをリスト型で指定し、順番に...
** プログラムのまとめ [#z7e38825]
これまでの説明とプログラム自体の長さからわかるように課題...
終了行:
----
目次
#contents
----
* 課題2:ライントレース [#u7470bfe]
下の画像の指定されたコースを黒線に沿って進む
&ref(2019b/Member/LaiHen/Mission2/2019b-mission2.png,70%,...
** 指定コース [#vce05226]
+ A地点から出発
+ B
+ C (直進)
+ D (一時停止の後、直進)
+ E, F 通過
+ G (一時停止の後、左折)
+ H (一時停止の後、左折)
+ I (キューボイドをつかんでUターン)
+ H (直進)
+ J (一時停止)
+ A地点に入る(ゴール)
* ロボットについて [#h73f63eb]
** ロボットの構造 [#d613c006]
今回の課題でロボットに必要な物は本体を移動させるためのモ...
*** カラーセンサー [#h529f137]
カラーセンサーは今回のライントレースで最も重要な部分です...
*** 超音波センサー [#c9e9e386]
前提としてキューボイドとの測る際本体はライントレースをし...
*** アーム [#b9c5da66]
アームの設置位置は超音波センサーを基準にしたので簡単でし...
** 全体的な工夫点 [#x6509f6c]
EV3のセンサーは精度が高いため振れなどによって値が変化して...
&ref(2019b/Member/LaiHen/Mission2/KD22.jpg,25%,ロボットの...
&ref(2019b/Member/LaiHen/Mission2/KD21.jpg,25%,補助輪画像);
&ref(2019b/Member/LaiHen/Mission2/KD24.jpg,25%,センサー関...
** ロボットについてのまとめ [#c64c38da]
前回はあまりロボットにかかわらなかったのでいろいろと試行...
* プログラムについて [#f9aa9a86]
** プログラムのシステムについて [#i0b559db]
ライントレースは黒線の上を進むのではなく黒と白の境界部分...
#!/usr/bin/env python3
from ev3dev2.motor import *
from ev3dev2.sensor import *
from ev3dev2.sensor.lego import *
from time import *
Wmax,Bmax,spmax,spmin,brockch,tst=75,5,8,4,6,1.5
tw = MoveTank(OUTPUT_B, OUTPUT_C)
Mm= MediumMotor(OUTPUT_A)
cs,ts,us = ColorSensor(),TouchSensor(),UltrasonicSensor()
us.mode = 'US-DIST-CM'
Mv=(Wmax+Bmax)/2
Lp=(Wmax-Mv)/4
llp=2*Lp
spab=(spmax+spmin)/2
Clev=[Wmax,Wmax-Lp,Mv+Lp,Mv-Lp,Bmax+Lp,Bmax]
class Linetorace:
def __init__(self,a):
self.cv=a
self.colortyp,self.dcv,self.lesp,self.risp=0,0,0,0
self.typcheck()
self.movesp()
def typcheck(self):
for i in range(5):
if Clev[i+1]<=self.cv<Clev[i]:
self.colortyp=i
self.dcv=Clev[i]-self.cv
def movesp(self):
zuw=round(self.dcv/llp,1)
if self.colortyp==0:
self.lesp=spab-(spab-spmin)*zuw
self.risp=-spmin
elif self.colortyp==1:
self.lesp=spmax
self.risp=spab+(spmax-spab)*zuw
elif self.colortyp==2:
self.lesp=spmax
self.risp=spmax
elif self.colortyp==3:
self.lesp=spab+(spmax-spab)*zuw
self.risp=spmax
else:
self.lesp=-spmin
self.risp=spab-(spab-spmin)*zuw
class root:
def __init__(self,v1,v2):
self.typ,self.chst=v1,v2
def action(self):
if self.typ==0:
follow_line(self.chst,50)
elif self.typ==1:
closs(self.chst)
elif self.typ==2:
fetch_cuboid(self.chst)
else:
gostart()
def follow_line(chst,ched):#ライントレース用プログラム
sttime1,notime1 = time(),time()
bcon=0
while not (ts.is_pressed) and not ((notime1-sttime1)...
cvp = cs.reflected_light_intensity
MLT=Linetorace(cvp)
if MLT.colortyp==4:
bcon=bcon+1
else:
bcon=0
notime1=time()
if (chst <= (notime1-sttime1) <=ched) and (bcon=...
break
tw.on(MLT.lesp,MLT.risp)
sleep(0.1)
tw.off()
def closs(pp):#交差点と直角カーブの際の行動用プログラム
cvp= cs.reflected_light_intensity
MLT = Linetorace(cvp)
tw.on(-MLT.lesp,-MLT.risp)
sleep(0.1*brockch)
tw.off()
if pp==0:
follow_line(tst,tst+0.1)
else:
sleep(5)
if pp==1:
follow_line(tst,tst+0.1)
elif pp==2:
tw.on_for_seconds(spmax,spmax,1)
else:
sttime=time()
notime=time()
while (notime- sttime <=tst):
cvp= cs.reflected_light_intensity
MLT= Linetorace(cvp)
tw.on(MLT.risp,MLT.lesp)
sleep(0.1)
notime=time()
tw.off()
def fetch_cuboid(edti):#ライントレース後キューブを回収し...
sttime2 = time()
fase=0
while not (ts.is_pressed):
cvp= cs.reflected_light_intensity
MLT= Linetorace(cvp)
tw.on(MLT.risp,MLT.lesp)
notime2= time()
txle= us.distance_centimeters
if txle <= 4 :
tw.on(0,0)
Mm.on_for_seconds(-10,1.2)
tw.on_for_degrees(-spmax,spmax,360)
fase=1
break
if (notime2-sttime2) >= edti:
fase=1
break
sleep(0.1)
if fase==1:
follow_line(5,edti)
tw.off()
Mm.off()
def gostart():#スタート時の前進用プログラム
tw.on_for_seconds(spmax,spmax,2)
def main():
MAP=[root(4,0),root(0,0),root(1,0),root(0,0),root(1,...
for i in range(len(MAP)):
if not ts.is_pressed:
MAP[i].action()
else:
break
print("all clear")
if __name__ == '__main__':
main()
このプログラムについて以下で8つに分けて詳しく説明していき...
*** ?プログラムの事前設定と基準値の算出 [#xacf6790]
#!/usr/bin/env python3
from ev3dev2.motor import *
from ev3dev2.sensor import *
from ev3dev2.sensor.lego import *
from time import *
この部分で必要な物のインポートをする
Wmax,Bmax,spmax,spmin,brockch,tst=75,5,8,4,6,1.5
ここで使う数値を入力します。この部分以外では極力数値を直...
入力するのは
+ 白色のセンサーの値(Wmax) ==75
+ 黒色のセンサーの値(Bmax) ==5
+ モーターの最高速度(spmax) ==8
+ モーターの最低速度(spmin) ==4
+ 交差点判断する黒色のカウント値(brockch) ==6
+ 交差点等のコマンドの継続時間(tst) ==1.5~
上記の6つです。
これ以外の数値はこれらをもとに計算していきます
- モーターやセンサーを使うための準備を行います。
tw = MoveTank(OUTPUT_B, OUTPUT_C)
Mm= MediumMotor(OUTPUT_A)
cs,ts,us = ColorSensor(),TouchSensor(),UltrasonicSensor()
us.mode = 'US-DIST-CM'
- 入力された数値からプログラムで使うものの決定をしていき...
Mv=(Wmax+Bmax)/2
Lp=(Wmax-Mv)/4
llp=2*Lp
spab=(spmax+spmin)/2
Clev=[Wmax,Wmax-Lp,Mv+Lp,Mv-Lp,Bmax+Lp,Bmax]
-- 白色と黒色の境界線(灰色)でのセンサーの数値
灰色の値を計測する場合正確に境界線の中央を測ることは難し...
Mv=(Wmax+Bmax)/2
-- 色の段階を判断の範囲を決定する
白から黒までを均等に分けるのに使う。ここでは(白色の値-灰...
Lp=(Wmax-Mv)/4
llp=2*Lp
-- 速度の平均値を決定
ライントレースの速度の計算の際に最高速度と最低速度の平均...
spab=(spmax+spmin)/2
-- 色の範囲の基準値をリストとして決定する
白から黒までを5段階に分けるときの基準値を先に求めた数値か...
各段階の基準値は
+ Wmax〜Wmax-Lp
+ Wmax-Lp〜Mv+Lp
+ Mv+Lp〜Mv-Lp
+ Mv-Lp〜Bmax+Lp
+ Bmax+Lp〜Bmax
Clev=[Wmax,Wmax-Lp,Mv+Lp,Mv-Lp,Bmax+Lp,Bmax]
- これで今後使う変数の準備ができました。プログラムを起動...
*** ?ライントレース用のクラス [#dc918a51]
class Linetorace:
def __init__(self,a):
self.cv=a
self.colortyp,self.dcv,self.lesp,self.risp=0,0,0,0
self.typcheck()
self.movesp()
def typcheck(self):
for i in range(5):
if Clev[i+1]<=self.cv<Clev[i]:
self.colortyp=i
self.dcv=Clev[i]-self.cv
def movesp(self):
zuw=round(self.dcv/llp,1)
if self.colortyp==0:
self.lesp=spab-(spab-spmin)*zuw
self.risp=-spmin
elif self.colortyp==1:
self.lesp=spmax
self.risp=spab+(spmax-spab)*zuw
elif self.colortyp==2:
self.lesp=spmax
self.risp=spmax
elif self.colortyp==3:
self.lesp=spab+(spmax-spab)*zuw
self.risp=spmax
else:
self.lesp=-spmin
self.risp=spab-(spab-spmin)*zuw
カラーセンサーの値を5段階のうちどれに該当するかを判定する...
このクラスはセンサーの値から左右の速度、段階などを取得で...
このクラスのメインである段階分けと左右の速度決定を説明し...
+ 段階分け
カラーセンサーの値を以下の表と照らし合わせて段階数を決め...
|色の段階|白色|白色と灰色の中間|灰色|黒色と灰色の中間|黒色|
|段階数|0|1|2|3|4|
|値の範囲|Wmax〜Wmax-Lp|Wmax-Lp〜Mv+Lp|Mv+Lp〜Mv-Lp|Mv-Lp...
+ 左右の速度決定
段階数が決まったらその段階数ごとに決められた速度を求める...
''(決定した段階の上限-カラーセンサーの値)÷(範囲の幅×2...
|段階数|0|1|2|3|4|
|右の速度(文字)|-(最低速度)|速度の平均値+(最高速度-速...
|右の速度(式)|-spmin|spab+(spmax-spab)*zuw|spmax|spmax|sp...
|左の速度(文字)|速度の平均値-(速度の平均値-最低速度)×調...
|左の速度(式)|spab-(spab-spmin)*zuw|spmax|spmax|spab+(spm...
表からわかるように段階が0と4、1と3は式が左右反対だけで計...
- ''任意による左右の基準を変更可能''~
段階分けの対称および計算式の調整によってライントレースの...
-- 左側の時は右の速度を右のモーターに左の速度を左のモータ...
-- 右側の時は右の速度を左のモーターに左の速度を右のモータ...
*** ?ルート指定用のクラス [#o79a6f60]
class root:
def __init__(self,v1,v2):
self.typ,self.chst=v1,v2
def action(self):
if self.typ==0:
follow_line(self.chst,50)
elif self.typ==1:
closs(self.chst)
elif self.typ==2:
fetch_cuboid(self.chst)
else:
gostart()
main部分でルートのコードを打ち込んでいくのは大変なので2つ...
*** ?通常時のライントレース用の関数 [#z4db0b7e]
def follow_line(chst,ched):#ライントレース用プログラム
sttime1,notime1 = time(),time()
bcon=0
while not (ts.is_pressed) and not ((notime1-sttime1)...
cvp = cs.reflected_light_intensity
MLT=Linetorace(cvp)
if MLT.colortyp==4:
bcon=bcon+1
else:
bcon=0
notime1=time()
if (chst <= (notime1-sttime1) <=ched) and (bcon=...
break
tw.on(MLT.lesp,MLT.risp)
sleep(0.1)
tw.off()
2つの引数(交差点判定開始までの時間、関数の処理の制限時間...
- 1つ目は今のカラーセンサーの値から左右のモーターの速度を...
- 2つ目は交差点または直角カーブに来ているかどうか
の2つです。これらの処理について説明していきます。
+ ライントレース
ここでの処理はタッチセンサーが押されておらずまた、関数の...
while not (ts.is_pressed) and not ((notime1-sttime1)...
cvp = cs.reflected_light_intensity
MLT=Linetorace(cvp)
tw.on(MLT.lesp,MLT.risp)
sleep(0.1)
+ 交差点判定
交差点判定は最初はカラーセンサーの変化の具合から判定しよ...
ここでの処理は1つ目の処理で使ったクラスの段階が黒色の場合...
if MLT.colortyp==4:
bcon=bcon+1
else:
bcon=0
notime1=time()
if (chst <= (notime1-sttime1) <=ched) and (bcon=...
break
この関数は0.1秒おきに色のチェックをするため曲線部分での交...
*** ?直角カーブと交差点での行動用関数 [#ca2a43c6]
def closs(pp):#交差点と直角カーブの際の行動用プログラム
cvp= cs.reflected_light_intensity
MLT = Linetorace(cvp)
tw.on(-MLT.lesp,-MLT.risp)
sleep(0.1*brockch)
tw.off()
if pp==0:
follow_line(tst,tst+0.1)
else:
sleep(5)
if pp==1:
follow_line(tst,tst+0.1)
elif pp==2:
tw.on_for_seconds(spmax,spmax,1)
else:
sttime=time()
notime=time()
while (notime- sttime <=tst):
cvp= cs.reflected_light_intensity
MLT= Linetorace(cvp)
tw.on(MLT.risp,MLT.lesp)
sleep(0.1)
notime=time()
tw.off()
引数でカーブ、交差点を左折、右折、直進の4つを指示しそれぞ...
+ 現在のカラーセンサーの値からさっきまでの道を戻る
+ その後4つそれぞれの動きを実行する
といった流れです。~
なぜ交差点での処理で一旦道を戻るのはこの関数が呼び出され...
後は引数の値で処理を変えて4つの行動を分けます。
++ カーブ~
カーブの場合は一旦止まる必要はないのでそのまま黒線の左側...
++ 交差点を左折~
交差点なので一定時間停止後カーブと同様の処理をします。
++ 交差点を直進~
交差点なので一定時間停止後左右のモーターを最大速度で1秒間...
++ 交差点を右折~
交差点なので一定時間停止後黒線の右側を基準にライントレー...
*** ?キューブキャッチ用関数 [#s7a772b7]
def fetch_cuboid(edti):#ライントレース後キューブを回収し...
sttime2 = time()
fase=0
while not (ts.is_pressed):
cvp= cs.reflected_light_intensity
MLT= Linetorace(cvp)
tw.on(MLT.risp,MLT.lesp)
notime2= time()
txle= us.distance_centimeters
if txle <= 4 :
tw.on(0,0)
Mm.on_for_seconds(-10,1.2)
tw.on_for_degrees(-spmax,spmax,360)
fase=1
break
if (notime2-sttime2) >= edti:
fase=1
break
sleep(0.1)
if fase==1:
follow_line(5,edti)
tw.off()
Mm.off()
キューボイドをキャッチし、Uターンして戻る処理を行う関数で...
+ キューボイドまでライントレース~
ロボットについての説明で述べたように超音波センサーはライ...
cvp= cs.reflected_light_intensity
MLT= Linetorace(cvp)
tw.on(MLT.risp,MLT.lesp)
notime2= time()
txle= us.distance_centimeters
+ キューボイドの検知とキャッチ~
超音波センサーの値が決められた数値以下になったらミディア...
if txle <= 4 :
tw.on(0,0)
Mm.on_for_seconds(-10,1.2)
+ Uターン~
キューボイドをキャッチ後その場で反時計回りに半回転します
tw.on_for_degrees(-spmax,spmax,360)
+ 来た道を戻る~
Uターンして先ほどまで通ってきた線に戻ってきます。ですが先...
if fase==1:
follow_line(5,edti)
*** ?スタート用の関数 [#q7516c13]
def gostart():#スタート時の前進用プログラム
tw.on_for_seconds(spmax,spmax,2)
AからBに進むときライントレースで進むのは大変のなのでただ...
*** ?メインプログラム [#y525a140]
def main():
MAP=[root(4,0),root(0,0),root(1,0),root(0,0),root(1,...
for i in range(len(MAP)):
if not ts.is_pressed:
MAP[i].action()
else:
break
print("all clear")
if __name__ == '__main__':
main()
メインプログラムで今回のルートをリスト型で指定し、順番に...
** プログラムのまとめ [#z7e38825]
これまでの説明とプログラム自体の長さからわかるように課題...
ページ名: