2016年11月17日木曜日

第7回:GOPIGOをPYTHONで自律駆動させる(1)


訂正(2016年11月22日):GOPIGOとしてRaspberry PIを組み込んだ状態では、Micro USBの+5V電源は使えないと断言しておりましたが、Dexter IndustriesのホームページにGOPIGOの形で、「Micro USBが使える」ことが明記されておりました。回路図的には私の読んだ通りですが、ICの耐圧仕様などを鑑みるとOKということなのだと理解しました。早とちりで申し訳ありません。


GOPIGOをPYTHONで動かす事は、サンプルプログラムも多くUPされているので、比較的簡単にトライできそうである。
自律駆動の第一歩として、超音波距離センサーで前の距離を測りながら前進して、障害に近づいたら一旦止まり、左右に首を振ってそれぞれの距離を測り、遠い方へまた前進する、ということを繰り返すプログラムを作れば良いと考えた。
サンプルプログラムとしては、GITHUBにUPされているbasic_obstacle_avoid.pyというプログラム例が参考になりそうだ。

<電池問題>
PYTHONでプログラムをしながら、GOPIGOの動きを観察していると、当たり前の話では有るが、電池がへたってきて、SSHのやりとりも時間がかかるようになった。
プログラムコードを睨んでいると、どうしても時間が経ってしまうので、やっぱり電池では無理が多い。
既に持っているMicro USBのACアダプターが使えないものかと、GOPIGO2基板の回路図をじっと見てみたが、回路設計上は+5Vを外部から供給される事は想定していない様だ。GOPIGO2基板の中では、電池ホルダーからの電源を直接使っているのはモータードライバーICだけで、それ以外はレギュレータICを通過して+5Vで使っている。+5VをGOPIGO基板に強引に外部供給した場合、問題となるのはこのレギュレータICの出力ピンとFeedbackピンに想定外の+5Vがかかった場合にICが壊れるかどうかだ。Dexter Industriesにそのことを聞いても設計範囲外のことだから困るだけだろう。あまり、設計範囲外のことをしてトラブルを招くのも嫌なので、やっぱりMicro USBコネクタから電源供給をするのは止めておこう。どなたか、GOPIGOに組み込んだ状態で+5Vを外部供給してみた人が居たら、参考までに状況を教えて下さい。
電池は、やっぱりエネループかな。家にあるエネループを一部使ってみた(写真)が、8本もあるわけではなく、また古いので充電時間も7時間と長い。最新のエネループを見ると2時間程度で充電できるらしい。 +12VのACアダプターを買うのも良いが、動かしてデバッグする時は困るだろうし、最新のエネループを買うのか、迷いは多い。

<超音波距離センサー>
サンプルプログラムは、そのまま動かすと、想像どおりに、壁に向かって動き、20cm程手前で止まる。まったく、プログラム通りだ。
サンプルプログラムに手を加えて、以下の様に変えた。障害まで20cmの距離までまっすぐ進み、20cm以下の距離で止まり、右(20度)、左(160度)の距離を測定し、どちらも20cm以下であれば、少しバックして終了する。どちらかが20cmより遠ければ、より遠い方向へ回転し、まっすぐ進む。これを繰り返す。

from gopigo import *
import time

enable_servo()
servo(90)
distance_to_stop=20
print "Press ENTER to start"
raw_input() #Wait for input to start
fwd()
while True:
dist=us_dist(15) #Find the distance of the object in front
print "Dist:",dist,'cm'
if dist<distance_to_stop: #If the object is closer than the "distance_to_stop" distance, stop the GoPiGo
print "obstacle"
stop()
servo(20)
time.sleep(1)
dist=us_dist(15)
print "Right Dist:",dist,'cm'
a=dist
servo(160)
time.sleep(1)
dist=us_dist(15)
print "Left Dist:",dist,'cm'
b=dist
if a<=distance_to_stop and b<=distance_to_stop:
   servo(90)
   time.sleep(1.0)
   bwd()
   time.sleep(0.5)
   stop()
   print "I gave up and stop!"
       #Stop the GoPiGo
   break
elif a>b:
   if a>distance_to_stop:
       right_rot()
       time.sleep(0.3)
       stop()
       servo(90)
       time.sleep(1)
       print "go right"
       fwd()
elif b>a: 
   if b>distance_to_stop:
       left_rot()
       time.sleep(0.3)
       stop()
       servo(90)
                        time.sleep(1)
                        print "go left"
                        fwd()

time.sleep(0.1)
dist=us_dist(15)
time.sleep(.1)

このプログラムで、囲まれた場所では、多少ぶつかりながらも自律的に動き回ることができる。但し、超音波距離センサーが時々誤った結果を返すので、何も障害が無いのに、左右を見渡す動作が入り、どちらかに回転して進んでいるところがある。超音波距離センサーをうまく制御できていない気がする。電池の電圧が変動しているのかもしれないが、正直良くわかりません。
まあ、とりあえず自律動作の第一ステップはうまくいった様に思う。USセンサーを使う限りは、こんなところでしょう。

第二ステップは、カメラ・マイク・スピーカ等を加えて、何ができるか?というところでしょう。ということで、次の段階を検討する事にする。



0 件のコメント:

コメントを投稿