Comments
Если С больше чем сумма длин FEMUR и TIBIA, то точка является не достижимой.

Или если С меньше чем разница длин FEMUR и TIBIA (точка слишком близко к основанию ноги).

Этот вариант я упустил. Спасибо. Нужно будет поправить алгоритм.

Молодец! Сделано красиво и с умом. Только не забрасывай проект. Я тоже гексапода делал, четыре года назад. Так он с тех пор на балконе и валяется…

Спасибо. Читал Вашу статью когда еще только начинал разработку. Постараюсь не забросить.

Буду рад если кто-нибудь сможет упростить этот алгоритм. Я делал его таким, чтобы понять его спустя, допустим, пол года.

Честно говоря, в ваш алгоритм не вчитывался, но когда я думал над подобным, я решал его через нахождение координат точки b как точки пересечения окружностей с центрами в a и c и радиусами равными длине суставов. Помнится что там к арктангенсам прибегать не приходилось, а потом уже отдельно для каждой сервы считал угол поворота от текущего положения для первого сустава, и от положения в точке b для второго.

Я с этого начал, но я от него отошел так как не особо понимал что откуда берется. Геометрию забыл совсем. Возможно вернусь к нему, если разберусь))


А так да, там вычисления проще.

Расчет в sympy вот что-то такое даёт… Но, конечно проверить надо. (l1, l2 — длины суставов, x,y,z — координаты конечной точки, q0,q1,q2 — углы на сервоприводах)


q₀ = atan2(y, x)
                                         _______________________________
                                        ╱                             2 
                                       ╱      ⎛        ______________⎞  
                                      ╱       ⎜       ╱  2    2    2 ⎟  
                                     ╱        ⎝l₁ - ╲╱  x  + y  + z  ⎠  
                              l₂⋅   ╱     1 - ───────────────────────── 
          ⎛      _________⎞        ╱                       2            
          ⎜     ╱  2    2 ⎟      ╲╱                      l₂             
q₁ = atan2⎝z, ╲╱  x  + y  ⎠ - ──────────────────────────────────────────
                                                  l₁                    
         ⎛         ______________⎞
         ⎜        ╱  2    2    2 ⎟
         ⎜-l₁ + ╲╱  x  + y  + z  ⎟
q₂ = acos⎜───────────────────────⎟
         ⎝           l₂          ⎠

Генерирующий скрипт:
(r — расстояние от начала координат до концевой точки, beta — угол между горизонтальной плоскостью и вектором, проведенным от начала координат до концевой точки)


#!/usr/bin/env python3
#coding: utf-8

from sympy import *

var("beta q(0:3) l1 l2 z r x y z")

eq1 = Eq(r, l1 + l2*cos(q2))
eq2 = Eq(beta, q1+l2*sin(q2)/l1)

slv = solve([eq1,eq2], [q1,q2])
slv0 = slv[0]

h = sqrt(x**2 + y**2)

pprint(Eq(q0, atan2(y,x)))
pprint(Eq(q1, slv0[0].subs({beta:atan2(z, h), r:sqrt(z**2+h**2)})))
pprint(Eq(q2, slv0[1].subs({beta:atan2(z, h), r:sqrt(z**2+h**2)})))
Есть еще один маленький нюанс. Не достаточно просто вращать ось вокруг COXA для шага. Дело в том, что кончик лапки движется относительно корпуса не параллельно продольной оси движения, а по дуге. Следовательно, если в процессе шага не корректировать дугу незначительным изменением остальных углов то возникнет скольжение. Первую половину шага лапки будут скользить от корпуса, вторую — к корпусу. Не очень значимый фактор, но он будет влиять на точность, скорость, затраты мощности и износ механики.
Верно. За движение по прямой отвечает алгоритм сглаживания. В процессе работы генерируется ряд точек, их количество зависит от желаемой скорости движения. Далее для каждой точки в определенные моменты времени считаются углы приводов и получается плавное движение кончика ноги по прямой параллельно продольной оси корпуса.

Сейчас все приводы меняют свое положение более менее синхронно и с приблизительно одинаковой скоростью.

Я хотел об этом рассказать в следующей статье. Там есть хитрые траектории движения, которые очень упрощают жизнь.
Я б добавил ещё один небольшой момент. При остановке сейчас ноги остаются стоять криво. Мне кажется будте очень «красиво», если при остановке ноги будут выравниваться не меняя положение корпуса.
Верно. Сейчас это есть, но на видео не показано. Сейчас движения назад и вперед переключаются руками с PC программы, модуль для автоматического переключения пока еще сырой
Замечательнейшая статья! но вот вопрос, как такой гексапод пойдет по пересеченной местности, например по гальке или по вспаханному полю.
С текущим алгоритмом передвижения — плохо:). На данный момент последовательности заданы жестко и не меняются в процессе работы. Я думаю адаптация под ландшафт появится еще не скоро, т.к. сейчас есть ряд других проблем
Only those users with full accounts are able to leave comments. Log in, please.