Как получить немедленную реакцию между двигателями и датчиками?

Я новичок в pybricks и нашел очень мало документации, чтобы помочь ответить на мой собственный запрос. Я написал, как мне казалось, простую программу, которая будет вращать моего робота на месте, пока ультразвуковой датчик что-то не увидит. Затем он будет продвигаться вперед. Если его толкнуть назад и он увидит черную линию, он должен попытаться отклониться в сторону.

Следующий код работает, но его реакция на датчики ультразвука и света значительно задерживается:

#!/usr/bin/env pybricks-micropython

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, ColorSensor, UltrasonicSensor
from pybricks.parameters import Port
from pybricks.tools import wait

ev3 = EV3Brick()
eyes = UltrasonicSensor(Port.S2)
left_motor = Motor(Port.B)
right_motor = Motor(Port.A)
right_light = ColorSensor(Port.S1)
left_light = ColorSensor(Port.S4)

while True:

    if right_light.reflection() < 50:
        ev3.speaker.say('black')
        left_motor.run(500)
        right_motor.run(-100)
        wait(2000)
        left_motor.run(500)
        right_motor.run(500)
        wait(1000)
    if eyes.distance() > 200:
        left_motor.run(500)
        right_motor.run(-500)
    else:
        left_motor.run(-500)
        right_motor.run(-500)

В (ограниченной) документации я вижу, что вы можете изменить настройки двигателя, но я не могу найти указание, как это сделать (или даже если это было бы полезно). Любая помощь будет оценена по достоинству.


person MisterWeary    schedule 11.01.2021    source источник


Ответы (2)


ev3.speaker.say(text) синтезирует речь на ходу. Это весело, но очень медленно. Это особенно заметно в контуре управления, подобном вашему.

Вместо этого я бы рекомендовал использовать ev3.speaker.beep(). Вы даже можете выбрать частоту на основе значения отражения, чтобы вы могли слышать то, что видит датчик.

person Laurens Valk    schedule 13.01.2021
comment
Спасибо за ваш ответ. Однако это не устранило отставание между датчиком и двигателем. Я чувствую, что двигателю нужно разогнаться до скорости, которую я ему дал, а затем замедлиться с этой скорости, прежде чем он среагирует. Это вещь? Есть ли способ удалить все ускорение/замедление и сразу же выполнить следующую команду? Так работали старые блоки NXT?!? - person MisterWeary; 14.01.2021

Итак, проблема заключалась в том, что я использовал запуск команда для перемещения двигателей. У бега есть компоненты ускорения и замедления.

Я использовал dc вместо run и теперь моторы мгновенно реагируют на данные датчиков.

person MisterWeary    schedule 13.01.2021