- 追加された行はこの色です。
- 削除された行はこの色です。
[[2019a/Member]] ←令和元年前期ロボティックス受講者一覧へ戻る
*スケジュール [#oa6297ea]
-レポート作成開始 2019/07/07 15:47
-レポート作成開始 2019/07/07 15:47
-課題2披露 2019/07/12
-課題2披露 2019/07/12
-レポート完成 2019/07/15 21:56
-レポート完成 2019/07/15 21:56
-レポート締め切り 2019/07/18
-レポート締め切り 2019/07/18
-レポート訂正、追加 2019/08/06
*今回の課題 [#lf77530f]
今回の課題は[[2019a/Mission2]]に掲載されています。
&ref(2019a/Member/fuji/Mission2/road.jpg,100%,道);←図1
図1のルートです。
*制作したロボット [#r64a428f]
&ref(2019a/Member/fuji/Mission2/ev3.png,60%,ロボット);←図2
*工夫した点 [#fe4fd464]
可能な限りシンプル化
ロボットの部品を最低限にし、プログラミングも単純化。詳しくはプログラミング欄で説明
ボールの接地の高さに関係なく掴める
制作したロボット欄にある通り、すくうタイプのアームだと浮いてないと取りにくいが、上から取るので浮いてなくても取れる。
制作したロボット欄にある通り、すくうタイプのアームだと浮いてないと取りにくいが、上から取るので浮いてなくても取れる。キャッチ率100%。
オリジナルのプログラム
交差点で曲がりすぎた分を自動修正してくれるプログラムを開発し、導入したことで楽になった。
他にやってる人いなさそう。また、ペアとプログラムは定義から全く違うものを作った。
モーター一つで掴むことが出来る
授業で発言もしましたが、先端の二本のややゆるんでいる棒を振り下ろすことで、棒の上にボールを置くことを可能にした。また、投げる点に関しては後ろに投げることで解決した。
*プログラミングと動作説明 [#e0eb01b5]
#!/usr/bin/env python3
from ev3dev.ev3 import *
from time import sleep
mL = LargeMotor('outB')
mR = LargeMotor('outA')
mZ = MediumMotor('outC')
cs = ColorSensor('in1')
cs.mode = 'COL-REFLECT'
今回、ボールの位置が分かってるため超音波センサーは不使用。
def motor_init():
mL.reset()
mR.reset()
mZ.reset()
リセットプログラム。
def catch():
mZ.run_timed(time_sp=130,speed_sp=600,stop_action='brake')
sleep(1)
mZ.run_timed(time_sp=250,speed_sp=-200,stop_action='brake')
sleep(1)
下にある図3のアームを下ろしボールを取り、アームを上げてボールを持つ。
&ref(2019a/Member/fuji/Mission2/ev3_LI.jpg,50%,道);←図3
def nage():
mZ.run_timed(time_sp=80,speed_sp=-1000,stop_action='brake')
sleep(1)
上にある図3をさらに上げ、機体の進行方向と逆にボールを投げる。
上にある図3をさらに上げ、機体の進行方向と逆にボールを投げる。発射装置。
def go():
mL.run_timed(time_sp=80,speed_sp=150,stop_action='brake')
mR.run_timed(time_sp=80,speed_sp=150,stop_action='brake')
ライントレースの基本的な直進。
ライントレースの基本的な直進の動作。
def over(t):
mL.run_timed(time_sp=t,speed_sp=200,stop_action='brake')
mR.run_timed(time_sp=t,speed_sp=200,stop_action='brake')
sleep(1)
交差点直撃後に交差点を跨いだり、円の動作への調整用。
交差点直撃後に交差点を跨いだり、円の動作への調整用に用いる直進するプログラム。
def back():
mL.run_timed(time_sp=250,speed_sp=-200,stop_action='brake')
mR.run_timed(time_sp=250,speed_sp=-200,stop_action='brake')
sleep(1)
ボールのキャッチ用・最後のゴール用。
上記の後進用。
def turnl2():
mL.run_timed(time_sp=200,speed_sp=45,stop_action='brake')
mR.run_timed(time_sp=200,speed_sp=-50,stop_action='brake')
左側ライントレースにおける基本的なコーナー用。
def turnr2():
mR.run_timed(time_sp=200,speed_sp=75,stop_action='brake')
mL.run_timed(time_sp=200,speed_sp=-45,stop_action='brake')
右側ライントレースにおける基本的なコーナー用。
def turnr2X(x):
mR.run_timed(time_sp=x,speed_sp=-75,stop_action='brake')
mL.run_timed(time_sp=x,speed_sp=45,stop_action='brake')
左側を辿り交差点に当たった時自動的に修正する機能用。
左側を辿り交差点に当たった時自動的に修正する機能。個人的に今回の目玉の一つ。
def turnr2Y(y):
mR.run_timed(time_sp=y,speed_sp=45,stop_action='brake')
mL.run_timed(time_sp=y,speed_sp=-75,stop_action='brake')
右側を辿り交差点に当たった時自動的に修正する機能用。
右側を辿り交差点に当たった時自動的に修正する機能用。同じく目玉。
def turnC(a):
mR.run_timed(time_sp=a,speed_sp=-150,stop_action='brake')
mL.run_timed(time_sp=a,speed_sp=150,stop_action='brake')
sleep(1)
右へ方向転換、方向調整用。
def turnD(a):
mR.run_timed(time_sp=a,speed_sp=150,stop_action='brake')
mL.run_timed(time_sp=a,speed_sp=-150,stop_action='brake')
sleep(1)
左へ方向転換、方向調整用。
def stop():
mL.stop
mR.stop
機体を止める
def linel():
S = 1 初期設定
while S > 0: while関数で永久機関脱出条件を作成
S = 1 #初期設定
while S > 0: #while関数で永久機関脱出条件を作成
go()
if cs.value() > 15:
while cs.value() > 15:
turnl2()
if cs.value() < 9:
tS = time.time() 時間測定開始
tS = time.time() #時間測定開始
while cs.value() < 9:
turnr2()
if time.time()-tS > 0.48: 計測時間が長い場合発動、永久機関を脱出する方向へ
turnr2X((time.time()-tS)*1400) 交差点で曲がりすぎた分を修正するプログラム
S = 0 永久機関脱出
if time.time()-tS > 0.48: #計測時間が長い場合発動、永久機関を脱出する方向へ
turnr2X((time.time()-tS)*1400) #交差点で曲がりすぎた分を修正するプログラム
S = 0 #永久機関脱出
sleep(1)
以下、左右逆転しただけのもの
def liner():
S = 1
while S > 0:
go()
if cs.value() > 15:
while cs.value() > 15:
turnr2()
if cs.value() < 9:
tS = time.time()
while cs.value() < 9:
turnl2()
if time.time()-tS > 0.48:
turnr2Y((time.time()-tS)*1400)
S = 0
sleep(1)
上から順番に左、右を辿る主となるプログラム。
&ref(2019a/Member/fuji/Mission2/line_LI.jpg,80%,ライン);
左側は黄色、右側は緑色の動きに準ずる。数字はカラーセンサーが読み取る数字である。
左右それぞれ3つだけに分ける、というとてもシンプルにすることが出来た点だと思う。
関数中の「S」を使い、永久機関から脱出する方法を用いた。
また、交差点に関しては千代のを参考にさせていただき、「9未満(黒)を辿る時間を測り、一定以上で停止する」方法を用いた。交差点に入ると計測時間が長くなることを利用した。でもオリジナル性が欠けていたので、交差点で曲がりすぎた分を修正するプログラムを開発した。
また、交差点に関しては先代のを参考にさせていただき、「9未満(黒)を辿る時に時間を測り始め、黒を脱出時に計測を停止し、計測した時間が一定以上で停止する」方法を用いた。交差点に入ると計測時間が長くなることを利用した。でもオリジナル性が欠けていたので、交差点で曲がりすぎた分を修正するプログラムを開発した。
これらの定義を使用して...
これらの定義を使用して、課題2へと取り組む
motor_init()
linel() 交差点Dまでライントレース
over(300) 交差点Dを跨ぐ
linel() 交差点Gまでライントレース
turnC(800) 方向の調整
over(100) 位置の調整、右側トレースへ
liner() 交差点Hまでライントレース
over(200) 交差点Hを跨ぐ
liner() 交差点Iまでライントレース
over(200) 交差点Iを跨ぐ
liner() 交差点Jまでライントレース
over(300) 交差点Jを跨ぎ、左側トレースへ
linel() 交差点Kまでライントレース
over(100) 「catch」まで、ボールの位置への調整
linel() #交差点Dまでライントレース
over(300) #交差点Dを跨ぐ
linel() #交差点Gまでライントレース
turnC(800) #方向の調整
over(100) #位置の調整、右側トレースへ
liner() #交差点Hまでライントレース
over(200) #交差点Hを跨ぐ
liner() #交差点Iまでライントレース
over(200) #交差点Iを跨ぐ
liner() #交差点Jまでライントレース
over(300) #交差点Jを跨ぎ、左側トレースへ
linel() #交差点Kまでライントレース
over(100) #「catch」まで、ボールの位置への調整
sleep(1)
turnD(800)
sleep(1)
back()
catch() ボールを掴む
over(700) 位置調整
catch() #ボールを掴む
over(700) #位置調整
sleep(1)
turnD(2700)方向調整
turnD(2700)#方向調整
sleep(3)
over(200) 位置調整
liner() 交差点Mまでライントレース
turnD(2100)交差点Mにぶつかり、反対方向を向く
over(200) #位置調整
liner() #交差点Mまでライントレース
turnD(2100)#交差点Mにぶつかり、反対方向を向く
sleep(2)
nage() 後ろ向きにボールを投げる
nage() #後ろ向きにボールを投げる
sleep(1)
back() 以下、ゴールへ収納
back() #以下、ゴールへ収納
back()
back()
*実際にやってみた結果 [#hd67c2b1]
ライントレース
成功率は50%程と、そこまで良くなかった。主な原因としてFG間の短さ、円GHIJが交差点と判断するかの瀬戸際。
成功率は50%程と、そこまで良くなかった。主な原因としてFG間の短さ、円GHIJが交差点と判断するかの瀬戸際であった。
ボールのキャッチ
位置調整したおかげで、ライントレースが成功すればキャッチ成功率は100%だった。調整が完璧であった。
位置調整により、ライントレースが成功すればキャッチ成功率は100%だった。調整が完璧であった。
ボールの発射
後ろ向きに投げるということで、大体成功するがたまに勢いが足らず機体に当たってどこかへ行ってしまうケースがあった。
総合して
所々交差点と勘違いする、交差点判断が特に難しかったですが、頑張って調整をした結果、やっと50%まで成功率を上げれたんだろうな、と思いました。
*それを踏まえて問題点など [#ta05f33c]
交差点の判別
主に円のゾーンで交差点反応を示したり示さなかったりしてしまった。
スピードの遅さ
マップが狭く、繊細さが必要で、やむを得なかった感もある。
投げる正確さ
交差点認識後に投げるので、微妙に誤差があった。
*最後に [#k6a7380f]
今回は前回の書道ロボットと比べて早めに動き、早めに大元は完成していたので、前回の反省点はしっかり出来ていたと思います。次の課題3もまた早めに動き、頑張りたいです。
*参考文献・サイト [#za8dbe3c]
[[2018a/Member/gear/Mission2]]
「線を辿る時間を測る」点について参考にさせてもらいました。
訪問者:総計:&counter(total); 今日:&counter(today); 昨日:&counter(yesterday);