Распространено в системе управления использовать выходные параметры инверсной кинематики, чтобы задать сетболы для контроллера. Роботизированная рука, для которой определяют задачу с трассировкой пути с его исполнительным элементом конца, например, может иметь один такой контроллер для каждого соединения. Учитывая путь к трассировке, решатель инверсной кинематики определяет мгновенные объединенные углы, чтобы предназначаться, и от них, диспетчеры могут получить объединенные крутящие моменты приведения в действие, чтобы применяться.
Чтобы поддержать кинематический анализ, требуемый таких задач, Simscape Multibody обеспечивает класс KinematicsSolver
. Создайте объект KinematicsSolver
получить подходящее представление модели для анализа, затем использовать объектные функции, чтобы сформулировать кинематическую проблему решить. Можно вызвать функции от блока MATLAB function, чтобы включить анализ с симуляцией или из скрипта MATLAB, чтобы запустить анализ вне симуляции.
Рассмотрите модель sm_import_humanoid_robot_urdf
от своей установки Simscape Multibody. Модель имеет робота обхода, разработанного после человеческого тела. Создайте кинематический объект решателя для модели:
sys = 'sm_import_humanoid_urdf';
ks = simscape.multibody.KinematicsSolver(sys)
Объект решателя имеет класс KinematicsSolver
, и это хранит, среди других данных, переменных вашего анализа. Те переменные могут быть объединенными переменными или структурировать переменные.
Объединенные переменные кодируют состояния соединений — компоненты перевода и вращения последователя относительно опорных рам. Переменные кадра кодируют положение тела, или, более точно, компоненты перевода и вращения кадра на том теле относительно другого кадра. Исполнительный элемент конца и ссылочные кадры походят на последователя и опорные рамы соединения.
Перечислите объединенные переменные в своем объекте решателя:
ks.jointVariables
Объединенные переменные включают все присутствующие в модели, когда объект решателя был создан. Если вы обновляете модель — добавляют соединения, говорят — затем необходимо создать новый объект решателя в порядке получить те изменения. Предположим, что ваш анализ ограничивается левой рукой. Соответствующие объединенные переменные являются затем вашим левым запястьем, коленом, лобное плечо, и плечо стреловидные углы — или строки 8, 6, 7 и 2 из объединенной таблицы переменных.
Перечислите переменные кадра в своем объекте решателя:
ks.frameVariables
Переменные кадра зависят от выбора исполнительного элемента конца, и этот выбор не может быть определен из одной только вашей модели. Необходимо указать который переменные кадра использовать. Когда ни один еще не был дан, ни один не существует, чтобы показать.
Позвольте левой руке быть исполнительным элементом конца. Возьмите кадр F руки, чтобы быть кадром исполнительного элемента конца и мировым кадром, чтобы быть вашим ссылочным кадром. Можно назвать эти кадры последователем и основой. Добавьте x, y, и z компоненты перевода, как измерено от основы до последователя, к вашим переменным кадра:
base = 'sm_import_humanoid_urdf/World/W'; follower = 'sm_import_humanoid_urdf/left_hand/F'; ks.addFrameVariables('Hand', 'translation', base, follower)
Обратите внимание на то, что base
и follower
должны быть полными путями ваших кадров. Обратите внимание также, что ваши переменные кадра, как задано, все имеют тип перевода. Что, если вы заботитесь о вращении исполнительного элемента конца также? Можно всегда добавлять (и удалять), переменные кадра. Добавить x, y, и z компоненты вращения:
ks.addFrameVariables('Hand', 'rotation', base, follower)
Hand
является переменным названием группы. Заметьте столбец ID своих таблиц переменных. Все переменные, или кадр или соединение, называют в формате group.type.component. Первая перечисленная переменная кадра находится в группе Hand
типа Translation
, и для компонента x. Другими словами, Hand.Translation.x
дает x перевод кадра последователя Hand
относительно опорной рамы.
Аналогично, первая объединенная перечисленная переменная принадлежит, чтобы сгруппировать j1
, имеет тип Rz
и задает q
компонента. Таким образом, j1.Rz.q
дает угол поворота (q
) примитивного соединения Rz
— или его кадра последователя относительно его опорной рамы. Rz
является шарнирным соединением, примитивным с z для его оси вращения.
Ваше соединение и переменные кадра теперь достаточны для анализа левой руки. Тип анализа зависит, на которых переменных вы задаете — ваши цели — и какие переменные вы решаете для — ваши выходные параметры. Целевые и выходные переменные могут каждый включить соединение и структурировать переменные. Они - в общем случае, подмножествах всего соединения и структурируют переменные.
Предположим, что вы имеете цели для своих объединенных углов и хотите положение кадра исполнительного элемента конца. Проблемой является одна из прямой кинематики. Установите объединенные переменные левой руки как ваши цели и переменные кадра типа перевода как ваш вывод:
ks.addTargetVariables(ks.jointVariables.ID([2,6:8])) ks.addOutputVariables(ks.frameVariables.ID(1:3))
Только одна вещь остается, чтобы завершить аналитическую формулировку — численные значения для целевых переменных. Переменные и их модули по умолчанию в градусах. Позвольте левому колену соединиться быть под углом с 30 степенями, левое плечо лобное и левое плечо стреловидные соединения в углу в 45 градусов каждый и соединение левого запястья под углом с 15 степенями:
targets = [30, 45, 45, 15];
Решите для выходных переменных и исследуйте результаты:
outputVec = ks.solve(targets)
outputVec = 0.2120 0.0505 -0.1273
outputVec
является вектором решений для выходных переменных — компоненты перевода, в модуле по умолчанию m
, левой руки кадр F относительно мирового кадра. Этот вектор отвечает на вопрос, скорее всего, чтобы управлять таким анализом: где исполнительный элемент конца, когда соединения под некоторыми данными углами?
Часто, вы имеете цели для своих переменных кадра — или своего исполнительного элемента конца — и хотите объединенные углы, сопоставимые с теми целями. Проблемой является теперь одна из инверсной кинематики, и решение, если вы найдены, является вероятным из нескольких возможных. Начните путем очистки целевых и выходных переменных от предыдущих исследований:
ks.clearTargetVariables ks.clearOutputVariables
clearTargetVariables
и clearOutputVariables
удаляют все целевые и выходные переменные из вашего объекта решателя. Похожие методы существуют для других переменных. Можно также удалить подмножества переменных. Удалить переменные кадра типа вращения — строки 4-6 в таблице переменных кадра:
ks.removeFrameVariables(ks.frameVariables.ID([4:6]))
Метод removeFrameVariables
удаляет только заданные переменные. Установите свои переменные кадра как цели и ваши соответствующие объединенные переменные — те из левой руки — как выведено:
ks.addTargetVariables(ks.frameVariables.ID) ks.addOutputVariables(ks.jointVariables.ID([2,6:8]))
Робот является маленьким, и плечи и предплечья - каждый на порядке 8 cm
долго. С этой мерой в памяти, устанавливает ваши переменные перевода кадра на [16, -12, 0] cm
, или, в единицах по умолчанию длины, [0.16, -0.12, 0] m
. Эти значения относительно Мирового кадра, который расположен в основе головы, с оставленным обращением оси X, обращением оси Y назад и подчеркивающей осью z:
targets = [0.16, -0.12, 0];
Решите для выходных переменных и исследуйте результаты:
outputVec = ks.solve(targets)
outputVec = 52.8406 -108.3936 7.0457 15.0565
Вывод является теперь вектором объединенных углов в модуле по умолчанию степеней. Углы - каждый для кадра последователя соединения относительно опорной рамы. Чтобы интерпретировать углы, это помогает визуализировать модель и проверять ориентацию объединенной опорной рамы. Можно использовать функцию set_param
, чтобы включить цели состояния положения и присвоить расчетные углы соответствующим соединениям:
for i = 1:length(outputVec) path = ks.outputVariables.JointVariableInfo.BlockPath(i); angle = num2str(outputVec(i)); set_param(path, 'PositionTargetSpecify', 'on',... 'PositionTargetValue', angle); end
Обновите блок-схему (Simulation> Update Diagram), чтобы открыть Mechanics Explorer и визуализировать модель в ее новом начальном состоянии. Рука — исполнительный элемент конца — находится в нужной области кадра, но колено имеет неестественный изгиб. Можно исправить изгиб — или попытаться исправить его — путем определения предположений для выходных переменных.
Предположения, сами переменные, служат, чтобы вести решатель к разумной настройке блока. Они могут быть объединенными переменными или структурировать переменные и, в общем случае, соединении обоих. Установите переменную соединения колена — единственное, которому нужно руководство — как переменная предположения:
ks.addInitialGuessVariables(ks.jointVariables.ID(2))
Думайте о переменных предположения как о низкоприоритетных объединенных целях состояния. Они не всегда удовлетворяются — например, если две переменные предположения находятся в конфликте. Экспериментируйте с предполагаемыми значениями, чтобы найти немного, которые работают. Здесь, чтобы дать колену естественный изгиб, это достаточно, чтобы инвертировать знак расчетного угла колена:
guesses = -50;
Решите для выходных переменных с помощью и цели и угадайте переменные, как введено:
outputVec = ks.solve(targets,guesses);
Обновите объединенные цели положения как прежде:
for i = 1:length(outputVec) path = ks.outputVariables.JointVariableInfo.BlockPath(i); angle = num2str(outputVec(i)); set_param(path, 'PositionTargetSpecify', 'on',... 'PositionTargetValue', angle); end
Обновите блок-схему, чтобы визуализировать результаты. Рука должна остаться, где это было с левым коленом, теперь отворачивающимся от туловища.