ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» "Семерка" (МБР Р-7) для Orbiter | страница 3 |
|
|
|
Канал Orbiter: «"Семерка" (МБР Р-7) для Orbiter» |
|
|
Bloodest 155 EGP
Рейтинг канала: 3(40) Репутация: 18 Сообщения: 944 Откуда: Питерские мы Зарегистрирован: 07.10.2004 |
|
Tiger : |
Знаю одного человека, он умеет облака вычищать. Спросить, как?
|
Спроси, конечно.
Хотя вариант есть - тот же что и с Циклонами - убрать общие тайлы и оставить только высокого разрешения (их границы не захватят облака).
Есть еще один маленький секретик - на заметку базостроителям.
В конфиге базы есть два параметра
Size = 100
Objectsize = 100
Оба в километрах.
Дык если они одинаковые то с достаточно большой точностью можно сказать что граница видимости базы с расстояния будет определятся
L~ctg(FOV)*Objectsize
То есть при размерности в 100 км при фов 50 граница видимости 85 километров.
Граница разная - для тайлов поверхности для загрузки и отображения она отсчитывается от маркера базы, для мешей загрузка от маркера, отображение по расстоянию до каждого треугольника.
Смысл секрета следующий - при полете на орбите пролет ганицы вызывает процесс загрузки визуалки и если база имеет весомый объем визуалки происходит скачек в шаге симуляции и пертрубация орбиты. Выхода два -либо загонять размер в максимум, либо оганичить так чтобы с орбиты она была не видна. Другой подход - рельефы местности большой протяженности сотни и тясячи километров - имеет смысл ограничить дальность видимости и тем самым предотвратить отображения под углами меньше нуля к среднему местному горизонту.
|
|
|
astronavt 86 EGP
Рейтинг канала: 1(3) Репутация: 35 Сообщения: 403 Откуда: Новочеркасск Зарегистрирован: 11.01.2006 |
|
Bloodest : |
Поставил NASA WorldWind...
|
Угу, скачал. У "хьюзов". Пока не ставил. Эти 62 мега инсталяхи, это все что к нему нужно?
_________________ Я бы изменил этот мир, но Бог не дает мне исходников... |
|
|
Tiger 65 EGP
Репутация: 10 Сообщения: 140 Откуда: Россия, Барнаул Зарегистрирован: 13.12.2005 |
|
astronavt : |
Угу, скачал. У "хьюзов". Пока не ставил. Эти 62 мега инсталяхи, это все что к нему нужно?
|
Нет, смысл в том, что это только некий базовый комплект текстур. При увеличении дальше определенного масштаба будет происходить подкачка нужных материалов из интернета. Они будут храниться в кэше. Есть возможность заранее накачать "кэшевых файлов" для определенных участков. Ими люди друг с другом делятся.
_________________ Siberian Tiger |
|
|
Tiger 65 EGP
Репутация: 10 Сообщения: 140 Откуда: Россия, Барнаул Зарегистрирован: 13.12.2005 |
|
Bloodest : |
Tiger : |
Знаю одного человека, он умеет облака вычищать. Спросить, как?
|
Спроси, конечно.
Хотя вариант есть - тот же что и с Циклонами - убрать общие тайлы и оставить только высокого разрешения (их границы не захватят облака).
|
Спросил. Предлагает прибегнуть к ретушированию изображения. Использовать тулз "clone" из комплекта Photoshop или Gimp. Не забыть замазать также и тень облака. Подчеркивает, что, как правило, участок текстуры, которую класть поверх облака, лучше брать из удаленной на некоторое расстояние точки изображения, чтобы не было повторяющегося узора. Еще можно использовать тулз "Pattern", разница невелика. В одних случаях дает лучший результат резкие края кисти, в других - диффузные.
С пожеланиями удачи, StarLost
_________________ Siberian Tiger |
|
|
astronavt 86 EGP
Рейтинг канала: 1(3) Репутация: 35 Сообщения: 403 Откуда: Новочеркасск Зарегистрирован: 11.01.2006 |
|
Tiger : |
...подкачка нужных материалов из интернета
|
А вот это плохо. Дома онлайна нет (dialup), а на работе не всегда удобно
_________________ Я бы изменил этот мир, но Бог не дает мне исходников... |
|
|
astronavt 86 EGP
Рейтинг канала: 1(3) Репутация: 35 Сообщения: 403 Откуда: Новочеркасск Зарегистрирован: 11.01.2006 |
|
«Красотка» стала более-менее управляемой . Вот демка
http://texband.nm.ru/pub/dimonspage/orbiter/R7_demo6.zip
Новая версия сабжа оснащена простейшим автопилотом. Что я вкладываю в слово «простейший»:
1) Вращение ракеты вокруг центра масс считается динамически развязанным – ракета осесимметрична, вращения по крену нет.
2) Привод рулевиков моделируется просто вращением оных с конечной скоростью 20 град/с.
3) Реализовано управление по крену и тангажу, причем в этой демке крен никак не иллюстрируется. Рулим только тангаж, а в азимут поворачиваем на старте (в сценарии т.е.).
4) Вопреки замечаниям Bloodest, алгоритм расчета угла поворота рулевых камер строится по принципу подчиненного регулирования с обратными связями по вектору состояния (угол и соответстующая ему скорость), с ограничением по углу отклонения рулевиков и величине максимальной угловой скорости поворота (подробнее эта байда описана в теме «Универсальный ракетный автопилот» на стр. 3., мой постинг от 03-04-2006). Решил замутить пока так. Если честно, не понял смысл термина «залипание» решения, объясни, Роман, плз. .
5) Программа по тангажу состоит из двух частей – атмосферный участок (у меня все время работы 1-й ступени) и участок управления по линейному тангенсу tg(phi) = a*t + b.
Не могу, как обычно, не рассказать в подробностях о геморройных моментах. Такой я человек, люблю рассказывать о достигнутых успехах. Иногда это людей раздражает .
Прежде всего рулевики. Они на «семерке» отклоняются аж на 45 градусов (когда-то моделировал «Сатурн-5», так там максимум 7), а значит допущение
sin(delta) ~ delta
не катит! Отсюда возник вопрос – блин, а как в линейном регуляторе учесть эту ерунду. Долго думал, потом осенило – с выхода регулятора скорости снимать не угол отклонения рулевиков, а синус этого угла, т.к. момент линеен относительно синуса! А потом по синусу находить задание для привода рулевых машинок. Нелинейность то никуда не девается (отсюда небольшое перерегулирования при сильных бросках по тангажу), но на процесс синтеза регулятора уже не влияет.
Попробовал – получилось. Рулевики откидываются на полную катушку, но колебаний по тангажу нет.
Gut, контуры настроили, но как быть с программой управления? Может кому-то покажется, что я изобретаю велосипед, но прошу заметить, что во-первых, мне патологически не везет с поиском нужной информации (без освещения проекта на «Элите» вообще наверное не продвинулся бы), а во вторых, и это самое главное, всегда стремлюсь во всем досконально разобраться.
Так вот. Почесал я репу, и понял, что нужно решать задачу с конца. Ракета баллистическая, «голова» должна попасть в определенную точку земной поверхности. Для этого ее нужно бросить с определенной высоты, с определенной скоростью, в определенном направлении. Взял обожаемый мною пакет Maple, и составил такую вот систему диф-ур:
dx/dt = Vx
dy/dt = Vy
dz/dt = Vz
dVx/dt = -mu*x/r^3 + omega0^2*x + 2*omega*Vy
dVy/dt = -mu*y/r^3 + omega0^2*y - 2*omega*Vx
dVz/dt = -mu*z/r^3
r = sqrt(x^2 + y^2 + z^2)
ничто иное, как уравнения движения тела в системе отсчета, связанной с вращающейся Землей. Отсюда и составляющие центробежного ускорения, пропорциональные квадрату угловой скорости Земли, и составляющие ускорения Кориолиса, пропорциональные компонентам скорости тела и угловой скорости Земли. Здесь: omega0 – угловая скорость вращения Земли; mu – гравитационный параметр Земли.
Уравнения позволяют остановить Землю, но добавляют геммора с их решением. Эссно, решал я их численно, благо для Maple это плевое дело. Короче, решая двухточечную краевую задачу для этой системы, путем подбора параметров alpha0 – угол бросания к местному горизонту, A0 – азимут бросания, методом Ньютона, получил вышеозначенные величины, позволяющие попасть в заданную точку земной поверхности для заданной скорости V0, и высоты броска H0. Естественно, H0 и V0 связаны, чем меньше первое, тем больше второе, и меньше время подлета «головы» к цели. Погоду портит наша любимая атмосфера, поэтому я ограничился H0 = 200 км, и скоростью V0 = 7400 м/с. Результат: для попадания в точку 165 в.д., 55 с.ш. (на Камчатке) из Байконура, нужно бросить «голову» на азимут 39.32 градуса, под углом -0.59 градусов к горизонту.
Но это пассивный участок. Задача активного участка – дать нам указанные параметры. Тут я поступил довольно таки криво. На атмосферном участке ракета, по преодолении М = 0.1 заваливается на тангаж 75 градусов (необоснованный эссно), начиная с М = 0.8 идет управления для обеспечения нулевого угла атаки, и так до сброса боковиков. Потом в дело идет линейный тангаж, a и b для которого найдены однократным решением краевой задачи для ур-й полета 2-й ступени, с начальными условиями в виде результата работы 1-й ступени, требуемой скоростью и углом на другом конце. Такой подход создает точку разрыва 2-го рода в программе по тангажу (скачек с 45 на -20 градусов, который естественно не может быть отработан), ведущую к потере точности в конце активного участка. Результат – попадание «головы» в точку 159.286 в.д., 54.103 с.ш., т.е. с ошибкой в 127 км. Для такого результата пришлось уменьшить скорость до 7220.3 м/с, т.к. ракета вышла на высоту 221 км. Иначе – падение в Тихом океане.
Точность неудалая, учитывая, что ракета 63-го комплекса (средний радиус действия, их еще на Кубу возили) попадала с 2500 км в солдатскую простыню .
В общем, буду работать. Естественно, ни каких «мейплов» и в помине не должно быть – все алгоритмы предполагается перетащить в орбитеровские модули. Просто внешний математический пакет помог быстро выработать концепцию решения задачи и проверить его в первом приближении.
В принципе, есть соблазн вывести спутник – уменьшаем массу «головы» до 85 кг и перезакладываем уставку на скорость отсечки 2-й ступени (то есть перекомпилировать два модуля). Но так не интересно.
В целом, для такого сырого варианта получилось прикольно – ракета-то летает .
Теперь вопрос.
To Kulch
Не врублюсь, как можно задействовать GetManualControlLevel(…). Ведь в сдк написано, что он возвращает уровень тяги групп ориентации, но у меня то тяга не меняется, а поворачиваются сами камеры. Ясно, конечно, что он связан со всеми средствами пользовательского ввода (джой в том числе), но вот этот момент не ясен.
_________________ Я бы изменил этот мир, но Бог не дает мне исходников... |
|
|
Bloodest 155 EGP
Рейтинг канала: 3(40) Репутация: 18 Сообщения: 944 Откуда: Питерские мы Зарегистрирован: 07.10.2004 |
|
astronavt : |
4) Вопреки замечаниям Bloodest, алгоритм расчета угла поворота рулевых камер строится по принципу подчиненного регулирования с обратными связями по вектору состояния (угол и соответстующая ему скорость), с ограничением по углу отклонения рулевиков и величине максимальной угловой скорости поворота (подробнее эта байда описана в теме «Универсальный ракетный автопилот» на стр. 3., мой постинг от 03-04-2006). Решил замутить пока так. Если честно, не понял смысл термина «залипание» решения, объясни, Роман, плз. .
|
Цитата: |
Mx = Kpc*(wxz - Kocc*wx).
|
Ну здесь я так понял (чехарда с обозначениями)
wxz - рассогласование по углу
wx - угловая скорость.
Может и не правильно и все по другому.
Тем не менее все сводится, в любом варианте, к выражению
Mx= A*P1(x)+B*P2(Vx);
Где
Mx - управляющий момент
A и B - константы
P1 P2 - параметрические функции от положения и скорости.
Идем от обратного. Допустим Mx=0
Дык поскольку переменных две а уранение одно. То оно имеет бесконечное множество решений! Иными словами Mx равно нулю не только при P1(x)=P2(Vx)=0 но и при множестве других значений.
Если целевое (и к тому же в течении длительного времени) Vx=Vxc=0 и х=const то формула будет работать. Но если с течением времени x меняется...
По научному это можно объяснить следующим образом данная формула хороша для стационарного режима, но режим танагажа не стационарен!, он по своей сути всегда переходной.
Я собственно не далеко ушел от данной формулы - просто A и B не константы - они непрерывно вычисляются
Mx= A(P1(x),P2(Vx))*P1(x)+B(P1(x),P2(Vx))*P2(Vx)
Что дает в конечном счете агрегатирование вида
Mx=(abs((PP2(Vx)/PP1(x))-1)*sign(PP2(Vx))*sign(PP1(x))
Да, при нулевом PP1(x) Mx стремится к бесконечности. Зато она ни когда не залипает. Бесконечность подавить легко - достаточно ввести зону нечувствительности по PP1(x) где управление идет по закону
Mx=PP3(Vx). Во всяком случае зона нечувствительности все равно нужна если сами целевые параметры вычисляются с определенной точностью - появляется шум.
Весь смысл в универсальности - и для танагажа и для КК для посадки на поверхность и пр.
Цитата: |
участок управления по линейному тангенсу tg(phi) = a*t + b.
|
Дык в pdf по Союзу есть график тангажа - дык он линейный по времени
И это понятно - гораздо проще управлять.
ЗЫ предлагаю замутить реальную систему.
Забацать гиростабилизированную платформу - в упрощенном варианте конечно.
-Первый шаг расчет траектории - дык для БР здесь проще простого - троектория всего одна! - обеспечивающая максимальную дальность.
Получаем закон изменения тангажа и вектора скорости по времени.
-Второй прицеливание - учет вращения Земли и определение азимута бросания, определение момента и напаравления вектора скорости в момент отсечки для обеспечения попадания.
-Третий полет. Используем абсолютные напаравляющие вектора
--вектор вращения - перпендикулярен плоскости полета
--Вектор гировертикали - перпиндикулярен горизонту в месте старта
--Вектор конечной скорости.
Соответственно тангаж получаем путем вращения гировертикали вокруг вектора вращения (1). Скорость в момент старта считывается компонента скорости по вектору конечной скорости и затем считывается все время с целью получения разницы, иммитируя тем самым показания акселерометра кажущейся скорости (2). Второй акслерометр лежит в направлении вектора вращения и считывает боковой снос (3).
Таким образом управление разделяется по трем каналам
-Угол тангажа - (1)
-Тяги двигателей -5+2% на невилирование в течение заданного времени отклонений (2)
-Угол рысканья на невилирование в течение заданного времени отклонений (3)
Самое простое для реализации данной математики использовать глобальную систему координат Орбитера - к тому же можно говорить о том, что реализована истинная система инерциального управления - именно истинная.
Даже мой лаунчер использует комбинированную систему управления.
Первую стадию тоже производить в глобальной системе координат - гараздо проще система уровнений - нет ни кориолиса и др. Надо обеспечить законом танагажа, исходя из ограничений, просто максимальную дальность.
Вторая стадия. Естественно цель вращается но это плевое дело - одна формула, которую не надо интегрировать. Здесь надо подобрать только момент отсечки и азимут бросания. Соответственно два икса. И две невязки - отклонение по широте и долготе места падения. Конечно лудше невязки переориентировать по линии соединяющей старт и цель - тогда сходимость будет гараздо выше соотнести к времени (вдоль) и азимуту (поперек).
Третья стадия - в момент отрыва от стола считавыем вектора и используем их.
Матиматика работы с векторами предельно проста
Есть класс-юнион VECTOR3
Надо доопределить функцию его нормолизации - получение единичного вектора.
Тогда векторное произведение даст вектор перпендикулярный двум компонентам.
Скалярное произведение даст косинус угла между компонентами. Если один из компонентов - не нормализован то скалярное произведение даст длину его проекции на нармализованное напаравление.
Остается определить только кватернион и к нему функцию вращения.
Плюс халявные функции СДК по преобразованию глобальных координат в локальные и наоборот.
Например нужно получить вектор вращения тангажа.
Запрашиваем в СДК направление оси вращения планеты (1).
Запрашиваем в СДК радиус-вектор положения РН от планеты(2).
Векторное произведение нормализованных (2) на (1) даст вектор (3)перпендикулярный и плоскости стол-север-центр планеты и лежащий в плоскости горизонта стола.
Образуем из (2) и величины азимута бросания кватернион и вращаем им (3).
Все, полученный вектор (4) и есть искомый (3-4 строчки кода).
Остается только каждый раз для управления образовывать кватернион из (4) и угла 90 минус тангаж и им вращать (2) - результат вектор напаравление оси Z РН (5).
Требуем от СДК глобальное положение РН, дополняем им (5) и запихивем сумму в СДК для получения локальных координат - вуаля, остается только разложить на тангаж и рысканье для управления. Если (5) получить на секунду вперед то можно в локалке получить и скорость вращения.
Для получения отклонений кажущейся скорости и бокового сноса
достаточно использовать скалярные произведения на соответствующие направляющие и поправки вносить в тягу и вектор (5).
Одна загвоздка - аэродинамика. РН не знает ни угла атаки ни угла скольжения и померить их не может
|
|
|
Bloodest 155 EGP
Рейтинг канала: 3(40) Репутация: 18 Сообщения: 944 Откуда: Питерские мы Зарегистрирован: 07.10.2004 |
|
Докладываю, стрельбы произвел
Высота подъема 220 км
Точка падения 156.241 55.832
Замечания
1. Ни где не написано что окромя С (автопилот) надо жать еще и О (запуск двигателей).
Вообще лудше необратимые и важные команды разносить с их выключением и совмещать с Ctrl можно и второй раз жимануть С.
2. БЧ
а) Ушла в сторону (дб вперед ?)
б) Какая такая выемка у нее на ж..пе? Между баком и БЧ находится приборный отсек. Пятая точка у БЧ тоже выпуклая, более того она в атмосфере к цели летит ею вперед...
в) Надоть ориентацию БЧ добавить - всю аэродинамику содрать (коэффициенты сопротивления) и запихнуть в CreateVariableDragElement - работает пудово.
г) Дык втюхиваться в цель должна со скоростью не менее 3х Махов, иначе ее любой идиот подстрелит.
Ну и цель нужно как то обозначить - например добавить базу камчадалам...
|
|
|
astronavt 86 EGP
Рейтинг канала: 1(3) Репутация: 35 Сообщения: 403 Откуда: Новочеркасск Зарегистрирован: 11.01.2006 |
|
Bloodest : |
Ушла в сторону (дб вперед ?)
|
Дык после отцепления сообщаю скорость 1 м/с (детатчем). У меня тоже иногда вбок уходит, когда ступень имеет большой наклон к горизонту . А иногда как надо отделяется...
Bloodest : |
Какая такая выемка у нее...
|
Вот это от фонаря. Исправлю, спасибо за информацию. Об управлении ориентацией БЧ тоже думал. Забахаю стандартные группы ориентации. И, кстати, превоначально она у меня летела копчиком вперед, но потом я подумал, что это неправильно, и сместил ЦТ в нос.
Bloodest : |
Точка падения 156.241 55.832
|
М-де, а точность то у тебя еще хуже вышла... Буду улучшать.
_________________ Я бы изменил этот мир, но Бог не дает мне исходников... |
|
|
Bloodest 155 EGP
Рейтинг канала: 3(40) Репутация: 18 Сообщения: 944 Откуда: Питерские мы Зарегистрирован: 07.10.2004 |
|
astronavt : |
Забахаю стандартные группы ориентации. И, кстати, превоначально она у меня летела копчиком вперед, но потом я подумал, что это неправильно, и сместил ЦТ в нос.
|
Дык нету на БЧ ни каких органов управления. Система подрыва - относится к ЯБП и о ней ничего мне не известно. Все очень просто - скорее всего БЧ отделялась либо пружинным либо пневматическим толкателем. На известных мне 70х годов разработки был пневматический толкатель - пятая точка БЧ и еще одно днище с кусочком цилиндра образуют герметичную полость. По окончанию работы последней ступени вычисляется специально образованный недобор скорости (~3 м/с) и соответствующим образом полость наддувается, дальше подравают пироболты, держащие БЧ и она "выстреливается" из кусочка цилиндра уходя от последней ступени и набрав скорость с точностью до сантиметров в секунду. Гыг правда на этой балде в голове стоят два сектстанта и при полете за атмосферой они производят астрокоррекции.
Механический проще но менее точный - подпружиненные толкатели, ход каждого ограничен набором стопоров - они убраны, нужный ход/усилие_отталкивания обеспечивается выдвижением соответствующего стопора пиропатроном.
То есть реально в симе компенсировать ошибку скоростью отделения.
Грубо - для МБР каждый м/с дает ошибку в километр.
Дык при входе в атмосферу БЧ сама ориентируется - конус действует как флюгер.
Указанная CreateVariableDragElement позволяет создать никак невидимый элемент (он может быть вынесен и за геометрические контуры). Главное что его пложение по осям можно задать и он образует моменты. Плюс коэффициент его сопротивления можно менять.
Двумя драгами - один в ЦТ, другой отнесен по оси Z можно довольно хорошо сапроксимировать аэродинамику СА и БЧ и главное быстро. Сначала одним, в ЦТ - подобрать общую траекторию (скорость-высота), затем разделив их подобрать момент и сопротивление ему.Сама БЧ имеет фиктивные площади, микроскопическое сопротивление, и подобранное сопротивление вращению.
В аэрофоле это выльется в тучу таблиц моментов.
|
|
|
astronavt 86 EGP
Рейтинг канала: 1(3) Репутация: 35 Сообщения: 403 Откуда: Новочеркасск Зарегистрирован: 11.01.2006 |
|
Забацал гироплатформу. Кватернионы РУЛЕЗЗЗЗЗЗ!!! Долой матрицы поворота ! Шутка конечно... Правда пришлось немного дописать драгофлайевские исходники - у них не было нормы, построения сопряженного квартениона и построения обратного квартениона, что требуется для поворота.
В связи с дописыванием проблемка - исходники я передаю с аддоном, а кватернионы-то не мои! Самому писать влом (зачем?). Как там с авторскими правами, на кого и как сслылаться? В мануале написано, что это дело рук самого Мартина, Роджера Лонга и Раду Поенару. В исходниках вообще никаких комментариев, думаю можно просто сослаться, или как?
Извратился, сделал управление движками по принципу максимума Понтрягина. Точность резко возрасла! Имеется в виду точность отработки тангажа и рыскания. Критерий - оптимальность по быстродействию, управление получается импульсное с переключением, так, чтобы изображающая точка все время ползла в нуль фазовой плоскости, т.е. можно управлять как углом так и угловой скоростью.
Правда импульсное управление подразумевает мгоновенную перекладку рулевиков, а таковой нет в реальности. Для интереса делал вращение со скоростью 2000 град/с - красота, можно отклонять камеры на полный диапазон (45). Но если вернуть 20 град/с, рулевики запаздывают. Вышел из положения, ограничив диапазон отклонения камер до 5 градусов. И волкам и овцам . Управление теперь идет сразу по обоим каналам - уравнения Эйлера не врут, при осевой симметрии и отсутсвии скорости по крену каналы динамически развязаны. Прикольно смотреть, как в полете абсолютно все камеры качаются туда-сюда, туда-сюда...
Исправил пару глюков с мешами. Теперь работаю над прицеливанием и активным участком.
_________________ Я бы изменил этот мир, но Бог не дает мне исходников... |
|
|
Bloodest 155 EGP
Рейтинг канала: 3(40) Репутация: 18 Сообщения: 944 Откуда: Питерские мы Зарегистрирован: 07.10.2004 |
|
Ну дык с авторскими правами не беда - в Росии, скажем достаточно указать автора алгоритма, так сказать, для соблюдения чести. Поскольку способ решения посредством алгоритмических действий не является объектом авторских прав (даже в мелкософтовских юлах приписка - если не противоречит законадательству - дык половина запретов противоречит российскому). Это один путь.
Другой действительно периписать. Собственно я шел тем же путем - правки драгонфлайтовских (гыг - они там лежат мертвым грузом - в самом драгоне они ни как не используются). Дык ушел от vector3 на СДК VECTOR3 в инициализаторах. Соответственно вращаю квантернионом тоже VECTOR3.
Дык на счет долой матрицы это не шутка . Потому как в квантернионе поворот вектора это набор арифмитических операторов плюс один синус и один косинус (для образования кватерниона). Что действительно здорово сокращает вычисления.
Вопрос другой а аправдано ли использование float вместо double?
|
|
|
astronavt 86 EGP
Рейтинг канала: 1(3) Репутация: 35 Сообщения: 403 Откуда: Новочеркасск Зарегистрирован: 11.01.2006 |
|
Bloodest : |
Вопрос другой а аправдано ли использование float вместо double?
|
Если честно, разницы я не заметил. Еще когда только начинал изучать Си, писал симулятор Saturn-5, ломал голову над тем, в каком формате плавающую запятую брать. По моему даже точности float с головой. А с другой стороны, не зря же компилятор матерится, когда присваиваешь даблу флоат, или наоборот, типа потеря точности...
_________________ Я бы изменил этот мир, но Бог не дает мне исходников... |
|
|
astronavt 86 EGP
Рейтинг канала: 1(3) Репутация: 35 Сообщения: 403 Откуда: Новочеркасск Зарегистрирован: 11.01.2006 |
|
Такая трабла.
Как я понял, Роман, в твоем агоритме подбора коэффициентов для phi(t) = a*t + b, идет интегрирование физической модели от текущего момента времени, до конечного с подстановкой в качестве начальных условий текущего состояния + решением системы нелинейных уравнений методом Ньютона.
Так вот, забахал я у себя что-то похожее. Порядок расчета на каждом таймстепе следующий:
1. Интегрирую физическую модель, получая значения H1 – высота, и alpha1 – угол наклона скорости к горизонту. Причем интегрирование прекращается либо по истечении заданного конечного времени (выборка топлива), либо по достижении заданной скорости.
2. Составляю функции f1(a, b) = H1(a, b) – H, и f2(a, b) = alpha1(a, b) – alpha, где H, alpha – заданные значения. Решаю эту систему методом Ньютона относительно (a, b), естественно на каждой итерации заново интегрируя физическую модель.
3. Полученные (a, b) отдаю на съедение автопилота.
Пока интегрирование модели прекращается по истечении времени (т.е. при текущей программе ракета не дотягивает еще до нужной скорости) все идет просто замечательно. На первом таймстепе Ньютон делает 3 итерации, на последующих – всего одну, и невязка 1e-5 – что на два порядка точнее, чем заданное значение точности eps = 1e-3.
Но как только интегрирование начинает завершаться по достижении расчетной скорости (уже на малых тангажах, менее 10 градусов), начинаются чудеса. Получается решение, приводящее к задиранию носа ракеты, он задирается, естественно при этом опять мы не достигаем расчетной скорости, высота тоже «уходит» и Ньютон выпадет в осадок, т.к. чувствителен к начальному приближению. Бред какой-то…
Раньше я выполнял все дейтсвия в clbkPreStep(…). Но потом заметил, что в момент вышеописанного глюка, SimDT, то есть величина следующего таймстепа резко возрастает – от 30 секунд до МИНУТЫ!!! Поскольку в процедуру интегрирования подставляется текущее время, рассчитываемое исходя их SimDT, то на следующем шаге у нас получается момент времени НЕ СООТВЕТСВУЮЩИЙ истинному, а убежавший вперед на 30-60 секунд! Соответственно двигатель в физической модели не дорабатывает нужного времени, не достигается расчетная скорость и уже очень близкая к расчетной высота. А значит Ньютон снова расходится, к приводит к зависанию «Орбитера».
Почуяв это, я пересадил все на clbkPostStep(…), но видимо это не помогло, только автопилот перед издыханием успевает сделать несколько итераций.
Может я чего неверно понял?
_________________ Я бы изменил этот мир, но Бог не дает мне исходников... |
|
|
astronavt 86 EGP
Рейтинг канала: 1(3) Репутация: 35 Сообщения: 403 Откуда: Новочеркасск Зарегистрирован: 11.01.2006 |
|
astronavt : |
Получается решение, приводящее к задиранию носа ракеты
|
Это не решение, это я идиот . В программе отработки тангажа был такой код
Код: |
if (GetMachNumber() > 0.1)
{
SetHyroplatform(39.0659*KRAD, A*t + B);
}
else
{
SetHyroplatform(39.0659*KRAD, 90*KRAD);
}
|
Это условие типа для того, чтобы отработка начиналась после ухода со старта, т.е. когда уже имеется значительная скорость (30-40 м/с как пишут в умных книжках, или 0.1M). А до этого, просто держать вертикаль.
Вот здесь я и прокололся - ведь если выйти в космос, то там число Маха опять уменьшается, достаточно взглянуть на SurfaceMFD!!! И ракета радостно задирает нос в вертикаль, начихав на программу!!!
Так что вроде все нормуль .
_________________ Я бы изменил этот мир, но Бог не дает мне исходников... |
|
|
Bloodest 155 EGP
Рейтинг канала: 3(40) Репутация: 18 Сообщения: 944 Откуда: Питерские мы Зарегистрирован: 07.10.2004 |
|
На счет точности невязок это обманка, если конечно, используеш стандартную схему - оценка точности по приращению.
GetMachNumber() выше 200 км - мы тож по этим граблям ходили..
Однакож на вопрос я бы дал другой ответ - на конечном участке может происходить развал решения (но это зависит от самой ракеты и выбранной траектории и легко парируется подбором величины шага интегрирования). В лаунчере просто последние 10 секунд летит по уже вычиленным величинам.
|
|
|
astronavt 86 EGP
Рейтинг канала: 1(3) Репутация: 35 Сообщения: 403 Откуда: Новочеркасск Зарегистрирован: 11.01.2006 |
|
Ага, на последних секундах решение действительно разваливается. Все заканчивается мертвым зависом
_________________ Я бы изменил этот мир, но Бог не дает мне исходников... |
|
|
astronavt 86 EGP
Рейтинг канала: 1(3) Репутация: 35 Сообщения: 403 Откуда: Новочеркасск Зарегистрирован: 11.01.2006 |
|
To Bloodest
Роман, а как ты вычисляешь якобиан (матрицу Якоби, точнее) в методе Ньютона? Я тупо делаю, вот так:
J[i, j] = (F[i](x1, xj + h,..., xn) - F(x1, xj,...,xn))/h
то есть заменяю частную производную конечной разностью. Величину h беру от 1e-4 до 1e-7. При верхней границе наблюдается мертвый завис метода где-то на 200 секунде, а при нижней - неопределенность решения, вызванная, видимо, выраждением якобиана. А если взять грубее, то зависает вообще в начале полета. Завис возникает из-за расхождения метода Ньютона, это я точно выяснил, натыкав счетчиков итераций где только можно, и установив точки останова на определенные их значения.
У меня в диссере такой способ прокатывает, а тут видимо нет.
P.S.: Это я к тому, что основная формула метода Ньютона
X[k] = X[k-1] - (J[k-1]^(-1))*F(X[k-1])
где X - вектор неизвестных величин в ур-е F(X) = 0; J^(-1) - матрица, обратная матрице Якоби.
_________________ Я бы изменил этот мир, но Бог не дает мне исходников... |
|
|
Bloodest 155 EGP
Рейтинг канала: 3(40) Репутация: 18 Сообщения: 944 Откуда: Питерские мы Зарегистрирован: 07.10.2004 |
|
Здесь конечно вырождение якобиана может иметь место, но это следствие. Первопричина конечно в свойствах самих псевдофункций, а именно во второй производной. А именно - метод Ньютона- слабо работает если вторая производная имеет тот же знак что и первая. Добавляет масла в огонь способ вычисления производных якобиана. Чем меньше шаг при вычеслении производной тем больше промах. Дык основные способы борьбы -
вычисление производных с шагом равным шагу движения самого ньютона.
регуляризация приращений иксов
- проверка на допустимость величины если это тригонометрический параметр - конечно из иксов, относящихся к at+b должен получатся разумный угол - +- 180 градусов, особенно при предельных t. Соответственно присутствует регуляризация для b и главное а.
- дросселирование шага приближения
X[k] = X[k-1] - (J[k-1]^(-1))*F(X[k-1])*IncrementFactor
Итог - первое приближение
x[0] = -180.*RAD/650.;
x[1] = 50*RAD ;
x[2] = asin(cos(Inc)/cos(latitude));
Шаг для производных
double Step[3] ={.1,.1,0.01};//
В некоторых случаях лудше бывает использовать отрицательный шаг, но не здесь.
Точность
double E[3] ={.01*RAD,.01*RAD,.01*RAD};
Дроссель приращений
double IncrementFactor[3] ={ 1, 1, 0.1};
Регуляризация
x[i]=x[i]+f[i]*IncrementFactor[i];
if(x[1]>89.99*RAD) {x[1]= 89.99*RAD;bMarign=true;}
if(x[1]<-89*RAD) {x[1]= -89*RAD;bMarign=true;}
if(x[0]>10*RAD) {x[0]= 10*RAD;bMarign=true;}
if(x[0]<-10*RAD) {x[0]= -10*RAD;bMarign=true;}
if(x[2]>180*RAD) {x[2]= 180*RAD;bMarign=true;}
if(x[2]<-180*RAD) {x[2]= -180*RAD;bMarign=true;}
if ( fabs( f[i]/x[i])>E[i]) // Продолжаем расчет
ЗЫ Очепятка - исправил
|
|
|
astronavt 86 EGP
Рейтинг канала: 1(3) Репутация: 35 Сообщения: 403 Откуда: Новочеркасск Зарегистрирован: 11.01.2006 |
|
М-да, это не плюшки со стола тырить...
А еще погоду портит (уже при управлении) конечная скорость поворота рулевиков. Из-за этого дикое запаздывание. Вот сейчас чешу тыкву, как это учесть. Не Понтрягин, ни твой способ управления с линеаризацией этого не учитывает (наверно?). Можно, конечно, сделать так - управлять мговенно меняющимся моментом, а рулевики просто крутить для зрителей. Но так ведь блин не интересно . Летала же (и летает!) реальная "семерка". Обидно, ведь я по специальности управленец-робототехник... Видимо плохо учили, или я плохо учился. Ну ничего, прорвемся !
_________________ Я бы изменил этот мир, но Бог не дает мне исходников... |
|
|
|
|
|
Канал Orbiter: «"Семерка" (МБР Р-7) для Orbiter» |
|
К списку каналов | Наверх страницы |
Цитата не в тему: Ща кто-то дофлудится... включая меня... (угрожает Harley)
|
» "Семерка" (МБР Р-7) для Orbiter | страница 3 |
|