exponenta event banner

Ускорение алгоритмов робототехники с помощью генерации кода

Можно создать код для выбранных алгоритмов Robotics System Toolbox™, чтобы ускорить их выполнение. Настройте алгоритм, поддерживающий создание кода, как отдельную функцию, которую можно вставить в рабочий процесс. Для создания кода необходимо иметь лицензию MATLAB ® Coder™. Список поддержки создания кода в Robotics System Toolbox см. в разделе Функции, поддерживающие создание кода.

Для этого примера используйте inverseKinematics объект с rigidBodyTree модель робота для решения конфигураций робота, которые достигают желаемого конечного положения эффектора.

Создание отдельной функции для алгоритма

Создайте отдельную функцию, ikCodegen, который выполняет алгоритм обратной кинематики. Создать inverseKinematics объект и построить rigidBodyTree модель внутри функции. Определить %#codegen внутри функции, чтобы идентифицировать ее как функцию для генерации кода.

function qConfig = ikCodegen(endEffectorName,tform,weights,initialGuess)
	%#codegen
    
    robot = rigidBodyTree('MaxNumBodies',3,'DataFormat','row');
    body1 = rigidBody('body1');
    body1.Joint = rigidBodyJoint('jnt1','revolute');

    body2 = rigidBody('body2');
    jnt2 = rigidBodyJoint('jnt2','revolute');
    setFixedTransform(jnt2,trvec2tform([1 0 0]))
    body2.Joint = jnt2;

    body3 = rigidBody('tool');
    jnt3 = rigidBodyJoint('jnt3','revolute');
    setFixedTransform(jnt3,trvec2tform([1 0 0]))
    body3.Joint = jnt3;
    
    addBody(robot,body1,'base')
    addBody(robot,body2,'body1')
    addBody(robot,body3,'body2')


	ik = inverseKinematics('RigidBodyTree',robot);
	
	[qConfig,~] = ik(endEffectorName,tform,weights,initialGuess); 
end 

Сохраните функцию в текущей папке.

Создание кода для алгоритма

Вы можете использовать либо codegen (Кодер MATLAB) или приложение Кодер MATLAB (Кодер MATLAB) для создания кода. В этом примере создайте файл MEX путем вызова codegen в командной строке MATLAB. Укажите примеры входных аргументов для каждого ввода в функцию с помощью -args входной аргумент

Укажите примерные значения для входных аргументов.

endEffectorName = 'tool';       
tform = trvec2tform([0.7 -0.7 0]);
weights = [0.25 0.25 0.25 1 1 1];
initialGuess = [0 0 0];

Позвоните в codegen и укажите входные аргументы в массиве ячеек. Эта функция создает отдельный ikCodegen_mex функция для использования. Можно также создать код C с помощью options входной аргумент.

codegen ikCodegen -args {endEffectorName,tform,weights,initialGuess}

Если входные данные могут исходить из значений переменной длины, укажите канонический тип входных данных с помощью coder.typeof (Конструктор фиксированных точек) с помощью codegen (Кодер MATLAB).

Проверка производительности сгенерированного кода

Сравнение времени генерируемой функции MEX с временем исходной функции с помощью timeit.

time = timeit(@() ikCodegen(endEffectorName,tform,weights,initialGuess))
mexTime = timeit(@() ikCodegen_mex(endEffectorName,tform,weights,initialGuess))
time =

    0.0425


mexTime =

    0.0011

В этом примере функция MEX работает более чем в 30 раз быстрее. Результаты могут отличаться в системе.

Заменить функцию алгоритма на функцию MEX

Откройте основную функцию для запуска рабочего процесса робототехники. Замените ik вызов объекта с помощью функции MEX, созданной с помощью генерации кода. В этом примере используется простой пример трассировки пути 2-D.

Откройте 2-е Отслеживание Пути с Обратным примером Кинематики.

openExample('robotics/TwoDInverseKinematicsExampleExample')

Изменение кода примера для использования нового ikCodegen_mex функция. Следующий код является копией примера с изменениями использования новой функции MEX. Определение модели робота выполняется внутри функции, поэтому пропустите раздел «Построить робота».

Определение траектории

t = (0:0.2:10)'; % Time
count = length(t);
center = [0.3 0.1 0];
radius = 0.15;
theta = t*(2*pi/t(end));
points = center + radius*[cos(theta) sin(theta) zeros(size(theta))];

Решение по обратной кинематике

Предварительное распределение конфигурационных решений в виде матрицы qs. Укажите веса для преобразования конечного эффектора и имя конечного эффектора.

q0 = [0 0 0];
ndof = length(q0);
qs = zeros(count, ndof);
weights = [0, 0, 0, 1, 1, 0];
endEffector = 'tool';

Замкните траекторию точек, чтобы проследить окружность. Замените ik вызов объекта с помощью ikCodegen_mex функция. Вычислите решение для каждой точки, чтобы создать конфигурацию соединения, которая достигает конечного положения эффектора. Сохраните конфигурации, которые будут использоваться позже.

qInitial = q0; % Use home configuration as the initial guess
for i = 1:count
    % Solve for the configuration satisfying the desired end effector
    % position
    point = points(i,:);
    qSol = ikCodegen_mex(endEffector,trvec2tform(point),weights,qInitial);
    % Store the configuration
    qs(i,:) = qSol;
    % Start from prior solution
    qInitial = qSol;
end

Анимация решения

Теперь, когда все решения были созданы. Анимация результатов. Необходимо воссоздать робот, поскольку он был первоначально определен внутри функции. Выполните итерацию всех решений.

robot = rigidBodyTree('MaxNumBodies',15,'DataFormat','row');
body1 = rigidBody('body1');
body1.Joint = rigidBodyJoint('jnt1','revolute');

body2 = rigidBody('body2');
jnt2 = rigidBodyJoint('jnt2','revolute');
setFixedTransform(jnt2,trvec2tform([0.3 0 0]))
body2.Joint = jnt2;

body3 = rigidBody('tool');
jnt3 = rigidBodyJoint('jnt3','revolute');
setFixedTransform(jnt3,trvec2tform([0.3 0 0]))
body3.Joint = jnt3;

addBody(robot,body1,'base')
addBody(robot,body2,'body1')
addBody(robot,body3,'body2')

% Show first solution and set view.
figure
show(robot,qs(1,:));
view(2)
ax = gca;
ax.Projection = 'orthographic';
hold on
plot(points(:,1),points(:,2),'k')
axis([-0.1 0.7 -0.3 0.5])

% Iterate through the solutions
framesPerSecond = 15;
r = rateControl(framesPerSecond);
for i = 1:count
    show(robot,qs(i,:),'PreservePlot',false);
    drawnow
    waitfor(r);
end

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

См. также

| | (кодер MATLAB)

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