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

避障机器人Python代码出现语法错误,请求排查问题

你的避障机器人代码问题排查与修复方案

Hey,我帮你仔细捋了一遍你的代码,发现几个关键的语法和逻辑问题,这些正是导致机器人没反应、触发语法错误的原因:

1. 同一行挤了两个import,直接触发语法报错

你第一行把两个import语句塞在了同一行,中间的注释没正确分隔,Python根本解析不了:

import RPi.GPIO as GPIO #Import GPIO library import time #Import time library

改成两行分开写就好:

import RPi.GPIO as GPIO  # 导入GPIO库
import time  # 导入时间库

2. 用错逻辑运算符,导致转向判断完全失效

在判断机器人转向的条件里,你用了位运算符&,但Python里判断逻辑“与”应该用and,位运算符在这里会让逻辑判断完全不符合预期:

if((count%3 == 1) & (flag == 0)):

修正为:

if (count % 3 == 1) and (flag == 0):

3. 平均距离计算逻辑搞反,导致避障判断出错

你把avgDistance = avgDistance / 5放在了for循环内部,这样每次循环都会把当前累计的距离除以5,最后算出来的平均距离完全不对。得把这行移到循环结束之后:

avgDistance = 0
for i in range(5):
    # 这里是超声波检测的代码...
    avgDistance += distance
# 循环结束后再算平均值
avgDistance = avgDistance / 5

额外需要留意的潜在问题

  • 引脚冲突检查:m21 = 22 之前你注释了LED的引脚22,要确认这个引脚没有被其他设备占用,不然会影响电机控制。
  • 超声波传感器延迟:time.sleep(0.1)的延迟可以根据传感器的实际响应情况微调,如果检测不稳定可以适当调整。

修复后的完整代码

import RPi.GPIO as GPIO  # 导入GPIO库
import time  # 导入时间库
import traceback

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)  # 使用BCM引脚编号格式

TRIG = 24
ECHO = 27
##led = 22
m11 = 4
m12 = 26
m21 = 22
m22 = 23

GPIO.setup(TRIG,GPIO.OUT)  # 设置TRIG为输出
GPIO.setup(ECHO,GPIO.IN)  # 设置ECHO为输入
##GPIO.setup(led,GPIO.OUT)
GPIO.setup(m11,GPIO.OUT)
GPIO.setup(m12,GPIO.OUT)
GPIO.setup(m21,GPIO.OUT)
GPIO.setup(m22,GPIO.OUT)

##GPIO.output(led, True)
time.sleep(5)

def stop():
    ## 机器人停止
    print("STOP")
    GPIO.output(m11, False)
    GPIO.output(m12, False)
    GPIO.output(m21, False)
    GPIO.output(m22, False)

def forward():
    ## 机器人前进
    GPIO.output(m11, True)
    GPIO.output(m12, False)
    GPIO.output(m21, True)
    GPIO.output(m22, False)
    print("Forward")

def back():
    ## 机器人后退
    GPIO.output(m11, False)
    GPIO.output(m12, True)
    GPIO.output(m21, False)
    GPIO.output(m22, True)
    print("Back")

def left():
    ## 机器人左转
    GPIO.output(m11, False)
    GPIO.output(m12, False)
    GPIO.output(m21, True)
    GPIO.output(m22, False)
    print("Left")

def right():
    ## 机器人右转
    GPIO.output(m11, True)
    GPIO.output(m12, False)
    GPIO.output(m21, False)
    GPIO.output(m22, False)
    print("Right")

stop()
count = 0

try:
    while(True):
        avgDistance = 0
        for i in range(5):
            GPIO.output(TRIG, False)  # 设置TRIG为低电平
            time.sleep(0.1)  # 延迟
            GPIO.output(TRIG, True)  # 设置TRIG为高电平
            time.sleep(0.00001)  # 持续10微秒
            GPIO.output(TRIG, False)  # 设置TRIG为低电平

            while GPIO.input(ECHO) == False:  # 等待ECHO变为高电平
                pulse_start = time.time()
            while GPIO.input(ECHO) == True:  # 等待ECHO变回低电平
                pulse_end = time.time()

            pulse_duration = pulse_end - pulse_start  # 计算脉冲持续时间
            distance = pulse_duration * 17150  # 转换为距离(声速34300cm/s,除以2是因为往返)
            distance = round(distance, 2)  # 保留两位小数
            avgDistance += distance
        
        avgDistance = avgDistance / 5  # 计算5次检测的平均距离
        print(avgDistance)
        flag = 0

        if avgDistance < 15:  # 距离小于15cm时触发避障逻辑
            count += 1
            stop()
            time.sleep(1)
            back()
            time.sleep(1.5)
            # 修正逻辑运算符
            if (count % 3 == 1) and (flag == 0):
                right()
                flag = 1
            else:
                left()
                flag = 0
            time.sleep(1.5)
            stop()
            time.sleep(1)
        else:
            forward()
            flag = 0
except Exception:
    traceback.print_exc()
finally:
    GPIO.cleanup()  # 程序结束后清理GPIO资源

先把这些问题修复后重新运行代码,应该就能解决机器人无响应的问题了。如果还是有问题,可以检查电机驱动模块的接线是否正确,以及超声波传感器的接线是否牢固。

内容的提问来源于stack exchange,提问作者Pierre Borg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:50:45