В этом примере показано, как использовать элементы модели робота дерева твердого тела, чтобы создать основной манипулятор с пятью степенями свободы. Модель, созданная в этом примере, представляет общие настольные манипуляторы, созданные с сервомоторами и платой интегральной схемы.
Чтобы загрузить модель робота от набора общих коммерчески доступных роботов, используйте 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
Вызовите 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);
Переместите интерактивный маркер вокруг, чтобы протестировать различные желаемые положения механизма захвата. Графический интерфейс пользователя использует инверсную кинематику, чтобы сгенерировать лучшую объединенную настройку. Для получения дополнительной информации об интерактивном графический интерфейсе пользователя, смотрите interactiveRigidBodyTree
объект.
Теперь, когда вы создали свою модель в MATLAB®, можно хотеть сделать много разных вещей.
Выполните Инверсную кинематику, чтобы получить объединенные настройки на основе желаемых положений исполнительного элемента конца. Задайте дополнительные ограничения робота кроме параметров модели включая стремление ограничений, Декартовых границ или целей положения.
Сгенерируйте Генерацию Траектории и После на основе waypoints и других параметров с трапециевидными скоростными профилями, B-сплайнами или полиномиальными траекториями.
Планирование Движения Манипулятора Peform, использующее ваши модели робота и планировщика пути к быстро исследующему случайному дереву (RRT).
Проверяйте на Обнаружение столкновений с препятствиями в вашей среде, чтобы гарантировать безопасное и эффективное движение вашего робота.