rigidBodyTree

Создайте робота с древовидной структурой

Описание

The rigidBodyTree является представлением связности твёрдых тел с шарнирами. Используйте этот класс для создания моделей манипуляторов роботов в MATLAB®. Если у вас есть модель робота, заданная с использованием Унифицированного Формата Описания Робота (URDF), используйте importrobot импортировать модель робота.

Модель древовидного твердого тела состоит из твердых тел, как rigidBody объекты. Каждое твердое тело имеет rigidBodyJoint связанный с ним объект, который определяет, как он может перемещаться относительно своего родительского тела. Использование setFixedTransform для определения фиксированного преобразования между системой координат соединения и системой координат одного из смежных тел. Можно добавлять, заменять или удалять твердые тела из модели с помощью методов RigidBodyTree класс.

Также возможны вычисления динамики робота. Задайте Mass, CenterOfMass, и Inertia свойства для каждого rigidBody в модели робота. Можно вычислять прямую и обратную динамику с внешними силами или без и вычислять величины динамики с учетом движений соединений робота и входов соединений. Чтобы использовать функции, связанные с динамикой, установите DataFormat свойство к "row" или "column".

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

The show способ поддерживает визуализацию сеток тела. Сетки заданы как .stl файлы и могут быть добавлены к отдельным твердым телам с помощью addVisual. Кроме того, по умолчанию, importrobot функция загружает все доступные .stl файлы, указанные в вашей модели робота URDF.

Создание

Описание

пример

robot = rigidBodyTree создает объект робота с древовидной структурой. Добавить твердые тела к нему можно используя команду addBody.

robot = rigidBodyTree("MaxNumBodies",N,"DataFormat",dataFormat) задает верхнюю границу для количества тел, разрешенного роботом при генерации кода. Вы также должны задать DataFormat свойство как пара "имя-значение".

Свойства

расширить все

Это свойство доступно только для чтения.

Количество тел в модели робота (не включая основу), возвращаемое в виде целого числа.

Это свойство доступно только для чтения.

Список твердых тел в модели робота, возвращенный как массив ячеек с указателями. Используйте этот список для доступа к конкретным RigidBody объекты в модели. Можно также вызвать функцию getBody получить тело по его имени.

Это свойство доступно только для чтения.

Имена твердых тел, возвращенные как массив ячеек из векторов символов.

Имя основы роботов, возвращаемое как строковый скаляр или вектор символов.

Ускорение свободного падения, испытываемое роботом, задается как [x y z] вектор в метрах в секунду за секунду. Каждый элемент соответствует ускорению базовой системы координат робота в этом направлении.

Формат входных/выходных данных для кинематики и динамических функций, заданный как "struct", "row", или "column". Чтобы использовать функции динамики, необходимо использовать любой из "row" или "column".

Функции объекта

addBodyДобавьте тело к роботу
addSubtreeДобавьте поддерево к роботу
centerOfMassПоложение центра масс и якобиан
checkCollisionПроверьте, находится ли робот в столкновении
copyКопировать модель робота
externalForceСоставьте матрицу внешних сил относительно базы
forwardDynamicsУскорения соединений по данным моментов в соединениях и состояний
geometricJacobianГеометрический якобиан для строения робота
gravityTorqueМоменты в соединениях, которые компенсируют силу тяжести
getBodyПолучите указатель на тело робота по имени
getTransformПолучите преобразование между каркасами кузова
homeConfigurationВерните домой строение робота
inverseDynamicsНеобходимые усилия в соединениях для данного движения
massMatrixБольшая матрица пространства соединений
randomConfigurationСгенерируйте случайное строение робота
removeBodyУдалите тело от робота
replaceBodyЗамените тело на роботе
replaceJointЗамените соединение на корпусе
showПоказать модель робота на рисунке
showdetailsПоказать детали модели робота
subtreeСоздайте поддерево из модели робота
velocityProductМоменты в соединениях, которые отменяют силы, вызванные скоростью
writeAsFunctionСоздание rigidBodyTree функция генерации кода

Примеры

свернуть все

Добавьте твердое тело и соответствующее соединение в древовидное твердое тело. Каждый r igidBody объект содержит rigidBodyJoint объект и должен быть добавлен в r igidBodyTree использование addBody.

Создайте древовидное твердое тело.

rbtree = rigidBodyTree;

Создайте твердое тело с уникальным именем.

body1 = rigidBody('b1');

Создайте шарнирное соединение. По умолчанию r igidBody объект поставляется с фиксированным соединением. Замените соединение путем назначения нового rigidBodyJoint объект для body1.Joint свойство.

jnt1 = rigidBodyJoint('jnt1','revolute');
body1.Joint = jnt1;

Добавьте твердое тело в дерево. Задайте имя тела, к которому присоединяется твердое тело. Поскольку это первое тело, используйте базовое имя дерева.

basename = rbtree.BaseName;
addBody(rbtree,body1,basename)

Использование showdetails на дереве для подтверждения того, что твердое тело и соединение были добавлены правильно.

showdetails(rbtree)
--------------------
Robot: (1 bodies)

 Idx    Body Name   Joint Name   Joint Type    Parent Name(Idx)   Children Name(s)
 ---    ---------   ----------   ----------    ----------------   ----------------
   1           b1         jnt1     revolute             base(0)   
--------------------

Используйте параметры Денавита-Хартенберга (DH) робота Puma560 ®, чтобы создать робота. Каждое твердое тело добавляется по одному с преобразованием «child-to-parent», заданным объектом joint.

Параметры DH определяют геометрию робота относительно того, как каждое твердое тело присоединено к его родительскому элементу. Для удобства настройте параметры для робота- Puma560 в матрице [1]. Робот Puma является серийной цепью манипулятором. Параметры DH относятся к предыдущей линии в матрице, соответствующей предыдущему присоединению соединения .

dhparams = [0   	pi/2	0   	0;
            0.4318	0       0       0
            0.0203	-pi/2	0.15005	0;
            0   	pi/2	0.4318	0;
            0       -pi/2	0   	0;
            0       0       0       0];

Создайте объект древовидного твердого тела, чтобы создать робота.

robot = rigidBodyTree;

Создайте первое твёрдое тело и добавьте его к роботу. Для добавления твердого тела:

  1. Создайте rigidBody и присвоить ему уникальное имя.

  2. Создайте rigidBodyJoint и присвоить ему уникальное имя.

  3. Использование setFixedTransform для задания преобразования тела в тело с помощью параметров DH. Последний элемент параметров DH, theta, игнорируется, потому что угол зависит от положения соединения.

  4. Функции addBody крепление первого соединения корпуса к базовой системе координат робота.

body1 = rigidBody('body1');
jnt1 = rigidBodyJoint('jnt1','revolute');

setFixedTransform(jnt1,dhparams(1,:),'dh');
body1.Joint = jnt1;

addBody(robot,body1,'base')

Создайте и добавьте к роботу другие твердые тела. Задайте имя предыдущего тела при вызове addBody чтобы прикрепить его. Каждое фиксированное преобразование относится к предыдущей системе координат соединения.

body2 = rigidBody('body2');
jnt2 = rigidBodyJoint('jnt2','revolute');
body3 = rigidBody('body3');
jnt3 = rigidBodyJoint('jnt3','revolute');
body4 = rigidBody('body4');
jnt4 = rigidBodyJoint('jnt4','revolute');
body5 = rigidBody('body5');
jnt5 = rigidBodyJoint('jnt5','revolute');
body6 = rigidBody('body6');
jnt6 = rigidBodyJoint('jnt6','revolute');

setFixedTransform(jnt2,dhparams(2,:),'dh');
setFixedTransform(jnt3,dhparams(3,:),'dh');
setFixedTransform(jnt4,dhparams(4,:),'dh');
setFixedTransform(jnt5,dhparams(5,:),'dh');
setFixedTransform(jnt6,dhparams(6,:),'dh');

body2.Joint = jnt2;
body3.Joint = jnt3;
body4.Joint = jnt4;
body5.Joint = jnt5;
body6.Joint = jnt6;

addBody(robot,body2,'body1')
addBody(robot,body3,'body2')
addBody(robot,body4,'body3')
addBody(robot,body5,'body4')
addBody(robot,body6,'body5')

Проверьте, что ваш робот был построен правильно при помощи showdetails или show функция. showdetails списки всех тел в командном окне MATLAB ®. show отображает робота с заданным строением (по умолчанию домашний). Вызовы в axis измените пределы по осям и скрыть подписи по осям.

showdetails(robot)
--------------------
Robot: (6 bodies)

 Idx    Body Name   Joint Name   Joint Type    Parent Name(Idx)   Children Name(s)
 ---    ---------   ----------   ----------    ----------------   ----------------
   1        body1         jnt1     revolute             base(0)   body2(2)  
   2        body2         jnt2     revolute            body1(1)   body3(3)  
   3        body3         jnt3     revolute            body2(2)   body4(4)  
   4        body4         jnt4     revolute            body3(3)   body5(5)  
   5        body5         jnt5     revolute            body4(4)   body6(6)  
   6        body6         jnt6     revolute            body5(5)   
--------------------
show(robot);
axis([-0.5,0.5,-0.5,0.5,-0.5,0.5])
axis off

Ссылки

[1] Corke, P. I., and B. Armstrong-Helouvry. «Поиск консенсуса среди параметров модели, сообщенных для робота PUMA 560». Материалы 1994 Международной конференции IEEE по робототехнике и автоматизации, IEEE Comput. Soc. Press, 1994, pp. 1608-13. DOI.org (Crossref), doi:10.1109/ROBOT.1994.351360.

Внесение изменений в существующее rigidBodyTree объект. Можно получить замещающие соединения, тела и поддеревья в древовидном твердом теле.

Загрузите роботы в пример следующим rigidBodyTree объекты.

load exampleRobots.mat

Просмотрите детали робота Puma, используя showdetails.

showdetails(puma1)
--------------------
Robot: (6 bodies)

 Idx    Body Name   Joint Name   Joint Type    Parent Name(Idx)   Children Name(s)
 ---    ---------   ----------   ----------    ----------------   ----------------
   1           L1         jnt1     revolute             base(0)   L2(2)  
   2           L2         jnt2     revolute               L1(1)   L3(3)  
   3           L3         jnt3     revolute               L2(2)   L4(4)  
   4           L4         jnt4     revolute               L3(3)   L5(5)  
   5           L5         jnt5     revolute               L4(4)   L6(6)  
   6           L6         jnt6     revolute               L5(5)   
--------------------

Получите определенное тело для просмотра свойств. Единственный дочерний элемент L3 тело является L4 тело. Можно также скопировать конкретное тело.

body3 = getBody(puma1,'L3');
childBody = body3.Children{1}
childBody = 
  rigidBody with properties:

            Name: 'L4'
           Joint: [1x1 rigidBodyJoint]
            Mass: 1
    CenterOfMass: [0 0 0]
         Inertia: [1 1 1 0 0 0]
          Parent: [1x1 rigidBody]
        Children: {[1x1 rigidBody]}
         Visuals: {}
      Collisions: {}

body3Copy = copy(body3);

Замените соединение на L3 тело. Необходимо создать новую Joint объект и использование replaceJoint чтобы убедиться, что нижестоящая геометрия тела не затронута. Функции setFixedTransform при необходимости задать преобразование между телами вместо с единичными матрицами по умолчанию.

newJoint = rigidBodyJoint('prismatic');
replaceJoint(puma1,'L3',newJoint);

showdetails(puma1)
--------------------
Robot: (6 bodies)

 Idx    Body Name       Joint Name       Joint Type    Parent Name(Idx)   Children Name(s)
 ---    ---------       ----------       ----------    ----------------   ----------------
   1           L1             jnt1         revolute             base(0)   L2(2)  
   2           L2             jnt2         revolute               L1(1)   L3(3)  
   3           L3        prismatic            fixed               L2(2)   L4(4)  
   4           L4             jnt4         revolute               L3(3)   L5(5)  
   5           L5             jnt5         revolute               L4(4)   L6(6)  
   6           L6             jnt6         revolute               L5(5)   
--------------------

Удалите целое тело и получите полученное поддерево с помощью removeBody. Удаленное тело включено в поддерево.

subtree = removeBody(puma1,'L4')
subtree = 
  rigidBodyTree with properties:

     NumBodies: 3
        Bodies: {[1x1 rigidBody]  [1x1 rigidBody]  [1x1 rigidBody]}
          Base: [1x1 rigidBody]
     BodyNames: {'L4'  'L5'  'L6'}
      BaseName: 'L3'
       Gravity: [0 0 0]
    DataFormat: 'struct'

Удалите измененную L3 тело. Добавьте оригинал скопированного L3 тело в L2 тело с последующим возвращением поддерева. Модель робота осталась прежней. Смотрите подробное сравнение через showdetails.

removeBody(puma1,'L3');
addBody(puma1,body3Copy,'L2')
addSubtree(puma1,'L3',subtree)

showdetails(puma1)
--------------------
Robot: (6 bodies)

 Idx    Body Name   Joint Name   Joint Type    Parent Name(Idx)   Children Name(s)
 ---    ---------   ----------   ----------    ----------------   ----------------
   1           L1         jnt1     revolute             base(0)   L2(2)  
   2           L2         jnt2     revolute               L1(1)   L3(3)  
   3           L3         jnt3     revolute               L2(2)   L4(4)  
   4           L4         jnt4     revolute               L3(3)   L5(5)  
   5           L5         jnt5     revolute               L4(4)   L6(6)  
   6           L6         jnt6     revolute               L5(5)   
--------------------

Чтобы использовать функции динамики для вычисления моментов в соединениях и ускорений, задайте свойства динамики для rigidBodyTree объект и rigidBody.

Создайте модель древовидного твердого тела. Создать два твёрдых тела для присоединения к нему.

robot = rigidBodyTree('DataFormat','row');
body1 = rigidBody('body1');
body2 = rigidBody('body2');

Укажите соединения для присоединения к телам. Установите фиксированное преобразование body2 на body1. Это преобразование равняется 1m в направлении x.

joint1 = rigidBodyJoint('joint1','revolute');
joint2 = rigidBodyJoint('joint2');
setFixedTransform(joint2,trvec2tform([1 0 0]))
body1.Joint = joint1;
body2.Joint = joint2;

Задайте свойства динамики для двух тел. Добавьте тела к модели робота. В данном примере основные значения для штока (body1) с присоединенной сферической массой (body2) даны.

body1.Mass = 2;
body1.CenterOfMass = [0.5 0 0];
body1.Inertia = [0.001 0.67 0.67 0 0 0];

body2.Mass = 1;
body2.CenterOfMass = [0 0 0];
body2.Inertia = 0.0001*[4 4 4 0 0 0];

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

Вычислите положение центра масс всего робота. Постройте график положения на роботе. Переместите вид в плоскость xy.

comPos = centerOfMass(robot);

show(robot);
hold on
plot(comPos(1),comPos(2),'or')
view(2)

Figure contains an axes. The axes contains 6 objects of type patch, line. These objects represent base, body1, body2.

Измените массу второго тела. Заметьте изменение центра масс.

body2.Mass = 20;
replaceBody(robot,'body2',body2)

comPos2 = centerOfMass(robot);
plot(comPos2(1),comPos2(2),'*g')
hold off

Figure contains an axes. The axes contains 7 objects of type patch, line. These objects represent base, body1, body2.

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

Загрузите предопределенную модель робота KUKA LBR, которая задается как RigidBodyTree объект.

load exampleRobots.mat lbr

Установите формат данных равным 'row'. Для всех динамических вычислений формат данных должен быть либо 'row' или 'column'.

lbr.DataFormat = 'row';

Установите силу тяжести. По умолчанию сила тяжести принимается равной нулю.

lbr.Gravity = [0 0 -9.81];

Получите домашнее строение для lbr робот.

q = homeConfiguration(lbr);

Задайте вектор ключа, который представляет внешние силы, испытываемые роботом. Используйте externalForce функция для генерации матрицы внешних сил. Укажите модель робота, конечный эффектор, который испытывает ключ, вектор ключа и текущее строение робота. wrench дается относительно 'tool0' каркас кузова, который требует, чтобы вы задали строение робота, q.

wrench = [0 0 0.5 0 0 0.3];
fext = externalForce(lbr,'tool0',wrench,q);

Вычислите результирующие ускорения соединений из-за силы тяжести с внешней силой, приложенной к эффектору конца 'tool0' когда lbr находится в домашнем строении. Скорости соединений и крутящие моменты в соединениях приняты равными нулю (вход как пустой вектор []).

qddot = forwardDynamics(lbr,q,[],[],fext);

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

Загрузите предопределенную модель робота KUKA LBR, которая задается как RigidBodyTree объект.

load exampleRobots.mat lbr

Установите формат данных равным 'row'. Для всех динамических вычислений формат данных должен быть либо 'row' или 'column'.

lbr.DataFormat = 'row';

Установите Gravity свойство задать удельное ускорение свободного падения.

lbr.Gravity = [0 0 -9.81];

Сгенерируйте случайное строение для lbr.

q = randomConfiguration(lbr);

Вычислите необходимые моменты в соединениях для lbr для статического удержания этого строения.

tau = inverseDynamics(lbr,q);

Используйте externalForce функция для генерации матриц сил для применения к модели древовидного твердого тела. Матрица сил является вектором m на 6, который имеет строку для каждого соединения на роботе, чтобы применить шестиэлементный ключ. Используйте externalForce и задайте конечный эффектор, чтобы правильно назначить ключ правильной строке матрицы. Можно добавить несколько матриц сил вместе, чтобы применить несколько сил к одному роботу.

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

Загрузите предопределенную модель робота KUKA LBR, которая задается как RigidBodyTree объект.

load exampleRobots.mat lbr

Установите формат данных равным 'row'. Для всех динамических вычислений формат данных должен быть либо 'row' или 'column'.

lbr.DataFormat = 'row';

Установите Gravity свойство задать удельное ускорение свободного падения.

lbr.Gravity = [0 0 -9.81];

Получите домашнее строение для lbr.

q = homeConfiguration(lbr);

Установите внешнюю силу на link1. Вход ключа выражен в базовой системе координат.

fext1 = externalForce(lbr,'link_1',[0 0 0.0 0.1 0 0]);

Установите внешнюю силу на концевой эффектор, tool0. Входной вектор ключа выражен в tool0 система координат.

fext2 = externalForce(lbr,'tool0',[0 0 0.0 0.1 0 0],q);

Вычислите моменты в соединениях, необходимые для балансировки внешних сил. Чтобы объединить силы, добавьте матрицы сил вместе. Скорости и ускорения соединений приняты равными нулю (вход как []).

tau = inverseDynamics(lbr,q,[],[],fext1+fext2);

Можно импортировать роботов, у которых есть .stl файлы, сопоставленные с файлом формата Unified Robot Description (URDF), для описания визуальных геометрий робота. Каждое твердое тело имеет заданную индивидуальную визуальную геометрию. The importrobot функция анализирует файл URDF, чтобы получить модель робота и визуальные геометрии. Функция принимает, что визуальная геометрия и геометрия столкновения робота одинаковы, и присваивает визуальные геометрии как геометрии столкновения соответствующих тел.

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

Импортируйте модель робота как файл URDF. The .stl расположение файлов должно быть правильно задано в этом URDF. Как добавить другие .stl файлы для отдельных твердых тел, см. addVisual.

robot = importrobot('iiwa14.urdf');

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

show(robot,'visuals','on','collision','off');

Figure contains an axes. The axes contains 29 objects of type patch, line. These objects represent world, iiwa_link_0, iiwa_link_1, iiwa_link_2, iiwa_link_3, iiwa_link_4, iiwa_link_5, iiwa_link_6, iiwa_link_7, iiwa_link_ee, iiwa_link_ee_kuka, iiwa_link_0_mesh, iiwa_link_1_mesh, iiwa_link_2_mesh, iiwa_link_3_mesh, iiwa_link_4_mesh, iiwa_link_5_mesh, iiwa_link_6_mesh, iiwa_link_7_mesh.

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

show(robot,'visuals','off','collision','on'); 

Figure contains an axes. The axes contains 29 objects of type patch, line. These objects represent world, iiwa_link_0, iiwa_link_1, iiwa_link_2, iiwa_link_3, iiwa_link_4, iiwa_link_5, iiwa_link_6, iiwa_link_7, iiwa_link_ee, iiwa_link_ee_kuka, iiwa_link_0_mesh, iiwa_link_1_mesh, iiwa_link_2_mesh, iiwa_link_3_mesh, iiwa_link_4_mesh, iiwa_link_5_mesh, iiwa_link_6_mesh, iiwa_link_7_mesh, iiwa_link_0_coll_mesh, iiwa_link_1_coll_mesh, iiwa_link_2_coll_mesh, iiwa_link_3_coll_mesh, iiwa_link_4_coll_mesh, iiwa_link_5_coll_mesh, iiwa_link_6_coll_mesh, iiwa_link_7_coll_mesh.

Вопросы совместимости

расширить все

Изменение поведения в будущем релизе

Ссылки

[1] Крейг, Джон Дж. Введение в робототехнику: механика и управление. Reading, MA: Addison-Wesley, 1989.

[2] Сисилиано, Бруно, Лоренцо Сьявикко, Луиджи Виллани и Джузеппе Ориоло. Робототехника: моделирование, планирование и управление. Лондон: Спрингер, 2009.

Расширенные возможности

.
Введенный в R2016b