訂正(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というプログラム例が参考になりそうだ。
<超音波距離センサー>
サンプルプログラムは、そのまま動かすと、想像どおりに、壁に向かって動き、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 件のコメント:
コメントを投稿