exponenta event banner

rigidBodyTree

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

Описание

rigidBodyTree - представление связности жестких тел с соединениями. Этот класс используется для создания моделей роботов-манипуляторов в MATLAB ®. Если модель робота задана с помощью унифицированного формата описания робота (URDF), используйтеimportrobot для импорта модели робота.

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

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

Для данной модели дерева жесткого тела можно также использовать модель робота для вычисления углов соединения для требуемых конечных положений эффектора с помощью алгоритмов обратной кинематики робототехники. Укажите модель дерева жесткого тела при использовании inverseKinematics или generalizedInverseKinematics.

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

Создание

Описание

пример

robot = rigidBodyTree создает объект робота с древовидной структурой. Добавление жестких тел с помощью addBody.

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

Свойства

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

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

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

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

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

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

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

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

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

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

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

addBodyДобавить тело к роботу
addSubtreeДобавление поддерева к роботу
centerOfMassПоложение центра масс и якобиан
checkCollisionПроверьте, находится ли робот в состоянии столкновения
copyКопировать модель робота
externalForceСоставить матрицу внешних сил относительно основания
forwardDynamicsУскорения сочленения с учетом крутящих моментов и состояний сочленения
geometricJacobianГеометрический якобиан для конфигурации робота
gravityTorqueКрутящие моменты соединения, компенсирующие силу тяжести
getBodyПолучить ручку тела робота по имени
getTransformПреобразование между кадрами тела
homeConfigurationПолучить домашнюю конфигурацию робота
inverseDynamicsТребуемые крутящие моменты соединения для данного движения
massMatrixМассовая матрица «соединение-пространство»
randomConfigurationСоздание случайной конфигурации робота
removeBodyИзвлечь тело из робота
replaceBodyЗаменить тело на роботе
replaceJointЗаменить соединение на корпусе
showПоказать модель робота на рисунке
showdetailsПоказать сведения о модели робота
subtreeСоздание поддерева из модели робота
velocityProductКрутящие моменты соединения, которые отменяют силы, вызванные скоростью
writeAsFunctionСоздать rigidBodyTree функция генерации кода

Примеры

свернуть все

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

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

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

robot = rigidBodyTree('DataFormat','row');
body1 = rigidBody('body1');
body2 = rigidBody('body2');

Укажите соединения для присоединения к телам. Установка фиксированного преобразования body2 кому body1. Это преобразование имеет значение 1m в направлении X.

joint1 = rigidBodyJoint('joint1','revolute');
joint2 = rigidBodyJoint('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.001 0.67 0.67 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)

Figure contains an axes. The axes contains 6 objects of type patch, line. These objects represent base, body1, body2.

Измените массу второго тела. Обратите внимание на изменение центра масс.

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

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

Figure contains an axes. The axes contains 7 objects of type patch, line. These objects represent base, body1, body2.

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

Загрузите предварительно определенную модель робота KUKA LBR, которая указана как 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 вычислять требуемые крутящие моменты соединения для статического удержания определенной конфигурации робота. Можно также задать скорости соединения, ускорения соединения и внешние силы с помощью других синтаксисов.

Загрузите предварительно определенную модель робота KUKA LBR, которая указана как 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 функция.

Загрузите предварительно определенную модель робота KUKA LBR, которая указана как 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,'visuals','on','collision','off');

Figure contains an axes. The axes contains 29 objects of type patch, line. These objects represent world, iiwa_link_0, iiwa_link_1, iiwa_link_2, iiwa_link_3, iiwa_link_4, iiwa_link_5, iiwa_link_6, iiwa_link_7, iiwa_link_ee, iiwa_link_ee_kuka, iiwa_link_0_mesh, iiwa_link_1_mesh, iiwa_link_2_mesh, iiwa_link_3_mesh, iiwa_link_4_mesh, iiwa_link_5_mesh, iiwa_link_6_mesh, iiwa_link_7_mesh.

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

show(robot,'visuals','off','collision','on'); 

Figure contains an axes. The axes contains 29 objects of type patch, line. These objects represent world, iiwa_link_0, iiwa_link_1, iiwa_link_2, iiwa_link_3, iiwa_link_4, iiwa_link_5, iiwa_link_6, iiwa_link_7, iiwa_link_ee, iiwa_link_ee_kuka, iiwa_link_0_mesh, iiwa_link_1_mesh, iiwa_link_2_mesh, iiwa_link_3_mesh, iiwa_link_4_mesh, iiwa_link_5_mesh, iiwa_link_6_mesh, iiwa_link_7_mesh, iiwa_link_0_coll_mesh, iiwa_link_1_coll_mesh, iiwa_link_2_coll_mesh, iiwa_link_3_coll_mesh, iiwa_link_4_coll_mesh, iiwa_link_5_coll_mesh, iiwa_link_6_coll_mesh, iiwa_link_7_coll_mesh.

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

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

Изменение поведения в будущем выпуске

Ссылки

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

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

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

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