робототехника. Класс RigidBodyTree

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

Создайте робота с древовидной структурой

Описание

RigidBodyTree является представлением возможности соединения твердых тел с соединениями. Используйте этот класс, чтобы создать модели манипулятора робота в MATLAB®. Если у вас есть заданное использование модели робота Объединенного формата описания робота (URDF), используйте importrobot, чтобы импортировать вашу модель робота.

Модель дерева твердого тела составлена из твердых тел, когда RigidBody возражает. Каждому твердому телу сопоставили объект Joint с ним, который задает, как это может переместиться относительно его вышестоящей инстанции. Используйте setFixedTransform, чтобы задать фиксированное преобразование между кадром соединения и кадром одного из смежных тел. Можно добавить, заменить или удалить твердые тела из модели с помощью методов класса RigidBodyTree.

Вычисления динамики робота также возможны. Задайте Mass, CenterOfMass и свойства Inertia для каждого RigidBody в модели робота. Можно вычислить вперед и обратная динамика с или без внешних сил и вычислить количества динамики, данные совместные движения робота, и соединить входные параметры. Чтобы использовать связанные с динамикой функции, установите свойство DataFormat на "row" или "column".

Для данной модели дерева твердого тела можно также использовать модель робота, чтобы вычислить объединенные углы для желаемых положений исполнительного элемента конца с помощью алгоритмов инверсной кинематики робототехники. Задайте свою модель дерева твердого тела при использовании InverseKinematics или GeneralizedInverseKinematics.

Метод show поддерживает визуализацию сеток тела. Сетки заданы как файлы .stl и могут быть добавлены к отдельным твердым телам с помощью addVisual. Кроме того, по умолчанию функция importrobot загружает все доступные файлы .stl, заданные в вашей модели робота URDF.

Конструкция

robot = robotics.RigidBodyTree создает объект робота с древовидной структурой. Добавьте твердые тела в него с помощью addBody.

robot = robotics.RigidBodyTree("MaxNumBodies",N,"DataFormat",dataFormat) задает верхнюю границу на количестве тел, позволенных в роботе при генерации кода. Необходимо также задать свойство DataFormat как пару "имя-значение".

Свойства

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

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

Количество тел в модели робота (не включая основу), возвращенный как целое число.

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

Список твердых тел в модели робота, возвращенной как массив ячеек указателей. Используйте этот список, чтобы получить доступ к определенным объектам RigidBody в модели. Можно также вызвать robotics.RigidBodyTree.getBody, чтобы получить тело его именем.

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

Имена твердых тел, возвращенных как массив ячеек из символьных векторов.

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

Гравитационное ускорение, испытанное роботом, заданным как вектор [x y z] в метрах в секунду, придало квадратную форму. Каждый элемент соответствует ускорению основного кадра робота в том направлении.

Формат данных ввода/вывода для кинематики и функций динамики, заданных как "struct", "row" или "column". Чтобы использовать функции динамики, необходимо использовать или "row" или "column".

Методы

addBodyДобавьте тело в робота
addSubtreeДобавьте поддерево в робота
centerOfMassЦентр массового положения и якобиана
копияСкопируйте модель робота
externalForceСоставьте внешнюю матрицу силы относительно основы
forwardDynamicsОбъединенные ускорения, данные объединенные крутящие моменты и состояния
geometricJacobianГеометрический якобиан для настройки робота
getBodyПолучите указатель корпуса робота по наименованию
getTransformДоберитесь преобразовывают между каркасами кузова
gravityTorqueОбъединенные крутящие моменты, которые компенсируют силу тяжести
homeConfigurationВозвратитесь домой настройка робота
inverseDynamicsНеобходимое соединение закручивает для данного движения
massMatrixБольшая матрица объединенного пробела
randomConfigurationСгенерируйте случайную настройку робота
removeBodyУдалите тело из робота
replaceBodyЗамените тело на роботе
replaceJointСоединение замены на теле
showПокажите модель робота в фигуре
showdetailsПокажите детали модели робота
поддеревоСоздайте поддерево из модели робота
velocityProductОбъединенные крутящие моменты та отмена вызванные скоростью силы

Примеры

свернуть все

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

Чтобы использовать функции динамики, чтобы вычислить объединенные крутящие моменты и ускорения, задайте свойства динамики для объекта robotics.RigidBodyTree и robotics.RigidBody.

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

robot = robotics.RigidBodyTree('DataFormat','row');
body1 = robotics.RigidBody('body1');
body2 = robotics.RigidBody('body2');

Задайте соединения, чтобы присоединить к телам. Установите фиксированное преобразование body2 к body1. Это преобразование составляет 1 м в направлении X.

joint1 = robotics.Joint('joint1','revolute');
joint2 = robotics.Joint('joint2');
setFixedTransform(joint2,trvec2tform([1 0 0]))
body1.Joint = joint1;
body2.Joint = joint2;

Задайте свойства динамики для этих двух тел. Добавьте тела в модель робота. В данном примере основные значения для стержня (body1) с присоединенной сферической массой (body2) даны.

body1.Mass = 2;
body1.CenterOfMass = [0.5 0 0];
body1.Inertia = [0.167 0.001 0.167 0 0 0];

body2.Mass = 1;
body2.CenterOfMass = [0 0 0];
body2.Inertia = 0.0001*[4 4 4 0 0 0];

addBody(robot,body1,'base');
addBody(robot,body2,'body1');

Вычислите центр массового положения целого робота. Постройте позицию по роботу. Переместите представление в xy плоскость.

comPos = centerOfMass(robot);

show(robot);
hold on
plot(comPos(1),comPos(2),'or')
view(2)

Измените массу второго тела. Заметьте изменение в центре массы.

body2.Mass = 20;
replaceBody(robot,'body2',body2)

comPos2 = centerOfMass(robot);
plot(comPos2(1),comPos2(2),'*g')
hold off

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

Загрузите предопределенную модель робота LBR KUKA, которая задана как объект RigidBodyTree.

load exampleRobots.mat lbr

Установите формат данных на 'row'. Для всех вычислений динамики форматом данных должен быть или 'row' или 'column'.

lbr.DataFormat = 'row';

Установите силу тяжести. По умолчанию сила тяжести принята, чтобы быть нулем.

lbr.Gravity = [0 0 -9.81];

Получите домашнюю настройку для робота lbr.

q = homeConfiguration(lbr);

Задайте вектор ключа, который представляет внешние силы, испытанные роботом. Используйте функцию externalForce, чтобы сгенерировать внешнюю матрицу силы. Задайте модель робота, исполнительный элемент конца, который испытывает ключ, вектор ключа и текущую настройку робота. wrench дан относительно каркаса кузова 'tool0', который требует, чтобы вы задали настройку робота, q.

wrench = [0 0 0.5 0 0 0.3];
fext = externalForce(lbr,'tool0',wrench,q);

Вычислите результирующие объединенные ускорения из-за силы тяжести с внешней силой, к которой применяются исполнительный элемент конца 'tool0', когда lbr будет в его домашней настройке. Объединенные скорости и объединенные крутящие моменты приняты, чтобы быть нулем (вход как пустой вектор []).

qddot = forwardDynamics(lbr,q,[],[],fext);

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

Загрузите предопределенную модель робота LBR KUKA, которая задана как объект RigidBodyTree.

load exampleRobots.mat lbr

Установите формат данных на 'row'. Для всех вычислений динамики форматом данных должен быть или 'row' или 'column'.

lbr.DataFormat = 'row';

Установите свойство Gravity дать определенное гравитационное ускорение.

lbr.Gravity = [0 0 -9.81];

Сгенерируйте случайную настройку для lbr.

q = randomConfiguration(lbr);

Вычислите необходимые объединенные крутящие моменты для lbr, чтобы статически содержать ту настройку.

tau = inverseDynamics(lbr,q);

Используйте функцию externalForce, чтобы сгенерировать матрицы силы, чтобы примениться к модели дерева твердого тела. Матрица силы является m-6 вектором, который ссорится для каждого соединения на роботе, чтобы применить ключ с шестью элементами. Используйте externalForce, функционируют и задают исполнительный элемент конца, чтобы правильно присвоить ключ правильной строке матрицы. Можно добавить, что несколько спрессовывают матрицы, чтобы прикладывать несколько сил к одному роботу.

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

Загрузите предопределенную модель робота LBR KUKA, которая задана как объект RigidBodyTree.

load exampleRobots.mat lbr

Установите формат данных на 'row'. Для всех вычислений динамики форматом данных должен быть или 'row' или 'column'.

lbr.DataFormat = 'row';

Установите свойство Gravity дать определенное гравитационное ускорение.

lbr.Gravity = [0 0 -9.81];

Получите домашнюю настройку для lbr.

q = homeConfiguration(lbr);

Установите внешнюю силу на link1. Входной вектор ключа выражается в опорной раме.

fext1 = externalForce(lbr,'link_1',[0 0 0.0 0.1 0 0]);

Установите внешнюю силу на исполнительном элементе конца, tool0. Входной вектор ключа выражается в кадре tool0.

fext2 = externalForce(lbr,'tool0',[0 0 0.0 0.1 0 0],q);

Вычислите объединенные крутящие моменты, требуемые сбалансировать внешние силы. Чтобы объединить силы, добавьте матрицы силы вместе. Объединенные скорости и ускорения приняты, чтобы быть нулем (вход как []).

tau = inverseDynamics(lbr,q,[],[],fext1+fext2);

Можно импортировать роботов, которым сопоставили файлы .stl с файлом Объединенного формата описания робота (URDF), чтобы описать визуальные конфигурации робота. Каждое твердое тело имеет отдельную визуальную заданную геометрию. Функция importrobot анализирует файл URDF, чтобы получить робота образцовые и визуальные конфигурации. Используйте функцию show, чтобы визуализировать модель робота в фигуре. Можно затем взаимодействовать с моделью путем нажатия на компоненты, чтобы осмотреть их и щелчка правой кнопкой, чтобы переключить видимость.

Импортируйте модель робота как файл URDF. Расположение файлов .stl должно быть правильно задано в этом URDF. Чтобы добавить другие файлы .stl в отдельные твердые тела, смотрите addVisual.

robot = importrobot('iiwa14.urdf');

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

show(robot);

Ссылки

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

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

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

Введенный в R2017b