Ошибка атрибута microPython в __init__ - PullRequest
0 голосов
/ 23 ноября 2018

РЕДАКТИРОВАТЬ: Благодаря вековой традиции отключать и подключать все обратно я получил его на работу;Я перепрошил модуль WiPy и переустановил плагин Pymakr.

В настоящее время я нахожусь в процессе написания PID-контроллера для micropython (мы должны сделать линейный подписчик).Я реализовал алгоритм PID в microPython как класс.

Я буду использовать модуль WiPy от Pycom для управления моим линейным подписчиком.

Пока что настоящая программа мало что делает, яЯ просто хотел проверить, была ли программа достаточно быстрой, поэтому у меня есть несколько случайных чисел для ввода и значений K, а функция вывода просто оставлена ​​пустой.

Однако всякий раз, когда я пытаюсь выполнить небольшой тестВ сценарии, в котором я создаю объект и вычисляю PID 100 раз, я получаю attributeError в init класса PID.Этот метод доставляет мне неприятности:

def __init__(self, input_func, output_func, P_factor=1.0, I_factor=0.0,
             D_factor=0.0):

    ... previous variable declarations ...

    # Initializer for the time. This will form the basis for the timebased
    # calculations. This time will mark the start of a time-block.
    self.last_calculate_time = utime.ticks_ms()

Последняя строка вызывает у меня проблемы.В основной программе есть это:

def motorOutput(PID_output):
    """
    Function for driving the two motors depending on the PID output.
    """
    pass

def generateInput():
    """
    Return a random float
    """
    return 2.5


if __name__ == "__main__":

    print("creating PID controller")
    PID_controller = PID.PID(generateInput, motorOutput, 1.0, 0.5, 1.5)
    counter = 0
    print("starting loop")
    while counter < 1000:
        counter += 1
        PID_controller.calculate()

    print("finished loop")

Это вывод, который я получаю при запуске файла:

>>> Running main.py

>>>
>>> creating PID controller
╝Traceback (most recent call last):
File "<stdin>", line 60, in <module>
File "/flash/lib/PID.py", line 95, in __init__
AttributeError: 'PID' object has no attribute 'last_calculate_time'
╝>
MicroPython v1.8.6-621-g17ee404e on 2017-05-25; WiPy with ESP32

1 Ответ

0 голосов
/ 23 ноября 2018

Вы получаете эту ошибку, потому что вы пытаетесь назначить атрибут, который не был объявлен, и я предполагаю, что вы используете классический стиль класса Python 2.Добавьте определение для last_calculate_time в свой класс PID, например last_calculate_time = None, и тогда оно должно работать как положено.

Более подходящим подходом будет передача object в качестве аргумента для определения вашего класса, как показано ниже:вызывая его как новый класс стиля:

class PID(object):
    def __init__(self):
        self.last_calculate_time = utime.ticks_ms()

Более подробную информацию можно увидеть по адресу: https://wiki.python.org/moin/NewClassVsClassicClass

...