我一直在构建一个基于Raspberry Pi的机器人,该机器人使用经过大量修改的Jasper版本来响应语音命令。它使用超声波测距传感器和RPi摄像头板具有一定程度的自主性。我只想出了如何将MaryTTS本地服务器集成到我的代码中,以便每次做出关于想要去哪个方向的决定时让机器人发出短语,从短语中随机选择短语。英寸
这里是我至少使用其自治的逻辑,这是从pythonprogramming.net教程中大量借用的
def autonomy():
no_problem = True
while no_problem:
time.sleep(1)
os.system('pigs s 4 1460')
os.system('pigs s 27 1500')
time.sleep(1)
x = 0
dist = snr(x)
if dist > min_distance:
excite_random()
print dist
robot.forward(180)
else:
robot.forward(0,0)
time.sleep(1)
confused_random()
os.system('pigs s 4 1500')
os.system('pigs s 27 500')
time.sleep(1)
x = 0
left_dir = snr(x)
time.sleep(1)
os.system('pigs s 4 1500')
os.system('pigs s 27 2500')
x = 0
right_dir = snr(x)
time.sleep(1)
if left_dir > right_dir and left_dir > min_distance:
robot.left(180,1)
time.sleep(1)
elif left_dir < right_dir and right_dir > min_distance:
robot.right(180,1)
else:
robot.backward(180)
time.sleep(2)
rot_choices = [robot.right(180,1), robot.right(180,1)]
random.choice(rot_choices)
time.sleep(1)
robot.backward(0)
try:
robot.backward(0)
os.system('sudo pigpiod')
os.system('pigs s 4 1460')
os.system('pigs s 27 1500')
time.sleep(1)
autonomy()
except KeyboardInterrupt:
sleep()
time.sleep(0.5)
GPIO.cleanup()
robot.forward(0,0)
一切都运行良好,我自己也是一个会说话的机器人,但我对你们的问题就是这个 - 正如你在下面的代码片段中看到的那样
if dist > min_distance:
excite_random()
print dist
robot.forward(180)
我在while循环中有一个if语句执行我写的函数excite_random()
,它让机器人说出一个可兴奋的短语,然后如果范围传感器读取超过最小距离则继续向前移动。但是,我希望excite_random
只能在评估距离后的每个循环开始时执行,而不是在机器人向前移动时反复执行。
有没有人知道我该怎么做?我试过搞乱嵌套语句,嵌套循环和lambda函数无济于事。我似乎已经碰到了一堵墙,我真的很感激他的帮助。嘿,如果你需要我更好地表达问题那么请说,我很乐意进一步详细说明。
答案 0 :(得分:2)
你可以有一个标志来检查它是否是第一次执行excite功能。如果是第一个,则执行,否则不执行。
def autonomy():
no_problem = True
# Assign an initial value to the flag (True)
excite_flag = True
while no_problem:
time.sleep(1)
os.system('pigs s 4 1460')
os.system('pigs s 27 1500')
time.sleep(1)
x = 0
dist = snr(x)
if dist > min_distance:
# If the flag is the initial value, then execute the excite function
if excite_flag:
# Excite function will be executed for the first time
excite_random()
# Now reverse the initial value (False) to stop the if condition from happening (being True),
# until autonomy is called again
excite_flag = False
print dist
robot.forward(180)
# Then the rest of the code
答案 1 :(得分:-1)
我不太清楚你的意图,但我最好的猜测是使用2 while循环。
while no_problem:
# get distance
# squeal once
while no_problem:
# move forward