Этот пример показывает, как сгенерировать код С для функции MATLAB, которая обрабатывает данные, зарегистрированные от тестового автомобиля, и отслеживает объекты вокруг этого.
Автоматическая генерация кода из кода MATLAB обладает двумя ключевыми преимуществами:
Прототипы могут быть разработаны и отлажены в среде MATLAB. Если работа MATLAB сделана, автоматическая генерация кода C делает алгоритмы развертываемыми на различных целях. Кроме того, код С может быть далее протестирован путем выполнения скомпилированного файла MEX в среде MATLAB с помощью тех же инструментов визуализации и анализа, которые были доступны во время фазы прототипирования.
После генерации кода С можно сгенерировать исполняемый код, который во многих случаях запускается быстрее, чем код MATLAB. Улучшенное время выполнения может использоваться, чтобы разработать и развернуть сплав датчика в реальном времени и системы слежения. Это также обеспечивает, лучший способ обработать в пакетном режиме тестируют системы слежения на большом количестве наборов данных.
Пример объясняет, как изменить код MATLAB в Прямом Столкновении, Предупреждающем Используя пример Fusion Датчика, чтобы поддержать генерацию кода.
Этот пример требует лицензии MATLAB® Coder™ на генерацию кода С.
Можно узнать об основах генерации кода, использующей MATLAB Coder от Введения до Генерации кода с Соответствием Функции и Регистрацией (Computer Vision Toolbox) пример.
Чтобы сгенерировать код С, MATLAB Coder требует, чтобы код MATLAB был в форме функции. Кроме того, аргументы функции не могут быть классами MATLAB.
В этом примере код для примера прямого предупреждения столкновения (FCW) был реструктурирован таким образом, что функции, которые выполняют сплав датчика и отслеживание, находятся в отдельном файле, названном trackingForFCW_kernel.m
. Рассмотрите этот файл для важной информации о выделении памяти для генерации кода.
Чтобы сохранить состояние multiObjectTracker
между вызовами trackingForFCW_kernel.m
, средство отслеживания задано как переменная
.persistent
Эта функция берет в качестве входа кадр записанных данных, которые включают:
Объекты видения - struct
, который содержит 10 объектов видения.
Радарные объекты - struct
, который содержит 36 радарных объектов.
Инерционное измерение - struct
, содержащий скорость и уровень отклонения от курса.
Отчеты маршрута - массив struct
с параметрами для левых и правых контуров маршрута.
Точно так же выходные параметры от функции, которая поддерживает генерацию кода, не могут быть объектами. Выходные параметры от trackingForFCW_kernel.m
:
Подтвержденные дорожки - массив struct
, который содержит переменное количество дорожек.
Маршрут эго - массив struct
с параметрами левых и правых контуров маршрута.
Количество дорожек - целочисленный скаляр.
Информация о самом важном объекте (MIO) и предупреждении уровня от логики FCW.
Путем реструктуризации кода этот путь можно снова использовать те же инструменты отображения, используемые в примере FCW. Эти инструменты, все еще запущенные в MATLAB и, не требуют генерации кода.
Запустите следующие строки кода, чтобы загрузить записанные данные и подготовить отображение похожим способом к примеру FCW.
% If a previous tracker is defined, clear it clear trackingForFCW_kernel % Set up the display videoFile = '01_city_c2s_fcw_10s.mp4'; sensorConfigFile = 'SensorConfigurationData.mat'; [videoReader, videoDisplayHandle, bepPlotters, sensor] = helperCreateFCWDemoDisplay(videoFile,sensorConfigFile); % Read the recorded detections file detfile = '01_city_c2s_fcw_10s_sensor.mat'; [visionObjects, radarObjects, imu, lanes, timeStep, numSteps] = helperReadSensorRecordingsFile(detfile); % An initial ego lane is calculated. If the recorded lane information is % invalid, define the lane boundaries as straight lines half a lane % distance on each side of the car. laneWidth = 3.6; % meters egoLane = struct('left', [0 0 laneWidth/2], 'right', [0 0 -laneWidth/2]); % Prepare some time variables time = 0; % Time since the beginning of the recording index = 0; % Index into the recorded sensor data % Define the position and velocity selectors: % The state vector is in constant acceleration: [x;vx;ax;y;vy;ay] % Constant acceleration position: [x;y] = [1 0 0 0 0 0; 0 0 0 1 0 0] * State positionSelector = [1 0 0 0 0 0; 0 0 0 1 0 0]; % Constant acceleration velocity: [x;y] = [0 1 0 0 0 0; 0 0 0 0 1 0] * State velocitySelector = [0 1 0 0 0 0; 0 0 0 0 1 0];
Теперь запустите пример путем вызывания функции trackingForFCW_kernel
в MATLAB. Это начальное выполнение обеспечивает базовую линию, чтобы сравнить результаты и позволяет вам собрать некоторые метрики о производительности средства отслеживания, когда это запускается в MATLAB или как файл MEX.
% Allocate memory for number of tracks and time measurement in MATLAB numTracks = zeros(1, numSteps); runTimes = zeros(1, numSteps); while index < numSteps && ishghandle(videoDisplayHandle) % Update scenario counters index = index + 1; time = time + timeStep; tic; % Call the MATLAB tracking kernel file to perform the tracking [tracks, egoLane, numTracks(index), mostImportantObject] = trackingForFCW_kernel(... visionObjects(index), radarObjects(index), imu(index), lanes(index), egoLane, time, positionSelector, velocitySelector); runTimes(index) = toc; % Gather MATLAB run time data % Update video and bird's-eye plot displays frame = readFrame(videoReader); % Read video frame laneBoundaries = [parabolicLaneBoundary(egoLane.left);parabolicLaneBoundary(egoLane.right)]; helperUpdateFCWDemoDisplay(frame, videoDisplayHandle, bepPlotters, laneBoundaries, sensor, ... tracks, mostImportantObject, positionSelector, velocitySelector, visionObjects(index), radarObjects(index)); end
Используйте функцию codegen
, чтобы скомпилировать функцию trackingForFCW_kernel
в файл MEX. Можно задать опцию -report
, чтобы сгенерировать отчет компиляции, который показывает оригинальный код MATLAB и связанные файлы, которые были созданы во время генерации кода C. Рассмотрите создание временной директории, где MATLAB Coder может хранить сгенерированные файлы. Обратите внимание на то, что, если вы не используете опцию -o
, чтобы задать имя исполняемого файла, сгенерированный файл MEX имеет то же имя как исходный файл MATLAB с добавленным _mex
.
MATLAB Coder требует, чтобы вы задали свойства всех входных параметров. Входные параметры используются средством отслеживания, чтобы создать правильные типы данных и размеры для объектов, используемых в отслеживании. Типы данных и размеры не должны изменяться между кадрами данных. Один простой способ сделать это должно задать входные свойства на примере в командной строке с помощью опции -args
. Для получения дополнительной информации смотрите, Задают Входные свойства на примере в Командной строке (MATLAB Coder).
% Define the properties of the input based on the data in the first time frame. compInputs = {visionObjects(1), radarObjects(1), imu(1), lanes(1), egoLane, time, positionSelector, velocitySelector}; % Code generation may take some time. h = msgbox({'Generating code. This may take a few minutes...';'This message box will close when done.'},'Codegen Message'); % Generate code. try codegen trackingForFCW_kernel -args compInputs; close(h) catch ME close(h) delete(videoDisplayHandle.Parent.Parent) throw(ME) end
Теперь, когда код был сгенерирован, запустите тот же самый сценарий со сгенерированным файлом MEX trackingForFCW_kernel_mex
. Все остальное остается то же самое.
% If a previous tracker is defined, clear it clear trackingForFCW_kernel_mex % Allocate memory for number of tracks and time measurement numTracksMex = zeros(1, numSteps); runTimesMex = zeros(1, numSteps); % Reset the data and video counters index = 0; videoReader.CurrentTime = 0; while index < numSteps && ishghandle(videoDisplayHandle) % Update scenario counters index = index + 1; time = time + timeStep; tic; % Call the generated MEX file to perform the tracking [tracks, egoLane, numTracksMex(index), mostImportantObject] = trackingForFCW_kernel_mex(... visionObjects(index), radarObjects(index), imu(index), lanes(index), egoLane, time, positionSelector, velocitySelector); runTimesMex(index) = toc; % Gather MEX run time data % Update video and bird's-eye plot displays frame = readFrame(videoReader); % Read video frame laneBoundaries = [parabolicLaneBoundary(egoLane.left);parabolicLaneBoundary(egoLane.right)]; helperUpdateFCWDemoDisplay(frame, videoDisplayHandle, bepPlotters, laneBoundaries, sensor, ... tracks, mostImportantObject, positionSelector, velocitySelector, visionObjects(index), radarObjects(index)); end
Сравните результаты и производительность сгенерированного кода по сравнению с кодом MATLAB. Следующие графики сравнивают количество дорожек, сохраняемых средствами отслеживания на каждом временном шаге. Они также показывают количество времени, которое это заняло, чтобы обработать каждый вызов функции.
figure(2) subplot(2,1,1) plot(2:numSteps, numTracks(2:end), 'rs-', 2:numSteps, numTracksMex(2:end), 'bx-') title('Number of Tracks at Each Step'); legend('MATLAB', 'MEX') grid subplot(2,1,2) yyaxis left plot(2:numSteps, runTimesMex(2:end)*1e3); ylabel('MEX Procssing Time (ms)'); yyaxis right plot(2:numSteps, runTimes(2:end) ./ runTimesMex(2:end)) ylabel('Speed-Up Ratio'); title('MEX Processing Time and Speed-Up Ratio at Each Step') grid xlabel('Time Step')
Главный график показывает, что количество дорожек, которые сохранялись каждым средством отслеживания, является тем же самым. Это измеряет размер проблемы отслеживания с точки зрения количества дорожек.
Нижний график показывает время, требуемое для кода MATLAB и функций сгенерированного кода, чтобы обработать каждый шаг. Обратите внимание на то, что первый шаг требует непропорционально более длительного времени, потому что средства отслеживания должны быть созданы в первом шаге. Таким образом первый временной шаг проигнорирован.
Результаты показывают, что код MEX намного быстрее, чем код MATLAB. Они также показывают количество миллисекунд, требуемых кодом MEX выполнять каждый шаг обновления на вашем компьютере. Например, на компьютере с тактовой частотой ЦП 2,6 ГГц, запускающих Windows 7, время, требуемое для кода MEX запускать шаг обновления, составляло меньше чем 4 мс. Как ссылка, записанные данные, используемые в этом примере, были выбраны каждые 50 мс, таким образом, время выполнения MEX достаточно коротко, чтобы позволить отслеживание в реальном времени.
Отобразите тактовую частоту ЦП и среднее отношение ускорения.
p = profile('info'); speedUpRatio = mean(runTimes(2:end) ./ runTimesMex(2:end)); disp(['The generated code is ', num2str(speedUpRatio), ' times faster than the MATLAB code.']); disp(['The computer clock speed is ', num2str(p.ClockSpeed / 1e9), ' GHz.']);
The generated code is 36.56 times faster than the MATLAB code. The computer clock speed is 3.601 GHz.
Этот пример показал, как сгенерировать код С из кода MATLAB для сплава датчика и отслеживания.
Основные преимущества автоматической генерации кода являются способностью моделировать в среде MATLAB, генерируя файл MEX, который может запуститься в среде MATLAB, и развертывающийся к цели с помощью кода С. В большинстве случаев сгенерированный код быстрее, чем код MATLAB и может использоваться для пакетного тестирования алгоритмов и генерации систем слежения в реальном времени.