Создание соединения
rigidBodyJoint объекты определяют способ перемещения жесткого тела относительно точки присоединения. В роботе с древовидной структурой соединение всегда принадлежит конкретному жесткому телу, и каждое жесткое тело имеет одно соединение.
rigidBodyJoint объект может описывать соединения различных типов. При построении структуры дерева жесткого тела с помощью rigidBodyTree, необходимо назначить Joint объект к жесткому телу с помощью rigidBody класс.
Поддерживаются следующие типы соединений:
fixed - Неподвижное соединение, предотвращающее относительное движение между двумя телами.
revolute - Соединение с одной степенью свободы (DOF), вращающееся вокруг данной оси. Также называется штырьковым или шарнирным соединением.
prismatic - одиночное соединение степени свободы, которое скользит вдоль заданной оси. Также называется скользящим шарниром.
Каждый тип соединения имеет различные свойства с различными размерами в зависимости от определенной геометрии.
jname - Наименование соединенияИмя соединения, указанное как строковый скалярный или символьный вектор. Имя соединения должно быть уникальным для доступа к нему из дерева жесткого тела.
Пример: "elbow_right"
Типы данных: char | string
jtype - Тип соединения'fixed' (по умолчанию) | строковый скалярный | символьный векторТип соединения, заданный как строковый скалярный или символьный вектор. Тип соединения предопределяет определенные свойства при создании соединения.
Поддерживаются следующие типы соединений:
fixed - Неподвижное соединение, предотвращающее относительное движение между двумя телами.
revolute - Соединение с одной степенью свободы (DOF), вращающееся вокруг данной оси. Также называется штырьковым или шарнирным соединением.
prismatic - одиночное соединение степени свободы, которое скользит вдоль заданной оси. Также называется скользящим шарниром.
Пример: "prismatic"
Типы данных: char | string
Type - Тип соединения'fixed' (по умолчанию) | строковый скалярный | символьный векторЭто свойство доступно только для чтения.
Тип соединения, возвращаемый как строковый скалярный или символьный вектор. Тип соединения предопределяет определенные свойства при создании соединения.
Поддерживаются следующие типы соединений:
fixed - Неподвижное соединение, предотвращающее относительное движение между двумя телами.
revolute - Соединение с одной степенью свободы (DOF), вращающееся вокруг данной оси. Также называется штырьковым или шарнирным соединением.
prismatic - одиночное соединение степени свободы, которое скользит вдоль заданной оси. Также называется скользящим шарниром.
Если жесткое тело, содержащее это соединение, добавляется к модели робота, тип соединения должен быть изменен путем замены соединения с помощью replaceJoint.
Пример: "prismatic"
Типы данных: char | string
Name - Наименование соединенияИмя соединения, возвращаемое в виде строкового скалярного или символьного вектора. Имя соединения должно быть уникальным для доступа к нему из дерева жесткого тела. Если жесткое тело, содержащее это соединение, добавляется к модели робота, имя соединения должно быть изменено путем замены соединения с помощью replaceJoint.
Пример: "elbow_right"
Типы данных: char | string
PositionLimits - Пределы положения стыкаПределы положения соединения, указанные как вектор [min max] значения. В зависимости от типа соединения эти значения имеют различные определения.
fixed — [NaN NaN] (по умолчанию). Фиксированное соединение не имеет пределов. Тела остаются зафиксированными между собой.
revolute — [-pi pi] (по умолчанию). Пределы определяют угол поворота вокруг оси в радианах.
prismatic — [-0.5 0.5] (по умолчанию). Пределы определяют линейное движение вдоль оси в метрах.
Пример: [-pi/2, pi/2]
HomePosition - Исходное положение стыкаИсходная позиция соединения, заданная как скаляр, зависящий от типа соединения. Исходная позиция должна находиться в диапазоне, установленном PositionLimits. Это свойство используется homeConfiguration для создания предопределенной домашней конфигурации для всего дерева жесткого тела.
В зависимости от типа соединения исходная позиция имеет другое определение.
fixed — 0 (по умолчанию). Фиксированное соединение не имеет соответствующего исходного положения.
revolute — 0 (по умолчанию). Поворотное соединение имеет исходное положение, определяемое углом поворота вокруг оси соединения в радианах.
prismatic — 0 (по умолчанию). Призматическое соединение имеет исходное положение, определяемое линейным движением вдоль оси соединения в метрах.
Пример: pi/2 радианы для revolute сустав
JointAxis - Ось движения для соединенияNaN
NaN
NaN] (по умолчанию) | трехэлементный единичный векторОсь движения для соединения, заданная как трехэлементный единичный вектор. Вектор может быть любым направлением в 3-D пространстве в локальных координатах.
В зависимости от типа соединения ось соединения имеет другое определение.
fixed - Неподвижное соединение не имеет соответствующей оси движения.
revolute - Поворотное соединение вращает тело в плоскости, перпендикулярной оси соединения.
prismatic - призматическое соединение перемещает тело линейным движением вдоль направления оси соединения.
Пример: [1 0 0] для движения вокруг оси X для revolute сустав
JointToParentTransform - Фиксированное преобразование из соединения в родительский кадрeye(4) (по умолчанию) | однородная матрица преобразования 4 на 4Это свойство доступно только для чтения.
Фиксированное преобразование из соединения в родительский кадр, возвращаемое в виде однородной матрицы преобразования 4 на 4. Преобразование преобразует координаты точек в объединенном предшествующем кадре в родительский кадр тела.
Пример: eye(4)
ChildToJointTransform - Фиксированное преобразование из дочернего тела в соединительную рамуeye(4) (по умолчанию) | однородная матрица преобразования 4 на 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;
Создайте первое жесткое тело и добавьте его к роботу. Для добавления жесткого тела:
Создать rigidBody и присвойте ему уникальное имя.
Создать rigidBodyJoint и присвойте ему уникальное имя.
Использовать setFixedTransform задание преобразования тело-тело с использованием параметров DH. Последний элемент параметров DH, theta, игнорируется, поскольку угол зависит от положения соединения.
Звонить 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) --------------------
rigidBodyJoint был переименованИзменение поведения в будущем выпуске
rigidBodyJoint объект был переименован из robotics.Joint. Использовать rigidBodyJoint для создания всех объектов.
[1] Крейг, Джон Дж. Введение в робототехнику: механика и управление. Рединг, Массачусетс: Эддисон-Уэсли, 1989.
[2] Сисилиано, Бруно. Робототехника: моделирование, планирование и контроль. Лондон: Спрингер, 2009.
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.