робототехника. Объединенный класс

Пакет: робототехника

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

Описание

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

Объект Joint может описать соединения различных типов. При создании древовидной структуры твердого тела с robotics.RigidBodyTree необходимо присвоить объект Joint твердому телу с помощью класса robotics.RigidBody.

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

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

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

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

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

Конструкция

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

пример

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

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

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

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

Пример: "elbow_right"

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

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

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

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

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

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

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

Свойства

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

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

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

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

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

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

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

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

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

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

Пример: "elbow_right"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Методы

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

Примеры

свернуть все

Добавьте твердое тело и соответствующее соединение к дереву твердого тела. Каждый объект RigidBody содержит объект Joint и должен быть добавлен к RigidBodyTree с помощью addBody.

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

rbtree = robotics.RigidBodyTree;

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

body1 = robotics.RigidBody('b1');

Создайте шарнирное соединение. По умолчанию объект RigidBody идет с фиксированным соединением. Замените соединение путем присвоения нового объекта Joint свойству body1.Joint.

jnt1 = robotics.Joint('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 = robotics.RigidBodyTree;

Создайте первое твердое тело и добавьте его в робота. Добавить твердое тело:

  1. Создайте объект RigidBody и дайте ему уникальное имя.

  2. Создайте объект Joint и дайте ему уникальное имя.

  3. Используйте setFixedTransform, чтобы задать преобразование от тела к телу с помощью параметров DH. Последний элемент параметров DH, theta, проигнорирован, потому что угол зависит от объединенного положения.

  4. Вызовите addBody, чтобы присоединить первый сустав к опорной раме робота.

body1 = robotics.RigidBody('body1');
jnt1 = robotics.Joint('jnt1','revolute');

setFixedTransform(jnt1,dhparams(1,:),'dh');
body1.Joint = jnt1;

addBody(robot,body1,'base')

Создайте и добавьте другие твердые тела в робота. Задайте предыдущее имя тела при вызове addBody, чтобы присоединить его. Каждое фиксированное преобразование относительно предыдущего объединенного координатного кадра.

body2 = robotics.RigidBody('body2');
jnt2 = robotics.Joint('jnt2','revolute');
body3 = robotics.RigidBody('body3');
jnt3 = robotics.Joint('jnt3','revolute');
body4 = robotics.RigidBody('body4');
jnt4 = robotics.Joint('jnt4','revolute');
body5 = robotics.RigidBody('body5');
jnt5 = robotics.Joint('jnt5','revolute');
body6 = robotics.RigidBody('body6');
jnt6 = robotics.Joint('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')

Проверьте, что ваш робот был создан правильно при помощи функции show или showdetails. 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 robotics.Joint]
            Mass: 1
    CenterOfMass: [0 0 0]
         Inertia: [1 1 1 0 0 0]
          Parent: [1x1 robotics.RigidBody]
        Children: {[1x1 robotics.RigidBody]}
         Visuals: {}

body3Copy = copy(body3);

Замените соединение на теле L3. Необходимо создать новый объект Joint и использовать replaceJoint, чтобы гарантировать, что нисходящая геометрия тела незатронута. Вызовите setFixedTransform при необходимости, чтобы задать преобразование между телами вместо с единичными матрицами по умолчанию.

newJoint = robotics.Joint('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: {1x3 cell}
          Base: [1x1 robotics.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