#author("2020-02-15T21:47:07+09:00","twin","twin") #author("2020-02-15T22:52:25+09:00","twin","twin") [[2019b/Member]] *目次 [#m1eccd3a] #contents *課題2 [#nb4e1fa0] 下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。 #ref(1A1D481C-301A-4994-8DF4-83E66CF8C8CE.png) *ミッション [#d2bb3a9b] A地点を出発し、次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。 ~私は、1人目を担当した。 +A地点から出発 +B +C (直進) +D (一時停止の後、直進) +E, F 通過 +G (一時停止の後、左折) +H (一時停止の後、左折) +I(ボール or キューボイドをつかんでUターン) +H (直進) +J (一時停止) +A地点に入る(ゴール) *ロボットの解説 [#xa201957] 最終案として完成したロボットの特徴的な仕組みは、ベースを課題1のを活用し、 ~1.カラーセンサーを下に向けて固定して、黒線の境界を認識できるようにし、 ~2.赤外線センサーも下に向けて取り付け、 ~3.Cuboidが車体の前に現れるとアームが下がってそれを捕らえるような機構である。 ~1. #ref(467FEA2C-BB09-406A-BD28-189198FA2AC4.jpeg) ~2. #ref(32C308B8-CB18-4FB5-A619-E21843344F51.jpeg) ~3. #ref(469E6CEA-D77C-4C01-824E-D700EE6E3AF9.jpeg) * プログラムの解説 [#q4449248] 構想としては、ラインの右か左をたどるようにするのをベースに、例えば右か真っ直ぐか左を選ぶ交差点に差し掛かったら、右を辿っていたら右から1番目2番目3番目と線を選択し、そして選択した線の右か左の境界のどちらを辿るのかを指定するのをテキストファイルで別に作っておくとういものである。この方法の利点は、どのように道を辿るのかさえこちらが把握してテキストファイルに書いておけばどんなルートでも取れるということである。 以下、ベースとなるプログラム **定数(プログラム実行中や与えるデータによって値が変化しない変数) [#kb01b44b] 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" 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 :境界として使う場所でのcsの値 ; 使ってる場所 :intersection(),fetch_cuboid(),fetch_cuboid3(),follow_line() v_s = 12.5 :まっすぐ進むときのtankの速さ ; 使ってる場所 :follow_line() &; v_c = 5.0 160; 値           :曲がるときの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_cuboid3(),follow_line()     cs_th_d_max = 20         値           :csの値を使うときその値を-cs_th_d_max<=csの値<=cs_th_d_maxの範囲で制限                       するために使う値         使ってる場所 :follow_line()     csd_s_max = 3         値           :-csd_s_max<threshold-csの値<csd_s_maxのときまっすぐ進んでると判断させ                       るために使う値         使ってる場所 :follow_line()       v_is = 5         値           :intersection()実行時のtankの速さ         使ってる場所 :intersection()     v_fc = 5         値           :fetch_cuboid()またはfetch_cuboid3()実行時のtankの速さ         使ってる場所 :fetch_cuboid(),fetch_cuboid3()     v_fc_m = 5         値           :fetch_cuboid()またはfetch_cuboid3()実行時のfc_mの速さ         使ってる場所 :fetch_cuboid(),fetch_cuboid3()     a1_is=-0.2         値           :基本的には0以下で-1より大きく、intersection()実行時にtankを分岐点から                       遠ざかる方向に外側に向くように回転させるときにどのくらい大きく回転さ                       せるかを決める値         使ってる場所 :intersection()     a2_is=1         値           :基本的には0より大きく、intersection()実行時にtankが道を探すため分岐点                       周辺を回るときにどのくらい大きく回るかを決める値         使ってる場所 :intersection() cs.mode ="COL-REFLECT" us.mode ="US-DIST-CM" threshold = 45 値 :境界として使う場所でのcsの値 使ってる場所 :intersection(),fetch_cuboid(),fetch_cuboid3(),follow_line() 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_cuboid3(),follow_line() cs_th_d_max = 20 値 :csの値を使うときその値を-cs_th_d_max<=csの値<=cs_th_d_maxの範囲で制限 するために使う値 使ってる場所 :follow_line() csd_s_max = 3 値 :-csd_s_max<threshold-csの値<csd_s_maxのときまっすぐ進んでると判断させ るために使う値 使ってる場所 :follow_line() v_is = 5 値 :intersection()実行時のtankの速さ 使ってる場所 :intersection() v_fc = 5 値 :fetch_cuboid()またはfetch_cuboid3()実行時のtankの速さ 使ってる場所 :fetch_cuboid(),fetch_cuboid3() v_fc_m = 5 値 :fetch_cuboid()またはfetch_cuboid3()実行時のfc_mの速さ 使ってる場所 :fetch_cuboid(),fetch_cuboid3() a1_is=-0.2 値 :基本的には0以下で-1より大きく、intersection()実行時にtankを分岐点から 遠ざかる方向に外側に向くように回転させるときにどのくらい大きく回転さ せるかを決める値 使ってる場所 :intersection() a2_is=1 値 :基本的には0より大きく、intersection()実行時にtankが道を探すため分岐点 周辺を回るときにどのくらい大きく回るかを決める値 使ってる場所 :intersection() **変数(プログラム実行中や与えるデータによって値が変化する変数) [#s9d4b8d9] 読み込みはmain()に含まれているが、ここではmain()と書いた場合はmain()関数のうち読むこむ部分を除いたものとする。 &br; fetch_cuboid()と書いたときはfetch_cuboid3()も含むとする。 &br; 使っている場所に書いてるものは関数実行時に引数として渡している関数も含む。 ***main_break_bool [#jedc8414]     main_break_bool         とりうる値     :True,False         どんな値か     :main()でファイルを読み込みそこでエラーやファイルの書き方に間違いが                         あったときTrueとなり、main()の動かす部分を行わずにプログラムを終了                         する。         使っている場所 :読み込み,main() main_break_bool とりうる値 :True,False どんな値か :main()でファイルを読み込みそこでエラーやファイルの書き方に間違いが あったときTrueとなり、main()の動かす部分を行わずにプログラムを終了 する。 使っている場所 :読み込み,main() ***index_list_is [#yadc0a62]     index_list_is         とりうる値     :0,1,2,...         どんな値か     :最初は0でありintersection()が行われるたびに1増え、intersection()実                         行時、list_intersection[index_list_is]を使う。         使っている場所 :intersection(),main() index_list_is とりうる値 :0,1,2,... どんな値か :最初は0でありintersection()が行われるたびに1増え、intersection()実 行時、list_intersection[index_list_is]を使う。 使っている場所 :intersection(),main() ***after_fl [#maaf36df]     after_fl         とりうる値     :"after_fl","fc","is","ts_break"         どんな値か     :follow_line()実行時に交差点に差し掛かったりcuboidが見つかるなどによ                         りfollow()を終了するが、そのあと何をするかを表す値                         "fc"      :fetch_cuboid()を実行する                         "is"      :intersection()を実行する                         "ts_break":タッチセンサーが押されたときにこの値になり、main()を終わ                                    らせる                         "after_fl":初期化のときに使い、follow_line()実行時に代入はされず、                                    特に意味のある値ではない。         使っている場所 :intersection(),読み込み after_fl とりうる値 :"after_fl","fc","is","ts_break" どんな値か :follow_line()実行時に交差点に差し掛かったりcuboidが見つかるなどによ りfollow()を終了するが、そのあと何をするかを表す値 "fc" :fetch_cuboid()を実行する "is" :intersection()を実行する "ts_break":タッチセンサーが押されたときにこの値になり、main()を終わ らせる "after_fl":初期化のときに使い、follow_line()実行時に代入はされず、 特に意味のある値ではない。 使っている場所 :intersection(),読み込み ***fc_ab [#i4a4a770]     fc_ab         とりうる値     :"a","b"         どんな値か     :最初は"b"でありfetch_cuboid()が実行されると"a"になる値で、                         fetch_cuboid()が複数回実行されるのを防ぐために使われている。         使っている場所 :fetch_cuboid(),follow_line(),main()   fc_ab とりうる値 :"a","b" どんな値か :最初は"b"でありfetch_cuboid()が実行されると"a"になる値で、 fetch_cuboid()が複数回実行されるのを防ぐために使われている。 使っている場所 :fetch_cuboid(),follow_line(),main() ***number [#gddbe997]     number         とりうる値     :1,2,3         どんな値か     :プログラム実行開始時に入力する値でlist_isの何番のファイルを読み込む                         か、その他の読み込むファイルの何行目を使うかを決める値         使っている場所 :main(),読み込み number とりうる値 :1,2,3 どんな値か :プログラム実行開始時に入力する値でlist_isの何番のファイルを読み込む か、その他の読み込むファイルの何行目を使うかを決める値 使っている場所 :main(),読み込み ***list_intersection [#kc00bd0c]     list_intersection         とる値の例     :[[2,l],[2,l],[1,l],[1,l],[1,r],[1,l],"end"]         どんな値か     :何回目の分岐(分岐と判断される場所)でどのような道をとるかを決める値                         でファイルlist_isから読み込む("end"はファイルには書かないもので自動                         で追加される)                         [数字n,文字a]:進行方向に合わせて時計回りか反時計回りで近いほうから                                       n番目の道でa=rなら右、a=lなら左の境界をとる。                         "end"        :ゴールに着いたこと表す値         使っている場所 :intersection(),main(),読み込み list_intersection とる値の例 :[[2,l],[2,l],[1,l],[1,l],[1,r],[1,l],"end"] どんな値か :何回目の分岐(分岐と判断される場所)でどのような道をとるかを決める値 でファイルlist_isから読み込む("end"はファイルには書かないもので自動 で追加される) [数字n,文字a]:進行方向に合わせて時計回りか反時計回りで近いほうから n番目の道でa=rなら右、a=lなら左の境界をとる。 "end" :ゴールに着いたこと表す値 使っている場所 :intersection(),main(),読み込み ***sign [#a8ede537]     sign         とりうる値     :-1,1         どんな値か     :follow_line()実行時右と左のどっちの境界をとっているかを表す値で、                         右の時1、左の時-1をとる。         使っている場所 :intersection(),follow_line(),main(),読み込み sign とりうる値 :-1,1 どんな値か :follow_line()実行時右と左のどっちの境界をとっているかを表す値で、 右の時1、左の時-1をとる。 使っている場所 :intersection(),follow_line(),main(),読み込み ***sign_fc [#iddbc59b]     sign_fc         とりうる値     :-1,1         どんな値か     :(),fetch_cuboid3()の実行後に右と左のどちらの境界をとる                         かを表す値で、右の時1、左の時-1をとる。ファイルu_turn_rlから読み込                         む。         使っている場所 :fetch_cuboid(),main(),読み込み sign_fc とりうる値 :-1,1 どんな値か :(),fetch_cuboid3()の実行後に右と左のどちらの境界をとる かを表す値で、右の時1、左の時-1をとる。ファイルu_turn_rlから読み込 む。 使っている場所 :fetch_cuboid(),main(),読み込み **読み込むテキストファイル [#ddf72ff5] 次のようなファイルプログラム実行前に用意する必要がある。このファイルでどの交差点でどの道を選択するかを指定する 以下、テキストファイル **読み込むファイル [#ddf72ff5] 次のようなファイルプログラム実行前に用意する必要がある。 ***list_is(list_is3) [#sa8e8c0f] list_isは自分がライントレースする道が何人目の課題かによってlist_isの直後にその数字を 付け加えたものをファイル名として保存する。今回は1人目の課題について書くのでファイル名はlist_is1とする。  2,r  1,l  2,r  1,r  2,r  1,l  2,l  1,r 付け加えたものをファイル名として保存する。今回は1人目の課題について書くのでファイル名はlist_is1とす る。 2,r 1,l 2,r 1,r 2,r 1,l 2,l 1,r ***sign0 [#t3686132]  r  r  r r r r ***u_turn_rl [#jbd78aed]  l  r  r l r r *まとめ [#r7797918] 実は、カラーセンサーを車体の前で黒線に垂直にに往復運動をさせることでカラーセンサーを2個分として機能させる案があったのだが、ソフトの面で困難を極め、本番に採用されることはなかった。だが、せっかくのいい案を無しにしてしまうのは勿体無いので、課題3にて実現できればなとかんがえている。