rigidBodyJoint

Создайте соединение

Описание

The rigidBodyJoint объекты определяют, как твердое тело перемещается относительно точки присоединения. У древовидного робота соединение всегда принадлежит определенному твёрдому телу, и каждое твёрдое тело имеет одно соединение.

The rigidBodyJoint объект может описывать соединения различных типов. При построении древовидной структуры твёрдого тела с rigidBodyTree, вы должны назначить Joint объект твердому телу с помощью rigidBody класс.

Поддерживаются следующие типы соединений:

  • fixed - Фиксированное соединение, препятствующее относительному движению двух тел.

  • revolute - соединение с одной степенью свободы (DOF), которое вращается вокруг заданной оси. Также называется контактом или шарнирным соединением.

  • prismatic - Одно соединение DOF, которое скользит по заданной оси. Также называется скользящим соединением.

Каждый тип соединения имеет различные свойства с различными размерностями, в зависимости от заданной геометрии.

Создание

Описание

jointObj = rigidBodyJoint(jname) создает фиксированное соединение с заданным именем.

пример

jointObj = rigidBodyJoint(jname,jtype) создает соединение заданного типа с заданным именем.

Входные параметры

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

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

Пример: "elbow_right"

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

Тип соединения, заданный как строковый скаляр или вектор символов. Тип соединения предопределяет определенные свойства при создании соединения.

Поддерживаются следующие типы соединений:

  • fixed - Фиксированное соединение, препятствующее относительному движению двух тел.

  • revolute - соединение с одной степенью свободы (DOF), которое вращается вокруг заданной оси. Также называется контактом или шарнирным соединением.

  • prismatic - Одно соединение DOF, которое скользит по заданной оси. Также называется скользящим соединением.

Пример: "prismatic"

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

Свойства

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

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

Тип соединения, возвращенный как строковый скаляр или вектор символов. Тип соединения предопределяет определенные свойства при создании соединения.

Поддерживаются следующие типы соединений:

  • fixed - Фиксированное соединение, препятствующее относительному движению двух тел.

  • revolute - соединение с одной степенью свободы (DOF), которое вращается вокруг заданной оси. Также называется контактом или шарнирным соединением.

  • prismatic - Одно соединение DOF, которое скользит по заданной оси. Также называется скользящим соединением.

Если твердое тело, которое содержит это соединение, добавляется к модели робота, тип соединения должен быть изменен путем замены соединения с помощью replaceJoint.

Пример: "prismatic"

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

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

Пример: "elbow_right"

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

Пределы положения соединения, заданные как вектор [min max] значения. В зависимости от типа соединения эти значения имеют различные определения.

  • fixed[NaN NaN] (по умолчанию). Фиксированное соединение не имеет пределов соединения. Тела остаются неподвижными между собой.

  • revolute[-pi pi] (по умолчанию). Пределы определяют угол поворота вокруг оси в радианах.

  • prismatic[-0.5 0.5] (по умолчанию). Пределы определяют линейное движение вдоль оси в метрах.

Пример: [-pi/2, pi/2]

Исходное положение сустава, заданное как скаляр, который зависит от типа вашего сустава. Исходное положение должно опуститься в область значений, установленной PositionLimits. Это свойство используется в homeConfiguration чтобы сгенерировать предопределённое исходное строение для всего твердого дерева тел.

В зависимости от типа соединения исходное положение имеет другое определение.

  • fixed0 (по умолчанию). Фиксированное соединение не имеет соответствующего исходного положения.

  • revolute0 (по умолчанию). Шарнирное соединение имеет исходное положение, заданное углом поворота вокруг оси соединения в радианах.

  • prismatic0 (по умолчанию). Призматическое соединение имеет исходное положение, заданное линейным движением вдоль оси соединения в метрах.

Пример: pi/2 радианы для revolute сустав

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

В зависимости от типа соединения ось соединения имеет другое определение.

  • fixed - Фиксированное соединение не имеет соответствующей оси движения.

  • revolute - шарнирное соединение вращает тело в плоскости, перпендикулярной оси соединения.

  • prismatic - призматическое соединение перемещает тело в линейном движении вдоль направления оси соединения.

Пример: [1 0 0] для движения вокруг оси x для revolute сустав

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

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

Пример: eye(4)

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

Фиксированное преобразование из дочернего тела в систему координат, возвращаемое как матрица однородного преобразования 4 на 4. Преобразование преобразует координаты точек в дочернем каркасе кузова в последующую систему координат соединений.

Пример: eye(4)

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

copyСоздайте копию соединения
setFixedTransformУстановите свойства фиксированного преобразования соединения

Примеры

свернуть все

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

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

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

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

Ссылки

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

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

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

Генерация кода C/C + +
Сгенерируйте код C и C++ с помощью Coder™ MATLAB ®

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