4. 互动反馈
在本项目中,PiDog 将以有趣的方式与你进行互动。
当你从正前方伸手摸它的头时,它会警觉地吠叫。
但如果你从后方轻抚它的头顶,它则会露出享受的神情。
运行代码
cd ~/pidog/examples
sudo python3 4_response.py
运行此示例后,PiDog 的超声波模块会检测前方是否有障碍物, 当检测到你的手靠近时,它会点亮红色呼吸灯,后退一步并发出吠叫声。
同时,触摸传感器也会开始工作。如果你轻抚(而非轻触)其头部, PiDog 会摇头、摇尾巴,展现出一副非常享受的样子。
代码
备注
您可以对以下代码进行 修改/重置/复制/运行/停止。但请确保已进入代码路径(如 pidog\examples)后再进行操作。修改后可直接运行查看效果。
#!/usr/bin/env python3
from pidog import Pidog
from time import sleep
from math import sin
from preset_actions import bark_action
my_dog = Pidog()
sleep(0.1)
def lean_forward():
my_dog.speak('angry', volume=80)
bark_action(my_dog)
sleep(0.2)
bark_action(my_dog)
sleep(0.8)
bark_action(my_dog)
def head_nod(step):
y = 0
r = 0
p = 30
angs = []
for i in range(20):
r = round(10*sin(i*0.314), 2)
p = round(20*sin(i*0.314) + 10, 2)
angs.append([y, r, p])
my_dog.head_move(angs*step, immediately=False, speed=80)
def alert():
my_dog.do_action('stand', step_count=1, speed=90)
my_dog.rgb_strip.set_mode('breath', color='pink', bps=1, brightness=0.8)
while True:
print(
f'distance.value: {round(my_dog.ultrasonic.read_distance(), 2)} cm, touch {my_dog.dual_touch.read()}')
# 警觉状态
if my_dog.ultrasonic.read_distance() < 15 and my_dog.ultrasonic.read_distance() > 1:
my_dog.head_move([[0, 0, 0]], immediately=True, speed=90)
my_dog.tail_move([[0]], immediately=True, speed=90)
my_dog.rgb_strip.set_mode('bark', color='red', bps=2, brightness=0.8)
my_dog.do_action('backward', step_count=1, speed=98)
my_dog.wait_all_done()
lean_forward()
while len(my_dog.legs_action_buffer) > 0:
sleep(0.1)
my_dog.do_action('stand', step_count=1, speed=90)
sleep(0.5)
# 放松状态
if my_dog.dual_touch.read() != 'N':
if len(my_dog.head_action_buffer) < 2:
head_nod(1)
my_dog.do_action('wag_tail', step_count=10, speed=80)
my_dog.rgb_strip.set_mode('listen', color="#8A2BE2", bps=0.35, brightness=0.8)
# 平静状态
else:
my_dog.rgb_strip.set_mode('breath', color='pink', bps=1, brightness=0.8)
my_dog.tail_stop()
sleep(0.2)
if __name__ == "__main__":
try:
alert()
except KeyboardInterrupt:
pass
except Exception as e:
print(f"\033[31mERROR: {e}\033[m")
finally:
my_dog.close()