es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo ejecutar una parte de un módulo de Python solo una vez?

Estoy creando un controlador PID para un coche RC con control de crucero en python, y quiero separarlo en un módulo para que el código principal se vea más limpio. Puedo hacer esto, pero el problema sería que tendría que crear un objeto una vez para el controlador PID y establecer sus constantes, y la parte restante del código debería ejecutarse cada vez que se llame a la función.

Este es mi código para el controlador PID:

from simple_pid import PID

def PID(rpm_array1, target_speed):
    Kp = 80
    Ki = 60
    Kd = 0.01
    Kf = 180 / target_speed

    pid = PID(Kp, Ki, Kd)
    pid.sample_time = 0.05

    avg_rpm_rear = (rpm_array1[2]+rpm_array1[3])/2
    speed = (avg_rpm_rear/60)*0.355; 

    pid.setpoint = target_speed

    x = pid(speed)

    pid_output = x + (target_speed * Kf)
    if(pid_output>0):
        throttle_target = pid_output+1455

    if throttle_target >= 2500 :
        throttle_target = 2500
    elif throttle_target <= 1455 :
        throttle_target = 1455

    return throttle_target

Y me gustaría usarlo así:

import PID_module

while True:
    target_throttle = PID_module.PID(rpm_array1, target_speed)

¿Cuál sería la manera correcta de hacer esto?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para separar el controlador PID en un módulo, se pueden definir las constantes PID como variables globales en el módulo y crear el objeto PID en una función separada. Aquí hay una implementación de ejemplo:

    desde simple_pid import PID
    
    Kp = 80
    Ki = 60
    Kd = 0.01
    Kf = Nada
    pid = Nada
    
    def init_pid(target_speed):
        global pid, Kf
        Kf = 180 / target_speed
        pid = PID(Kp, Ki, Kd)
        pid.tiempo de muestra = 0.05
        pid.punto de ajuste = target_speed
    
    def get_throttle_target(rpm_array1):
        avg_rpm_rear = (rpm_array1[2] + rpm_array1[3]) / 2
        velocidad = (avg_rpm_rear / 60) * 0.355
        x = pid(velocidad)
        pid_output = x + (pid.punto de ajuste * Kf)
        throttle_target = pid_output + 1455
        if throttle_target >= 2500:
            throttle_target = 2500
        elif throttle_target <= 1455:
            throttle_target = 1455
        return throttle_target
    

    Luego se puede usar este módulo de la siguiente manera:

    importar PID_module
    
    PID_module.init_pid(target_speed)
    
    while Verdadero:
        target_throttle = PID_module.get_throttle_target(rpm_array1)
    

    De esta manera, el objeto PID se crea solo una vez cuando se llama a init_pid() y las constantes se almacenan en variables globales. La función get_throttle_target() se puede llamar repetidamente con diferentes valores de rpm_array1.

Comments are closed.