exponenta event banner

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 - одиночное соединение степени свободы, которое скользит вдоль заданной оси. Также называется скользящим шарниром.

Пример: "prismatic"

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

Свойства

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

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

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

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

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

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

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

Если жесткое тело, содержащее это соединение, добавляется к модели робота, тип соединения должен быть изменен путем замены соединения с помощью 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 сустав

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

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

  • fixed - Неподвижное соединение не имеет соответствующей оси движения.

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

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

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

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

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

Пример: eye(4)

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

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

Пример: eye(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 робота в матрице [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] Корк, П. И. и Б. Армстронг-Хелуври. «Поиск консенсуса между параметрами модели, сообщенными для робота PUMA 560». Материалы Международной конференции IEEE по робототехнике и автоматизации 1994 года, IEEE Comput. Soc. Press, 1994, стр. 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] Крейг, Джон Дж. Введение в робототехнику: механика и управление. Рединг, Массачусетс: Эддисон-Уэсли, 1989.

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

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

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.
Представлен в R2016b