Войти
ПрограммированиеФорумФизика

Физика аркадного поворота (2 стр)

Страницы: 1 2
#15
23:30, 27 июня 2018

NXTaar
> В это составленное уравнение можем подставить x1 и проверить лежит ли наша
> точка, в которой окажется корабль в следующий момент времени, на нужной нам
> траектории круга. Точка естественно уравнению удовлетворять не будет. И как в
> таком случаее ее корректировать?
Например, так.


#16
23:55, 27 июня 2018

FordPerfect
> x1:=C+R*(x1-C)/|x1-C|

Я правильно истолковал выражение?
Изображение

Delfigamer
> Например вот так
Спасибо, буду разбираться!

#17
23:59, 27 июня 2018

NXTaar
Да.

#18
2:27, 28 июня 2018

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

некие стартовые данные, условно то с чем мы начинаем поворот

local radius = 10 // как я понял, радиус вы решили взять некий постоянный, тоесть корабль всегда будет поворачивать по этому радиусу, меняться будет только угловая скорость
local velocity = 1
local baseacceleration = velocity*velocity/radius
local pos = vec(-radius, 0) // правильно понимаю, что это точка в которой находится корабль
local vel = vec(0, velocity) 

это вектора, которые в дальнейшем будут использоваться как регуляторы? что означает приставка int в названии?

local posreg_int = vec(0,0)
local velreg_int = vec(0,0)

Вот здесь у меня первый затык. Зачем мы ищем перпедикулярный вектор ndir к нормали cdir от pos? Ведь pos это не совсем веткор? Это точка в которой находится корабль, как я понял

local posabs = math.sqrt(dot(pos,pos))
local cdir = pos/posabs
local ndir = left(cdir)

Как писал выше, непонятно,зачем расстояние posabs от корабля до центра координат, как могу изтолковываю что происходит дальше. Единственное что понял, cn обозначает следующие 4 строки кода делают что-то связанное с центром окружности, по которой будет происходить поворот.

local poscn = vec(posabs, 0) // что это за точка, которая находится на расстоянии 2*radius от положения корабля?
local velcn = project(vel, cdir,ndir) // что происходит здесь? Что за операцию делает функция project? Что такое velcn? 
local poscn_target = vec(radius, 0)
local poscn_err = poscn_target - poscn // здесь как я понял происходит первый детект того, появилась ли погрешность

Самая важная магия с погрешностями происходит здесь, верно?

  posreg_int = posreg_int + poscn_err // как я понял, в векторе posreg_int мы накапливаем нашу погрешность 
  local velcn_target = vec(0, velocity) + poscn_err * 0.4 + posreg_int * 0.2 // что за коэффициенты 0.2 и 0.4? Что такое velcn_target?
  local velcn_err = velcn_target - velcn // здесь по аналогии с poscn_target - poscn - детект того, появилась ли погрешность в какой-то величине связанной со скоростью
  velreg_int = velreg_int + velcn_err // по аналогии накапливаем погрешность
  local acccn = vec(baseacceleration, 0) + velcn_err * 0.4 + velreg_int * 0.2 // объявляется ускорение после чего к нему прибавляются не совсем понятные мне вещи связанные со скоростью
  local acc = unproject(acccn, cdir,ndir) // что делает эта операция? Мне понятно только то что это обратная операция от project

  vel = vel + acc
  pos = pos + vel

  local r = math.sqrt(dot(pos,pos)) // радиус нашей окружности
  local phi = math.atan2(pos.y, pos.x) // угловая скорость с которой идет движение по этой окружности?
#19
10:32, 28 июня 2018

NXTaar
> некие стартовые данные, условно то с чем мы начинаем поворот
Верно.
У себя ты будешь задавать эти данные исходя из условий, например:

local radius = dot(vel, vel) / acceleration
local center = left(lev) * radius / math.sqrt(dot(vel, vel))

NXTaar
> это вектора, которые в дальнейшем будут использоваться как регуляторы? что
> означает приставка int в названии?
Для стабилизации траектории я собрал схему с двумя ПИД-регуляторами.
Дело в том, что если взять простой проворциональный регулятор - он будет действовать только при уже имеющейся ошибке. Поскольку базовая схема постоянно стремится  увеличить радиус траектории, то с пропорциональным регулятором система придёт в такое равновесное положение, когда постоянная ошибка радиуса траектории будет заставлять регулятор компенсировать дальнейший рост этой ошибки.
То есть - система сойдётся не на радиусе 10, а, например, на радиусе 11.3.
Чтобы этого избежать, я добавил интегральную составляющую. Она запоминает постоянную составляющую внешних помех, что позволяет со временем достичь точного радиуса 10.
Этот эффект хорошо показан на анимации в Википедии. Там предполагается, что из-за постоянной составляющей помех система останавливается в положении ниже, чем требуется. Обратить внимание следует на то, что с ростом пропорционального коэффициента KP положение равновесия приближается к желаемому, но не достигает его. Однако, добавление KI позволяет системе со временем всё-таки достичь желаемого положения.
Соответственно, posreg_int - это текущее значение Изображение в регуляторе положения, а velreg_int, соответственно, - текущее значение интеграла ошибки по скорости.

NXTaar
> Вот здесь у меня первый затык. Зачем мы ищем перпедикулярный вектор ndir к
> нормали cdir от pos? Ведь pos это не совсем веткор?
Здесь я применяю тот же трюк, что и в прошлый раз - я перехожу от инерционной системы координат XY к относительной CN.

+ Показать

Соответственно, cdir и ndir - это единичные векторы системы координат CN; через которые я перевожу векторы pos и vel из XY в CN и получившийся вектор acc обратно в XY.
poscn и velcn - это координаты тех же векторов pos и vel, но выраженные в системе CN.

NXTaar
> Самая важная магия с погрешностями происходит здесь, верно?
Возможно, принцип будет понятнее, если показать функциональную схему:

+ Показать

Вычисление r,phi в конце - это перевод pos в полярную систему координат; он нужен только для того, чтобы показать результат в удобном виде.

#20
13:39, 28 июня 2018

Это тот случай, когда слишком много школьного образования? :)

vec2 velocity;
static float angularSpeed = 1.23;
..
if (key.down)
  velocity.Rotate(dt*angularSpeed);

Да, это не совсем точно, но для практических целей достаточно.
Еще точности? Разбивай dt на фиксированные микроскопические кусочки и интегрируй.

#21
14:34, 28 июня 2018

jaguard
> Это тот случай, когда слишком много школьного образования? :)
Возможно. ¯\_(ツ)_/¯

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

#22
17:26, 28 июня 2018

Delfigamer, jaguard
Почти) Игрок управляет кораблем, в ньютоновском космосе. Корабль может летать в двух режимах - все чисто по Ньютону, куда пнул, туда и лети, и с режимом "flight assist", типо бортовой компьютер корабля берет на себя более точное управление полетом, и отсюда получаются вот эти все аркадные повороты по окружности и торможение если газ отпустили.
Delfigamer
Спасибо за объяснения, дальше уже самостоятельно справлюсь. Отдельное спасибо за направление в какую сторону копать по знаниям (ПИДы и интегрирование)

Страницы: 1 2
ПрограммированиеФорумФизика

Тема в архиве.

Тема закрыта.