Запланируйте цепкое движение Кинову Джако Ассистив Роботикс Арм, использующую алгоритм быстро исследующего случайного дерева (RRT). Этот пример использует plannerRRTStar
возразите, чтобы произвести состояния и запланировать движение робота. Если помощники в качестве примера иллюстрируют, как задать пользовательские пространства состояний и валидацию состояния для приложений планирования движения.
Загрузите модель Киновой Джако от библиотеки робота. Эта конкретная модель включает механизм захвата с тремя пальцами.
kin = loadrobot('kinovaJacoJ2S7S300');
Используя примитивы объекта столкновения, добавьте пол, два стола, и цилиндр может. Задайте размер и положение этих объектов. Обеспеченное изображение показывает созданную среду.
floor = collisionBox(1, 1, 0.01); tabletop1 = collisionBox(0.4,1,0.02); tabletop1.Pose = trvec2tform([0.3,0,0.6]); tabletop2 = collisionBox(0.6,0.2,0.02); tabletop2.Pose = trvec2tform([-0.2,0.4,0.5]); can = collisionCylinder(0.03,0.16); can.Pose = trvec2tform([0.3,0.0,0.7]);
Рука Киновой имеет десять степеней свободы (число степеней свободы) с последними тремя числами степеней свободы, соответствующими пальцам. Только используйте первые семь чисел степеней свободы для планирования и сохраните пальцы в нулевой настройке (широко открытыми). ExampleHelperRigidBodyTreeStateSpace
пространство состояний создается, чтобы представлять пробел настройки (объединенный пробел). ExampleHelperRigidBodyTreeStateSpace
выборки выполнимые состояния для манипулятора. sampleUniform
функция пространства состояний чередуется между следующими двумя стратегиями выборки с равной вероятностью:
Однородно случайная выборка положение исполнительного элемента конца в области Цели Рабочей области вокруг ссылочного целевого положения, затем сопоставьте его с объединенным пробелом через инверсную кинематику. Уважают объединенные пределы.
Однородно случайная выборка на объединенном пробеле. Уважают объединенные пределы.
Первая стратегия выборки помогает вести планировщика RRT к целевой области на пробеле задачи так, чтобы RRT мог сходиться к решению быстрее вместо того, чтобы теряться на семи пробелах соединения степени свободы.
Используя Область цели рабочей области (WGR) вместо одного целевого положения увеличивает шанс нахождения решения путем смещения выборок в целевую область. WGR задает континуум приемлемых положений исполнительного элемента конца для определенных задач. Например, робот может приблизиться от нескольких направлений, чтобы схватить чашку воды со стороны, пока это не сталкивается со средой. Концепция WGR сначала предложена Дмитрием Беренсоном и др. [1] в 2 009. Этот алгоритм позже развит из областей Пробела Задачи [2]. WGR состоит из трех частей:
Twgr_0
- Ссылочное преобразование WGR в мире ({0}) координаты
Te_w
- Смещение исполнительного элемента конца преобразовывает в {w}, координаты, {w} производится от WGR
Bounds
- 6 2 матрица границ в ссылочных координатах WGR. Первые три строки Bounds
установите допустимый перевод вдоль x, y, и оси z (в метрах) соответственно и последние три устанавливают допустимые вращения вокруг допустимых вращений вокруг x, y, и оси z (в радианах). Обратите внимание на то, что Углы Эйлера Рыскания тангажа крена (RPY) используются, когда они могут быть интуитивно заданы.
Можно задать и конкатенировать несколько WGRs в одной проблеме планирования. В этом примере позволен только один WGR.
% Create state space and set workspace goal regions (WGRs) ss = ExampleHelperRigidBodyTreeStateSpace(kin); ss.EndEffector = 'j2s7s300_end_effector'; % Define the workspace goal region (WGR) % This WGR tells the planner that the can shall be grasped from % the side and the actual grasp height may wiggle at most 1 cm. % This is the orientation offset between the end-effector in grasping pose and the can frame R = [0 0 1; 1 0 0; 0 1 0]; Tw_0 = can.Pose; Te_w = rotm2tform(R); bounds = [0 0; % x 0 0; % y 0 0.01; % z 0 0; % R 0 0; % P -pi pi]; % Y setWorkspaceGoalRegion(ss,Tw_0,Te_w,bounds);
Индивидуально настраиваемый блок проверки допустимости состояния, ExampleHelperValidatorRigidBodyTree
, обеспечивает проверку столкновения твердого тела между роботом и средой. Этот блок проверки допустимости проверки произведенные настройки и планировщик должен отбросить недопустимые состояния.
sv = ExampleHelperValidatorRigidBodyTree(ss); % Add obstacles in the environment addFixedObstacle(sv,tabletop1, 'tabletop1', [71 161 214]/256); addFixedObstacle(sv,tabletop2, 'tabletop2', [71 161 214]/256); addFixedObstacle(sv,can, 'can', 'r'); addFixedObstacle(sv,floor, 'floor', [1,0.5,0]); % Skip collision checking for certain bodies for performance skipCollisionCheck(sv,'root'); % root will never touch any obstacles skipCollisionCheck(sv,'j2s7s300_link_base'); % base will never touch any obstacles skipCollisionCheck(sv,'j2s7s300_end_effector'); % this is a virtual frame % Set the validation distance sv.ValidationDistance = 0.01;
Используйте plannerRRT
объект с индивидуально настраиваемым пространством состояний и объекты блока проверки допустимости состояния. Задайте запуск и целевые настройки при помощи inverseKinematics
решить для configrations на основе положения исполнительного элемента конца. Задайте GoalReachedFcn
использование exampleHelperIsStateInWorkspaceGoalRegion
, который проверяет, достигает ли путь целевой области.
% Set random seeds for repeatable results rng(0,'twister') % 0 % Compute the reference goal configuration. Note this is applicable only when goal bias is larger than 0. Te_0ref = Tw_0*Te_w; % Reference end-effector pose in world coordinates, derived from WGR ik = inverseKinematics('RigidBodyTree',kin); refGoalConfig = ik(ss.EndEffector,Te_0ref,ones(1,6),homeConfiguration(ss.RigidBodyTree)); % Compute the initial configuration (end-effector is initially under the table) T = Te_0ref; T(1,4) = 0.3; T(2,4) = 0.0; T(3,4) = 0.4; initConfig = ik(ss.EndEffector,T,ones(1,6),homeConfiguration(ss.RigidBodyTree)); % Create the planner from previously created state space and state validator planner = plannerRRT(ss,sv); % If a node in the tree falls in the WGR, a path is considered found. planner.GoalReachedFcn = @exampleHelperIsStateInWorkspaceGoalRegion; % Set the max connection distance. planner.MaxConnectionDistance = 0.5; % With WGR, there is no need to specify a particular goal configuration (use % initConfig to hold the place). % As a result, one can set GoalBias to zero. planner.GoalBias = 0; [pthObj,solnInfo] = plan(planner,initConfig, initConfig);
Найденный путь сначала сглаживается через рекурсивную сокращающую угол стратегию [3], прежде чем движение будет анимировано.
% Smooth the path. interpolate(pthObj,100); newPathObj = exampleHelperPathSmoothing(pthObj,sv); interpolate(newPathObj,200); figure states = newPathObj.States; % Draw the robot. ax = show(kin,states(1,:)); zlim(ax, [-0.03, 1.4]) xlim(ax, [-1, 1]) ylim(ax, [-1, 1]) % Render the environment. hold on showObstacles(sv, ax); view(146, 33) camzoom(1.5) % Show the motion. for i = 2:length(states) show(kin,states(i,:),'PreservePlot',false,'Frames','off','Parent',ax); drawnow end q = states(i,:); % Grab the can. q = exampleHelperEndEffectorGrab(sv,'can',q, ax);
Поставьте цель psotion для банки на другой поверхности стола.
targetPos = [-0.15,0.35,0.51];
exampleHelperDrawHorizontalCircle(targetPos,0.02,'y',ax);
Во время движения перемещения сохраните цилиндр, может выровняться во все время, чтобы избежать разлива. Задайте дополнительное ограничение на временные настройки манипулятора для планировщика RRT. Включите ограничение путем установки UseConstrainedSampling
свойство к истине.
Tw_0 = trvec2tform(targetPos+[0,0,0.08]); Te_w = rotm2tform(R); bounds = [0 0; % x 0 0; % y 0 0; % z 0 0; % R 0 0; % P -pi pi]; % Y setWorkspaceGoalRegion(ss,Tw_0,Te_w,bounds); ss.UseConstrainedSampling = true; planner.MaxConnectionDistance = 0.05; [pthObj2,~] = plan(planner,q,q);
Визуализируйте движение.
states = pthObj2.States; view(ax, 152,45) for i = 2:length(states) show(kin,states(i,:),'PreservePlot',false,'Frames','off','Parent',ax); drawnow end q = states(i,:); % let go of the can q = exampleHelperEndEffectorRelease(sv,q,ax);
[1] Д. Беренсон, С. Сриниваса, Д. Фергюсон, A. Оправа и Дж. Каффнер, "Манипуляция, Планирующая с областями Цели Рабочей области", в Продолжениях Международной конференции IEEE по вопросам Робототехники и Автоматизации, 2009, pp.1397-1403
[2] Д. Беренсон, С. Сриниваса и Дж. Каффнер, "области пробела задачи: среда для ограниченного положением планирования манипуляции", международный журнал исследования робототехники, издания 30, № 12 (2011): 1435-1460
[3] П. Чен и И. Хван, "SANDROS: динамический алгоритм поиска графика для планирования движения", транзакция IEEE на робототехнике и автоматизации, издании 14 № 3 (1998): 390-403