sample

Демонстрационный исполнительный элемент конца позирует в мировой системе координат

Описание

eePose = sample(goalRegion) производит положение исполнительного элемента конца в мировой системе координат как гомогенная матрица преобразования.

Функция возвращает положение, однородно произведенное в свойстве Bounds относительно системы координат, и применяет следующие преобразования на основе свойств ReferencePose и EndEffectorOffsetPose:

tSample; % Pose sampled within Bounds
Tw0 = goalRegion.ReferencePose;
TeW = goalRegion.EndEffectorOffsetPose;
eePose = Tw0 * tSample * TeW; % tSample is a pose within the bounds.

пример

eePose = sample(goalRegion,numSamples) выборки несколько положений на основе входа numSamples. Функция возвращается, исполнительный элемент конца изображает из себя трехмерный массив гомогенных преобразований.

Примеры

свернуть все

Демонстрационные различные положения в границах области цели рабочей области для руки манипулятора. Некоторые положения исполнительного элемента конца не могут быть желательными из-за расположения тел руки и препятствий в сцене. workspaceGoalRegion объект задает границы на XYZ-позиционной и Эйлеровой ориентации ZYX исполнительного элемента конца робота. sample возразите функции однородно выборки случайные положения в границах. Найдите настройки, которые достигают этих положений исполнительного элемента конца и определяют лучшее визуализацией.

Загрузите существующую модель робота как rigidBodyTree объект.

robot = loadrobot("kinovaGen3","DataFormat","row");
show(robot,"Collisions","on","Visuals","off");

Добавьте банку как collisionCylinder возразите против манипулятора.

can = collisionCylinder(0.05, 0.1); 
can.Pose = trvec2tform([0.2, 0.3, 0.5]); 

addCollision(robot.Bodies{end},"cylinder", [0.05, 0.1], trvec2tform([0, 0, 0.02])); 

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

table = collisionBox(0.7, 0.5, 0.04); 
table.Pose = trvec2tform([0, 0.5, 0.43]); 
env = {can, copy(can), copy(can), table}; 
env{2}.Pose = trvec2tform([-0.1, 0.3, 0.5]); 
env{3}.Pose = trvec2tform([-0.1, 0.5, 0.5]); 

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

Figure contains an axes object. The axes object contains 55 objects of type patch, line. These objects represent base_link, Shoulder_Link, HalfArm1_Link, HalfArm2_Link, ForeArm_Link, Wrist1_Link, Wrist2_Link, Bracelet_Link, EndEffector_Link, Shoulder_Link_mesh, HalfArm1_Link_mesh, HalfArm2_Link_mesh, ForeArm_Link_mesh, Wrist1_Link_mesh, Wrist2_Link_mesh, Bracelet_Link_mesh, base_link_mesh, Shoulder_Link_coll_mesh, HalfArm1_Link_coll_mesh, HalfArm2_Link_coll_mesh, ForeArm_Link_coll_mesh, Wrist1_Link_coll_mesh, Wrist2_Link_coll_mesh, Bracelet_Link_coll_mesh, base_link_coll_mesh, EndEffector_Link_coll_mesh.

Задайте целевую область

Создайте область цели рабочей области с помощью имени корпуса исполнительного элемента конца робота.

Задайте целевые параметры области для своей рабочей области. Целевая область включает ссылочное положение, XYZ-позиционные границы и пределы ориентации на Углах Эйлера ZYX. Этот пример задает границы XYZ в табличных размерностях и прикрепляет вращение к маленькой области значений в Y и оси X.

tableRegion = workspaceGoalRegion("EndEffector_Link",...
    "ReferencePose",table.Pose);
tableRegion.EndEffectorOffsetPose(1:3,1:3) = eul2rotm([0, 0, pi]); 
tableRegion.EndEffectorOffsetPose(3, end) = 0.1; 

tableRegion.Bounds = ... 
    [-table.X/2, table.X/2; % X Bounds
    -table.Y/2, table.Y/2;  % Y Bounds
    0.04, 0.10;             % Z Bounds
    -pi, pi;                % Rotation about Z-axis
    -0.01, 0.01;            % Y-Axis
    -0.01, 0.01;];          % X-Axis

show(tableRegion);
view(165,50)
camzoom(3.5)

Figure contains an axes object. The axes object contains 65 objects of type line, patch. These objects represent base_link, Shoulder_Link, HalfArm1_Link, HalfArm2_Link, ForeArm_Link, Wrist1_Link, Wrist2_Link, Bracelet_Link, EndEffector_Link, Shoulder_Link_mesh, HalfArm1_Link_mesh, HalfArm2_Link_mesh, ForeArm_Link_mesh, Wrist1_Link_mesh, Wrist2_Link_mesh, Bracelet_Link_mesh, base_link_mesh, Shoulder_Link_coll_mesh, HalfArm1_Link_coll_mesh, HalfArm2_Link_coll_mesh, ForeArm_Link_coll_mesh, Wrist1_Link_coll_mesh, Wrist2_Link_coll_mesh, Bracelet_Link_coll_mesh, base_link_coll_mesh, EndEffector_Link_coll_mesh.

Демонстрационные положения

Однородно демонстрационные положения в табличной области с помощью sample объектная функция. В этом примере, набор rng отберите, чтобы получить результаты repeatible. Создайте векторы для хранения допустимых и недопустимых положений.

rng(0)
poses = sample(tableRegion,10);
validPoses = [];
invalidPoses = [];

Проверяйте на столкновения

Чтобы найти настройки для тех положений, создайте решатель инверсной кинематики (IK).

ik = inverseKinematics('RigidBodyTree',robot);
config = cell(10);

Протестируйте произведенные положения путем итерации через произведенные положения, решения для настроек с помощью IK, и проверяя на столкновения. Покажите допустимые настройки.

for i = 1:length(poses)
    % Solve for robot configuraiton using IK.
    config{i} = ik("EndEffector_Link",poses(:,:,i),ones(6,1),homeConfiguration(robot));
    % Check for collisions.
    isColliding = checkCollision(robot,config{i},env);
    
    if ~isColliding % If not in collision, show robot configuration and save valid pose.
        show(robot,config{i},"PreservePlot",false,"Collisions","on","Visuals","off");
        drawnow
        validPoses = [validPoses; i];
    else
        invalidPoses = [invalidPoses; i];
    end
    
end

Figure contains an axes object. The axes object contains 40 objects of type line, patch. These objects represent base_link, Shoulder_Link, HalfArm1_Link, HalfArm2_Link, ForeArm_Link, Wrist1_Link, Wrist2_Link, Bracelet_Link, EndEffector_Link, Shoulder_Link_mesh, HalfArm1_Link_mesh, HalfArm2_Link_mesh, ForeArm_Link_mesh, Wrist1_Link_mesh, Wrist2_Link_mesh, Bracelet_Link_mesh, base_link_mesh, Shoulder_Link_coll_mesh, HalfArm1_Link_coll_mesh, HalfArm2_Link_coll_mesh, ForeArm_Link_coll_mesh, Wrist1_Link_coll_mesh, Wrist2_Link_coll_mesh, Bracelet_Link_coll_mesh, EndEffector_Link_coll_mesh, base_link_coll_mesh.

disp(string(validPoses'))
    "3"    "5"    "7"    "10"

Визуализируйте ожог допустимое положение

Постройте все допустимые положения, как преобразовывает. Итоговая допустимая настройка от проверки столкновений все еще отображается на рисунке.

translations = tform2trvec(poses(:,:,validPoses));
rotations = tform2quat(poses(:,:,validPoses));

plotTransforms(translations,rotations,"FrameSize",0.1)

Figure contains an axes object. The axes object contains 56 objects of type patch, line. These objects represent base_link, Shoulder_Link, HalfArm1_Link, HalfArm2_Link, ForeArm_Link, Wrist1_Link, Wrist2_Link, Bracelet_Link, EndEffector_Link, Shoulder_Link_mesh, HalfArm1_Link_mesh, HalfArm2_Link_mesh, ForeArm_Link_mesh, Wrist1_Link_mesh, Wrist2_Link_mesh, Bracelet_Link_mesh, base_link_mesh, Shoulder_Link_coll_mesh, HalfArm1_Link_coll_mesh, HalfArm2_Link_coll_mesh, ForeArm_Link_coll_mesh, Wrist1_Link_coll_mesh, Wrist2_Link_coll_mesh, Bracelet_Link_coll_mesh, EndEffector_Link_coll_mesh, base_link_coll_mesh.

Покажите допустимую настройку из списка. Измените индекс в validPoses смотреть на различные положения. Вызовите hold off прекратить сохранять элементы фигуры. Чтобы вручную смотреть положения и настройки, закомментируйте итоговую линию при выполнении.

poseIndex = validPoses(1);
show(robot,config{poseIndex},"PreservePlot",false,"Collisions","on","Visuals","off");
hold off

Figure contains an axes object. The axes object contains 56 objects of type patch, line. These objects represent base_link, Shoulder_Link, HalfArm1_Link, HalfArm2_Link, ForeArm_Link, Wrist1_Link, Wrist2_Link, Bracelet_Link, EndEffector_Link, Shoulder_Link_mesh, HalfArm1_Link_mesh, HalfArm2_Link_mesh, ForeArm_Link_mesh, Wrist1_Link_mesh, Wrist2_Link_mesh, Bracelet_Link_mesh, base_link_mesh, Shoulder_Link_coll_mesh, HalfArm1_Link_coll_mesh, HalfArm2_Link_coll_mesh, ForeArm_Link_coll_mesh, Wrist1_Link_coll_mesh, Wrist2_Link_coll_mesh, Bracelet_Link_coll_mesh, EndEffector_Link_coll_mesh, base_link_coll_mesh.

Входные параметры

свернуть все

Область цели рабочей области в виде workspaceGoalRegion объект.

Количество отсчетов в виде положительного целого числа

Выходные аргументы

свернуть все

Положения произвели в границах рабочей области в мировой системе координат, возвращенной как четыре четыре гомогенная матрица преобразования или 4 4 n массивом, где n является количеством отсчетов numSamples.

Функция возвращает положение, однородно произведенное в свойстве Bounds относительно системы координат, и применяет следующие преобразования на основе свойств ReferencePose и EndEffectorOffsetPose:

tSample = rand(6,2);
Tw0 = goalRegion.ReferencePose;
TeW = goalRegion.EndEffectorOffsetPose;
eePose = Tw0 * tSample * TeW;

Типы данных: double

Расширенные возможности

Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.

Смотрите также

| |

Введенный в R2021a