目次 #contents *課題3 [#va54b46a] 細かいルールは省略するが、端的にまとめると &size(30){ボールを拾って缶に乗せる!}; *課題達成のためのルート [#j10deba6] &ref(2018b/Member/miyashi/Mission3/s_課題3コース.png,100%,設定したルート); *ロボットの説明 [#of1e3a29] **本体について [#hfdefae6] ・車型ロボットにボールを扱う機構とセンサ類を設置 **ボールを扱う機構について [#jc19a875] ・ベルトコンベアでボールを掬い上げる ・一度に二個ボールを運べる→ライントレースのショートカットが可能 ・車体上部に設置した坂道で転がしてボールを入れる ・加速したボールを減速。缶に乗ったボールを逃さない。役割をもつ可動な壁 **センサ類について [#v8a9ebbc] 使用したのはカラーセンサ、超音波センサ、ジャイロセンサを一つづつ。カラーセンサと超音波センサに関しては、課題2のレポートで詳細したのでそちらを参照。(URLは後述) ***カラーセンサ [#v30f0ba7] ライントレースに使用。 ***超音波センサ [#dd0c2bfb] 缶の発見に使用。 ***ジャイロセンサ [#zaa3d421] 課題とロボットの特性上、車体を何回も正確に回転させる必要があった。前回までのミッションのときはモーターを決まった値で回して車体を回転させていたが、充電等の影響により回転角度が変わってしまうという失敗が多かった。この反省を踏まえ、充電に影響されにくいセンサ類、を採用した。採用したジャイロセンサは、角度を測ることが可能であり、計測開始と計測終了時の値を得ることにより、何度移動したか、その変位を知ることができる。しかし、完全に正確な値を得ることは不可能であり、数度だけ誤差が生じる。 *定義したプログラム [#s9b3182f] **基本的なプログラム [#o934100a] 車輪を止めるプログラム。適宜、利用した。 def stop(): ml.stop() #左車輪を停止 mr.stop() #右車輪を停止 決められた角度だけ車輪のモーターを回す。前進、後進、回転、斜め方向etc…多彩な動きを変数により制御する。適宜、利用した。 def angle(l,r,t): ml.run_to_rel_pos(position_sp=l,speed_sp=115,stop_action='hold') #左車輪をlだけ回転させる mr.run_to_rel_pos(position_sp=r,speed_sp=115,stop_action='hold') #右車輪をrだけ回転させる time.sleep(t) 車体後部のベルトコンベアを回すプログラム。ボールを抱える時や発射する時にコンベアを回す。maはベルトコンベアに連動するLargeMotorのこと。 def roll(s): ma.run_to_rel_pos(position_sp=s,speed_sp=80,stop_action='hold') #モーターをsだけ回し、コンベアを回転させる。 time.sleep(3) ジャイロセンサによる制御で、車体を決められた角度回転させるプログラム。センサが検出する角度と車輪の速度を変数で扱う。右回りと左回りの二種類作った。 右回り def kaiten_r(s,t): g1=gs.value() #回転前のジャイロセンサの値g1を測る g2=gs.value() #g2を測る while g2-g1<s: #角度s(変数)回転するまで車体を回す ml.run_forever(speed_sp=t,stop_action='hold') #左車輪を回転させ続ける mr.run_forever(speed_sp=-t,stop_action='hold') #右車輪を回転させ続ける g2=gs.value() #g2を更新 stop() #止める 左回り def kaiten_l(s,t): g1=gs.value() #回転前のジャイロセンサの値g1を測る g2=gs.value() #g2を測る while g1-g2<s: #角度s(変数)回転するまで車体を回す ml.run_forever(speed_sp=-t,stop_action='hold') #左車輪を回転させ続ける mr.run_forever(speed_sp=t,stop_action='hold') #右車輪を回転させ続ける g2=gs.value() #g2を更新 stop() #止める **ライントレースのプログラム [#y6003622] 移動時にライントレースを利用する。課題2のレポートで内容は詳細してあるのでプログラムの説明はそちらを参照。 http://yakushi.shinshu-u.ac.jp/robotics/?2018b%2FMember%2Fmiyashi%2FMission2 def linetrace_rin(): c1=cs.value() while c1>13: #カラーセンサの値が14以上なら次の動きを繰り返す。 c1=cs.value() x=(abs(c1-10)/70)*100 #xの値を決める。 if x>100: #xの値の最大を100とする。 x=100 l=(x/100)*210-30 #左車輪の速度lを定める。 r=150-l #右車輪の速度rを定める。 ml.run_forever(speed_sp=l,stop_action='brake') #与えられた速度lで進む。 mr.run_forever(speed_sp=r,stop_action='brake') #与えられた速度rで進む。 stop() def linetrace_rout(): c1=cs.value() #計測値をc1とする。 while c1<40: #c1<40ならば以下を繰り返す。 c1=cs.value() #c1を計測。 x=(abs(c1-10)/70)*100 #xの値を求める。 if x>100: #xの値の最大値を100とする。 x=100 l=(x/100)*120-40 #lの値を決める。 r=40-l #rの値を決める。 ml.run_forever(speed_sp=l,stop_action='brake') #lの速度で左車輪を動かす。 mr.run_forever(speed_sp=r,stop_action='brake') #rの速度で右車輪を動かす。 stop() #止める。 def linetrace_lin(): c1=cs.value() while c1>13: #カラーセンサの値が14以上なら次の動きを繰り返す。 c1=cs.value() x=abs((c1-10)/70)*100 #xの値を決める。 if x>100: #xの値の最大を100とする。 x=100 r=(x/100)*210-30 #右車輪の速度rを定める。 l=150-r #左車輪の速度lを定める。 ml.run_forever(speed_sp=l,stop_action='brake') #与えられた速度lで進む。 mr.run_forever(speed_sp=r,stop_action='brake') #与えられた速度rで進む。 stop() #カラーセンサの値が13以下なら動きをやめる。 def linetrace_lout(): c1=cs.value() #計測値をc1とする。 while c1<40: #c1<40ならば以下を繰り返す。 c1=cs.value() #c1を計測。 x=(abs(c1-10)/70)*100 #xの値を求める。 if x>100: #xの値の最大値を100とする。 x=100 r=(x/100)*120-40 #rの値を求める。 l=40-r #lの値を求める。 ml.run_forever(speed_sp=l,stop_action='brake')#lの速度で左車輪を動かす。 mr.run_forever(speed_sp=r,stop_action='brake')#rの速度で右車輪を動かす。 stop() #止める。 以上4つのライントレースのプログラムに加え、今回は変数の値(秒数)経過したら、ライントレースを終わるプログラムを作った。 def linetrace_ltime(j): c1=cs.value() #計測値をc1とする t1=time.time() #計測開始時刻をt1とする t2=time.time() #t2を計測 while t2-t1<j: #j秒間経過するまで以下を繰り返す c1=cs.value() #c1を計測 t2=time.time() #t2を更新 x=abs((c1-10)/70)*100 #xの値を求める if x>100: #xの最大値を100とする x=100 r=(x/100)*210-30 #rの値を求める l=150-r #lの値を求める ml.run_forever(speed_sp=l,stop_action='brake') #左車輪をlの速度で回す。 mr.run_forever(speed_sp=r,stop_action='brake') #右車輪をrの速度で回す。 stop() #j秒後にライントレースを停止。 **缶の発見とボール落下させるプログラム [#w1430d97] 缶の場所を探査したい場所に到着した時に使用する。まず任意の変数だけ回転し、超音波センサが最も近い物体を検知した時に回転し始めてからどれほどの角度を回ったかジャイロセンサで把握しておき、変数分回転したあとに最も近い物体の方向を先程とは逆回りで回転しながら向く。 その後、缶に向かって前進する。課題の特性上、缶の配置によって前進する距離が異なるので、缶に超音波センサがぶつかる(センサの値が2550になる)まで前進を続ける。 缶にぶつかったら車体は止まり、ベルトコンベアを回転させ、ボールを落下させる。 缶まで進んだ分後退し、探査開始時に戻るまで車体角度を調節する。 この定義は左回りの探査と右回りの探査の二種類がある。 左回り def discover_l(s,t): u1=us.value() #u1を計測 g1=gs.value() #g1を計測 g2=gs.value() #g2を計測 while g1-g2<s: #角度sになるまで左に回る u2=us.value() #u2を更新 ml.run_forever(speed_sp=-70,stop_action='hold') mr.run_forever(speed_sp=70,stop_action='hold') g2=gs.value() #g2を更新 if u2<u1: #最も近い物体がある方向を向いた時の距離と角度を保存 u1=u2 #u1を更新 g3=gs.value() #g3を計測 g4=gs.value() #g4を計測 g5=gs.value() #g5を計測 if u1<=t: #t(距離)の中に感があった時 while g5-g4<g3-g2-6: #缶のある方向を向くまで車輪を動かす mr.run_forever(speed_sp=-70,stop_action='hold') ml.run_forever(speed_sp=70,stop_action='hold') g5=gs.value() #g5を更新 stop() #車体を止める u3=us.value() #u3を計測 t1=time.time() #t1缶に向かう前の時間を計測 while u3<2550: #缶に当たる(センサの値が2550になる)まで車輪を回し続ける ml.run_forever(speed_sp=100,stop_action='hold') mr.run_forever(speed_sp=100,stop_action='hold') u3=us.value() #u3を更新 t2=time.time() #缶に当たった時をt2とする stop() #止める roll(220) #コンベアを回転させ、ボールを落とす ml.run_timed(speed_sp=-100,time_sp=(t2-t1)*1000,stop_action='hold') #缶に向かい始めた位置まで戻る mr.run_timed(speed_sp=-100,time_sp=(t2-t1)*1000,stop_action='hold') #缶に向かい始めた位置まで戻る time.sleep(t2-t1) #戻るまで停止 g6=gs.value() # g7=gs.value() # while g7-g6<=g1-g3-6: # mr.run_forever(speed_sp=-70,stop_action='hold') # ml.run_forever(speed_sp=70,stop_action='hold') # g7=gs.value() # stop() # else: # while g5-g4<90: # mr.run_forever(speed_sp=-70,stop_action='hold') # ml.run_forever(speed_sp=70,stop_action='hold') # g5=gs.value() # stop() #