Множественность решений и ограничения

У обратной задачи часто несколько ответов — или ни одного. Как с этим жить на практике.

В отличие от прямой задачи (один вход — один выход), обратная кинематика может иметь несколько решений, бесконечно много (у избыточных роботов) или вовсе ни одного.

Это фундаментальная асимметрия: FK — функция, IK — отношение. Управляющая программа обязана выбрать конкретное решение разумно.

Сколько решений

  • Одно — цель ровно на границе зоны (рука вытянута).
  • Два — типичный двухзвенник: локоть вверх/вниз.
  • Бесконечно много — избыточный робот ($\gt$ DOF задачи): остаётся свобода, которой пользуются для обхода препятствий.
  • Ноль — цель вне рабочей зоны.

Как выбирают решение

Критерии: ближе к текущей позе (меньше движения), без столкновений, внутри пределов углов суставов, подальше от сингулярностей. Часто берут решение, минимизирующее сумму перемещений суставов.

Ограничения углов

Реальный сустав не крутится на $360^\circ$: есть пределы $\theta_{\min} \le \theta \le \theta_{\max}$. Решение IK, выходящее за них, отбрасывают. Проверим достижимость и фильтрацию по пределам.

import math

L1, L2 = 1.0, 0.7

def ik_both(x, y):
    r2 = x*x + y*y
    cos2 = (r2 - L1*L1 - L2*L2) / (2*L1*L2)
    if cos2 < -1 or cos2 > 1:
        return []  # вне зоны
    sols = []
    for sign in (1, -1):
        s2 = sign * math.sqrt(1 - cos2*cos2)
        t2 = math.atan2(s2, cos2)
        t1 = math.atan2(y, x) - math.atan2(L2*math.sin(t2), L1 + L2*math.cos(t2))
        sols.append((math.degrees(t1), math.degrees(t2)))
    return sols

for sol in ik_both(1.2, 0.5):
    t1, t2 = sol
    ok = -150 <= t1 <= 150 and -150 <= t2 <= 150
    print(f"theta1={t1:7.2f} theta2={t2:7.2f} -> {'в пределах' if ok else 'нарушает лимит'}")
print("вне зоны:", ik_both(1.75, 0.0))

Вывод:

theta1=  -9.58 theta2=  81.79 -> в пределах
theta1=  54.82 theta2= -81.79 -> в пределах
вне зоны: []

Как работает под капотом

Для избыточных роботов «лишнюю» свободу формализуют как нуль-пространство якобиана: движения суставов, которые не двигают схват. По нему оптимизируют вторичную цель — например, держаться подальше от пределов суставов, не нарушая основную задачу.

Частые ошибки

  • Брать первое попавшееся решение IK, игнорируя пределы суставов — робот «дёрнется» или упрётся в упор.
  • Не обрабатывать случай «нет решения» (цель вне зоны) — программа падает на sqrt от отрицательного.
  • Прыгать между решениями локоть-вверх/вниз между кадрами — траектория получается рваной.

Итог

  • IK может иметь несколько решений, бесконечно много или ни одного.
  • Решение выбирают по близости, отсутствию столкновений и пределам суставов.
  • Реальные суставы ограничены диапазоном — решения вне него отбрасывают.
  • У избыточных роботов лишнюю свободу используют для вторичных целей через нуль-пространство.
Проверьте себя
1. Сколько решений IK у типичного плоского двухзвенника для достижимой точки внутри зоны?
AВсегда одно
BДва — локоть вверх и локоть вниз
CБесконечно много
DНи одного
2. Что делать, если решение IK выходит за пределы угла сустава?
AПрименить его всё равно
BОтбросить это решение и взять другое допустимое
CУменьшить длину звена
DИгнорировать пределы