为什么我的程序让我的机器人关掉电源?

2024-09-30 22:27:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试组装一个编程机器人,它可以通过阅读指示牌(比如浴室右侧)来导航房间。我正在使用AlphaBot2套件和RPI3b+

图像处理部分工作正常,但由于某些原因,运动控制无法工作。 我写了一个简单的PID控制器,可以“给”电机供电,但一旦电机开始转动,机器人就会关闭

iPWM = 20 # initial motor power in duty cycle
MAX_PWM = 100 
dt = 0.001 # time step

#PID PARAMETERS#
KP = 0.2
KD = 0.01
KI = 0.00005

targets = ['BATHROOM', 'RESTAURANT', 'BALCONY']

class PID(object):
    def __init__(self,target):
        
        self.target = target
        self.kp = KP
        self.ki = KI
        self.kd = KD 
        self.setpoint = 320
        self.error = 0
        self.integral_error = 0
        self.error_last = 0
        self.derivative_error = 0
        self.output = 0
        
    def compute(self, pos):
        self.error = self.setpoint - pos
        #self.integral_error += self.error * TIME_STEP
        self.derivative_error = (self.error - self.error_last) / dt
        self.error_last = self.error
        self.output = self.kp*self.error + self.ki*self.integral_error + self.kd*self.derivative_error
        if(abs(self.output)>= MAX_PWM-iPWM and (((self.error>=0) and (self.integral_error>=0))or((self.error<0) and (self.integral_error<0)))):
            #no integration
            self.integral_error = self.integral_error
        else:
            #rectangular integration
            self.integral_error += self.error * dt
        
        if self.output>= MAX_PWM-iPWM:
            self.output = MAX_PWM-iPWM
    
            
        elif self.output <= -MAX_PWM:
            self.output = iPWM - MAX_PWM
        return self.output
        



class MOTORS(object):
    
    def __init__(self,ain1=12,ain2=13,ena=6,bin1=20,bin2=21,enb=26):
        self.AIN1 = ain1
        self.AIN2 = ain2
        self.BIN1 = bin1
        self.BIN2 = bin2
        self.ENA = ena
        self.ENB = enb
        self.PA  = iPWM
        self.PB  = iPWM

        GPIO.setmode(GPIO.BCM)
        GPIO.setwarnings(False)
        GPIO.setup(self.AIN1,GPIO.OUT)
        GPIO.setup(self.AIN2,GPIO.OUT)
        GPIO.setup(self.BIN1,GPIO.OUT)
        GPIO.setup(self.BIN2,GPIO.OUT)
        GPIO.setup(self.ENA,GPIO.OUT)
        GPIO.setup(self.ENB,GPIO.OUT)
        self.PWMA = GPIO.PWM(self.ENA,500)
        self.PWMB = GPIO.PWM(self.ENB,500)
        self.PWMA.start(self.PA)
        self.PWMB.start(self.PB)
        self.stop()

    def forward(self):
        self.PWMA.ChangeDutyCycle(self.PA)
        self.PWMB.ChangeDutyCycle(self.PB)
        GPIO.output(self.AIN1,GPIO.LOW)
        GPIO.output(self.AIN2,GPIO.HIGH)
        GPIO.output(self.BIN1,GPIO.LOW)
        GPIO.output(self.BIN2,GPIO.HIGH)
    
    def updatePWM(self,value):
        if value<0:
            self.PA = iPWM+abs(value)
            self.PB = iPWM
            self.PWMA.ChangeDutyCycle(self.PA)
            self.PWMB.ChangeDutyCycle(self.PB)
        if value>0:
            self.PA = iPWM
            self.PB = iPWM+value
            self.PWMB.ChangeDutyCycle(self.PB)
            self.PWMA.ChangeDutyCycle(self.PA)
        if value ==0:
            self.PA = iPWM
            self.PB = iPWM
            self.PWMB.ChangeDutyCycle(self.PB)
            self.PWMA.ChangeDutyCycle(self.PA)
            
        GPIO.output(self.AIN1,GPIO.LOW)
        GPIO.output(self.AIN2,GPIO.HIGH)
        GPIO.output(self.BIN1,GPIO.LOW)
        GPIO.output(self.BIN2,GPIO.HIGH)
        
        
    
    def stop(self):
        self.PWMA.ChangeDutyCycle(0)
        self.PWMB.ChangeDutyCycle(0)
        GPIO.output(self.AIN1,GPIO.LOW)
        GPIO.output(self.AIN2,GPIO.LOW)
        GPIO.output(self.BIN1,GPIO.LOW)
        GPIO.output(self.BIN2,GPIO.LOW)

然后我在相机捕捉到的图像上画了一个圈,在这里我识别出最近的符号,并计算出它的宽度和中心的x坐标:

cx = int(x+w//2)

    if d<= 60:
        mot.stop()
        GPIO.cleanup()
dutyCycle = pid.compute(cx)
pwm = mot.updatePWM(dutyCycle)



Tags: selfoutputgpiodeferrormaxlowpb
1条回答
网友
1楼 · 发布于 2024-09-30 22:27:09

它可能不是软件。您的电源不足或不够稳定,无法为您的电机和Raspberry Pi供电。这是一个非常普遍的问题。要么:

  • 建议使用单独的电源
  • 或者增加你的主电源,使用一些不稳定的电源

您使用的电源和电源配置是什么

相关问题 更多 >