exponenta event banner

Создание кода для отслеживания и слияния датчиков

В этом примере показано, как создать код C для функции MATLAB, которая обрабатывает данные, записанные из тестируемого транспортного средства, и отслеживает объекты вокруг него.

Автоматическое создание кода из кода MATLAB имеет два ключевых преимущества:

  1. Прототипы могут быть разработаны и отлажены в среде MATLAB. После выполнения работы MATLAB автоматическое формирование кода C делает алгоритмы развертываемыми для различных целей. Кроме того, код C может быть дополнительно протестирован путем запуска скомпилированного файла MEX в среде MATLAB с использованием тех же средств визуализации и анализа, которые были доступны на этапе прототипирования.

  2. После генерации кода C можно создать исполняемый код, который во многих случаях выполняется быстрее, чем код MATLAB. Улучшенное время работы может быть использовано для разработки и развертывания систем слияния и отслеживания датчиков в реальном времени. Это также обеспечивает лучший способ пакетного тестирования систем отслеживания на большом количестве наборов данных.

В примере объясняется, как изменить код MATLAB в примере предупреждения о столкновении в прямом направлении с использованием Sensor Fusion для поддержки генерации кода.

В этом примере для создания кода C требуется лицензия MATLAB ® Coder™.

Изменение и выполнение кода MATLAB

Об основах создания кода с помощью кодера MATLAB можно узнать из примера Введение в создание кода с сопоставлением и регистрацией признаков.

Для генерации кода C кодер MATLAB требует, чтобы код MATLAB имел форму функции. Кроме того, аргументами функции не могут быть классы MATLAB.

В этом примере код для примера предупреждения о прямом столкновении (FCW) был реструктурирован таким образом, что функции, выполняющие слияние датчиков и отслеживание, находятся в отдельном файле, называемом trackingForFCW_kernel.m. Просмотрите этот файл для получения важной информации о выделении памяти для создания кода.

Сохранение состояния multiObjectTracker между вызовами trackingForFCW_kernel.m, трекер определяется как persistent переменная.

Эта функция принимает в качестве входных данных кадр записанных данных, который включает в себя:

  1. Объекты зрения - A struct содержит 10 объектов зрения.

  2. Радиолокационные объекты - А struct содержит 36 радиолокационных объектов.

  3. Инерционное измерение - А struct содержащий скорость и скорость рыскания.

  4. Отчеты по переулкам - A struct массив с параметрами для левой и правой границ полосы движения.

Аналогично, выходные данные функции, поддерживающей генерацию кода, не могут быть объектами. Выходные данные trackingForFCW_kernel.m являются:

  1. Подтвержденные треки - A struct массив, содержащий переменное количество дорожек.

  2. Эго-лейн - А struct массив с параметрами левой и правой границ полосы движения.

  3. Количество дорожек - целочисленный скаляр.

  4. Информация о наиболее важном объекте (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
timeStamp  = 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;
    timeStamp = timeStamp + 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, timeStamp, 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

Компиляция функции MATLAB в файл MEX

Используйте codegen для компиляции trackingForFCW_kernel в файл MEX. Можно указать -report используется для создания отчета о компиляции, в котором отображается исходный код MATLAB и связанные файлы, созданные во время создания кода C. Рекомендуется создать временный каталог, в котором кодер MATLAB может хранить созданные файлы. Обратите внимание, что, если вы не используете -o для указания имени исполняемого файла созданный файл MEX имеет то же имя, что и исходный файл MATLAB с _mex прилагается.

Для кодера MATLAB необходимо указать свойства всех входных аргументов. Входные данные используются трекером для создания правильных типов данных и размеров для объектов, используемых в трекинге. Типы и размеры данных не должны изменяться между кадрами данных. Один простой способ сделать это - определить входные свойства на примере в командной строке с помощью -args вариант. Дополнительные сведения см. в разделе Определение входных свойств по примеру в командной строке (кодер MATLAB).

% 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, timeStamp, 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;
    timeStamp = timeStamp + 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, timeStamp, 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 Processing 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 43.4007 times faster than the MATLAB code.
The computer clock speed is 3.601 GHz.

Резюме

В этом примере показано, как генерировать код C из кода MATLAB для слияния и отслеживания датчиков.

Основными преимуществами автоматического создания кода являются возможность создания прототипа в среде MATLAB, создание файла MEX, который может выполняться в среде MATLAB, и развертывание на цели с использованием кода C. В большинстве случаев генерируемый код быстрее кода MATLAB и может использоваться для пакетного тестирования алгоритмов и создания систем слежения в реальном времени.

См. также

Связанные темы