2019a/Member/takumi/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2019a/Member]]
#contents
*課題2 [#j6c97f06]
**内容 [#v79404bd]
「紙に書いた黒い線に沿ってロボットを動かしボールを運ぶ」...
**コース [#ubf47f1a]
今回は以下のようなコースでロボットを動かした。~
&ref(Map.png);~
(赤い矢印の方向に進む。また青い丸では1秒止まる。)
*戦略 [#cd0876e5]
**? ライントレース [#td2f8e6d]
今回の課題ではライントレースをどのように行うかでロボット...
&ref(LineTrace.png);~
今回は黒い線と白い地面の境目をたどるような方法でライント...
-もしカラーセンサーで地面の色を測定して黒色だったらライン...
-もしカラーセンサーで地面の色を測定して白色だったらライン...
という動作を繰り返して黒い線と白い地面の境目をたどるとい...
~
また、この方法で直線上をライントレースするとカラーセンサ...
黒→白→黒→白→黒→白→黒→白→黒→白→黒→白→黒→白→黒
というように交互に判断する。またカーブ上でもよほどきつい...
黒→黒→白→黒→黒→白→黒→黒→黒→白→黒→黒→黒→黒→白
といった感じに判断した地面の色が長時間連続して黒だけだっ...
**? 交差点の判断 [#f79bd959]
交差点を判断するのは単純に見えてとても難しい。今回はかな...
&ref(DetermineTheIntersection.png);~
交差点の上で戦略?のようにライントレースをすると交差点の左...
*作成したロボット [#lb902c52]
&ref(Robot.png);~
今回は上のようなロボットを作成した。課題1の時とは違い今回...
**? アーム [#f979355c]
ボールを運ぶためのアームはこのようなものにした。~
&ref(Arm.png);
**? カラーセンサー [#vaf8cbc4]
カラーセンサーは黒線の有無がしっかりわかるようなるべく地...
&ref(ColorSensor.png);
*プログラムの準備 [#nc12a535]
**モジュールのインポート [#k6f4f48a]
#!/usr/bin/env python3
from ev3dev.ev3 import *
import time
**インスタンスと定数の作成 [#p2659269]
mR = LargeMotor("outA")
mL = LargeMotor("outB")
mB = MediumMotor("outC")
cs = ColorSensor("in1")
cs.mode = "COL-REFLECT"
speed_sp = 100
black_line_reflection = 7
インスタンスの名前の由来は
-右側(&size(20){R};ight)のモーター(&size(20){m};otor)
-左側(&size(20){L};eft)のモーター(&size(20){m};otor)
-ボール(&size(20){B};all)を持つために使うモーター(&size(2...
-カラーセンサー(&size(20){c};olor&size(20){s};ensor)~
である。~
今回カラーセンサーは反射光の強さを0〜100の値で返すCOL-REF...
また、定数の使い道は以下の通り。
-speed_sp: モーターを動かす速度。今回はライントレースを正...
-black_line_reflection: 黒い線上をカラーセンサーで明るさ...
**関数の定義 [#na7bd91a]
今回は以下の関数を定義した。
-ロボットを前進させる関数
-ロボットを時計回り/反時計回りに回転させる関数
-黒い線の右側/左側をライントレースさせる関数
-ロボットにボールをキャッチ/シュートさせる関数
***ロボットを前進させる関数 [#nb5fb2fc]
def forward(distance):
mR.run_timed(time_sp=distance / speed_sp * 2000, spe...
mL.run_timed(time_sp=distance / speed_sp * 2000, spe...
time.sleep(distance / speed_sp * 2)
引数:~
-distance: 前進させる距離をmmで指定する。
この関数の説明:~
-time_spはtime_sp=1000,speed_sp=360のとき180mm進むので、...
***ロボットを時計回りに回転させる関数 [#g394ebd7]
def clockwise(angle):
mR.run_timed(time_sp=angle / speed_sp * 2000, speed_...
mL.run_timed(time_sp=angle / speed_sp * 2000, speed_...
time.sleep(angle / speed_sp * 2)
引数:~
-angle: 時計回りに回転させる角度を度数法で指定する。~
この関数の説明:~
-二つのタイヤの真ん中を中心として時計回りに回転させる。
-time_spはtime_sp=1000,speed_sp=360の時ロボットが180度回...
***ロボットを反時計回りに回転させる関数 [#ec2e07dc]
def counter_clockwise(angle):
mR.run_timed(time_sp=angle / speed_sp * 2000, speed_...
mL.run_timed(time_sp=angle / speed_sp * 2000, speed_...
time.sleep(angle / speed_sp * 2)
引数:~
-angle: 反時計回りに回転させる角度を度数法で指定する。~
この関数の説明:~
-二つのタイヤの真ん中を中心として反時計回りに回転させる。
-time_spはtime_sp=1000,speed_sp=360の時ロボットが180度回...
***黒い線の右側をライントレースさせる関数 [#u0eb7987]
&ref(RightSideLineTrace.png);
def right_side_line_trace():
reflection_log = [False for _ in range(30)]
while True:
del reflection_log[0]
if cs.value() <= black_line_reflection:
# black
mR.stop(stop_action="hold")
mL.run_timed(time_sp=1000, speed_sp=speed_sp...
reflection_log.append(True)
else:
# white
mL.stop(stop_action="hold")
mR.run_timed(time_sp=1000, speed_sp=speed_sp...
reflection_log.append(False)
if all(reflection_log):
mR.stop(stop_action="hold")
mL.stop(stop_action="hold")
break
この関数の説明:
-黒い線の右側をライントレースする関数。
-具体的には
--もし地面の明るさがblack_line_reflectionを下回っていたら...
--もし地面の明るさがblack_line_reflectionを上回っていたら...
--一定時間黒い線の上いたら(30回連続して地面の明るさがblac...
という動作をすることによってライントレースをする。
***黒い線の左側をライントレースさせる関数 [#c8f8543c]
&ref(LeftSideLineTrace.png);
def left_side_line_trace():
reflection_log = [False for _ in range(30)]
while True:
del reflection_log[0]
if cs.value() <= black_line_reflection:
# black
mL.stop(stop_action="hold")
mR.run_timed(time_sp=1000, speed_sp=speed_sp...
reflection_log.append(True)
else:
# white
mR.stop(stop_action="hold")
mL.run_timed(time_sp=1000, speed_sp=speed_sp...
reflection_log.append(False)
if all(reflection_log):
mR.stop(stop_action="hold")
mL.stop(stop_action="hold")
break
この関数の説明:
-黒い線の左側をライントレースする関数。right_side_line_tr...
-具体的には
--もし地面の明るさがblack_line_reflectionを下回っていたら...
--もし地面の明るさがblack_line_reflectionを上回っていたら...
--一定時間黒い線の上いたら(30回連続して地面の明るさがblac...
という動作をすることによってライントレースをする。
***ロボットにボールをキャッチさせる関数 [#a5abc7a9]
def catch():
mB.run_to_rel_pos(position_sp=-60, speed_sp=speed_sp...
time.sleep(1)
この関数の説明:~
-speed_spはモーターの向きの関係で負になっている。
-スリープさせる時間が1秒なのは、この関数が実行される前の...
***ロボットにボールをシュートさせる関数 [#e61015b9]
def shot():
# Release the ball from the arm.
mB.run_to_rel_pos(position_sp=60, speed_sp=speed_sp,...
time.sleep(1)
# Move backward.
mR.run_timed(time_sp=500, speed_sp=-1000, stop_actio...
mL.run_timed(time_sp=500, speed_sp=-1000, stop_actio...
time.sleep(0.5)
# Move forward
mR.run_timed(time_sp=700, speed_sp=1000, stop_action...
mL.run_timed(time_sp=700, speed_sp=1000, stop_action...
time.sleep(0.7)
この関数の説明:~
-ボールをシュートさせる関数。
?アームからボールを外す。
?後ろに下がる。
?ボールに体当たりしてボールを蹴る。
という動作によってボールをシュートする。
*ロボットを動かす [#tc49018c]
**MからKまで [#n3ed3468]
&ref(RobotAtM.png);
# from M to K
left_side_line_trace() #?
**ボールをキャッチする [#x1406737]
&ref(RobotAtK_1.png);
# from K to L
clockwise(35) #?
forward(180) #?
catch()
# from L to K
counter_clockwise(180) #?
left_side_line_trace() #?
**KからJまで [#i85caada]
&ref(RobotAtK_2.png);~
ロボットのカラーセンサーがJを確実に判別できるよう、ロボッ...
# from K to J
counter_clockwise(45) #?
forward(100) #?
clockwise(115) #?
left_side_line_trace() #?
time.sleep(1)
**JからIまで [#wd2aedee]
&ref(RobotAtJ.png);
# from J to I
counter_clockwise(30) #?
left_side_line_trace() #?
**IからHまで [#xe99016b]
&ref(RobotAtI.png);
# from I to H
forward(30) #?
left_side_line_trace() #?
**HからGまで [#df1d1c2d]
&ref(RobotAtH.png);
# from H to G
forward(20) #?
left_side_line_trace() #?
**GからDまで [#f35ec9dc]
&ref(RobotAtG.png);
# from G to D
forward(20) #?
left_side_line_trace() #?
time.sleep(1)
**DからBまで動かしてシュートさせる [#j40fe254]
&ref(RobotAtD.png);
# from D to G
forward(20) #?
right_side_line_trace() #?
shot()
*反省 [#wee0cbd7]
ライントレースと交差点判断はとても精度が高かったがその分...
~
~
~
昨日の訪問者数: &counter(yesterday);人~
今日の訪問者数: &counter(today);人~
合計訪問者数: &counter(all);人
終了行:
[[2019a/Member]]
#contents
*課題2 [#j6c97f06]
**内容 [#v79404bd]
「紙に書いた黒い線に沿ってロボットを動かしボールを運ぶ」...
**コース [#ubf47f1a]
今回は以下のようなコースでロボットを動かした。~
&ref(Map.png);~
(赤い矢印の方向に進む。また青い丸では1秒止まる。)
*戦略 [#cd0876e5]
**? ライントレース [#td2f8e6d]
今回の課題ではライントレースをどのように行うかでロボット...
&ref(LineTrace.png);~
今回は黒い線と白い地面の境目をたどるような方法でライント...
-もしカラーセンサーで地面の色を測定して黒色だったらライン...
-もしカラーセンサーで地面の色を測定して白色だったらライン...
という動作を繰り返して黒い線と白い地面の境目をたどるとい...
~
また、この方法で直線上をライントレースするとカラーセンサ...
黒→白→黒→白→黒→白→黒→白→黒→白→黒→白→黒→白→黒
というように交互に判断する。またカーブ上でもよほどきつい...
黒→黒→白→黒→黒→白→黒→黒→黒→白→黒→黒→黒→黒→白
といった感じに判断した地面の色が長時間連続して黒だけだっ...
**? 交差点の判断 [#f79bd959]
交差点を判断するのは単純に見えてとても難しい。今回はかな...
&ref(DetermineTheIntersection.png);~
交差点の上で戦略?のようにライントレースをすると交差点の左...
*作成したロボット [#lb902c52]
&ref(Robot.png);~
今回は上のようなロボットを作成した。課題1の時とは違い今回...
**? アーム [#f979355c]
ボールを運ぶためのアームはこのようなものにした。~
&ref(Arm.png);
**? カラーセンサー [#vaf8cbc4]
カラーセンサーは黒線の有無がしっかりわかるようなるべく地...
&ref(ColorSensor.png);
*プログラムの準備 [#nc12a535]
**モジュールのインポート [#k6f4f48a]
#!/usr/bin/env python3
from ev3dev.ev3 import *
import time
**インスタンスと定数の作成 [#p2659269]
mR = LargeMotor("outA")
mL = LargeMotor("outB")
mB = MediumMotor("outC")
cs = ColorSensor("in1")
cs.mode = "COL-REFLECT"
speed_sp = 100
black_line_reflection = 7
インスタンスの名前の由来は
-右側(&size(20){R};ight)のモーター(&size(20){m};otor)
-左側(&size(20){L};eft)のモーター(&size(20){m};otor)
-ボール(&size(20){B};all)を持つために使うモーター(&size(2...
-カラーセンサー(&size(20){c};olor&size(20){s};ensor)~
である。~
今回カラーセンサーは反射光の強さを0〜100の値で返すCOL-REF...
また、定数の使い道は以下の通り。
-speed_sp: モーターを動かす速度。今回はライントレースを正...
-black_line_reflection: 黒い線上をカラーセンサーで明るさ...
**関数の定義 [#na7bd91a]
今回は以下の関数を定義した。
-ロボットを前進させる関数
-ロボットを時計回り/反時計回りに回転させる関数
-黒い線の右側/左側をライントレースさせる関数
-ロボットにボールをキャッチ/シュートさせる関数
***ロボットを前進させる関数 [#nb5fb2fc]
def forward(distance):
mR.run_timed(time_sp=distance / speed_sp * 2000, spe...
mL.run_timed(time_sp=distance / speed_sp * 2000, spe...
time.sleep(distance / speed_sp * 2)
引数:~
-distance: 前進させる距離をmmで指定する。
この関数の説明:~
-time_spはtime_sp=1000,speed_sp=360のとき180mm進むので、...
***ロボットを時計回りに回転させる関数 [#g394ebd7]
def clockwise(angle):
mR.run_timed(time_sp=angle / speed_sp * 2000, speed_...
mL.run_timed(time_sp=angle / speed_sp * 2000, speed_...
time.sleep(angle / speed_sp * 2)
引数:~
-angle: 時計回りに回転させる角度を度数法で指定する。~
この関数の説明:~
-二つのタイヤの真ん中を中心として時計回りに回転させる。
-time_spはtime_sp=1000,speed_sp=360の時ロボットが180度回...
***ロボットを反時計回りに回転させる関数 [#ec2e07dc]
def counter_clockwise(angle):
mR.run_timed(time_sp=angle / speed_sp * 2000, speed_...
mL.run_timed(time_sp=angle / speed_sp * 2000, speed_...
time.sleep(angle / speed_sp * 2)
引数:~
-angle: 反時計回りに回転させる角度を度数法で指定する。~
この関数の説明:~
-二つのタイヤの真ん中を中心として反時計回りに回転させる。
-time_spはtime_sp=1000,speed_sp=360の時ロボットが180度回...
***黒い線の右側をライントレースさせる関数 [#u0eb7987]
&ref(RightSideLineTrace.png);
def right_side_line_trace():
reflection_log = [False for _ in range(30)]
while True:
del reflection_log[0]
if cs.value() <= black_line_reflection:
# black
mR.stop(stop_action="hold")
mL.run_timed(time_sp=1000, speed_sp=speed_sp...
reflection_log.append(True)
else:
# white
mL.stop(stop_action="hold")
mR.run_timed(time_sp=1000, speed_sp=speed_sp...
reflection_log.append(False)
if all(reflection_log):
mR.stop(stop_action="hold")
mL.stop(stop_action="hold")
break
この関数の説明:
-黒い線の右側をライントレースする関数。
-具体的には
--もし地面の明るさがblack_line_reflectionを下回っていたら...
--もし地面の明るさがblack_line_reflectionを上回っていたら...
--一定時間黒い線の上いたら(30回連続して地面の明るさがblac...
という動作をすることによってライントレースをする。
***黒い線の左側をライントレースさせる関数 [#c8f8543c]
&ref(LeftSideLineTrace.png);
def left_side_line_trace():
reflection_log = [False for _ in range(30)]
while True:
del reflection_log[0]
if cs.value() <= black_line_reflection:
# black
mL.stop(stop_action="hold")
mR.run_timed(time_sp=1000, speed_sp=speed_sp...
reflection_log.append(True)
else:
# white
mR.stop(stop_action="hold")
mL.run_timed(time_sp=1000, speed_sp=speed_sp...
reflection_log.append(False)
if all(reflection_log):
mR.stop(stop_action="hold")
mL.stop(stop_action="hold")
break
この関数の説明:
-黒い線の左側をライントレースする関数。right_side_line_tr...
-具体的には
--もし地面の明るさがblack_line_reflectionを下回っていたら...
--もし地面の明るさがblack_line_reflectionを上回っていたら...
--一定時間黒い線の上いたら(30回連続して地面の明るさがblac...
という動作をすることによってライントレースをする。
***ロボットにボールをキャッチさせる関数 [#a5abc7a9]
def catch():
mB.run_to_rel_pos(position_sp=-60, speed_sp=speed_sp...
time.sleep(1)
この関数の説明:~
-speed_spはモーターの向きの関係で負になっている。
-スリープさせる時間が1秒なのは、この関数が実行される前の...
***ロボットにボールをシュートさせる関数 [#e61015b9]
def shot():
# Release the ball from the arm.
mB.run_to_rel_pos(position_sp=60, speed_sp=speed_sp,...
time.sleep(1)
# Move backward.
mR.run_timed(time_sp=500, speed_sp=-1000, stop_actio...
mL.run_timed(time_sp=500, speed_sp=-1000, stop_actio...
time.sleep(0.5)
# Move forward
mR.run_timed(time_sp=700, speed_sp=1000, stop_action...
mL.run_timed(time_sp=700, speed_sp=1000, stop_action...
time.sleep(0.7)
この関数の説明:~
-ボールをシュートさせる関数。
?アームからボールを外す。
?後ろに下がる。
?ボールに体当たりしてボールを蹴る。
という動作によってボールをシュートする。
*ロボットを動かす [#tc49018c]
**MからKまで [#n3ed3468]
&ref(RobotAtM.png);
# from M to K
left_side_line_trace() #?
**ボールをキャッチする [#x1406737]
&ref(RobotAtK_1.png);
# from K to L
clockwise(35) #?
forward(180) #?
catch()
# from L to K
counter_clockwise(180) #?
left_side_line_trace() #?
**KからJまで [#i85caada]
&ref(RobotAtK_2.png);~
ロボットのカラーセンサーがJを確実に判別できるよう、ロボッ...
# from K to J
counter_clockwise(45) #?
forward(100) #?
clockwise(115) #?
left_side_line_trace() #?
time.sleep(1)
**JからIまで [#wd2aedee]
&ref(RobotAtJ.png);
# from J to I
counter_clockwise(30) #?
left_side_line_trace() #?
**IからHまで [#xe99016b]
&ref(RobotAtI.png);
# from I to H
forward(30) #?
left_side_line_trace() #?
**HからGまで [#df1d1c2d]
&ref(RobotAtH.png);
# from H to G
forward(20) #?
left_side_line_trace() #?
**GからDまで [#f35ec9dc]
&ref(RobotAtG.png);
# from G to D
forward(20) #?
left_side_line_trace() #?
time.sleep(1)
**DからBまで動かしてシュートさせる [#j40fe254]
&ref(RobotAtD.png);
# from D to G
forward(20) #?
right_side_line_trace() #?
shot()
*反省 [#wee0cbd7]
ライントレースと交差点判断はとても精度が高かったがその分...
~
~
~
昨日の訪問者数: &counter(yesterday);人~
今日の訪問者数: &counter(today);人~
合計訪問者数: &counter(all);人
ページ名: