Есть два широких подхода:
- аналитические решения, учитывая конечную эффекторную позу, непосредственно вычисляют координаты соединения. В целом решение не является уникальным, поэтому вы можете вычислить набор возможных совместных координат. Некоторые из них могут привести к попаданию робота в окружающую среду (или в себя), или ваша задача может помочь вам выбрать конкретное решение, т.е. Вы можете предпочесть локоть вверх (или вниз), или чтобы робот располагал руку слева (или справа) от туловища. В целом, существуют ограничения на получение аналитического решения, для 6-осевых роботов предполагается сферическое запястье (все оси пересекаются). Аналитические решения для многих различных типов роботов были рассчитаны на протяжении десятилетий, и вы, вероятно, можете найти документ, который дает решение для вашего робота.
- Числовые решения, как описано в других ответах, используют оптимизационный подход для корректировки координат соединений, пока прямая кинематика не даст правильного решения. Опять же, есть огромная литература по этому вопросу и много программного обеспечения.
Используя мой Robotics Toolbox для MATLAB, я создаю модель хорошо известного 6-осевого робота, используя параметры Денавита-Хартенберга
>> mdl_puma560
>> p560
p560 =
Puma 560 [Unimation]:: 6 axis, RRRRRR, stdDH, fastRNE
- viscous friction; params of 8/95;
+---+-----------+-----------+-----------+-----------+-----------+
| j | theta | d | a | alpha | offset |
+---+-----------+-----------+-----------+-----------+-----------+
| 1| q1| 0| 0| 1.5708| 0|
| 2| q2| 0| 0.4318| 0| 0|
| 3| q3| 0.15005| 0.0203| -1.5708| 0|
| 4| q4| 0.4318| 0| 1.5708| 0|
| 5| q5| 0| 0| -1.5708| 0|
| 6| q6| 0| 0| 0| 0|
+---+-----------+-----------+-----------+-----------+-----------+
затем выберите случайную координату соединения
>> q = rand(1,6)
q =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
затем рассчитать кинематику вперед
>> T = p560.fkine(q)
T =
-0.9065 0.0311 -0.4210 -0.02271
0.2451 0.8507 -0.4649 -0.2367
0.3437 -0.5247 -0.7788 0.3547
0 0 0 1
Теперь мы можем вычислить обратную кинематику, используя опубликованное аналитическое решение для робота с 6 суставами и сферическим запястьем
>> p560.ikine6s(T)
ans =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
и вуаля, у нас есть оригинальные совместные координаты.
Численное решение
>> p560.ikine(T)
Warning: ikine: rejected-step limit 100 exceeded (pose 1), final err 0.63042
> In SerialLink/ikine (line 244)
Warning: failed to converge: try a different initial value of joint coordinates
> In SerialLink/ikine (line 273)
ans =
[]
не удалось, и это распространенная проблема, поскольку обычно им требуется хорошее начальное решение. Давай попробуем
>> p560.ikine(T, 'q0', [1 1 0 0 0 0])
ans =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
который теперь дает ответ, но он отличается от аналитического решения. Это нормально, так как есть несколько вариантов решения проблемы IK. Мы можем проверить правильность нашего решения, рассчитав прямую кинематику
>> p560.fkine(ans)
ans =
-0.9065 0.0311 -0.4210 -0.02271
0.2451 0.8507 -0.4649 -0.2367
0.3437 -0.5247 -0.7788 0.3547
0 0 0 1
и проверка того, что это то же самое, что и преобразование, с которого мы начали (что это такое).
Другие источники: