pi-top 4球检测器报错:元组与NoneType间无法使用<=运算符
pi-top 4球检测器坐标判断报错解决
问题代码
if blue_ball.found: print(f"Blue ball center: {blue_ball.center}") print() if ((30,50) <= blue_ball.center <= (60, 80)): led.on() sleep(0.5)
报错信息
"<=" cannot be inbetween a tuple and a NoneType.
原因分析
blue_ball.center为NoneType的核心原因:pitop.processing.algorithms.BallDetector模块的设计逻辑是,当未检测到目标球时(即blue_ball.found为False),center属性会被设为None——因为此时没有有效的坐标数据可以返回。- 代码逻辑漏洞:第二个
if判断没有先校验blue_ball.found的状态,当球没被检测到时,直接拿None和元组做比较,触发类型错误。 - 补充:元组范围比较的格式
(30,50) <= blue_ball.center <= (60,80)本身是合法的(Python会按元组元素顺序逐一比较),但前提是blue_ball.center是有效的二元组坐标。
解决方案
方案1:嵌套判断(推荐,逻辑更清晰)
将坐标范围判断嵌套到 blue_ball.found 的分支内,确保只有检测到球时才访问 center 属性:
if blue_ball.found: print(f"Blue ball center: {blue_ball.center}") print() # 仅在检测到球时判断坐标范围 if (30, 50) <= blue_ball.center <= (60, 80): led.on() sleep(0.5)
方案2:合并判断条件
在一个 if 中同时校验检测状态和坐标范围:
if blue_ball.found and (30, 50) <= blue_ball.center <= (60, 80): led.on() sleep(0.5)
注意事项
- 不要尝试手动修改
blue_ball.center的类型,这个属性由BallDetector模块自动赋值:检测到球时是包含x、y坐标的二元组,未检测到则为None。 - 所有访问
blue_ball.center的操作,必须先通过blue_ball.found确认球已被检测到,这是避免NoneType错误的核心原则。
内容的提问来源于stack exchange,提问作者Kai_Q
相关产品推荐
相关产品推荐

