Принимать необязательный ввод во время выполнения

в настоящее время я пишу узел операционной системы робота (ros) на python. Я хочу создать цикл while, который, с одной стороны, принимает пользовательский ввод, но может продолжаться, если пользовательский ввод недоступен.

Идея следующего фрагмента заключается в том, что этот python-скрипт всегда предлагает «старт» или «стоп». Другой узел прослушивает, какая строка будет опубликована. Пользователь должен иметь возможность вводить 0 или 1 во время выполнения, чтобы переключить флаг.

Вот мой код на питоне:

def main():
    pub = rospy.Publisher('/start_stop', String, queue_size=10)
    rospy.init_node('start_stop', anonymous = True);
    rate=rospy.Rate(10)  # 10hz
    pubStr = "Start"
    while not rospy.is_shutdown():
        try:
            input = raw_input()
            if input == "0":
                pubStr = "Stop"
            elif input == "1":
                pubStr = "Start"
        except:
            rospy.sleep(0.1)
        rospy.loginfo(pubStr)
        pub.publish(pubStr)
        rate.sleep()

if __name__ == '__main__':
    main();

person Jochen    schedule 14.06.2016    source источник
comment
Итак, вы ищете неблокирующую функцию ввода, верно?   -  person Dilettant    schedule 14.06.2016
comment
Да, я думаю, что ищу способ сделать это.   -  person Jochen    schedule 14.06.2016
comment
Возможно, посмотрите на Python: ввод данных из sys.stdin, неблокирующий для идей... или неблокирующий консольный ввод Python. ХТН   -  person Dilettant    schedule 14.06.2016


Ответы (1)


Если вы не найдете способа сделать это непосредственно в Python, простым решением будет перемещение пользовательского ввода на другой узел:

  • Первый узел (назовем его «узел пользовательского ввода») выглядит в основном как опубликованный вами код, но публикует значение input непосредственно в теме /user_input.
  • Второй узел («узел запуска/остановки») публикует «Старт»/«Стоп» в цикле, в зависимости от флага. Этот флаг устанавливается обратным вызовом, прослушивающим /user_input.

Таким образом, узел запуска/остановки всегда публикуется в зависимости от пользовательского ввода, не дожидаясь нового ввода, в то время как пользователь всегда может изменить флаг, отправив новое значение через узел пользовательского ввода.

Это решение было бы легко реализовать, но его недостатком является дополнительный узел в вашей настройке.

person luator    schedule 14.06.2016