Создайте соединение
The rigidBodyJoint
объекты определяют, как твердое тело перемещается относительно точки присоединения. У древовидного робота соединение всегда принадлежит определенному твёрдому телу, и каждое твёрдое тело имеет одно соединение.
The rigidBodyJoint
объект может описывать соединения различных типов. При построении древовидной структуры твёрдого тела с rigidBodyTree
, вы должны назначить Joint
объект твердому телу с помощью rigidBody
класс.
Поддерживаются следующие типы соединений:
fixed
- Фиксированное соединение, препятствующее относительному движению двух тел.
revolute
- соединение с одной степенью свободы (DOF), которое вращается вокруг заданной оси. Также называется контактом или шарнирным соединением.
prismatic
- Одно соединение DOF, которое скользит по заданной оси. Также называется скользящим соединением.
Каждый тип соединения имеет различные свойства с различными размерностями, в зависимости от заданной геометрии.
jname
- имя соединенияИмя соединения, заданное как строковый скаляр или вектор символов. Имя соединения должно быть уникальным, чтобы получить доступ к нему из древовидного твердого тела.
Пример: "elbow_right"
Типы данных: char
| string
jtype
- Тип соединения'fixed'
(по умолчанию) | строковый скаляр | символьный векторТип соединения, заданный как строковый скаляр или вектор символов. Тип соединения предопределяет определенные свойства при создании соединения.
Поддерживаются следующие типы соединений:
fixed
- Фиксированное соединение, препятствующее относительному движению двух тел.
revolute
- соединение с одной степенью свободы (DOF), которое вращается вокруг заданной оси. Также называется контактом или шарнирным соединением.
prismatic
- Одно соединение DOF, которое скользит по заданной оси. Также называется скользящим соединением.
Пример: "prismatic"
Типы данных: char
| string
Type
- Тип соединения'fixed'
(по умолчанию) | строковый скаляр | символьный векторЭто свойство доступно только для чтения.
Тип соединения, возвращенный как строковый скаляр или вектор символов. Тип соединения предопределяет определенные свойства при создании соединения.
Поддерживаются следующие типы соединений:
fixed
- Фиксированное соединение, препятствующее относительному движению двух тел.
revolute
- соединение с одной степенью свободы (DOF), которое вращается вокруг заданной оси. Также называется контактом или шарнирным соединением.
prismatic
- Одно соединение DOF, которое скользит по заданной оси. Также называется скользящим соединением.
Если твердое тело, которое содержит это соединение, добавляется к модели робота, тип соединения должен быть изменен путем замены соединения с помощью 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
] (по умолчанию) | трехэлементный единичный векторОсь движения для соединения, заданная как трехэлементный единичный вектор. Вектор может быть любым направлением в трехмерном пространстве в локальных координатах.
В зависимости от типа соединения ось соединения имеет другое определение.
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 | Установите свойства фиксированного преобразования соединения |
Добавьте твердое тело и соответствующее соединение в древовидное твердое тело. Каждый r igidBody
объект содержит rigidBodyJoint
объект и должен быть добавлен в r igidBodyTree
использование addBody
.
Создайте древовидное твердое тело.
rbtree = rigidBodyTree;
Создайте твердое тело с уникальным именем.
body1 = rigidBody('b1');
Создайте шарнирное соединение. По умолчанию r igidBody
объект поставляется с фиксированным соединением. Замените соединение путем назначения нового 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) --------------------
Используйте параметры Денавита-Хартенберга (DH) робота Puma560 ®, чтобы создать робота. Каждое твердое тело добавляется по одному с преобразованием «child-to-parent», заданным объектом joint.
Параметры 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] Corke, P. I., and B. Armstrong-Helouvry. «Поиск консенсуса среди параметров модели, сообщенных для робота PUMA 560». Материалы 1994 Международной конференции IEEE по робототехнике и автоматизации, IEEE Comput. Soc. Press, 1994, pp. 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
был переименованИзменение поведения в будущем релизе
The rigidBodyJoint
объект был переименован из robotics.Joint
. Использование rigidBodyJoint
для создания всех объектов.
[1] Крейг, Джон Дж. Введение в робототехнику: механика и управление. Reading, MA: Addison-Wesley, 1989.
[2] Сисилиано, Бруно. Робототехника: моделирование, планирование и управление. Лондон: Спрингер, 2009.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.