Алгоритм синхронизации — различия между версиями

Материал из Deeptown Manual
Перейти к: навигация, поиск
м (Механизм коррекции ошибки)
(Механизм коррекции ошибки)
Строка 64: Строка 64:
 
Коррекция осуществляется путем приложения сторонней силы к движущемуся телу так, чтобы "подтолкнуть" его в сторону желаемой траектории. Коррекция осуществляется в отношении собственно координаты тела и в отношении вектора его скорости. Опять же, в идеальном случае, скорректированная траектория полностью накладывается на серверную, вплоть до равенства параметров в соответствующих точках. Задача сводится к нахождению дифференциального уравнения соответствующей силы, а также определению граничных параметров, которые позволят выполнить коррекцию гладко, без перерегулирования.  
 
Коррекция осуществляется путем приложения сторонней силы к движущемуся телу так, чтобы "подтолкнуть" его в сторону желаемой траектории. Коррекция осуществляется в отношении собственно координаты тела и в отношении вектора его скорости. Опять же, в идеальном случае, скорректированная траектория полностью накладывается на серверную, вплоть до равенства параметров в соответствующих точках. Задача сводится к нахождению дифференциального уравнения соответствующей силы, а также определению граничных параметров, которые позволят выполнить коррекцию гладко, без перерегулирования.  
  
Чтобы упростить себе жизнь, рассмотрим одномерный случай. Пусть серверная "траектория" тела единичной массы находится в точке 0; клиентская "траектория" - в точке с координатой H. Графически, это выглядит как вертикальная линия, в нуле -- серверная траектория, в точке на высоте H -- клиентская. Горизонтальную и вертикальную компоненты скорости будем рассматривать отдельно.
 
  
Пусть серверная точка имеет горизонтальную скорость <math>V_x</math>. Клиентская, в самом начале -- горизонтальную скорость <math>V_x</math> и вертикальную, равную нулю.
+
=== Поиск уравнения коррекции ===
 +
 
 +
Чтобы упростить себе жизнь, рассмотрим одномерный случай. Пусть серверная "траектория" тела единичной массы находится в точке 0; клиентская "траектория" — в точке с координатой H. Графически, это выглядит как вертикальная линия, в нуле — серверная траектория, в точке на высоте H — клиентская. Горизонтальную и вертикальную компоненты скорости будем рассматривать отдельно.
 +
 
 +
Пусть серверная точка имеет горизонтальную скорость <math>V_x</math>. Клиентская, в самом начале горизонтальную скорость <math>V_x</math> и вертикальную, равную нулю.
  
  
 
Сила коррекции высоты, по такой модели, будет направлена "вниз" на эту точку, и будет равна:  
 
Сила коррекции высоты, по такой модели, будет направлена "вниз" на эту точку, и будет равна:  
 
:<math>F_p = - K_p \cdot y(t) \cdot V_x</math>
 
:<math>F_p = - K_p \cdot y(t) \cdot V_x</math>
где <math>y</math> -- это высота точки и  
+
где <math>y</math> это высота точки и  
 
:<math>y(0) = H\!</math>
 
:<math>y(0) = H\!</math>
  
Строка 77: Строка 80:
 
Вертикальная скорость точки:
 
Вертикальная скорость точки:
 
:<math>F_v = - K_v \cdot V_y(t)</math>,
 
:<math>F_v = - K_v \cdot V_y(t)</math>,
и <math>V_y(0) = 0</math>
+
и  
 +
:<math>V_y(0) = 0\!</math>
  
  
Известно, что скорость -- это производная координаты по времени:
+
Известно, что скорость это производная координаты по времени:
 
:<math>V_y(t) = \frac{\partial y(t)}{\partial t}</math>
 
:<math>V_y(t) = \frac{\partial y(t)}{\partial t}</math>
  
Строка 104: Строка 108:
  
  
Для исключения колебательного процесса, необходимо условие <math>D \geqslant 0</math>
+
Дискриминант характеристического уравнения:
 +
:<math>D = A^2 - 4 \cdot B = K_v^2 - 4 \cdot K_p \cdot V_x</math>
  
<math>y(t) = C_1 \cdot e^{\alpha_1 t} + C_2 \cdot t \cdot e^{\alpha_2 t}</math>
+
Для исключения колебательного процесса, необходимо условие <math>D \geqslant 0</math>. Следовательно:
 +
:<math>K_v^2 - 4 \cdot K_p \cdot V_x \geqslant 0</math>
 +
:<math>K_v^2 \geqslant 4 \cdot K_p \cdot V_x, \quad V_x \leqslant \frac{K_v^2}{4 \cdot K_p}</math>
  
 +
:<math>y(t) = C_1 \cdot e^{\alpha_1 t} + C_2 \cdot t \cdot e^{\alpha_2 t}</math>
  
Дискриминант характеристического уравнения:
 
<math>D = K_v^2 - 4 \cdot K_p \cdot V_x; \quad  Kv^2 \geqslant 4 * Kp * Vx, \quad Vx \leqslant Kv^2 / (4 * Kp)</math>
 
  
<math>\alpha_{1,2} = \frac{-K_v \pm \sqrt{D}}{2}</math>
 
  
 +
:<math>\alpha_{1,2} = \frac{-K_v \pm \sqrt{D}}{2}</math>
  
  
 
[14:45:15] <droot@deeptown.org> вот если ось y направлена вверх, т.е. положительное направление силы - вверх
 
[14:46:06] <droot@deeptown.org> то Fp = - m * Kp * Vx * y(t), Fv = - m * Kv * y'(t)
 
[14:46:35] <droot@deeptown.org> потому что в начальный момент времени y(t) > 0, а Fp < 0 - соответственно, чтобы коэффициент был положительным, ставим знак минус
 
[14:47:06] <droot@deeptown.org> y'(t) в первый момент времени < 0, а Fv должна быть > 0 - соответственно, тоже ставим знак минус
 
[14:47:35] <droot@deeptown.org> да, еще на массу таки умножать надо =) потому что F = m * a, т.е. все кроме массы имеет физический смысл ускорения
 
[14:48:13] <droot@deeptown.org> кстати, я еще размерность посмотрел. странные какие-то штуки получаются: [Kp] = 1 / (м*с), [Kv] = 1 / c
 
[14:48:49] <droot@deeptown.org> (впрочем, далее по выкладкам все размерности сходятся)
 
[14:49:27] <droot@deeptown.org> уравнение такое (после сокращения на массу): y''(t) + Kv * y'(t) + Kp * Vx * y(t) = 0
 
[14:50:14] <droot@deeptown.org> D = Kv^2 - 4 * Kp * Vx;  Kv^2 >= 4 * Kp * Vx, Vx <= Kv^2 / (4 * Kp)
 
[14:50:31] <droot@deeptown.org> т.е. тут все как и говорили
 
[14:51:15] <droot@deeptown.org> alpha(1,2) = (-Kv^2 +- sqrt(D)) / 2
 
[14:52:05] <droot@deeptown.org> чтобы система схлапывалась, а не разлеталась, нам нужно чтобы оба коэффициента alpha были бы меньше нуля
 
[14:52:31] <droot@deeptown.org> напомню: y(t) = C1 * exp(alpha1 * t) + C2 * exp(alpha2 * t)
 
[14:53:21] <droot@deeptown.org> поскольку Kp > 0 и Kv > 0, то alpha2 (которая с -sqrt(D)) - всегда меньше нуля
 
[14:54:20] <droot@deeptown.org> тьфу, там ошибка: alpha(1,2) = (-Kv +- sqrt(D)) / 2    (т.е. Kv, а не Kv^2)
 
[14:54:40] <droot@deeptown.org> alpha1 < 0  =>  -Kv + sqrt(D) < 0
 
[14:56:51] <droot@deeptown.org> т.е. sqrt(D) < Kv,  D < Kv^2,  Kv^2 - 4*Kp*Vx < Kv^2,  4*Kp*Vx > 0,  Kp > 0
 
[14:57:17] <droot@deeptown.org> получается интересная вещь: alpha[1,2] оба меньше нуля при любых Kp > 0, Kv > 0
 
[14:58:14] <droot@deeptown.org> (условие Kv > 0 было использовано в этих выкладках, когда обе части неравенства возвели в квадрат - если бы этого условия не было, там надо было бы рассматривать 2 случая)
 
[14:59:26] <droot@deeptown.org> (причем кстати второй случай соответствовал бы sqrt(D) < Kv при Kv < 0 - т.е. неравенство не выполняется никогда - ч.т.д =))
 
  
  
Строка 142: Строка 127:
  
 
:<math>C_1 \cdot e^{\alpha_1 \cdot 0} + C_2 \cdot t \cdot e^{\alpha_2 \cdot 0} = y(0) = H</math>,  
 
:<math>C_1 \cdot e^{\alpha_1 \cdot 0} + C_2 \cdot t \cdot e^{\alpha_2 \cdot 0} = y(0) = H</math>,  
следовательно <math>C1 + C2 = H</math>.
+
следовательно  
 +
:<math>C1 + C2 = H\!</math>.
  
  
Строка 153: Строка 139:
 
:<math>C_{1,2} = \left ( \frac{1}{2} \pm \frac{K_v}{\sqrt{D}} \right ) \cdot H</math>
 
:<math>C_{1,2} = \left ( \frac{1}{2} \pm \frac{K_v}{\sqrt{D}} \right ) \cdot H</math>
  
 +
Все коэффициенты найдены, задачу можно считать решенной. Однако, есть еще один немаловаждый момент.
  
  
 +
=== Оценка параметров ===
  
При моделировании, в течение шага тело движется по прямой. Соответственно, сила, которая будет действовать на тело в течение первого шага, т.е. времени T, будет равна  
+
 
 +
Выше уже было упомянуто, что колебательный процесс для нас недопустим. Скажем, в случае летящей стрелы, это могло выглядеть как ее периодические колебания вдоль траектории движения, что плохо скажется на реалистичности.
 +
 
 +
Математически, коэффициенты были рассчитаны так, чтобы этого избежать. Проблема заключается в том, что в случае клиента, мы имеем дело не с непрерывными математическими функциями, а с дискретной апроксимацией. Плюс к этому, изменение модуля прилагаемой силы осуществляется не непрерывно, а, естественно, тоже дискретно. Поскольку в моменты времени "между" коррекциями тело предоставлено само себе, оно и будет двигаться в указанную ей сторону. В худшем случае, при больших и плохо подобранных параметрах, уже после первого корректирующего воздействия, тело вылетит "за траекторию", соответственно возникнут колебания (возможно даже возрастающие).
 +
 
 +
Для избежания этого неприятного момента, попробуем оценить параметры и найти их "практический потолок", с тем, чтобы не позволять пользователю задавать значения выходящие за границы.
 +
 
 +
Итак, при моделировании, будем считать что в течение шага тело движется по прямой. Соответственно, сила, которая будет действовать на тело в течение первого шага, т.е. времени T, будет равна  
 
:<math>F_p = - K_p \cdot V_x \cdot H \cdot m</math>
 
:<math>F_p = - K_p \cdot V_x \cdot H \cdot m</math>
 +
 +
Множитель <math>V_x</math> мы добавляем специально, чтобы уменьшить влияние силы коррекции на малых скоростях (иначе еле движущееся тело будет менять свое положение заметными глазу рывками).
  
  
Строка 164: Строка 161:
  
  
Условие стабилизации:
+
Условие стабилизации — расстояние, которое преодолеет тело за первый шаг должно быть меньше <math>H</math>:
 
:<math>K_p \cdot V_x \cdot H \cdot \frac{T^2}{2} < H</math>
 
:<math>K_p \cdot V_x \cdot H \cdot \frac{T^2}{2} < H</math>
 
:<math>K_p \cdot V_x \cdot \frac{T^2}{2} < 2</math>
 
:<math>K_p \cdot V_x \cdot \frac{T^2}{2} < 2</math>
Строка 173: Строка 170:
  
  
[20:13:09] <droot@deeptown.org> получаем: Kp < 8*Kp / (T*Kv)^2
+
Это означает, что вот в том случае когда модуль скорости тела меньше чем указанное значение, то все будет происходить хорошо; когда больше — в формуле для силы стабилизации положения мы Vx заменяем на <math>\tfrac{K_v^2}{4 \cdot K_p}</math>.
[20:13:33] <droot@deeptown.org> 1 < 8 / (T*Kv)^2
+
[20:15:02] <droot@deeptown.org> Kv < 2*sqrt(2) / T
+
[20:15:54] <droot@deeptown.org> при T = 0.04 это получается что-то вроде Kv < 70.7
+
[20:17:43] <korvin> так...
+
  
 +
Из этого следует, что чтобы действительно сделать невидимым действие нашей силы на малых скоростях, необходимо, чтобы значение <math>\tfrac{K_v^2}{4 \cdot K_p}</math> было бы достаточно большим. Мы взяли его по-умолчанию равным 10, но это значение можно бдет менять в свойствах каждого конкретного объекта.
  
[20:18:28] <droot@deeptown.org> ну и на Kp условие получается исходя из того что это рассматривается при Kv^2 = 4*Kp
 
[20:24:10] <droot@deeptown.org> мм. тоесть Vx = Kv^2 / (4*Kp)
 
[20:25:45] <droot@deeptown.org> мм блин =)
 
[20:25:50] <droot@deeptown.org> как-то надо еще одно условие
 
[20:26:07] <droot@deeptown.org> и вообще как-то странно что мы получили ограничение на Kv, когда рассматривали действие силы Fp =)
 
  
[20:27:24] <droot@deeptown.org> а, ну вообще правильно. на Kp ограничение мы написали: Kp < 2 / (T^2 * Vx), и оно зависит от Vx
+
Осталось только численно оценить коэффициенты <math>K_p</math> и <math>K_v</math>. Для <math>K_p</math> конкретное значение получается, если подставить в условие
[20:28:47] <droot@deeptown.org> ну если взять Vx равным скажем 10 м/с, то получается Kp < 2 / (0.04^2 * 10) = 125
+
:<math>K_p < \frac{2}{V_x \cdot T^2}</math>
[20:29:26] <droot@deeptown.org> хотя, в принципе, Vx у нас каждый раз можно посчитать из конкретных Kp, Kv
+
значения <math>V_x = 10</math> и <math>T = 0.04</math>. Получается, что <math>K_p < 125</math>.
[20:29:29] <droot@deeptown.org> короче
+
[20:29:38] <droot@deeptown.org> когда у нас есть Kp, Kv введенные пользователем
+
[20:29:44] <droot@deeptown.org> то мы должны проверить
+
[20:30:09] <droot@deeptown.org> во-первых, что Kv^2 / (4*Kp) больше некоторой минимально различимой скорости - типа 10 м/с
+
[20:30:30] <droot@deeptown.org> Kv^2 / (4*Kp) > 10
+
[20:30:47] <droot@deeptown.org> во-вторых, то что Kv < 70
+
[20:31:28] <droot@deeptown.org> и в-третьих то Kp < 2 / (0.04^2 * Vx)
+
  
  
 +
Для нахождения <math>K_v</math> вместо <math>V_x</math> подставить наибольшее возможное для нее значение <math>\tfrac{K_v^2}{4 \cdot K_p}</math>:
 +
 +
:<math>K_p < \frac{2}{\frac{K_v^2}{4 \cdot K_p} \cdot T^2}, \quad K_p < \frac{2 \cdot 4 \cdot K_p}{K_v^2 \cdot T^2}, \quad 1 < \frac{8}{K_v^2 \cdot T^2}, \quad K_v^2 < \frac{8}{T^2}</math>
 +
 +
Окончательно,
 +
:<math>K_v < \frac{2\sqrt{2}}{T}</math>
 +
 +
 +
При подстановке значения <math>T = 0.04</math>, получается, что <math>K_v < 70</math>. В реальных условиях эти пределы взяты еще меньше, для защиты от граничных случаев. Конкретно, <math>K_p</math> по-умолчанию не может превышать 50, а <math>K_v</math> — 30
 +
 +
 +
<!--
 
[20:40:39] <droot@deeptown.org> так
 
[20:40:39] <droot@deeptown.org> так
 
[20:40:44] <droot@deeptown.org> а теперь - самое веселое
 
[20:40:44] <droot@deeptown.org> а теперь - самое веселое
Строка 266: Строка 260:
 
[22:06:40] <droot@deeptown.org> ну, вполне себе круглые числа =)
 
[22:06:40] <droot@deeptown.org> ну, вполне себе круглые числа =)
 
[22:06:48] <droot@deeptown.org> Vx = 10, Kp = 10, Kv = 20
 
[22:06:48] <droot@deeptown.org> Vx = 10, Kp = 10, Kv = 20
 +
 +
-->

Версия 12:36, 23 октября 2008

Здесь будет рассмотрена математическая составляющая алгоритмов синхронизации физики. Понимающих в этом деле, просьба прокомментировать.

Содержание

Построение сплайна

Для синхронизации была выбрана форма кубических сплайнов, при которой за основу берутся значения функции и ее производной в двух точках.

Свойства сплайна:

<math>s(t_i) = f(t_i) = , \quad s'(t_i) = f'(t_i)\!</math>

Уравнение сплайна:

<math>s(t) = a + bt + ct^2 + dt^3\!</math>


Для нахождения коэффициентов <math>a, b, c, d</math> записываем систему уравнений:

<math>\begin{cases}

a + bt_0 + ct_0^2 + dt_0^3 = f(t_0) \\ a + bt_1 + ct_1^2 + dt_1^3 = f(t_1) \\ b + 2ct_0 + 3dt_0^2 = f'(t_0) \\ b + 2ct_1 + 3dt_1^2 = f'(t_1) \end{cases} </math>


Подставляем известные значения в правой части системы (даны по условию):

<math>\begin{cases}

a + bt_0 + ct_0^2 + dt_0^3 = x_0 \\ a + bt_1 + ct_1^2 + dt_1^3 = x_1 \\ b + 2ct_0 + 3dt_0^2 = v_0 \\ b + 2ct_1 + 3dt_1^2 = v_1 \end{cases} </math>


Поскольку сплайн не зависит от конкретных значений <math>t_0</math> и <math>t_1</math> положим <math>t_0 = 0</math>, а <math>t_1 = t</math>. В результате, пара уравнений становится тривиальной:

<math>\begin{cases}

a = x_0 \\ a + bt_1 + ct_1^2 + dt_1^3 = x_1 \\ b = v_0 \\ b + 2ct_1 + 3dt_1^2 = v_1 \end{cases} </math>


Заменяем в оставшихся уравнениях известные теперь коэффициенты и получаем конечную систему:

<math>\begin{cases}

x_0 + v_0t_1 + ct_1^2 + dt_1^3 = x_1 \\ v_0 + 2ct_1 + 3dt_1^2 = v_1 \end{cases} </math>


После нехитрых манипуляций, получаем выражения для оставшихся коэффициентов:

<math>\begin{cases}

c = \frac{3x_1 - 3x_0 - 2v_0t - v_1t}{t^2} \\ d = \frac{v_1t - 2x_1 + 2x_0 + v_ot}{t^3} \end{cases} </math>


Механизм коррекции ошибки

В идеальном случае, при нулевой задержке времени между клиентом и сервером, а также при достаточно большой частоте обновлений, рассинхронизация между миром клиента и миром сервера была бы пренебрежимо мала. Однако, суровая реальность говорит обратное. В результате, клиентская часть, по сути, находится в прошлом от серверной (на время половины пинга). Поэтому, возникает необходимость подгонять траекторию движения клиентских тел так, чтобы она коррелировала с эталонной, серверной траекторией, опорные точки которой мы получаем.

Коррекция осуществляется путем приложения сторонней силы к движущемуся телу так, чтобы "подтолкнуть" его в сторону желаемой траектории. Коррекция осуществляется в отношении собственно координаты тела и в отношении вектора его скорости. Опять же, в идеальном случае, скорректированная траектория полностью накладывается на серверную, вплоть до равенства параметров в соответствующих точках. Задача сводится к нахождению дифференциального уравнения соответствующей силы, а также определению граничных параметров, которые позволят выполнить коррекцию гладко, без перерегулирования.


Поиск уравнения коррекции

Чтобы упростить себе жизнь, рассмотрим одномерный случай. Пусть серверная "траектория" тела единичной массы находится в точке 0; клиентская "траектория" — в точке с координатой H. Графически, это выглядит как вертикальная линия, в нуле — серверная траектория, в точке на высоте H — клиентская. Горизонтальную и вертикальную компоненты скорости будем рассматривать отдельно.

Пусть серверная точка имеет горизонтальную скорость <math>V_x</math>. Клиентская, в самом начале — горизонтальную скорость <math>V_x</math> и вертикальную, равную нулю.


Сила коррекции высоты, по такой модели, будет направлена "вниз" на эту точку, и будет равна:

<math>F_p = - K_p \cdot y(t) \cdot V_x</math>

где <math>y</math> — это высота точки и

<math>y(0) = H\!</math>


Вертикальная скорость точки:

<math>F_v = - K_v \cdot V_y(t)</math>,

и

<math>V_y(0) = 0\!</math>


Известно, что скорость — это производная координаты по времени:

<math>V_y(t) = \frac{\partial y(t)}{\partial t}</math>


Соответственно, сила, которая действует на объект:

<math>F(t) = F_p + F_v = - K_p \cdot y(t) \cdot V_x - K_v \cdot V_y(t) = - K_p \cdot y(t) \cdot V_x - K_v \cdot y'(t)</math>


Поскольку масса единичная, то силу можно выразить через ускорение:

<math>F = m \cdot a, \ m = 1, \ \to \ a \equiv F</math>


Окончательно, дифференциальное уравнение примет вид:

<math>y(t) + K_v \cdot y'(t) + K_p \cdot y(t) \cdot Vx = 0</math>


Перепишем параметрически:

<math>y(t) + A \cdot y'(t) + B \cdot y(t) = 0\!</math>


Характеристическое уравнение:

<math>\lambda^2 + A \cdot \lambda + B = 0</math>


Дискриминант характеристического уравнения:

<math>D = A^2 - 4 \cdot B = K_v^2 - 4 \cdot K_p \cdot V_x</math>

Для исключения колебательного процесса, необходимо условие <math>D \geqslant 0</math>. Следовательно:

<math>K_v^2 - 4 \cdot K_p \cdot V_x \geqslant 0</math>
<math>K_v^2 \geqslant 4 \cdot K_p \cdot V_x, \quad V_x \leqslant \frac{K_v^2}{4 \cdot K_p}</math>
<math>y(t) = C_1 \cdot e^{\alpha_1 t} + C_2 \cdot t \cdot e^{\alpha_2 t}</math>


<math>\alpha_{1,2} = \frac{-K_v \pm \sqrt{D}}{2}</math>



Далее, найдем <math>C_1</math> и <math>C_2</math>. Зная начальные условия <math>y(0) = H</math> (начальное расстояние между объектами) и <math>y'(t) = 0</math> получаем уравнение:

<math>C_1 \cdot e^{\alpha_1 \cdot 0} + C_2 \cdot t \cdot e^{\alpha_2 \cdot 0} = y(0) = H</math>,

следовательно

<math>C1 + C2 = H\!</math>.


Из второго условия:

<math>\alpha_1 \cdot C_1 \cdot e^{\alpha_1 \cdot 0} + \alpha_2 \cdot C_2 \cdot t \cdot e^{\alpha_2 \cdot 0} = 0</math>
<math>\alpha_1 \cdot C_1 + \alpha_2 \cdot C_2 = 0</math>


Решая систему относительно <math>C_1</math> и <math>C_2</math>, получаем

<math>C_{1,2} = \left ( \frac{1}{2} \pm \frac{K_v}{\sqrt{D}} \right ) \cdot H</math>

Все коэффициенты найдены, задачу можно считать решенной. Однако, есть еще один немаловаждый момент.


Оценка параметров

Выше уже было упомянуто, что колебательный процесс для нас недопустим. Скажем, в случае летящей стрелы, это могло выглядеть как ее периодические колебания вдоль траектории движения, что плохо скажется на реалистичности.

Математически, коэффициенты были рассчитаны так, чтобы этого избежать. Проблема заключается в том, что в случае клиента, мы имеем дело не с непрерывными математическими функциями, а с дискретной апроксимацией. Плюс к этому, изменение модуля прилагаемой силы осуществляется не непрерывно, а, естественно, тоже дискретно. Поскольку в моменты времени "между" коррекциями тело предоставлено само себе, оно и будет двигаться в указанную ей сторону. В худшем случае, при больших и плохо подобранных параметрах, уже после первого корректирующего воздействия, тело вылетит "за траекторию", соответственно возникнут колебания (возможно даже возрастающие).

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

Итак, при моделировании, будем считать что в течение шага тело движется по прямой. Соответственно, сила, которая будет действовать на тело в течение первого шага, т.е. времени T, будет равна

<math>F_p = - K_p \cdot V_x \cdot H \cdot m</math>

Множитель <math>V_x</math> мы добавляем специально, чтобы уменьшить влияние силы коррекции на малых скоростях (иначе еле движущееся тело будет менять свое положение заметными глазу рывками).


Соответственно, в течение первого шага тело будет двигаться с ускорением

<math>a = - K_p \cdot Vx \cdot H</math>


Условие стабилизации — расстояние, которое преодолеет тело за первый шаг должно быть меньше <math>H</math>:

<math>K_p \cdot V_x \cdot H \cdot \frac{T^2}{2} < H</math>
<math>K_p \cdot V_x \cdot \frac{T^2}{2} < 2</math>
<math>K_p < \frac{2}{V_x \cdot {T^2}}</math>


Левая часть будет минимальной в случае, когда Vx максимальна, т.е. равна <math>\frac{K_v^2}{4 \cdot K_p}</math>.


Это означает, что вот в том случае когда модуль скорости тела меньше чем указанное значение, то все будет происходить хорошо; когда больше — в формуле для силы стабилизации положения мы Vx заменяем на <math>\tfrac{K_v^2}{4 \cdot K_p}</math>.

Из этого следует, что чтобы действительно сделать невидимым действие нашей силы на малых скоростях, необходимо, чтобы значение <math>\tfrac{K_v^2}{4 \cdot K_p}</math> было бы достаточно большим. Мы взяли его по-умолчанию равным 10, но это значение можно бдет менять в свойствах каждого конкретного объекта.


Осталось только численно оценить коэффициенты <math>K_p</math> и <math>K_v</math>. Для <math>K_p</math> конкретное значение получается, если подставить в условие

<math>K_p < \frac{2}{V_x \cdot T^2}</math>

значения <math>V_x = 10</math> и <math>T = 0.04</math>. Получается, что <math>K_p < 125</math>.


Для нахождения <math>K_v</math> вместо <math>V_x</math> подставить наибольшее возможное для нее значение <math>\tfrac{K_v^2}{4 \cdot K_p}</math>:

<math>K_p < \frac{2}{\frac{K_v^2}{4 \cdot K_p} \cdot T^2}, \quad K_p < \frac{2 \cdot 4 \cdot K_p}{K_v^2 \cdot T^2}, \quad 1 < \frac{8}{K_v^2 \cdot T^2}, \quad K_v^2 < \frac{8}{T^2}</math>

Окончательно,

<math>K_v < \frac{2\sqrt{2}}{T}</math>


При подстановке значения <math>T = 0.04</math>, получается, что <math>K_v < 70</math>. В реальных условиях эти пределы взяты еще меньше, для защиты от граничных случаев. Конкретно, <math>K_p</math> по-умолчанию не может превышать 50, а <math>K_v</math> — 30


Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
информация
документация
Инструменты