rigidBodyTree

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

Описание

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

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

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

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

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 производящая функция кода

Примеры

свернуть все

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

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

rbtree = rigidBodyTree;

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

body1 = rigidBody('b1');

Создайте шарнирное соединение. По умолчанию, rigidBody объект идет с фиксированным соединением. Замените соединение путем присвоения нового 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)   
--------------------

Используйте параметры Denavit-Hartenberg (DH) робота Puma560®, чтобы создать робота. Каждое твердое тело добавляется по одному, с дочерним элементом к родительскому элементу преобразовывают заданный объединенным объектом.

Параметры DH задают геометрию робота с отношением к тому, как каждое твердое тело присоединено к своему родительскому элементу. Для удобства установите параметры для робота Puma560 в матрице [1]. Робот Пумы является последовательным цепочечным манипулятором. Параметры 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. и Б. Армстронг-Хелуври. “Поиск Согласия среди Параметров модели, о которых Сообщают для робота PUMA 560”. Продолжения 1 994 Международных конференций IEEE по вопросам Робототехники и Автоматизации, IEEE Comput. Soc. Нажмите, 1994, стр 1608–13. DOI.org (Crossref), doi:10.1109/ROBOT.1994.351360.

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

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

load exampleRobots.mat

Посмотрите детали робота Пумы с помощью 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. Это преобразование составляет 1 м в направлении 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 object. The axes object 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 object. The axes object contains 7 objects of type patch, line. These objects represent base, body1, body2.

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

Загрузите предопределенную модель робота LBR KUKA, которая задана как 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 функция, чтобы вычислить необходимое соединение закручивает, чтобы статически содержать определенную настройку робота. Можно также задать объединенные скорости, объединенные ускорения и внешние силы, использующие другие синтаксисы.

Загрузите предопределенную модель робота LBR KUKA, которая задана как 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 функция.

Загрузите предопределенную модель робота LBR KUKA, которая задана как 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 файлы, сопоставленные с файлом Объединенного формата описания робота (URDF), чтобы описать визуальные конфигурации робота. Каждое твердое тело имеет отдельную визуальную заданную геометрию. importrobot функционируйте анализирует файл URDF, чтобы получить робота и визуальные конфигурации модели. Функция принимает, что визуальная геометрия и геометрия столкновения робота являются тем же самым, и присваивает визуальные конфигурации как конфигурации столкновения corresponsing тел.

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

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

robot = importrobot('iiwa14.urdf');

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

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

Figure contains an axes object. The axes object 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 object. The axes object 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] Крэйг, Джон Дж. Введение в робототехнику: механика и управление. Чтение, MA: Аддисон-Уэсли, 1989.

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

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

Введенный в R2017b
Для просмотра документации необходимо авторизоваться на сайте