Можете ли вы синхронизировать набор инструментов для сбора данных и набор инструментов для сбора изображений в Matlab?

Я хотел бы одновременно получать данные с камеры (то есть изображение) и аналоговое напряжение с помощью Matlab. Для камеры я использую набор инструментов imaq, для считывания напряжения я использую набор инструментов daq (считывание устройства NI-USB) со следующим кодом:

clear all
% Prepare camera
vid = videoinput('gentl', 1, 'Mono8');
src = getselectedsource(vid);
vid.FramesPerTrigger = 1;
vid.TriggerRepeat = Inf;
triggerconfig(vid, 'hardware', 'DeviceSpecific', 'DeviceSpecific');
src.FrameStartTriggerMode = 'On';
src.FrameStartTriggerActivation = 'RisingEdge';

% prepare DAQ
s=daq.createSession('ni');
s.addAnalogInputChannel('Dev1','ai1','Voltage');
fid = fopen('log.txt','w');
lh = s.addlistener('DataAvailable',@(src,event)SaveData(fid,event));
s.IsContinuous = true;

% Take data
s.startBackground();
start(vid)
N=10;
for ii=1:N
    im(:,:,ii)=getsnapshot(vid);
end


% end code
delete(lh );
fclose('all');
stop(vid)
delete(vid)

где функция SaveData:

function SaveData(fid,event)
     time = event.TimeStamps;
     data = event.Data;
     fprintf(fid, '%f,%f\n ', [time data]);
end

Я получаю изображения и файл log.txt со следом daq (время и данные), но как я могу использовать внешний запуск (который запускает камеру) или другие часы для их синхронизации? В этом примере daq считывает сигнал TTL запуска камеры (@ 50 Гц), поэтому я хочу назначить каждый импульс TTL изображению.

Приложение: Я искал и нашел несколько обсуждений (например, это one) по теме и прочтите примеры, которые можно найти на веб-сайте Mathworks, но не нашли ответа. В документации показано, как Начать сбор данных с несколькими триггерами по внешнему событию, но обсуждаемое получение актуально только для ввода на основе DAQ, а не для ввода на основе камеры (он также работает на переднем плане) .


person Community    schedule 23.02.2013    source источник
comment
В MATLAB ничего прямого не существует; вы можете захотеть использовать внешнюю многопоточную библиотеку C ++ на основе Mex или решение на основе Simulink.   -  person Arcturus    schedule 23.02.2013
comment
Какое устройство вы используете для записи напряжения?   -  person H.Muster    schedule 23.02.2013
comment
Я не понимаю, почему это должно иметь значение, но вы можете видеть в коде, что это устройство NI (USB-считыватель аналогового напряжения, такой как USB6009)   -  person    schedule 26.02.2013
comment
Почему бы вам не записать сигнал TTL, который запускает камеру, с помощью NI через дополнительный аналоговый входной канал? Затем вы можете назначить изображения для данных напряжения в первом аналоговом канале впоследствии, сопоставив данные с импульсами во втором аналоговом входном канале.   -  person H.Muster    schedule 06.03.2013
comment
Я пробовал это, но всегда есть некоторая задержка между daq и камерой, поэтому, пока записывается сигнал запуска, только через некоторое время камера срабатывает. Другими словами, для обработки требуется s.startBackground(); около 0.15 секунд, за это время я записали несколько из этих триггеров, но фотоаппарат еще не начался ...   -  person    schedule 10.03.2013


Ответы (3)


Это не решит полностью вашу проблему, но этого может быть достаточно. Поскольку сигнал синхронизации, который вам нужен, имеет частоту 50 Гц, вы можете использовать clock для создания отметок времени для обоих типов ваших данных (изображение с камеры и аналоговое напряжение). Поскольку функция clock практически не занимает времени (т.е. менее 1e-7 секунд), вы можете попробовать изменить свою SaveData функцию соответствующим образом:

fprintf(fid, '%f,%f\n ', [clock time data]);

И в цикле for добавьте:

timestamp(i,:)=clock;
person bla    schedule 05.03.2013
comment
Возможно, лучше использовать tic и toc, которые Mathworks рекомендует для измерения времени, поскольку они не полагаются на вызовы системного времени. - person reverse_engineer; 07.03.2013

Можете ли вы использовать синхронизацию для запуска доски объявлений? Из руководства USB-6009 ...

Использование PFI 0 в качестве цифрового триггера - когда задана задача аналогового входа, вы можете сконфигурировать PFI 0 как цифровой триггерный вход. Когда цифровой триггер включен, задача AI ожидает нарастающего или спадающего фронта на PFI 0 перед началом сбора данных. Чтобы использовать AI Start Trigger (ai / StartTrigger) с цифровым источником, укажите PFI 0 в качестве источника и выберите нарастающий или спадающий фронт.

Мой опыт подсказывает, что задержка между триггером и AQ очень короткая.

Извините, я использую для этого Python или C, поэтому я не могу дать вам код MatLab, но вы хотите посмотреть на такие функции, как.

/* Select trigger source */
Select_Signal(deviceNumber, ND_IN_START_TRIGGER, ND_PFI_0, ND_HIGH_TO_LOW);

/* specify that a start trigger is to be used */
DAQ_Config(deviceNumber, startTrig, extConv); // set startTrig = 1

/* start the acquisition */ 
DAQ_Start(deviceNumber, …)

Если вы хотите пойти по этому пути, вы можете почерпнуть больше идей по адресу: http://www.ni.com/white-paper/4326/en

Надеюсь, это поможет, Карл

person Carl Houtman    schedule 25.03.2013

Это еще не полное решение, но некоторые мысли могут быть полезны.

Я получаю изображения и файл log.txt со следом daq (время и данные), но как я могу использовать внешний запуск (который запускает камеру) или другие часы для их синхронизации?

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

person s-m-e    schedule 08.03.2013