[[2019a/Member]]←2019年度前期受講生一覧へ戻る
*今回の課題 [#v100fc77]
&ref(2019a/Member/fuji/Mission3/mission3.png,80%,ロボット);
今回の課題は[[2019a/Mission3]]に掲載されています。
*制作したロボット [#b21f7756]
今回、自分の班は二つのロボットで分担させました。
�.肇譟爾貌�ったボールを回収するロボット
&ref(2019a/Member/fuji/Mission3/ev3.png,80%,ロボット);
�▲薀ぅ鷯紊肪屬い討△襯棔璽襪魏鷦�するロボット
&ref(2019a/Member/fuji/Mission3/ev3_3.png,80%,ロボット);
自分は主に�,離蹈椒奪箸鮹甘�しました。前回の[[2019a/Member/fuji/Mission2]]のロボットを少し改変して作成しました。�△離蹈椒奪箸離廛蹈哀薀潺鵐亜�詳細はあまり把握していないので、記述はほとんどありません。
詳しくはこちら→[[2019a/Member/TOY/Mission3]]
*動作についての狙い・戦略 [#t8f0b576]
�,離蹈椒奪�
1,トレーの下にアームをくぐらせ、ボールをトレーごと持つ
&ref(2019a/Member/fuji/Mission3/ev3.png,60%,ロボット); →
&ref(2019a/Member/fuji/Mission3/ev3_2.png,60%,ロボット);
2.アームをさらに持ち上げボールを斜面上で滑らせる
&ref(2019a/Member/fuji/Mission3/ev3_5.png,60%,ロボット); →
&ref(2019a/Member/fuji/Mission3/ev3_6.png,60%,ロボット); →
&ref(2019a/Member/fuji/Mission3/ev3_7.png,60%,ロボット);
�△離蹈椒奪�
ボールを掴み、斜面に滑らせてゴールに入れる
&ref(2019a/Member/fuji/Mission3/ev3_8.png,60%,ロボット); →
&ref(2019a/Member/fuji/Mission3/ev3_10.png,60%,ロボット);
*工夫した点 [#o0b2006c]
&ref(2019a/Member/fuji/Mission3/ev3_4.png,80%,ロボット);
トレーが出来るだけズレないようにストッパーをつけたり、斜面を固定しないことで実現が難しい角度の斜面を形成しました。
また、アーム先が重くなり過ぎないように出来るだけ造りをシンプルにしました。
*プログラム [#l4ef4d2b]
#!/usr/bin/env python3
from ev3dev.ev3 import *
from time import sleep
mL = LargeMotor('outB')
mR = LargeMotor('outD')
mZ = MediumMotor('outA')
cs = ColorSensor('in1')
cs.mode = 'COL-REFLECT'
def motor_init():
mL.reset()
mR.reset()
mZ.reset()
-アームを下げるプログラム
def down():
mZ.run_timed(time_sp=600,speed_sp=150,stop_action='brake')
sleep(1)
-トレーごとアームを上げるプログラム
def up():
mZ.run_timed(time_sp=685,speed_sp=-160,stop_action='hold')
sleep(1)
-トレーを更に持ち上げ、ボールをゴールに流し込むプログラム
def up2():
mZ.run_timed(time_sp=285,speed_sp=-569,stop_action='hold')
sleep(1)
-トレーを放り投げ、ルールに則るようにトレーを処理するプログラム
def nage():
mZ.run_timed(time_sp=400,speed_sp=-1000,stop_action='brake')
sleep(1)
-ライントレースにおける前へ進むプログラム
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(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')
-ライントレースにおける右折用
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')
sleep(1)
-ライントレースにおける左折用
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 linel():
S = 1
while S > 0: #繰り返し開始
go()
if cs.value() > 15: #白(左)に行き過ぎると
while cs.value() > 15:
turnl2() #黒(右)に向かって進む
if cs.value() < 9: #黒(右)に行き過ぎると
tS = time.time() #時間計測開始
while cs.value() < 9:
turnr2() #白(左)に向かって進む
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/Mission3/line_LI.jpg,100%,道);
図に表すとこのようになります。黄色は左側トレース、緑色は右側トレースを示しています。
-黒い線が見つかるまで直進するプログラム
def running():
while cs.value() > 15:
go()
sleep(1)
-定義を踏まえてのプログラム
motor_init()
sleep(110) #もう一つのロボットとぶつからないように待つ
liner() #Aからスタートし、右側を辿り交差点Cを認識
over(833) #ここからトレーまでの位置を調整する
sleep(1)
turnC(1760)
back(2000)
sleep(3)
down() #アームを下げる
over(2000) #トレーの下にアームを通す
sleep(3)
up() #アームを上げる
sleep(1)
turnC(800) #辺BCに方向転換
over(400)
linel() #CからBへ左側を辿り、Bで交差点認識をする
turnC(900) #線B'D'に向かって方向転換
over(500) #線をまたぐ
running() #線B'D'に着くまで前進
sleep(3)
turnC(1910) #180度方向転換
sleep(4)
back(300) #トレーに近づく
sleep(1)
up2() #トレーへボールを流し込む
sleep(2)
down() #ここでアームを上げ下げをして、流しそびれたボールを確実に入れようとする
sleep(1)
up()
over(150) #同じく前進と後進を行い、ボールを確実に処理する
sleep(0.5)
back(150)
sleep(1)
turnD(500) #線BDに向かって方向転換
running() #線BDに着くまで前進
linel() #線BDの左側を辿り、Dで交差点認識をする
over(150)
sleep(1)
turnC(1100) #円GHIJに向かって方向転換
down() #ここの二つでトレーを彼方へ飛ばし、ルール違反を阻止する
nage()
*実際にロボコンをやってみた結果 [#q5349f54]
相方のロボットは時間が足らなかったために、完成も遅れ、充電も足りなくなってしまった。自分側のロボットはアーム固定があまりままならなかった為に、試行の度に結果が左右し、ズレが生じてしまった。ボールは一個入れたが、再トライで一個も入れれなかったが故に基礎点は0点となってしまったのがとても悲しかった。
*反省点 [#d010a92a]
-アームの固定を歯車を利用して行う
アームを歯車で固定しなかったことで、アームが安定せず結果も不安定となってしまった。
-時間の余裕を持つ(テストで仕方ない面もあったが)
自分側は余裕を持って多少はやれたと思うが、相方側がとても時間が足らない様子であった。
-ピンポン玉+トレーがロボットにとっては重かった
アームの固定が出来ていなかったことで、モーター一つで上記の二つを持つこととなり、負担が大きかった。またそれによって結果もまた不安定となってしまった。
*最後に [#h1d12bd9]
半年間お疲れ様でした。自分にとって納得のいく結果となったmissionは殆ど無かったが、ロボットに熱中して、またpythonを予習出来てとてもよかったです。学科的に将来また触れる機会もあるかもしれないので、とてもいい経験になりました。
半年間お疲れ様でした。自分にとって納得のいく結果となったmissionは殆どありませんでしたが、ロボットに熱中して、またpythonを予習出来てとてもよかったです。学科的に将来また触れる機会もあるかもしれないので、とてもいい経験になりました。
訪問者:総計:&counter(total); 今日:&counter(today); 昨日:&counter(yesterday);