rigidBodyJoint

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

Описание

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

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

Различные объединенные поддерживаемые типы:

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

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

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

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

Создание

Описание

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

пример

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

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

развернуть все

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

Пример: "elbow_right"

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

Объединенный тип в виде строкового скаляра или вектора символов. Объединенный тип предопределяет определенные свойства при создании соединения.

Различные объединенные поддерживаемые типы:

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

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

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

Пример:

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

Свойства

развернуть все

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

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

Различные объединенные поддерживаемые типы:

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

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

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

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

Пример:

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

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

Пример: "elbow_right"

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

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

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

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

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

Пример:

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

В зависимости от объединенного типа исходное положение имеет различное определение.

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

  • revolute— 0 (значение по умолчанию). Шарнирному соединению задал исходное положение угол вращения вокруг объединенной оси в радианах.

  • prismatic— 0 (значение по умолчанию). Призматическому соединению задало исходное положение линейное движение вдоль объединенной оси в метрах.

Пример:

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

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

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

  • revolute — Шарнирное соединение вращает тело в плоском перпендикуляре к объединенной оси.

  • prismatic — Призматические совместные действия тело в линейном движении вдоль объединенного направления оси.

Пример:

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

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

Пример:

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

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

Пример:

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

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

Примеры

свернуть все

Добавьте твердое тело и соответствующее соединение к дереву твердого тела. Каждый 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 в матрице. Робот Пумы является последовательным цепочечным манипулятором. Параметры 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

Внесите изменения в существующий 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)   
--------------------

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

развернуть все

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

Ссылки

[1] Крэйг, Джон Дж. Введение в робототехнику: механика и управление. Чтение, MA: Аддисон-Уэсли, 1989.

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

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

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

Введенный в R2017b