Проследите конечную эффекторную траекторию с обратной кинематикой в Simulink

Используйте модель робота тела для вычисления обратной кинематики с помощью Simulink ®. Задайте траекторию для эффектора конца робота и цикла через точки, чтобы решить строения робота, которые отслеживают эту траекторию.

Импортируйте модель робота из файла URDF (унифицированный формат описания робота) как RigidBodyTree объект.

robot = importrobot('iiwa14.urdf');
robot.DataFormat = 'column';

Посмотрите робота.

ax = show(robot);

Задайте траекторию робота. Эти xyz-координаты рисуют N-образную форму перед роботом.

x = 0.5*zeros(1,4)+0.25;
y = 0.25*[-1 -1 1 1];
z = 0.25*[-1 1 -1 1] + 0.75;

hold on
plot3(x,y,z,'--r','LineWidth',2,'Parent',ax)
hold off

Откройте модель, которая выполняет обратную кинематику. xyz-координаты, определенные в MATLAB ®, преобразуются в однородные преобразования и вводятся как желаемые Pose. Обратно-кинематическое решение выхода подается назад как начальное предположение для следующего решения. Это начальное предположение помогает отслеживать положение end-effector и генерировать плавные строения.

Можно нажать кнопку коллбэка, чтобы регенерировать только что заданные модель робота и траекторию.

close
open_system('sm_ik_trajectory_model.slx')

% Запустите симуляцию. Модель должна сгенерировать строения робота (configs), которые следуют указанной траектории для конечного эффектора.

sim('sm_ik_trajectory_model.slx')

Прокрутите строения робота и отобразите робота для каждого временного шага. Сохраните положения концевого эффектора в xyz.

figure('Visible','on');
tformIndex = 1;
for i = 1:10:numel(configs.Data)/7
    currConfig = configs.Data(:,1,i);
    show(robot,currConfig);
    drawnow

    xyz(tformIndex,:) = tform2trvec(getTransform(robot,currConfig,'iiwa_link_ee'));
    tformIndex = tformIndex + 1;
end

Нарисуйте окончательную траекторию концевого эффектора в виде черной линии. Рисунок показывает конечный эффектор, отслеживающий первоначально заданную N-форму (красная пунктирная линия).

figure('Visible','on')
show(robot,configs.Data(:,1,end));

hold on
plot3(xyz(:,1),xyz(:,2),xyz(:,3),'-k','LineWidth',3);
plot3(x,y,z,'--r','LineWidth',3)
hold off

См. также

Объекты

Блоки

Похожие темы