addBody

Добавьте тело к роботу

Описание

пример

addBody(robot,body,parentname) добавляет твердое тело к объекту робота и присоединяется к родительскому элементу твердого тела, заданному как parentname. The body свойство определяет, как это тело перемещается относительно родительского тела.

Примеры

свернуть все

Добавьте твердое тело и соответствующее соединение в древовидное твердое тело. Каждый 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 объект.

Имя родительского тела, заданное как строковый скаляр или вектор символов. Это родительское тело должно уже существовать в модели робота. Новое тело присоединено к этому родительскому телу.

Типы данных: char | string

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

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