exponenta event banner

Выбор и размещение с помощью RRT для манипуляторов

Использование манипуляторов для выбора и размещения объектов в среде может потребовать алгоритмов планирования путей, таких как быстро исследуемый планировщик случайных деревьев. Планировщик исследует пространство совместной конфигурации и ищет путь без столкновений между различными конфигурациями роботов. В этом примере показано, как использовать manipulatorRRT объект для настройки параметров планировщика и планирования пути между двумя конфигурациями соединения на основе rigidBodyTree модель робота Franka Emika™ Panda. После настройки параметров планировщика робот-манипулятор планирует траекторию перемещения банки из одного места в другое.

Загрузить модель робота и среду

Загрузка робота и его среды с помощью exampleHelperLoadPickAndPlaceRRT функция. Функция выводит три переменные:

  • franka - Модель робота Franka Emika Panda в качестве rigidBodyTree объект. Модель была изменена, чтобы удалить некоторые смежные сети столкновений, которые всегда находятся в столкновении, и скорректировать пределы положения на основе осуществимости.

  • config - Начальная конфигурация положений соединения для робота.

  • env - набор объектов-коллизий в виде массива ячеек, представляющих среду робота. Планировщик путей проверяет наличие собственных коллизий и коллизий с этой средой.

[franka,config,env] = exampleHelperLoadPickAndPlaceRRT;

Визуализация сетей столкновения модели робота и объектов среды.

figure("Name","Pick and Place Using RRT",...
    "Units","normalized",...
    "OuterPosition",[0, 0, 1, 1],...
    "Visible","on");
show(franka,config,"Visuals","off","Collisions","on");
hold on
for i = 1:length(env)
    show(env{i});
end

Планировщик

Создайте планировщик путей RRT и укажите модель робота и среду. Определите некоторые параметры, которые будут настроены позже, и укажите конфигурацию начала и цели для робота.

planner = manipulatorRRT(franka, env);

planner.MaxConnectionDistance = 0.3;
planner.ValidationDistance = 0.1;

startConfig = config;
goalConfig = [0.2371   -0.0200    0.0542   -2.2272    0.0013    2.2072   -0.9670    0.0400    0.0400];

Запланируйте путь между конфигурациями. Планировщик RRT должен создать быстро исследуемое дерево случайных конфигураций для исследования пространства и в конечном итоге вернуть путь без столкновений через среду. Перед планированием сбросьте генератор случайных чисел MATLAB для повторяющихся результатов.

rng('default');
path = plan(planner,startConfig,goalConfig);

Чтобы визуализировать весь контур, выполните интерполяцию контура на небольшие шаги. По умолчанию interpolate генерирует все конфигурации, которые были проверены на выполнимость (проверка коллизий) на основе ValidationDistance собственность.

interpStates = interpolate(planner, path);

for i = 1:2:size(interpStates,1)
    show(franka, interpStates(i,:),...
        "PreservePlot", false,...
        "Visuals","off",...
        "Collisions","on");
    title("Plan 1: MaxConnectionDistance = 0.3")
    drawnow;
end

Настройка планировщика

Настройте планировщик пути путем изменения MaxConnectionDistance, ValidationDistance, EnableConnectHeuristic свойства на панели planner объект.

Установка MaxConnectionDistance свойство до большего значения вызывает более длинные движения в запланированном пути, но также позволяет планировщику жадно исследовать пространство. Использовать tic и toc функции во времени plan для справки о том, как эти параметры могут влиять на время выполнения.

planner.MaxConnectionDistance = 5;
tic
path = plan(planner,startConfig,goalConfig);
toc
Elapsed time is 11.217983 seconds.

Обратите внимание на изменение траектории. Рука робота качается намного выше из-за большего расстояния соединения.

interpStates = interpolate(planner, path);

for i = 1:2:size(interpStates, 1)
    show(franka,interpStates(i,:),...
        "PreservePlot",false,...
        "Visuals","off",...
        "Collisions","on");
    title("Plan 2: MaxConnectionDistance = 5")
    drawnow;
end

Установка ValidationDistance до меньшего значения позволяет более точно проверить движение вдоль кромки в запланированном пути. Увеличение количества конфигураций, подлежащих проверке по пути, приводит к увеличению времени планирования. Меньшее значение полезно в случае загроможденной среды с большим количеством объектов столкновения. Из-за малого расстояния проверки, interpStates имеет большее количество элементов. Для более быстрой визуализации for цикл пропускает больше состояний на этом шаге для более быстрой визуализации.

planner.MaxConnectionDistance = 0.3;
planner.ValidationDistance = 0.01;

tic
path = plan(planner,startConfig,goalConfig);
toc
Elapsed time is 11.115833 seconds.
interpStates = interpolate(planner,path);
for i = 1:10:size(interpStates,1)
    show(franka, interpStates(i,:),...
        "PreservePlot",false,...
        "Visuals","off",...
        "Collisions","on");
    title("Plan 3: ValidationDistance = 0.01")
    drawnow;
end

Эвристика соединения позволяет плановику жадно присоединяться к начальному и целевому деревьям. В местах, где среда менее загромождена, эта эвристика полезна для более короткого времени планирования. Однако жадное поведение в загроможденной среде приводит к бесполезным попыткам подключения. Установка EnableConnectHeuristic кому false может дать более длительное время планирования и более длинные пути, но приводит к более высокой частоте успешного поиска пути, учитывая количество итераций.

planner.ValidationDistance = 0.1;
planner.EnableConnectHeuristic = false;

tic
path = plan(planner,startConfig,goalConfig);
toc
Elapsed time is 7.556635 seconds.
interpStates = interpolate(planner,path);
for i = 1:2:size(interpStates,1)
    show(franka, interpStates(i,:), ...
        "PreservePlot",false,...
        "Visuals","off",...
        "Collisions","on");
    title("Plan 4: EnableConnectHeuristic = false")
    drawnow;
end

Прикрепление банки к концевому эффектору

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

% Create can as a rigid body
cylinder1 = env{3};
canBody = rigidBody("myCan");
canJoint = rigidBodyJoint("canJoint");

% Get current pose of the robot hand.
startConfig = path(end, :);
endEffectorPose = getTransform(franka,startConfig,"panda_hand");

% Place can into the end effector gripper.
setFixedTransform(canJoint,endEffectorPose\cylinder1.Pose); 

% Add collision geometry to rigid body.
addCollision(canBody,cylinder1,inv(cylinder1.Pose));
canBody.Joint = canJoint;

% Add rigid body to robot model.
addBody(franka,canBody,"panda_hand");

% Remove object from environment.
env(3) = [];

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

goalConfig = [-0.6564 0.2885 -0.3187 -1.5941 0.1103 1.8678 -0.2344 0.04 0.04];

planner.MaxConnectionDistance = 1;
planner.ValidationDistance = 0.2;
planner.EnableConnectHeuristic = false;
path = plan(planner,startConfig,goalConfig);

interpStates = interpolate(planner,path);

hold off

show(franka,config,"Visuals","off","Collisions","on");
hold on
for i = 1:length(env)
    show(env{i});
end

for i = 1:size(interpStates,1)
    show(franka,interpStates(i,:),...
        "PreservePlot", false,...
        "Visuals","off",...
        "Collisions","on");
    title("Plan 5: Place the Can")
    drawnow;
    if i == (size(interpStates,1))
        view([80,7])
    end
end

Сокращение запланированного пути

Чтобы сократить путь, используйте shorten и укажите число итераций. Небольшое значение для ValidationDistance свойство в сочетании с большим количеством итераций может привести к большим временам вычисления.

shortenedPath = shorten(planner,path,20);


interpStates = interpolate(planner,shortenedPath);
for i = 1:size(interpStates,1)
    show(franka, ...
        interpStates(i, :),  ...
        "PreservePlot", false, ...
        "Visuals", "off", ...
        "Collisions", "on");
    drawnow;
    title("Plane 6: Shorten the Path")
    if i > (size(interpStates,1)-2)
        view([80,7])
    end
end
hold off