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... и это должно работать.

Другие вопросы по тегам