Как синхронно сэмплировать две системы с помощью python

Мне нужно получить образцы из двух систем:

  1. Видеозахват (например, OpenCV)
  2. Электромагнитная система слежения.

Выборки должны быть синхронизированы, время выборки должно быть максимально стабильным, а общее время захвата ограничено.

Для этого я разработал две функции (update, update2) и попытался выполнить их с помощью потоков, взяв за отправную точку один из примеров, приведенных в разделе «Выполнять определенный код каждые n секунд» .

Код:

      from threading import Timer, Thread, Event
from threading import Timer, Thread, Event
import polhemus # Package for Tracker system

import cv2, time
import numpy as np
import matplotlib.pyplot as plt

class InfiniteTimer():
    """A Timer class that does not stop, unless you want it to."""

    def __init__(self, seconds, target):
        self._should_continue = False
        self.is_running = False
        self.seconds = seconds
        self.target = target
        self.thread = None

    def _handle_target(self):
        self.is_running = True
        self.target()
        self.is_running = False
        self._start_timer()

    def _start_timer(self):
        if self._should_continue: # Code could have been running when cancel was called.
            self.thread = Timer(self.seconds, self._handle_target)
            self.thread.start()

    def start(self):
        if not self._should_continue and not self.is_running:
            self._should_continue = True
            self._start_timer()
        else:
            print("Timer already started or running, please wait if you're restarting.")

    def cancel(self):
        if self.thread is not None:
            self._should_continue = False # Just in case thread is running and cancel fails.
            self.thread.cancel()
        else:
            print("Timer never started or failed to initialize.")


src=0 # Computer camera
track = polhemus.polhemus() # Tracker system
check =track.Initialize()
capture = cv2.VideoCapture(src) # Video capture system
capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
capture.read()
frames=[]
pos=[]

def update(): # Function for image data capturing
    t11=time.time()                    
    (_, frame) = capture.read() # get one sample from OpenCV
    t21=time.time()
    frames.append((frame,[t11,t21])) # save sample
    
def update2(): #Function for pose data capturing
    if check: 
        t1=time.time()
        track.Run()   # get one sample from Tracker 
        t2=time.time()
        pose=[track.PositionTooltipX1, track.PositionTooltipY1, track.PositionTooltipZ1, 
              track.AngleX1, track.AngleY1, track.AngleZ1]
        pos.append((pose,[t1,t2])) # save sample
    else:
        print('Tracker not connected')

def mainUpdate(): # main function to sample the two systems at time
    Thread(target=update).start()
    Thread(target=update2).start()
    
print('Recording starts at',time.time())

tObject=InfiniteTimer(0.04,mainUpdate) # Execute mainUpdate every 0.04 seconds (25 samples per second)
tObject.start()
time.sleep(5)   # Total Capture time
tObject.cancel()

print('Recording ends at', time.time())

Полученные результаты

Я установил период выборки 0,04 секунды и общее время захвата 5 секунд; это должно генерировать примерно 25 выборок в секунду, то есть 125 выборок за весь захват.

Однако я получил только 102 выборки с периодом выборки, который варьируется от 0,045 до 0,065 секунды.

Есть ли способ синхронно сэмплировать обе системы со стабильным периодом сэмплирования?

Заранее спасибо.

0 ответов

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