2011-07-18 4 views
2

두 대의 컴퓨터 사이에 UDP 연결을 만들어야합니다. 컴퓨터 A는 각 4 밀리 초를 보내야합니다. 컴퓨터 B로가는 패킷, B에게 로봇 팔을 어디서 어떻게 움직일 지 알려줍니다. B 컴퓨터는 팔 위치 속도와 가속도 및 위탁과 위치 사이의 오차를 다시 전송합니다 ...파이썬을 사용하여 결정 시간 소켓 연결 만들기

컴퓨터가 잘 작동하지만 볼 수없는 C 코드 프로그램이 있습니다. 로봇 때문에 나는 파이썬 코드 만 받아들이는 것으로 일하고있다. 나는 하나의 스레드가 오류와 위치를 되돌려 보내는 유일한 기능을 가진 다중 쓰레드 프로그램으로 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는))는"인수는 파이썬 인터프리터는 말한다 :

Exception in thread Thread-3:

Traceback (most recent call last):

File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner

self.run() 

File "./conclase.py", line 210, in run

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

IOError: [Errno 22] Invalid argument

만약 I decsec을 사용합니다. 대신 miliseconds 프로그램은 오류를 제공합니다.

내가 발견 한 두 번째이자 마지막 문제는 타이밍이 결정적이지 않다는 것입니다. 이 작은 조각의 코드를 실행하고 종료하는 Python에서 시간 제한 이벤트를 만들 수있는 방법이 있습니까?

저는 많은 문제가 있습니다. 저는 누군가이 질문에 답변하고 다른 사람들에게 유용하기를 바랍니다.

모두에게 감사드립니다. stackoverflow 및 사용하는 모든 사람들이 환상적입니다!

+1

식별자를 영어로 번역하면 도움이됩니다. –

답변

2

time.sleep에 음수 인수를 전달하면 errno 22가 표시됩니다.

self.acaba 및 self.empieza의 값은 무엇입니까? 두 통화 사이의 경과 시간이 4ms를 초과하면 실패합니다.

정기적 인 콜백 받기는 OS에 따라 다릅니다. SIGALRM을 사용하여 유닉스 시스템에서이를 얻을 수 있습니다. 자세한 내용은 http://docs.python.org/library/signal.html을 참조하십시오. 하지만 신호와 스레드는 잘 어울리지 않습니다.

multithreaded 코드에서 잘 통합 된 stdlib에서 sched 모듈을 볼 수도 있습니다.

+0

둘 다의 값을 확인하겠습니다. 아마도 실행 시간이 4 밀리 초를 초과 할 수도 있습니다. 일반적으로 실행하는 데 0.00047 초가 걸리지 만 결정적이지는 않습니다. 신호도 확인해 보겠습니다. 감사합니다. – Jubeor

1
time.sleep(max(0, <your time formula>)) # protect from negative time 
커널이 HZ로 컴파일하지 않는 한 안정 4ms의에 도달하기 어려울 수 있습니다

적어도 1000 프로그램이 이상 사용하는 경우 또한, 말을 프로그램이 제대로 "실시간"스레드를 예약하기에 충분한 유휴 CPU 잎 확인 90 % cpu, 당신은 적시에 깨우기를 얻지 못할 것입니다.

UDP 쿼리를 4ms마다 안정적으로 얻는다면, 그 타이밍을 벗어날 수 있습니다. 당신은 타이밍의 소스가없는 경우,이 같은 것을 할 수있는이 데이터를 보내기를 건너 뛰하지 않습니다

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` 

,하지만 물론 하나의 자료가 지연 될 수있다, 즉, 올바른 주파수를 가질 것이다 지터가있을 수 있습니다.