注釈
こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。
参加する理由は?
エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。
学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。
独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。
特別割引:最新製品の独占割引をお楽しみください。
祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。
👉 私たちと一緒に探索し、創造する準備はできていますか?[ここ]をクリックして今すぐ参加しましょう!
7. 顔追跡¶
PiDogは静かに座っています。あなたが手をたたくと、PiDogはあなたの方を向き、あなたを見つけると挨拶します。
コードの実行
cd ~/pidog/examples
sudo python3 7_face_track.py
このコードを実行すると、PiDogはカメラを起動し、顔検出機能を有効にします。
ブラウザで http://+ PiDogのIP +/mjpg
(私の場合は「http://192.168.18.138:9000/mjpg」)にアクセスして、カメラの画像を確認できます。
その後、PiDogは座り、音の方向センサーモジュールをアクティベートして、拍手の方向を検出します。 PiDogが拍手(または他の音)を聞くと、音源の方向に頭を向けてあなたを探します。
あなたを見つけると(顔検出がオブジェクトを見つけると)、尻尾を振って吠えます。
コード
注釈
以下のコードを 変更/リセット/コピー/実行/停止 することができます。ただし、それにはまず pidog\examples
のようなソースコードのパスに移動する必要があります。コードを変更した後、直接実行して効果を確認することができます。
#!/usr/bin/env python3
from pidog import Pidog
from time import sleep
from vilib import Vilib
from preset_actions import bark
my_dog = Pidog()
sleep(0.1)
def face_track():
Vilib.camera_start(vflip=False, hflip=False)
Vilib.display(local=True, web=True)
Vilib.human_detect_switch(True)
sleep(0.2)
print('start')
yaw = 0
roll = 0
pitch = 0
flag = False
direction = 0
my_dog.do_action('sit', speed=50)
my_dog.head_move([[yaw, 0, pitch]], pitch_comp=-40, immediately=True, speed=80)
my_dog.wait_all_done()
sleep(0.5)
# Cleanup sound detection by servos moving
if my_dog.ears.isdetected():
direction = my_dog.ears.read()
while True:
if flag == False:
my_dog.rgb_strip.set_mode('breath', 'pink', bps=1)
# If heard somthing, turn to face it
if my_dog.ears.isdetected():
flag = False
direction = my_dog.ears.read()
pitch = 0
if direction > 0 and direction < 160:
yaw = -direction
if yaw < -80:
yaw = -80
elif direction > 200 and direction < 360:
yaw = 360 - direction
if yaw > 80:
yaw = 80
my_dog.head_move([[yaw, 0, pitch]], pitch_comp=-40, immediately=True, speed=80)
my_dog.wait_head_done()
sleep(0.05)
ex = Vilib.detect_obj_parameter['human_x'] - 320
ey = Vilib.detect_obj_parameter['human_y'] - 240
people = Vilib.detect_obj_parameter['human_n']
# If see someone, bark at him/her
if people > 0 and flag == False:
flag = True
my_dog.do_action('wag_tail', step_count=2, speed=100)
bark(my_dog, [yaw, 0, 0], pitch_comp=-40, volume=80)
if my_dog.ears.isdetected():
direction = my_dog.ears.read()
if ex > 15 and yaw > -80:
yaw -= 0.5 * int(ex/30.0+0.5)
elif ex < -15 and yaw < 80:
yaw += 0.5 * int(-ex/30.0+0.5)
if ey > 25:
pitch -= 1*int(ey/50+0.5)
if pitch < - 30:
pitch = -30
elif ey < -25:
pitch += 1*int(-ey/50+0.5)
if pitch > 30:
pitch = 30
print('direction: %s |number: %s | ex, ey: %s, %s | yrp: %s, %s, %s '
% (direction, people, ex, ey, round(yaw, 2), round(roll, 2), round(pitch, 2)),
end='\r',
flush=True,
)
my_dog.head_move([[yaw, 0, pitch]], pitch_comp=-40, immediately=True, speed=100)
sleep(0.05)
if __name__ == "__main__":
try:
face_track()
except KeyboardInterrupt:
pass
except Exception as e:
print(f"\033[31mERROR: {e}\033[m")
finally:
Vilib.camera_close()
my_dog.close()