Python PID контроль с текстовыми файлами
У меня есть 2 TXT-файла со значениями, один с x координатами точки 1 и один с x координатами точки 2, точка 2 должна следовать за точкой 1, и после выполнения разницы между точками через регулятор мне нужно получить скорость для точки 2 из регулятора построчно, скажем, каждые 8 мс, так как система дискретна
вкратце: чтение строки из txt точки 1 и точки 2 проходит скорость записи регулятора для точки 2, и это каждые 8 мс или медленнее, не имеет значения
координаты точек перечислены в текстовых файлах построчно, у меня уже есть код для регулятора (ниже), но я не знаю, как это сделать с текстовыми файлами, так как я только начал использовать python
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 ответ
Скажем, у вас есть два файла, содержащие 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]
Здесь я читаю каждый файл в своем собственном списке, чтобы потом объединить его для простоты. Но, в зависимости от размера ваших файлов данных, они могут быть более удобными для чтения способами. В любом случае, давайте обработать дальше до "слияния"...
Шаг 2а: объединение обоих списков
Вы можете добавить все элементы списка к другому, используя extends
:
data1.extend(data2)
print "data1 =", data1
Производство:
data1 = [12, 15, 117, 1, 22, 25, 217, 2]
Шаг 3а: запись данных в выходной файл
Наконец, вы должны написать содержание в списке 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: создание пар данных
Скажи, что у тебя еще есть data1
а также data2
списки, найденные в конце шага 1. Но теперь вы хотите соединить их парой. Поскольку / если у вас два списка одинаковой длины, вы можете использовать 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
... и это должно работать.