避障机器人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
相关产品推荐
相关产品推荐

