Высокоточный миллисекундный таймер в Matlab - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь реализовать высокоточный таймер миллисекундной шкалы в Matlab. Каждые T секунд я хочу запрашивать камеру, связанную с matlab, и, если в памяти есть изображение, я хочу вытащить его. Фактическое подключение к камере простое, но проблема возникает из-за того, что изображения поступают через каждые ~ 60 мс, и все они должны быть сняты до того, как другое изображение попадет в буфер камеры. По сути, это означает, что мне нужно проверять буфер камеры, по крайней мере, каждые ~ 30 мс, а в идеале каждые ~ 5 мс.

Хотя встроенная в MATLAB функция timer якобы допускает синхронизацию в миллисекундах, она страдает от низкой точности. В то время как в> 95% выполнений встроенный таймер MATLAB действительно останавливается на ~ 5 мс между циклами, в ~ 5% случаев он колеблется около ~ 30 мс, а в ~ 1% случаев он занимает> 100 мс между выполнениями, что недопустимо убиваетпредставление. В защиту MATLAB я должен уточнить, что одновременно работают два других таймера (оба с периодами 1 с), а также открыто несколько графических окон, так что, хотя моя машина работает некорректно (16-ядерная, 64 ГБ ОЗУ), естьконечно много надо делать все сразу. Я попытался использовать таймеры на основе таймеров .NET (System.Timers.Timer(period)), а также с функцией ожидания Java (java.lang.Thread.sleep(period)), которые теоретически должны быть более точными, и хотя оба они лучше, чем таймер MATLAB (настоимость того, чтобы быть более громоздкой), ни одна из них не может последовательно достичь задержки выполнения <60 мс на протяжении тысяч итераций. </p>

Может быть, я прошу что-то, что не реализуемо - но я надеюсь, что есть какой-то способ реализоватьвысокоточный таймер в MATLAB, который будет продолжать работать в масштабе времени мс, даже если есть другие фигуры / таймеры / команды, выполняемые полуодновременно. Возможно, мне следует уточнить, что при работе только с таймером, когда другие таймеры / цифры не открыты, я могу последовательно достигать выполнения <60 мс (и действительно, последовательное выполнение <10 мс для периода таймера 5 мс). Это возможно, даже когда все эти таймеры / цифры открыты в другом экземпляре MATLAB, поэтому, похоже, проблема состоит в том, чтобы каким-то образом отделить таймер от остальной части MATLAB. В этом отношении будут приветствоваться любые советы или рекомендации. </p>

1 Ответ

0 голосов
/ 06 ноября 2019

В зависимости от того, что именно вы делаете, вам может помочь система синхронизации Psychtoolbox .

В частности, ознакомьтесь с функцией WaitSecs и ее документацией. Предполагается, что он более точный, чем timer, и документация содержит несколько советов по достижению высокой точности синхронизации в целом.

Также связана функция GetSecs.

Однако может случиться так, что переключение на WaitSecs вам не поможет. В этом случае вы можете быть совершенно уверены, что ваша машина слишком загружена, чтобы делать то, что вы пытаетесь сделать.

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