Я пытаюсь запрограммировать робота Lego EV3 с помощью MicroPython. Если срабатывает один из датчиков (например, датчик касания), робот должен говорить. Однако если робот активно получает сигналы от ИК-пульта дистанционного управления (который управляет движением) во время срабатывания датчика, предыдущее движение будет продолжаться, пока робот говорит, независимо от того, какие кнопки нажаты на пульте дистанционного управления. Я знаю, что это потому, что функция ev3.speaker.say() является «блокирующим вызовом».
Я знаю, что мне нужно настроить сопрограммы, чтобы робот мог продолжать проверять входные данные с ИК-пульта дистанционного управления, пока он говорит. Я искал, как это сделать, и посмотрел демо-версию LEGO «Gyro Boy», но все еще не могу заставить ее работать. С помощью этого текущего кода, если я использую пульт дистанционного управления, чтобы заставить двигатель вращаться, а затем, продолжая удерживать кнопку, активирую датчик касания, а затем отпущу кнопку на пульте дистанционного управления, двигатель будет продолжать вращаться до тех пор, пока не будет выполнена команда «сказать», даже когда я не нажимаю никаких кнопок.
Если я раскомментирую команду «yield», которая находится в нижней части функции «SensorControl» (чтобы попытаться сделать ее сопрограммой), то функция SensorControl полностью игнорируется и никогда вызывается, несмотря на то, что он все еще указан в главном контуре управления. То же самое произойдет, если я добавлю вторую команду доходности в нижней части функции SensorControl, чтобы полностью выйти из функции. (в дополнение к оператору if)
Похоже, что любая функция, содержащая команду «yield», полностью игнорируется, независимо от того, где находится эта команда доходности и должен ли процесс когда-либо достичь этого кода.
Я проверил это с помощью простого
if False == True:
yield
внутри функции управления двигателем, и это действительно так. Это странно, потому что у кода нет возможности когда-либо достичь этой команды доходности. (поскольку False никогда не равно True)
Я также пробовал использовать многопоточность вместо сопрограмм, но это тоже не сработало.
Документация по программированию EV3 представляет собой набор HTML-файлов, которые прилагаются к загрузке, поэтому я загрузил ее в папку на Google Диске.
https://drive.google.com/drive/folders/ ... sp=sharing
Вот мой минимальный воспроизводимый пример:
#!/usr/bin/env pybricks-micropython
from ucollections import namedtuple
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor,
InfraredSensor, UltrasonicSensor, GyroSensor)
from pybricks.parameters import Port, Stop, Direction, Button, Color
from pybricks.tools import wait, StopWatch, DataLog
from pybricks.robotics import DriveBase
from pybricks.media.ev3dev import SoundFile, ImageFile
motor1 = Motor(Port.B)
touchSensor = TouchSensor(Port.S1)
irSensor = InfraredSensor(Port.S4)
ev3 = EV3Brick()
LEG_MOTOR_SPEED = 500 # deg/s
# Motor Control (non-co)routine
def MotorControl():
if Button.LEFT_UP in irSensor.buttons(1):
motor1.run(LEG_MOTOR_SPEED)
elif Button.LEFT_DOWN in irSensor.buttons(1):
motor1.run(-LEG_MOTOR_SPEED)
else:
motor1.brake()
return
# Sensor Control (This is the attempted coroutine)
#(also tried making both functions use yield statements and that didnt work either)
def SensorControl():
if touchSensor.pressed() == True:
ev3.speaker.say("I grabbed something.")
# yield
# ===== MAIN CONTROL LOOP =====
while True:
MotorControl()
SensorControl()
Подробнее здесь: https://stackoverflow.com/questions/798 ... king-calls
Обнаружение ввода с ИК-пульта EV3 во время блокировки вызовов ⇐ Python
Программы на Python
-
Anonymous
1771443832
Anonymous
Я пытаюсь запрограммировать робота Lego EV3 с помощью MicroPython. Если срабатывает один из датчиков (например, датчик касания), робот должен говорить. Однако если робот активно получает сигналы от ИК-пульта дистанционного управления (который управляет движением) во время срабатывания датчика, предыдущее движение будет продолжаться, пока робот говорит, независимо от того, какие кнопки нажаты на пульте дистанционного управления. Я знаю, что это потому, что функция ev3.speaker.say() является «блокирующим вызовом».
Я знаю, что мне нужно настроить сопрограммы, чтобы робот мог продолжать проверять входные данные с ИК-пульта дистанционного управления, пока он говорит. Я искал, как это сделать, и посмотрел демо-версию LEGO «Gyro Boy», но все еще не могу заставить ее работать. С помощью этого текущего кода, если я использую пульт дистанционного управления, чтобы заставить двигатель вращаться, а затем, продолжая удерживать кнопку, активирую датчик касания, а затем отпущу кнопку на пульте дистанционного управления, двигатель будет продолжать вращаться до тех пор, пока не будет выполнена команда «сказать», даже когда я не нажимаю никаких кнопок.
Если я раскомментирую команду «yield», которая находится в нижней части функции «SensorControl» (чтобы попытаться сделать ее сопрограммой), то функция SensorControl полностью игнорируется и никогда вызывается, несмотря на то, что он все еще указан в главном контуре управления. То же самое произойдет, если я добавлю вторую команду доходности в нижней части функции SensorControl, чтобы полностью выйти из функции. (в дополнение к оператору if)
Похоже, что любая функция, содержащая команду «yield», полностью игнорируется, независимо от того, где находится эта команда доходности и должен ли процесс когда-либо достичь этого кода.
Я проверил это с помощью простого
if False == True:
yield
внутри функции управления двигателем, и это действительно так. Это странно, потому что у кода нет возможности когда-либо достичь этой команды доходности. (поскольку False никогда не равно True)
Я также пробовал использовать многопоточность вместо сопрограмм, но это тоже не сработало.
Документация по программированию EV3 представляет собой набор HTML-файлов, которые прилагаются к загрузке, поэтому я загрузил ее в папку на Google Диске.
https://drive.google.com/drive/folders/1m0HGmr_yqeg9nrS03VS4Ddk56q-s_NmG?usp=sharing
Вот мой минимальный воспроизводимый пример:
#!/usr/bin/env pybricks-micropython
from ucollections import namedtuple
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor,
InfraredSensor, UltrasonicSensor, GyroSensor)
from pybricks.parameters import Port, Stop, Direction, Button, Color
from pybricks.tools import wait, StopWatch, DataLog
from pybricks.robotics import DriveBase
from pybricks.media.ev3dev import SoundFile, ImageFile
motor1 = Motor(Port.B)
touchSensor = TouchSensor(Port.S1)
irSensor = InfraredSensor(Port.S4)
ev3 = EV3Brick()
LEG_MOTOR_SPEED = 500 # deg/s
# Motor Control (non-co)routine
def MotorControl():
if Button.LEFT_UP in irSensor.buttons(1):
motor1.run(LEG_MOTOR_SPEED)
elif Button.LEFT_DOWN in irSensor.buttons(1):
motor1.run(-LEG_MOTOR_SPEED)
else:
motor1.brake()
return
# Sensor Control (This is the attempted coroutine)
#(also tried making both functions use yield statements and that didnt work either)
def SensorControl():
if touchSensor.pressed() == True:
ev3.speaker.say("I grabbed something.")
# yield
# ===== MAIN CONTROL LOOP =====
while True:
MotorControl()
SensorControl()
Подробнее здесь: [url]https://stackoverflow.com/questions/79890424/detect-input-from-ev3-ir-remote-during-blocking-calls[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия