__init __

时间:2018-11-23 16:38:42

标签: python pid attributeerror micropython

编辑:感谢古老的拔插一切的传统,使它可以正常工作;我重新刷新了WiPy模块并重新安装了Pymakr插件。

我目前正在为micropython编写PID控制器(我们必须制作一个linefollower)。我已经在microPython中将PID算法实现为一个类。

我将使用Pycom的WiPy模块来控制我的线跟随器。

现在,实际程序并没有做太多事情,我只是想测试程序是否相当快,因此我对输入和K值有一些随机数,而输出函数只是留空。

但是,每当我尝试运行一个小的测试脚本来创建对象并计算PID达100次时,都会在PID类的 init 中得到attributeError。这是给我带来麻烦的方法:

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 :(得分:0)

您收到此错误,是因为您尝试分配一个尚未声明的属性,并且我假设您使用的是python 2  经典的班级风格。在您的PID类中为last_calculate_time添加last_calculate_time = None的定义,然后按预期运行。

一种更合适的方法是将object作为参数传递给您的类定义,如下所示,从而将其视为“新样式类”:

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

更多信息,请访问:https://wiki.python.org/moin/NewClassVsClassicClass