Добро пожаловать в отдел программирования и автоматизации исследовательского центра Кербала!! Мы всегда рады новым огурлицам!! Здесь вы найдете инструкции по инициализации и пользованию средой kOS - scriptable autopilot system! Кербал нуждается в новых программистах! Все свои идеи которые мы присвоим себе можешь оставлять здесь. Мы же в свою очередь ответим на все твои вопросы, и поможем разобраться в столь ответственном ремесле, как написание программ для покорения космоса нашими бравыми кербанафтами! Кракен фхтагн Кракен р'лайх фхтагн. С уважением, диспетчер центра - Finn.
Внимание! Для работоспособности мода нужен ModulManager, однако обычно разработчик kOS вставляет его в архив со своим модом. В любом случае убедитесь что у вас в GameData папке файл ModulManager в наличии.
Дополнительные моды: - Большое кол-во Action Groups-ов для тех кому мало десяти стандартных! Совместим с kOS версией выше 15. За предоставление мода спасибо -> Lynx Action Groups Extended: 250 Action Groups
- Проп монитор(кОС встроенный в интерфейс кабины) для кОС. Работоспособность - не проверена. Писался для 15 версии. (Сейчас 18). Если кто проверит, отпишитесь. kOS Prop Monitor
Jenyaza01 (24.08.2016, 21:40) писал: SHIP:FACING:FOREVECTOR - это "вперёд" у крафта, верно? Может, тогда SHIP:FACING:FOREVECTOR + R(90,0,0) - это "вверх" у крафта?
Ну да, я в свое время так и делал. Строил вектора "вверх" и "влево" от SHIP:FACING:FOREVECTOR.
Jenyaza01 (24.08.2016, 21:40) писал: То есть после set v1 to vxcl(craft_up, kerbin_up) v1 будет направлен в ту сторону, в какую наклонён крафт, и его длина - синус угла отклонения?
Не совсем. Это на картинке так нарисовано, поскольку у тебя по рысканью отклонения нет, там все довольно сложно. А что ты такое делаешь, что тебе в векторной форме решать надо? Не уж то автопилот для приземления?
Jenyaza01 (24.08.2016, 21:40) писал:SHIP:FACING:FOREVECTOR + R(90,0,0) - это "вверх" у крафта?
Нед! Это сумма векторов направления крафта и вертикального вектора торчащего из поверхности, потому что SHIP:FACING привязан к фрейму планеты, а не фрейму самого шипа (Это очевидно ). Попробуй SHIP:FACING:FOREVECTOR - R(90,0,0), это даст вектор разницы между направлением шипа и вертикалью, тебе же вроде это надо? Ну или я знатно гоню ))
SHIP:FACING:PITCH и SHIP:FACING:YAW дадут тебе отклонение вектора впереда крафта в градусах Никогда так не пробовал :)
Freze (24.08.2016, 23:45) писал:Ну да, я в свое время так и делал. Строил вектора "вверх" и "влево" от SHIP:FACING:FOREVECTOR.
Есть же стандартные SHIP:FACING:TOPVECTOR и SHIP:FACING:STARVECTOR (это вправо)
Lynx, Там ошибка небольшая, нельзя складывать вектор и направление. Надо взять направление крафта, повернуть его вверх на 90 и от этого взять вектор. set vec to (SHIP:FACING + R(90,0,0)):forevector.
Цитата:Direction Added to Direction Dir1 + Dir2 - This operator is less reliable because its exact behavior depends on the order of operations of the UnityEngine’s X Y and Z axis rotations, and it can result in gimbal lock. It’s supposed to perform a Euler rotation of one direction by another, but it’s preferred to use Dir*Dir instead, as that doesn’t experience gimbal lock, and does not require that you know the exact transformation order of Unity.
Freze, а SHIP:FACING же тоже направление, а не вектор
[/url][url=http://spacedock.ru/user/Lynx/]Lynx, можно гнать, я должен понять. Сейчас попробую (SHIP:FACING + R(90,0,0)):forevector. (никакая часть не реагирует на roll, не походит) SHIP:FACING:TOPVECTOR (ролл замечает, правда не в формате влево/вправо, а в какую сторону мира => надо всегда знать куда смотрю) SHIP:FACING:STARVECTOR (примерно то же, но Y, похоже, позволяет определить направление взгляда) Freze, не совсем для приземления. Для зависания внешний вид содран с "Аватара", функционал тоже (2х2 винты независимо наклоняемые, независимая тяга каждого), теперь нужен автопилот выравнивания, а то, как оказалось, там не всё так просто, как в фильме, стабилизация уходит улетает на раз-два. Для приземления можно использовать его же, с целевой вертикалкой -2 м/с, например, для взлёта +2м/с. Когда оно будет стабильно выравниваться, будет формула аккуратной посадки. Но формула - аналитическая, не вектор, с ней проблем не будет.
А вот и ответ. Почему я ещё неделю назад не написал в посиковике так...
set currentPitch to 90 - vectorangle(up:vector,ship:facing:forevector). set currentRoll to 90 - vectorangle(up:vector,ship:facing:starvector).
Всем, кто пытался помочь помогал - это бессмысленно спасибо большое
Jenyaza01 (25.08.2016, 11:10) писал:(SHIP:FACING + R(90,0,0)):forevector. (никакая часть не реагирует на roll, не походит)SHIP:FACING:TOPVECTOR (ролл замечает, правда не в формате влево/вправо, а в какую сторону мира => надо всегда знать куда смотрю) SHIP:FACING:STARVECTOR (примерно то же, но Y, похоже, позволяет определить направление взгляда)
Они втроем образуют тройку векторов, они смотрят вперед, вверх и вправо соответственно.
Lynx, хм, а ведь реально, "симптомы" у каждого соответствующие... теперь мой кусок хлама аппарат шатает, крутит (из-за меня, лопасти поворачиваю), но он всё равно не падает и пытается выровняться... ну, на критических углах высоту он теряет, но как он кружится вокруг стоек шасси...
"Универсализировал" скрипт посадки. Теперь можно пробовать садиться на любых телах=) В принципе, для разных планет никаких значений менять в скрипте не надо, но если очень хочется, то можно. Пробуем, проверяем, делимся мудростью и впечатлениями. Спасибо.
//Программа посадки беспилотного корабля на поверхность. v 2.0. //http://spacedock.ru/user/Iavasdemsul/ //Формулы: //Конечная высота h = h0 + v0*T + 0.5*a*T^2 //Конечная скорость v = v0 + a*t //Текущее ускорение a = F (тяги)/ M - g, или a = PWR * p - g. // clearscreen. // sas on. //Обязательно нужен SAS, чтоб не вращало наш аппарат. set navmode to "SURFACE". //переключение в режим Surface. set sasmode to "STABILITYASSIST". //Включение SAS в режиме стабилизации. set PWR to 0. //Начальная тяга двигателя. set lspeed to -1. //Желаемая конечная вертикальная скорость после маневра торможения - с минусом, если скорость падения. set T to 0. //Начальное значение дельты времени для достижения необходимой скорости, при максимальной тяге.(для отладки - должно уменьшаться или быть постоянным). set limit to 1. //Начальное значение программного лимита тяги, для компенсации инертности алгоритма сброса скорости. set TWRlimit to 2. //Лимит TWR для установки лимита тяги. Экспериментально вычисленное оптимальное значение 2. lock g to body:mu / (body:radius + ship:altitude)^2. //Ускорение свободного падения g = GM /(R + h_asl)^2. lock p to limit*ship:maxthrust/ship:mass. //Промежуточная переменная p = max(F тяги)/ M, коэффициент максимальной тяги корабля. lock deltav to lspeed - ship:verticalspeed. //Промежуточная переменная dV, характеризующая необходимый //прирост скорости в момент времени до окончания маневра. // set laser_module to ship:modulesnamed("laserdistmodule")[0]. //Включение if not laser_module:getfield("enabled") { //лазера laser_module:setfield("enabled",true). //из мода LaserDist v.0.9.2. } set T_temp to 0. //Объявление set V_temp to 0. //переменных. // set h to 1. //!!!!!!!Высота LaserDist модуля корабля. // until ship:status = "LANDED" or ship:status = "SPLASHED" or ship:status = "PRELAUNCH" { set delta_T to sessiontime - T_temp. //Дельта времени для вычисления реального ускорения. set delta to ship:verticalspeed - V_temp. //Дельта скорости за время delta_T set T_temp to sessiontime. //Присваивание значения для следующей итерации вычисления delta_T set V_temp to ship:verticalspeed. //То же для delta.
set A to delta/delta_T. //Реальное значение вертикального ускорения для атмосферных планет. lock drag to A + g - (throttle*ship:maxthrust/ship:mass). //Вычисление параметра ускорения, вносимого сопротивлением атмосферы.
if ship:maxthrust <= 0 { hudtext("NO MORE FUEL. R.I.P.", 5, 2, 45, red, false). reboot.}. //Проверка наличия топлива. if ship:verticalspeed < -1 { lock steering to ship:srfretrograde.}. //Разворот корабля в ретрогрейд, при падении.
set limit to TWRlimit*ship:mass*g/ship:maxthrust. //Расчет программного лимита тяги, для компенсации инертности алгоритма сброса скорости. За опору берется TWRlimit=2. if limit > 1 {set limit to 1.}. //Для слабых двигателей. if limit >= 2 {hudtext("NOT ENOUGH THRUST. R.I.P.", 5, 2, 45, red, false). reboot.}. //Для очень слабых!
if laser_module:getfield("Hit") = body:name and vang(ship:facing:forevector,ship:srfretrograde:forevector) < 10 //Проверка наклона аппарата { //для считывания данных лазерного дальномера. lock curr_h to min(alt:radar, laser_module:getfield("Distance") * sin(vang(up:vector,ship:facing:topvector))). //Если аппарат сориентирован по вектору движения и для лазера нет препятствий, } //то вычисляем минимальное значение из двух - альтиметра и дальномера. else // { //Если нет, то полагаемся только на данные альтиметра. lock curr_h to alt:radar. //Конструкция необходима для анализа ландшафта и обнаружения сильных перепадов по высоте. }. if alt:radar < 50 { //Лочим положение аппарата при подлете к поверхности для lock steering to ship:up. //предотвращения наклонов из-за потери ретрогрейда на низких скоростях. lock curr_h to laser_module:getfield("Distance"). //Ориентируемся только по дальномеру, так как он дает более точный результат по высоте. }.
if ship:verticalspeed < -1 and drag < g {
set PWR to ((p-g)^2)*(2*h-2*curr_h-2*ship:verticalspeed*deltav/(p-g))/(p*deltav^2) + g/p. //Расчет тяги, при след условиях: //конечная высота h метров; //вертикальная скорость отрицательна; } //T = dV/(p-g), минимальное время для достижения необходимой высоты h и скорости lspeed, при максимальной тяге. else {set PWR to 0.}. // if PWR < 0 {set PWR to 0.}. if PWR > 1 {set PWR to 1.}. set T to (deltav)/(PWR * p - g). lock throttle to PWR.
clearscreen. Print "LANDING TO " + body:name at (5,1). Print "Grav.acc.(g) " + round(g, 2) + " m/s^2" at (5,2). Print "Final Speed " + lspeed + " m/s" at (5,3). Print "Final Altitude " + round(h, 2) + " m" at (5,4).
А как быть с поверхностями ? Я хотеть такое запилить - мы проверяем, совпадает ли направление носа моего аппарата с вертикалью, типа pitch и yaw по 90 градусов, и если нет то дергаем соответствующий элерон до тех пор, пока не совпадет. Это мне для винтового взлетного модуля, сделать что то типа автомата перекоса винта, только на элеронах (в принципе - отклонился в одну сторону, дергаем элерон раз в 1/T секунд, где Т - период вращения, он же speed в ротатроне, и тогда он будет создавать момент только в 1 сторону)