Комментарии 21
Хорошо ходит. Достаточно плавно.
Если С больше чем сумма длин 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)})))
del
Есть еще один маленький нюанс. Не достаточно просто вращать ось вокруг COXA для шага. Дело в том, что кончик лапки движется относительно корпуса не параллельно продольной оси движения, а по дуге. Следовательно, если в процессе шага не корректировать дугу незначительным изменением остальных углов то возникнет скольжение. Первую половину шага лапки будут скользить от корпуса, вторую — к корпусу. Не очень значимый фактор, но он будет влиять на точность, скорость, затраты мощности и износ механики.
Верно. За движение по прямой отвечает алгоритм сглаживания. В процессе работы генерируется ряд точек, их количество зависит от желаемой скорости движения. Далее для каждой точки в определенные моменты времени считаются углы приводов и получается плавное движение кончика ноги по прямой параллельно продольной оси корпуса.
Сейчас все приводы меняют свое положение более менее синхронно и с приблизительно одинаковой скоростью.
Я хотел об этом рассказать в следующей статье. Там есть хитрые траектории движения, которые очень упрощают жизнь.
Сейчас все приводы меняют свое положение более менее синхронно и с приблизительно одинаковой скоростью.
Я хотел об этом рассказать в следующей статье. Там есть хитрые траектории движения, которые очень упрощают жизнь.
Очень круто! Реально впечатляет!
Я б добавил ещё один небольшой момент. При остановке сейчас ноги остаются стоять криво. Мне кажется будте очень «красиво», если при остановке ноги будут выравниваться не меняя положение корпуса.
Замечательнейшая статья! но вот вопрос, как такой гексапод пойдет по пересеченной местности, например по гальке или по вспаханному полю.
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Разработка hexapod с нуля (часть 3) — кинематика