Реализация 2D обратной кинематики - PullRequest
9 голосов
/ 13 апреля 2010

Я пытаюсь реализовать инверсную кинематику на двумерной руке (состоящей из трех палочек с шарнирами). Я могу повернуть нижнюю руку в нужное положение. Теперь у меня есть несколько вопросов:

  1. Как я могу заставить плечо двигаться вместе с третьим, чтобы конечная точка руки достигла желаемой точки. Нужно ли мне использовать матрицы вращения для обоих, и если да, может кто-нибудь дать мне какой-нибудь пример или помощь, и есть ли другой способ сделать это без матриц вращения ???

  2. Самая низкая рука движется только в одном направлении. Я попробовал Google, они говорят, что перекрестное произведение двух векторов дает направление для руки, но это для 3D. Я использую 2D и перекрестное произведение двух 2D векторов, чтобы получить скаляр. Итак, как я могу определить его направление ???

Плз, ребята, любая помощь будет оценена ....

Спасибо заранее Викрам

Ответы [ 4 ]

7 голосов
/ 13 апреля 2010

Я попробую, но так как моей робототехнике уже два десятилетия, возьми ее с солью.

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

Это дало именно тот эффект, который вы искали: вы могли перемещать только один сустав (изменить его ориентацию), а все остальные суставы выполнялись автоматически.

У вас не будет большого шанса обойти матрицы здесь - на самом деле, если вы используете однородные координаты, все совместные вычисления (вращения и сдвиги) могут быть смоделированы с умножением матрицы. Преимущество состоит в том, что положение полной руки можно описать одной матрицей (плюс происхождение руки).

С помощью этой матрицы преобразования вы можете решить обратную кинематическую задачу: поскольку элементы матрицы преобразования будут зависеть от углов соединений, вы можете рассматривать весь расчет «конечная точка = начальная точка x преобразования» как систему уравнений, и с известной начальной и конечной точкой, вы можете решить эту систему, чтобы определить неизвестные углы. Трудность заключается в том, что уравнение может быть неразрешимым или что существует несколько решений.

Я не совсем понимаю ваш второй вопрос - что вы ищете?

6 голосов
/ 23 декабря 2010
  1. Вместо матрицы вращения, вращение может быть представлено его углом или комплексным числом единичного круга , но на самом деле это то же самое. Что еще более важно, вам нужно представление T из преобразований твердого тела , чтобы вы могли писать такие вещи, как t1 * t2 * t3, для вычисления положения и ориентации третьей ссылки.

  2. Используйте atan2 для вычисления угла между векторами .

Как показывает следующий пример Python, этих двух вещей достаточно для создания небольшого IK-решателя.

from gameobjects.vector2 import Vector2 as V
from matrix33 import Matrix33 as T
from math import sin, cos, atan2, pi
import random

Библиотека gameobjects не имеет 2D-преобразований, поэтому вы должны написать matrix33 самостоятельно. Его интерфейс похож на gameobjects.matrix44.

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

def fk_joint(joint, angle): return T.rotation(angle) * joint

Преобразование инструмента: tool == fk(joints, q), где joints - фиксированные преобразования, а q - углы соединения:

def fk(joints, q):
    prev = T.identity()
    for i, joint in enumerate(joints):
        prev = prev * fk_joint(joint, q[i])
    return prev

Если основание рычага имеет смещение, замените преобразование T.identity().

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

def ccd_step(q, prev, tool, goal):
    a = tool.get_position() - prev.get_position()
    b = goal - prev.get_position()
    return q + atan2(b.get_y(), b.get_x()) - atan2(a.get_y(), a.get_x())

Обходите соединения и обновляйте конфигурацию инструмента при каждом изменении значения соединения:

def ccd_sweep(joints, tool, q, goal):
    prev = T.identity()
    for i, joint in enumerate(joints):
        next = prev * fk_joint(joint, q[i])
        q[i] = ccd_step(q[i], prev, tool, goal)
        prev = prev * fk_joint(joint, q[i])
        tool = prev * next.get_inverse() * tool
    return prev

Обратите внимание, что fk() и ccd_sweep() одинаковы для 3D; вам просто нужно переписать fk_joint() и ccd_step().

Создайте плечо из n идентичных звеньев и выполните cnt итераций развертки CCD, начиная со случайной конфигурации плеча q:

def ccd_demo(n, cnt):
    q = [random.uniform(-pi, pi) for i in range(n)]
    joints = [T.translation(0, 1)] * n
    tool = fk(joints, q)
    goal = V(0.9, 0.75)  # Some arbitrary goal.
    print "i     Error"
    for i in range(cnt):
        tool = ccd_sweep(joints, tool, q, goal)
        error = (tool.get_position() - goal).get_length()
        print "%d  %e" % (i, error)

Мы можем опробовать решатель и сравнить скорость сходимости для разного количества ссылок:

>>> ccd_demo(3, 7)
i     Error
0  1.671521e-03
1  8.849190e-05
2  4.704854e-06
3  2.500868e-07
4  1.329354e-08
5  7.066271e-10
6  3.756145e-11
>>> ccd_demo(20, 7)
i     Error
0  1.504538e-01
1  1.189107e-04
2  8.508951e-08
3  6.089372e-11
4  4.485040e-14
5  2.601336e-15
6  2.504777e-15
3 голосов
/ 14 апреля 2010

Обозначение DH (Denavit-Hartenberg) является частью решения. Это поможет вам собрать краткий набор значений, которые описывают механику вашего робота, такую ​​как длина звена и тип соединения.

Оттуда становится проще вычислять прямую кинематику. Первое, что вы должны понять, это как перевести координатную рамку из одного места в другое. Например, учитывая вашего робота (или его таблицу DH), какой набор поворотов и перемещений вы должны применить к одной системе координат (например, к миру), чтобы узнать местоположение точки (или вектора) в координатная рамка запястья робота.

Как вы, возможно, уже знаете, однородные матрицы преобразования очень полезны для таких преобразований. Это матрицы 4х4, которые включают в себя вращение и перемещение. Другое очень полезное свойство этих матриц состоит в том, что если у вас есть две координатные рамки, связанные и определенные некоторым вращением и сдвигом, если вы умножаете две матрицы вместе, то вам просто нужно умножить цель преобразования на произведение этого умножения.

Таким образом, таблица DH поможет вам построить эту матрицу.

Обратная кинематика немного сложнее и зависит от вашего приложения. Сложность возникает из-за наличия нескольких решений для одной и той же проблемы. Чем больше количество степеней свободы, тем больше число решений.

Подумай о своей руке. Ущипни что-нибудь твердое вокруг тебя. Вы можете переместить свою руку в несколько мест в пространстве и при этом сохранить вектор защемления без изменений. Решение проблемы обратной кинематики включает в себя решение, какое решение также выбрать.

3 голосов
/ 13 апреля 2010

В робототехнике мы чаще всего используем параметры DH для прямой и обратной кинематики. Википедия имеет хорошее введение.

...