You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Модный подход, основанный на использовании одного/несколько осцилляторов и
поиске способов управления ими.
Не понятно, что можно достичь, нет аналитического алгоритма, всё основано на
подборе чего-то для чего-то. Тем не менее, работ много и можно попробовать
почерпнуть идеи.
Осциллятор Hopf-а
В качестве базового осциллятора часто используют следующий осциллятор Hopf-а.
Он удобен независимостью параметров влияющих на поведение осциллятора.
$$
\begin{cases}
\frac{dx}{dt} = \alpha (\mu - x^2 - y^2) x - \omega y
\\
\frac{dy}{dt} = \alpha (\mu - x^2 - y^2) y + \omega x
\end{cases}
$$
Здесь $x$ и $y$ - переменные осциллятора, $alpha$ - определяет скорость сходимости, $\mu$ - квадрат амплитуды, $\omega$ - скорость колебаний ($\frac{радиан}{с}$).
Стабилизация осциллятора достигается за $\frac{1}{2 \alpha \mu}$, но непонятно в каких это единицах.
Из двух полученных значений $x$ будет использоваться для управления лапой, а $y$ как вспомогательное значение, а частности для определения этапа движения лапы - поддержвание или перестановка.
Для программирования
С целью удобства итеративного вычисления, переменную $h$ в методе Рунге-Кутты удобно принять равной $1$, тогда если скорость выразить через длительность цикла $T$, а количество итераций в единицу времени через $ticks$, можно вывести зависимость:
$$
\omega = \frac{2 \pi}{T \cdot ticks}
$$
получается легко связать один цикл осциллятора $\omega$, с количеством итераций $ticks$ за которые этот цикл должен быть сделан.
Планировщик движения выполняет фиксированное количество итераций расчёта в единицу времени, и подобная связь упрощает связывание длительности цикла в реальном времени и циклов планировщика.
Один цикл осциллятора описывает полный цикл движения лапы, включая этапы поддержания и перестановки. Длительность полного цикла движения лапы обозначим через $T$, этапа поддержки - через $T_{stance}$, и этапа переноса через $T_{swing}$. Эти длительности связаны через коэффициент заполнения $\beta$:
Разные шаблоны движения имеют различное соотношение длительности этапов поддержвания и перестановки, следовательно и различное значение коэффициента заполнения $\beta$.
Разделим скорость колебаний на две составляющих, отвечающих за разные этапы цикла движения лапы и определим функцию для переключения значения скорости в зависимости от знака значения $y$, показывающего текущий этап перемещения.
При выборе достаточно большого значения $a$ значение функции переходит из $\omega_{stance}$ в $\omega{swing}$ резким скачком. Опытным путём показано, что значени $a = 10000$ преключение происходит за одну итерацию при общей длине цикла в 2000 итераций. При предполагаемой длительности итерации 0.01 с этого достаточно для циклов длительностью 20 секунд. Значение можно уменьшить для другой частоты дискретизации и максимальной длительности цикла движения лапы.
Для удобства расчётов запишем скорости колебаний каждого этапа через длительность соответствующего этапа, и выразим всё через значение длительности этапа перестановки (обратите внимание, каждый из этапов занимает только половину цикла, поэтому использовано $\pi$):
В примечании к предыдущей секции было описание преобразование реального времени в дискретное для вычисления. Здесь аналогично, вместо $T_{swing}$ нужно использовать $T_{swing} \cdot ticks$.