Создайте основные модели дерева твердого тела

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

Чтобы загрузить модель робота от набора общих коммерчески доступных роботов, используйте loadrobot функция. Для примера смотрите Загрузку Предопределенные Модели Робота.

Если у вас есть файл URDF или модель Simscape Multibody™ вашего робота, можно импортировать как дерево твердого тела использование importrobot. Для примера см. Модели Simscape Multibody Импорта.

Создайте элементы твердого тела

Во-первых, создайте rigidBodyTree модель робота. Модель робота дерева твердого тела представляет целого робота, который составлен из твердых тел и соединений, которые присоединяют их вместе. Основа робота является фиксированной системой координат, которая задает мировые координаты. При добавлении первого тела, присоединяет тело к основе.

robot = rigidBodyTree("DataFormat","column");
base = robot.Base;

Затем создайте ряд рычажных устройств как rigidBody объекты. Робот состоит из вращающейся основы, 3 прямоугольных ручек и механизма захвата.

rotatingBase = rigidBody("rotating_base");
arm1 = rigidBody("arm1");
arm2 = rigidBody("arm2");
arm3 = rigidBody("arm3");
gripper = rigidBody("gripper");

Создайте объекты столкновения для каждого твердого тела с различными формами и размерностями. Когда вы создаете объекты столкновения, координатная система координат сосредоточена посреди объекта по умолчанию. Установите Pose свойство переместить систему координат в нижнюю часть каждого тела вдоль оси z. Смоделируйте механизм захвата как сферу для простоты.

collBase = collisionCylinder(0.05,0.04); % cylinder: radius,length
collBase.Pose = trvec2tform([0 0 0.04/2]);
coll1 = collisionBox(0.01,0.02,0.15); % box: length, width, height (x,y,z)
coll1.Pose = trvec2tform([0 0 0.15/2]);
coll2 = collisionBox(0.01,0.02,0.15); % box: length, width, height (x,y,z)
coll2.Pose = trvec2tform([0 0 0.15/2]);
coll3 = collisionBox(0.01,0.02,0.15); % box: length, width, height (x,y,z)
coll3.Pose = trvec2tform([0 0 0.15/2]);
collGripper = collisionSphere(0.025); % sphere: radius
collGripper.Pose = trvec2tform([0 -0.015 0.025/2]);

Добавьте тела столкновения в объекты твердого тела.

addCollision(rotatingBase,collBase)
addCollision(arm1,coll1)
addCollision(arm2,coll2)
addCollision(arm3,coll3)
addCollision(gripper,collGripper)

Присоедините соединения

Каждое твердое тело присоединяется с помощью шарнирного соединения. Создайте rigidBodyJoint объекты для каждого тела. Задайте ось X как ось вращения для прямоугольных соединений руки. Задайте ось Y для механизма захвата. Ось по умолчанию является осью z.

jntBase = rigidBodyJoint("base_joint","revolute");
jnt1 = rigidBodyJoint("jnt1","revolute");
jnt2 = rigidBodyJoint("jnt2","revolute");
jnt3 = rigidBodyJoint("jnt3","revolute");
jntGripper = rigidBodyJoint("gripper_joint","revolute");

jnt1.JointAxis = [1 0 0]; % x-axis
jnt2.JointAxis = [1 0 0];
jnt3.JointAxis = [1 0 0];
jntGripper.JointAxis = [0 1 0] % y-axis
jntGripper = 
  rigidBodyJoint with properties:

                      Type: 'revolute'
                      Name: 'gripper_joint'
                 JointAxis: [0 1 0]
            PositionLimits: [-3.1416 3.1416]
              HomePosition: 0
    JointToParentTransform: [4x4 double]
     ChildToJointTransform: [4x4 double]

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

setFixedTransform(jnt1,trvec2tform([0.015 0 0.04]))
setFixedTransform(jnt2,trvec2tform([-0.015 0 0.15]))
setFixedTransform(jnt3,trvec2tform([0.015 0 0.15]))
setFixedTransform(jntGripper,trvec2tform([0 0 0.15]))

Соберите робота

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

bodies = {base,rotatingBase,arm1,arm2,arm3,gripper};
joints = {[],jntBase,jnt1,jnt2,jnt3,jntGripper};

figure("Name","Assemble Robot","Visible","on")
for i = 2:length(bodies) % Skip base. Iterate through adding bodies and joints.
            bodies{i}.Joint = joints{i};
            addBody(robot,bodies{i},bodies{i-1}.Name)
            show(robot,"Collisions","on","Frames","off");
            drawnow;
end

Figure Assemble Robot contains an axes object. The axes object contains 5 objects of type patch. These objects represent base, rotating_base, arm1, arm2, arm3, gripper, rotating_base_coll_mesh, arm1_coll_mesh, arm2_coll_mesh, arm3_coll_mesh, gripper_coll_mesh.

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

showdetails(robot)
--------------------
Robot: (5 bodies)

 Idx            Body Name           Joint Name           Joint Type            Parent Name(Idx)   Children Name(s)
 ---            ---------           ----------           ----------            ----------------   ----------------
   1        rotating_base           base_joint             revolute                     base(0)   arm1(2)  
   2                 arm1                 jnt1             revolute            rotating_base(1)   arm2(3)  
   3                 arm2                 jnt2             revolute                     arm1(2)   arm3(4)  
   4                 arm3                 jnt3             revolute                     arm2(3)   gripper(5)  
   5              gripper        gripper_joint             revolute                     arm3(4)   
--------------------

Взаимодействуйте с моделью робота

Визуализируйте модель робота, чтобы подтвердить размерности с помощью interactiveRigidBodyTree объект. Используйте интерактивный графический интерфейс пользователя, чтобы переместить модель. Можно выбрать определенные тела и установить их объединенное положение. Чтобы взаимодействовать с более подробными моделями, которым предоставляют Robotics System Toolbox™, смотрите Загрузку Предопределенные Модели Робота или loadrobot функция.

figure("Name","Interactive GUI")
gui = interactiveRigidBodyTree(robot,"MarkerScaleFactor",0.25);

Figure Interactive Visualization contains an axes object. The axes object contains 21 objects of type patch, line, surface. This object represents base.

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

Следующие шаги

Теперь, когда вы создали свою модель в MATLAB®, можно хотеть сделать много разных вещей.

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

  • Сгенерируйте Генерацию Траектории и После на основе waypoints и других параметров с трапециевидными скоростными профилями, B-сплайнами или полиномиальными траекториями.

  • Планирование Движения Манипулятора Peform, использующее ваши модели робота и планировщика пути к быстро исследующему случайному дереву (RRT).

  • Проверяйте на Обнаружение столкновений с препятствиями в вашей среде, чтобы гарантировать безопасное и эффективное движение вашего робота.