You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EV3机器人MicroPython编程:阻塞调用时红外遥控器输入检测问题

乐高EV3 MicroPython编程问题:阻塞式语音导致运动控制失效

我用MicroPython为乐高EV3机器人编程,需求是触发触摸传感器时机器人发声,但如果触发传感器时机器人正接收红外遥控器的运动指令,发声期间之前的运动状态会持续保持,无论遥控器按键是否松开。我知道这是因为ev3.speaker.say()是阻塞调用。

我尝试通过协程解决,希望机器人在发声时仍能持续检测红外遥控器输入,参考了乐高的“Gyro Boy”演示但未能解决问题。当前代码中,若用遥控器让电机转动,按住按键时触发触摸传感器再松开遥控器按键,电机会持续转动直到语音播放完成,即使此时未按任何按键。

如果取消SensorControl函数底部的yield注释(尝试将其设为协程),即使主循环中仍调用该函数,SensorControl也会被完全忽略。即使在函数底部添加第二个yield命令(除if语句中的外),结果也是如此。

更奇怪的是,任何包含yield命令的函数都会被完全忽略,无论yield的位置或代码是否会执行到它。我在电机控制函数中加入一段测试代码:

if False == True:
    yield

情况确实如此——这段代码永远不会执行到yield,但函数仍被忽略。

我也尝试用多线程替代协程,同样无效。

最小复现代码

#!/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

# 电机控制函数(非协程)
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

# 传感器控制函数(尝试改为协程)
# 也试过让两个函数都用yield,同样无效
def SensorControl():
    if touchSensor.pressed() == True:
        ev3.speaker.say("I grabbed something.")
        # yield

# ===== 主控制循环 =====
while True:
    MotorControl()
    SensorControl()

内容的提问来源于stack exchange,提问作者John Gerken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 13:04:57