带有txt文件的Python PID控件

时间:2013-06-17 16:40:00

标签: python feedback-loop

我有2个txt文件的值,一个x坐标为point1,一个x坐标为point2,point 2需要跟随point1,并且通过调节器运行点之间的差异后我需要获得速度从调节器逐行出点2,因为系统是离散的,所以每8ms一次

简而言之:从point1和point2的txt读取行经过调节器写入速度为point2,这个每8ms或更慢,无关紧要

点的坐标逐行列在txt文件中,我已经有了调节器的代码(下面),但是因为我刚开始使用python而不知道怎么做txt文件

class PID:
    """
    Discrete PID control
    """

    def __init__(self, P=1.3, I=0.3, D=0.0, Derivator=0, Integrator=0, Integrator_max=500, Integrator_min=-500):

        self.Kp=P
        self.Ki=I
        self.Kd=D
        self.Derivator=Derivator
        self.Integrator=Integrator
        self.Integrator_max=Integrator_max
        self.Integrator_min=Integrator_min

        self.set_point=0.0
        self.error=0.0

    def update(self,current_value):
        """
        Calculate PID output value for given reference input and feedback
        """

        self.error = self.set_point - current_value

        self.P_value = self.Kp * self.error
        self.D_value = self.Kd * ( self.error - self.Derivator)
        self.Derivator = self.error

        self.Integrator = self.Integrator + self.error

        if self.Integrator > self.Integrator_max:
            self.Integrator = self.Integrator_max
        elif self.Integrator < self.Integrator_min:
            self.Integrator = self.Integrator_min

        self.I_value = self.Integrator * self.Ki

        PID = self.P_value + self.I_value + self.D_value

        return PID

    def setPoint(self,set_point):
        """
        Initilize the setpoint of PID
        """
        self.set_point = set_point
        self.Integrator=0
        self.Derivator=0

    def setIntegrator(self, Integrator):
        self.Integrator = Integrator

    def setDerivator(self, Derivator):
        self.Derivator = Derivator

    def setKp(self,P):
        self.Kp=P

    def setKi(self,I):
        self.Ki=I

    def setKd(self,D):
        self.Kd=D

    def getPoint(self):
        return self.set_point

    def getError(self):
        return self.error

    def getIntegrator(self):
        return self.Integrator

    def getDerivator(self):
        return self.Derivator

1 个答案:

答案 0 :(得分:2)

假设您有两个包含int的文件 - 每行一个。
这是in_1.txt

12
15
117
1

这是in_2.txt

22
25
217
2

以下是一步一步如何根据您的需要处理这些文件。

步骤1:读取两个输入文件

以下代码将能够读取其自己的 Python列表中的每个文件内容:

# Read first file
with open("in_1.txt", "rt") as f:
    # in the following line, replace `int` by `float` to read ... floats
    data1 = [int(line) for line in f.readlines()]

# Read second file
with open("in_2.txt", "rt") as f:
    # in the following line, replace `int` by `float` to read ... floats
    data2 = [int(line) for line in f.readlines()]

print "data1 =", data1
print "data2 =", data2

产:

data1 = [12, 15, 117, 1]
data2 = [22, 25, 217, 2]

为了简单起见,我在拥有列表中读取每个文件,然后将它们合并到。但是,根据数据文件的大小,它们可能是更加内存友好的方式来读取它们。无论如何,让我们进一步处理“合并”......

步骤2a:连接两个列表

您可以使用extends

将列表中的所有项目附加到其他项目
data1.extend(data2)
print "data1 =", data1

产:

data1 = [12, 15, 117, 1, 22, 25, 217, 2]

步骤3a:将数据写入输出文件

最后,您必须将列表中的内容写入每行out.txt一个

with open("out.txt", "wt") as f:
    for i in data1:
        f.write("{0}\n".format(i)) 

您现在可以在out.txt中找到它:

12
15
117
1
22
25
217
2

步骤2b:产生数据对

假设您仍然在data1data2 步骤1 结尾处找到了列表。 但现在,您希望通过 pair 来配对它们。从/如果你有两个列表具有相同的长度,你可以使用zip(或更好的内存效率itertools.izip

pairs = zip(data1, data2)
print data1
print data2
print pairs

制作输出:

[12, 15, 117, 1]
[22, 25, 217, 2]
[(12, 22), (15, 25), (117, 217), (1, 2)]

步骤3b:写入输出文件,每行一对,用空格分隔

最后,假设您必须将写入“空格分隔”文件:

with open("out.txt", "wt") as f:
    for x, y in pairs:
        f.write("{0} {1}\n".format(x,y))

生成输出文件out.txt

12 22
15 25
117 217
1 2

最后一句话

最后一句话。有很多房间可以“优化”或“定制”所有这些例子。但我认为它们将向您展示从/向文件读/写整数的一些基本用法。最后,我在整数上做了所有这些。但是如果你使用浮动,则必须用int替换单词float的每个实例......它应该可以工作。