Создание детерминированного соединения с сокетом времени с использованием Python - PullRequest
2 голосов
/ 18 июля 2011

Мне нужно создать UDP-соединение между двумя компьютерами.Компьютер A должен отправлять каждые 4 милисек.пакет на компьютер B, сообщающий B, куда и как двигать манипулятор.Компьютер B отправит обратно скорость и ускорение положения руки и ошибку между грузом и положением ...

Компьютер A работает нормально, у него есть программа на С-коде, которую я не вижу, но не показываетиз-за робота, с которым я работаю, принимаю только код Python.Я пытался сделать это на компьютере B с помощью многопоточной программы, где один поток выполняет единственную функцию - отсылать назад ошибку и положение.

В этом небольшом потоке, где я пытался определить времядля этого требуется отправить пакет UDP (teledirigido.fbk.send (...)), а затем выполнить сон, вычитая время выполнения кода из 4 милисек.

class enviaDeterministico(threading.Thread):
    def __init__(self,teledirigido):
        self.teledirigido = teledirigido
        # thanks to mordi
        threading.Thread.__init__(self)
        self.t = timeit.time
    def run(self):
        while 1:
            self.empieza0 = self.t.time()
            self.empieza = self.t.time()
            self.teledirigido.cond.acquire()
            self.teledirigido.fbk.send(self.teledirigido.lectura.enviarAmpliado())
            self.acaba = self.t.time()
            time.sleep((0.004-(self.acaba-self.empieza)))
            self.teledirigido.cond.release()
            self.acaba0 = self.t.time()
            print 'tiempo entre envios %.6f'% (self.acaba0-self.empieza0)

Первая проблема заключается в том, что режим снаМетод не содержит аргумент "(0.004- (self.acaba-self.empieza))", интерпретатор Python говорит:

Исключение в потоке Thread-3:

Traceback(последний вызов был последним):

Файл "/usr/lib/python2.6/threading.py", строка 532, в __bootstrap_inner

self.run()

Файл "./conclase.py", строка 210, в прогоне

time.sleep(0.004-(self.acaba-self.empieza))

IOError: [Errno 22] Недопустимый аргумент

Если я использую decsec.вместо миллисекунд программа не выдает ошибку.

Вторая и последняя проблема, которую я обнаружил, заключается в том, что синхронизация не совсем детерминирована.Есть ли способ сделать синхронизированное событие в Python, которое запускает этот маленький кусочек кода и завершается?

У меня много проблем, я знаю, я надеюсь, что кто-то ответит на этот вопрос, и это также принесет пользу другимлюди.

Спасибо всем!StackOverflow и все люди, которые используют это фантастика!

Ответы [ 2 ]

2 голосов
/ 18 июля 2011

Вы получаете errno 22, когда передаете отрицательный аргумент в time.sleep.

Каковы значения self.acaba и self.empieza? Если время между двумя вызовами превышает 4 мс, произойдет сбой.

Получение периодического обратного вызова зависит от вашей ОС. Вы можете получить это в системах Unix с SIGALRM. Подробнее см. http://docs.python.org/library/signal.html. Осторожно, хотя: сигналы и потоки не смешиваются хорошо.

Вы также можете посмотреть на модуль sched из stdlib, который хорошо интегрируется в многопоточный код.

1 голос
/ 12 июня 2012
time.sleep(max(0, <your time formula>))  # protect from negative time

Может быть трудно достичь стабильных 4 мс, если ваше ядро ​​не скомпилировано с HZ, по крайней мере, 1000. Также убедитесь, что ваша программа оставляет достаточно простоя процессора, чтобы правильно планировать поток в реальном времени, например, если ваша программа использует более 90% cpu, вы не получите своевременного пробуждения.

Если вы получаете ваши UDP-запросы каждые 4 мс надежно, вы можете основывать на этом свое время.Если у вас нет источника синхронизации, вы можете сделать что-то вроде этого:

class Timer(threading.Thread):
    def run(self):
        started = time.time()
        counter = 0
        while True:
            counter += 1
            now = time.time()
            if started + counter * 0.040 - now > 0:
                time.sleep(started + counter * 0.040 - now)
            # send datum number `counter`

Это не пропустит отправку данных, но, конечно, может быть задержана одна точка данных, то есть она будет иметь правильное значениечастота, но может иметь некоторое дрожание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...