我有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
答案 0 :(得分:2)
假设您有两个包含int
的文件 - 每行一个。
这是in_1.txt
:
12
15
117
1
这是in_2.txt
:
22
25
217
2
以下是一步一步如何根据您的需要处理这些文件。
以下代码将能够读取其自己的 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]
为了简单起见,我在拥有列表中读取每个文件,然后将它们合并到中。但是,根据数据文件的大小,它们可能是更加内存友好的方式来读取它们。无论如何,让我们进一步处理“合并”......
您可以使用extends
data1.extend(data2)
print "data1 =", data1
产:
data1 = [12, 15, 117, 1, 22, 25, 217, 2]
最后,您必须将列表中的内容写入每行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
假设您仍然在data1
和data2
步骤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)]
最后,假设您必须将对写入“空格分隔”文件:
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
的每个实例......它应该可以工作。