在while循环中的if语句的开头执行一次函数

时间:2017-07-16 18:08:16

标签: python raspberry-pi

我一直在构建一个基于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函数无济于事。我似乎已经碰到了一堵墙,我真的很感激他的帮助。嘿,如果你需要我更好地表达问题那么请说,我很乐意进一步详细说明。

2 个答案:

答案 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