Skip to content

Latest commit

 

History

History
100 lines (70 loc) · 7.19 KB

Unit_Hopf_CPG.md

File metadata and controls

100 lines (70 loc) · 7.19 KB

Central Pattern Generator

Модный подход, основанный на использовании одного/несколько осцилляторов и поиске способов управления ими.

Не понятно, что можно достичь, нет аналитического алгоритма, всё основано на подборе чего-то для чего-то. Тем не менее, работ много и можно попробовать почерпнуть идеи.

Осциллятор 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$ за которые этот цикл должен быть сделан. Планировщик движения выполняет фиксированное количество итераций расчёта в единицу времени, и подобная связь упрощает связывание длительности цикла в реальном времени и циклов планировщика.

Пример реализации для Octave см. в файле unit_cpg_hopf_runge_kutta.m

Коэффициент заполнения шаблона движения

Один цикл осциллятора описывает полный цикл движения лапы, включая этапы поддержания и перестановки. Длительность полного цикла движения лапы обозначим через $T$, этапа поддержки - через $T_{stance}$, и этапа переноса через $T_{swing}$. Эти длительности связаны через коэффициент заполнения $\beta$:

$$ \begin{array}{l} T = T_{stance} + T_{swing} \\ \beta = \frac{T_{stance}}{T} \\ \beta = 1 - \frac{T_{swing}}{T} \end{array} $$

Разные шаблоны движения имеют различное соотношение длительности этапов поддержвания и перестановки, следовательно и различное значение коэффициента заполнения $\beta$.

Разделим скорость колебаний на две составляющих, отвечающих за разные этапы цикла движения лапы и определим функцию для переключения значения скорости в зависимости от знака значения $y$, показывающего текущий этап перемещения.

$$ \omega = \frac{\omega_{stance}}{e^{-ay} + 1} + \frac{\omega_{swing}}{e^{ay} + 1} $$

При выборе достаточно большого значения $a$ значение функции переходит из $\omega_{stance}$ в $\omega{swing}$ резким скачком. Опытным путём показано, что значени $a = 10000$ преключение происходит за одну итерацию при общей длине цикла в 2000 итераций. При предполагаемой длительности итерации 0.01 с этого достаточно для циклов длительностью 20 секунд. Значение можно уменьшить для другой частоты дискретизации и максимальной длительности цикла движения лапы.

Для удобства расчётов запишем скорости колебаний каждого этапа через длительность соответствующего этапа, и выразим всё через значение длительности этапа перестановки (обратите внимание, каждый из этапов занимает только половину цикла, поэтому использовано $\pi$):

$$ \begin{array}{l} \omega_{stance} = \frac{\pi}{T_{stance}} = \frac{\pi (1 - \beta)}{\beta T_{swing}} \\ \omega_{swing} = \frac{\pi}{T_{swing}} \end{array} $$

Подставив в предыдущую формулу, получим уравнение скорости колебаний:

$$ \omega = \frac{\pi (1 - \beta)}{\beta (e^{-ay} + 1) T_{swing}} + \frac{\pi}{(e^{ay} + 1) T_{swing}} $$

Итого, получаем уточнённую систему уравнений осциллятора:

$$ \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 \\ \omega = \frac{\pi (1 - \beta)}{\beta (e^{-ay} + 1) T_{swing}} + \frac{\pi}{(e^{ay} + 1) T_{swing}} \end{cases} $$

Для программирования

В примечании к предыдущей секции было описание преобразование реального времени в дискретное для вычисления. Здесь аналогично, вместо $T_{swing}$ нужно использовать $T_{swing} \cdot ticks$.

Пример реализации для Octave см. в файле unit_cpg_hopf_runge_kutta_duty.m