__init__ 中的 microPython 属性错误
microPython attributeError in __init__
编辑:多亏了拔掉再插上所有东西的古老传统,我让它开始工作了;我刷新了 WiPy 模块并重新安装了 Pymakr 插件。
我目前正在为 micropython 编写 PID 控制器(我们必须制作一个线跟随器)。我已经在 microPython 中将 PID 算法实现为 class.
我将使用 Pycom 的 WiPy 模块来控制我的线跟随器。
现在实际的程序并没有做太多,我只是想测试程序是否相当快,因此我有一些随机数作为输入和 K 值,输出函数就剩下了空。
然而,每当我尝试 运行 一个创建对象并计算 PID 100 次的小测试脚本时,我在 init 中得到一个 attributeError PID-class。这是给我带来麻烦的方法:
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
您收到此错误是因为您试图分配一个尚未声明的属性,我假设您使用的是 python 2
classic class 风格。在您的 PID class 中添加 last_calculate_time
的定义,例如 last_calculate_time = None
然后它应该按预期工作。
更合适的方法是将 object
作为参数传递给您的 class 定义,如下所示,使其被视为新样式 Class:
class PID(object):
def __init__(self):
self.last_calculate_time = utime.ticks_ms()
编辑:多亏了拔掉再插上所有东西的古老传统,我让它开始工作了;我刷新了 WiPy 模块并重新安装了 Pymakr 插件。
我目前正在为 micropython 编写 PID 控制器(我们必须制作一个线跟随器)。我已经在 microPython 中将 PID 算法实现为 class.
我将使用 Pycom 的 WiPy 模块来控制我的线跟随器。
现在实际的程序并没有做太多,我只是想测试程序是否相当快,因此我有一些随机数作为输入和 K 值,输出函数就剩下了空。
然而,每当我尝试 运行 一个创建对象并计算 PID 100 次的小测试脚本时,我在 init 中得到一个 attributeError PID-class。这是给我带来麻烦的方法:
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
您收到此错误是因为您试图分配一个尚未声明的属性,我假设您使用的是 python 2
classic class 风格。在您的 PID class 中添加 last_calculate_time
的定义,例如 last_calculate_time = None
然后它应该按预期工作。
更合适的方法是将 object
作为参数传递给您的 class 定义,如下所示,使其被视为新样式 Class:
class PID(object):
def __init__(self):
self.last_calculate_time = utime.ticks_ms()