Телескопы покупают здесь


A A A A Автор Тема: Программа для предсказания пролётов ИСЗ - handmade  (Прочитано 3385 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн argrentoАвтор темы

  • ****
  • Сообщений: 376
  • Благодарностей: 24
  • I want to believe
    • Instagram: argrento
    • Сообщения от argrento
Разумеется, я знаю о таких программах, как Heavensat, GPredict и прочих, а так же о сайтах http://heavens-above.com и прочих. Но мне всё равно хочется написать свою программку. А еще я бы хотел об этом всём писать в этой теме realtime, с примерами кода, комментариями и прочего.
Будет ли это кому-нибудь интересно?
« Последнее редактирование: 10 Янв 2012 [21:27:22] от argrento »

Не забыть: на следующем Астрофесте вернуть 2 рубля в буфет!

Synta Sky-Watcher BKP2001EQ5
Окуляры: 20 мм, 10 мм, 6.5 мм
Барлоу 2х, 3x. QHY5.

Tau

  • Гость
Будет ли это кому-нибудь интересно?
Мне будет интересно. Один зритель уже есть :).

Оффлайн argrentoАвтор темы

  • ****
  • Сообщений: 376
  • Благодарностей: 24
  • I want to believe
    • Instagram: argrento
    • Сообщения от argrento
Будет ли это кому-нибудь интересно?
Мне будет интересно. Один зритель уже есть :).
О, это здорово!

Не забыть: на следующем Астрофесте вернуть 2 рубля в буфет!

Synta Sky-Watcher BKP2001EQ5
Окуляры: 20 мм, 10 мм, 6.5 мм
Барлоу 2х, 3x. QHY5.

Оффлайн d_w

  • *****
  • Сообщений: 1 948
  • Благодарностей: 131
    • Сообщения от d_w
Еще один зритель есть! У меня билет)))


Оффлайн argrentoАвтор темы

  • ****
  • Сообщений: 376
  • Благодарностей: 24
  • I want to believe
    • Instagram: argrento
    • Сообщения от argrento
Ну здорово. Тогда в ближайшее время напишу первую часть.
Но хочу предупредить о возможных задержах между частями.  :)
Не забыть: на следующем Астрофесте вернуть 2 рубля в буфет!

Synta Sky-Watcher BKP2001EQ5
Окуляры: 20 мм, 10 мм, 6.5 мм
Барлоу 2х, 3x. QHY5.

Оффлайн 1212Lupus

  • *****
  • Сообщений: 3 094
  • Благодарностей: 196
  • Мне стал не очень нравиться этот форум...
    • Сообщения от 1212Lupus
    • http://belastro.net
Третьим зрителем буду. :)
Радиоастрономы-любители -- объединяемся!


Если утро наступает в три -
Через два часа уже зажгут фонари.
Уже кончился день, а я только встал,
А я только что встал и уже устал.
(с) НОЛЬ

Оффлайн ROVIAN

  • Модератор
  • *****
  • Сообщений: 61 502
  • Благодарностей: 1224
  • RV6LOT Icom IC-775DSP
    • Сообщения от ROVIAN
    • Астрономия в Ростове-на-Дону
Парочку билетов в Ростов.  :)
80ED+SW0.85/HEQ5/533ММ/QHY5-II,
203/1000/HEQ5/МРСС/183ММ/QHY5-II

Н 150,200,300,  МСТ-180 Hand made  165,215,300,317,450
Canon 550D, 550DA, 1100DA, 5DM2, 5DM4,  (SY 14/2.8, SY 135/2.0, EF 70-200/4L, )  

Оффлайн xd

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Зрителей хватит.
Человек может бесконечно смотреть на три вещи: как течёт вода, как горит огонь и как работает другой человек  ;D
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн argrentoАвтор темы

  • ****
  • Сообщений: 376
  • Благодарностей: 24
  • I want to believe
    • Instagram: argrento
    • Сообщения от argrento
Итак, погнали.
1. Формат TLE.
Существует 2 карты свойств ИСЗ:
  • 2/3 строчный внутренний формат NORAD
  • двусточный формат для передачи
Первый нас ну совсем не интересует, потому что такие карты не выходят за пределы NORAD. Поэтому о нём забудем и переключим своё внимание на второй тип карт.
Он называется TLE, что расшифровывается Two Line Element set - это две строки форматированного текста, который описывает конфигурацию орбиты ИСЗ и его скоростные параметры.
Цитата
ISS (ZARYA)             
1 25544U 98067A   11291.93104194  .00026332  00000-0  31169-3 0  2661
2 25544  51.6409 257.8008 0015904 344.0404  56.7375 15.60926300740236
Вот так выглядит TLE для МКС. Пройдемся по строчкам и узнаем, что каждое число значит.
Строка 0.
1. ISS (ZARYA) - необязательная строка. Содержит в себе название спутника. Максимальная длина - 24 смвола.
Строка 1.
2. 1 - номер строки.
3. 25544 - это номер спутника в классификации NORAD. Длина - 5 символов.
4. U - классификация спутника. Буква "U" от слова "Unclassified". Эта буква - наше всё, потому что TLE военных спутников найти невозможно.  :)
5. 98067A - международный номер. Длина - 8 символов. Состоит из трёх составных частей:
6. 98 - год запуска. Длина - 2 символа.
7. 067 - номер запуска в том году. Длина - 3 символа.
8. A - часть запуска. Длина - 3 символа.
9. 11291.93104194 - эпоха TLE. Состоит из 2-х частей. Длина - 14 символов.
10. 11 - год. Длина - 2 символа.
11. 291.93104194 - номер дня в году и его часть. Длина - 12 символов.
12. .00026332 - сие есть первая производная от движения по времени, деленная на два. Тобишь, ускорение. Следует помнить, что до точки возможен знак "минус". Размер - 10 символов.
13. 00000-0 - вторая производная от движения по времени, деленная на 6. Не следует забывать тот факт, что перед эти числом подразумевается десятичная точка. Пример: 12345-6 = 0.12345*10^(-6).
14. 31169-3 - коэффициент торможения BSTAR (B*). Он тоже меньше 1. 31169-3 = 0.31169*10^(-3).
15. 266 - номер TLE для этого объекта.
16. 1 - контрольная сумма. Считается так: считается сумма всех цифр каждой строки, причем буквы, пробелы, и знак "плюс" принимается за 0, а "минус" - за 1. После подсчета берется остаток от деления на 10 полученной суммы.
Строка 2.
17. 1 - номер строки.
18. 25544 - это номер спутника в классификации NORAD. Длина - 5 символов.
19. 51.6409 - наклонение орбиты спутника. Это угол между плоскостью орбиты и плоскостью земного экватора. Длина - 8 символов.
20. 257.8008 - долгота восходящего узла. Это точка, в которой спутник пересекает плоскость экватора, когда движется с юга не север. Длина - 8 символов.
21. 0015904 - эксцентриситет орбиты. Аналогично 13 и 14, в TLE содержится только дробная часть. Длина - 7 символов.
22. 344.0404 - аргумент перицентра. Длина - 8 символов.
23. 56.7375 - средняя аномалия. Длина - 8 символов.
24. 15.60926300 - количество оборотов спутника в сутки. Длина - 11 символов.
25. 74023 - номер витка на момент эпохи. Длина - 5 символов.
26. 6 - контрольная сумма второй строки.

Необходимо учитывать следующее:
  • Элементы в TLE очень похожи на Кепплеровские элементы, но это не они. Поэтому эти элементы должны быть использованы только с моделями расчета SGP4, SDP4, SGP8, SDP8.
  • Все объекты в классификации NORAD можно разделить на 2 подмножества - объекты на низких орбитах (с периодом 225 минут) и объекты глубокого космоса (их период больше либо равен 225 минут). Разные множества объектов требуют разных методов расчёта.
« Последнее редактирование: 11 Янв 2012 [23:48:51] от argrento »
Не забыть: на следующем Астрофесте вернуть 2 рубля в буфет!

Synta Sky-Watcher BKP2001EQ5
Окуляры: 20 мм, 10 мм, 6.5 мм
Барлоу 2х, 3x. QHY5.

Оффлайн argrentoАвтор темы

  • ****
  • Сообщений: 376
  • Благодарностей: 24
  • I want to believe
    • Instagram: argrento
    • Сообщения от argrento
1.1. Работа с TLE на С++.
Весь код приведен для среды Qt Creator.
Напишем простецкий класс.
Числовые значения мы будем доставать из строки путём извлечения подстроки с эти числом. Чтобы извлечь подстроку, нам надо знать номер символа, с которого начинается число и длину числа. Для этого объявим следующие константы.
static const int TLE0_SAT_NAME_START                = 0;    static const int TLE0_SAT_NAME_LENGTH               = 24;

static const int TLE1_SAT_NUMBER_START              = 2;    static const int TLE1_SAT_NUMBER_LENGTH             = 5;
static const int TLE1_SAT_CLASSIFICATION_START      = 7;    static const int TLE1_SAT_CLASSIFICATION_LENGTH     = 1;
static const int TLE1_SAT_DESIGNATOR_YEAR_START     = 9;    static const int TLE1_SAT_DESIGNATOR_YEAR_LENGTH    = 2;
static const int TLE1_SAT_DESIGNATOR_LNUMBER_START  = 11;   static const int TLE1_SAT_DESIGNATOR_LNUMBER_LENGTH = 3;
static const int TLE1_SAT_DESIGNATOR_LPIECE_START   = 14;   static const int TLE1_SAT_DESIGNATOR_LPIECE_LENGTH  = 3;
static const int TLE1_SAT_EPOCH_YEAR_START          = 18;   static const int TLE1_SAT_EPOCH_YEAR_LENGTH         = 2;
static const int TLE1_SAT_EPOCH_START               = 20;   static const int TLE1_SAT_EPOCH_LENGTH              = 12;
static const int TLE1_SAT_MM1DERIVATIVE_START       = 33;   static const int TLE1_SAT_MM1DERIVATIVE_LENGTH      = 10;
static const int TLE1_SAT_MM2DERIVATIVE_START       = 44;   static const int TLE1_SAT_MM2DERIVATIVE_LENGTH      = 8;
static const int TLE1_SAT_BSTAR_START               = 53;   static const int TLE1_SAT_BSTAR_LENGTH              = 8;
static const int TLE1_SAT_EPHEM_TYPE_START          = 62;   static const int TLE1_SAT_EPHEM_TYPE_LENGTH         = 1;
static const int TLE1_SAT_ELEMENT_NUMBER_START      = 64;   static const int TLE1_SAT_ELEMENT_NUMBER_LENGTH     = 4;
static const int TLE1_SAT_CHECKSUM_START            = 68;   static const int TLE1_SAT_CHECKSUM_LENGTH           = 1;

static const int TLE2_SAT_NUMBER_START              = 2;    static const int TLE2_SAT_NUMBER_LENGTH             = 5;
static const int TLE2_SAT_INCLINATION_START         = 8;    static const int TLE2_SAT_INCLINATION_LENGTH        = 8;
static const int TLE2_SAT_ASCENSION_START           = 17;   static const int TLE2_SAT_ASCENSION_LENGTH          = 8;
static const int TLE2_SAT_ECCENTRICITY_START        = 26;   static const int TLE2_SAT_ECCENTRICITY_LENGTH       = 7;
static const int TLE2_SAT_PERIGEE_ARG_START         = 34;   static const int TLE2_SAT_PERIGEE_ARG_LENGTH        = 8;
static const int TLE2_SAT_MEAN_ANOMALY_START        = 43;   static const int TLE2_SAT_MEAN_ANOMALY_LENGTH       = 8;
static const int TLE2_SAT_MEAN_MOTION_START         = 52;   static const int TLE2_SAT_MEAN_MOTION_LENGTH        = 11;
static const int TLE2_SAT_REVOLUTION_NUMBER_START   = 63;   static const int TLE2_SAT_REVOLUTION_NUMBER_LENGTH  = 5;

Следующий шаг - заводим переменные под извлеченные части TLE.
QString     *SatelliteName;
qint16      SatelliteNumber;
QChar       SatelliteClassification;
qint16      SatelliteDesignatorYear;
qint16      SatelliteDesignatorLNumber;
QString     *SatelliteDesignatorLPiece;
qint16      SatelliteEpochYear;
double      SatelliteEpoch;
QString*    SatelliteEpochStr;
QString*    SatelliteFullEpochString;

double      SatelliteMM1Derivative;
double      SatelliteMM2Derivative;
QString*    SatelliteMM2DerivativeStr;
double      SatelliteBSTAR;
QString*    SatelliteBSTARStr;

double      SatelliteInclination;
double      SatelliteRightAscension;
double      SatelliteEccentricity;
double      SatellitePerigeeArgument;
double      SatelliteMeanAnomaly;
double      SatelliteMeanMotion;
double      SatelliteRevolutionNumber;

Все эти переменные и константы должны быть описаны в секции Private. А обращаться мы будем к этим переменным с помощью функций. Прототипы - внизу.
int         CreateSatelliteRecord(QString*, QString*, QString*);
QString*    GetSatelliteName(void);
qint16      GetSatelliteNumber(void);
QChar       GetSatelliteClasification(void);
qint16      GetSatelliteDesignatorYear(void);
qint16      GetSatelliteDesignatorLNumber(void);
QString*    GetSatelliteDesignatorLPiece(void);
qint16      GetSatelliteEpochYear(void);
double      GetSatelliteEpoch(void);
QString*    GetSatelliteFullEpochString(void);
double      GetSatelliteMM1Derivative(void);
double      GetSatelliteMM2Derivative(void);
double      GetSatelliteBSTAR(void);

double      GetSatelliteInclination(void);
double      GetSatelliteRightAscension(void);
double      GetSatelliteEccentricity(void);
double      GetSatellitePerigeeArgument(void);
double      GetSatelliteMeanAnomaly(void);
double      GetSatelliteMeanMotion(void);
double      GetSatelliteRevolutionNumber(void);

Самым первым при использовании класса должен вызываться метод CreateSatelliteRecord(QString*, QString*, QString*);. Этот метод принимает три указателя на строки - три строки TLE. Этот метод заполняет внутренние переменные класса.
int TLE::CreateSatelliteRecord(QString* TLELine0, QString* TLELine1, QString* TLELine2)
{
    SatelliteName->append(TLELine0->mid(TLE0_SAT_NAME_START, TLE0_SAT_NAME_LENGTH));
    SatelliteNumber = TLELine1->mid(TLE1_SAT_NUMBER_START, TLE1_SAT_NUMBER_LENGTH).toUInt();
    SatelliteClassification = TLELine1->at(TLE1_SAT_CLASSIFICATION_START);
    SatelliteDesignatorYear = TLELine1->mid(TLE1_SAT_DESIGNATOR_YEAR_START, TLE1_SAT_DESIGNATOR_YEAR_LENGTH).toUInt();
    SatelliteDesignatorLNumber = TLELine1->mid(TLE1_SAT_DESIGNATOR_LNUMBER_START, TLE1_SAT_DESIGNATOR_LNUMBER_LENGTH).toUInt();
    SatelliteDesignatorLPiece->append(TLELine1->mid(TLE1_SAT_DESIGNATOR_LPIECE_START, TLE1_SAT_DESIGNATOR_LPIECE_LENGTH));
    SatelliteEpochYear = TLELine1->mid(TLE1_SAT_EPOCH_YEAR_START, TLE1_SAT_EPOCH_YEAR_LENGTH).toUInt();
    SatelliteEpochStr->append(TLELine1->mid(TLE1_SAT_EPOCH_START, TLE1_SAT_EPOCH_LENGTH));
    SatelliteFullEpochString->append(TLELine1->mid(TLE1_SAT_EPOCH_YEAR_START, TLE1_SAT_EPOCH_YEAR_LENGTH + TLE1_SAT_EPOCH_LENGTH));
    SatelliteMM1Derivative = TLELine1->mid(TLE1_SAT_MM1DERIVATIVE_START, TLE1_SAT_MM1DERIVATIVE_LENGTH).toDouble();
    SatelliteMM2DerivativeStr->append(TLELine1->mid(TLE1_SAT_MM2DERIVATIVE_START, TLE1_SAT_MM2DERIVATIVE_LENGTH));
    SatelliteBSTARStr->append(TLELine1->mid(TLE1_SAT_BSTAR_START, TLE1_SAT_BSTAR_LENGTH));

    SatelliteInclination = TLELine2->mid(TLE2_SAT_INCLINATION_START, TLE2_SAT_INCLINATION_LENGTH).toDouble();
    SatelliteRightAscension = TLELine2->mid(TLE2_SAT_ASCENSION_START, TLE2_SAT_ASCENSION_LENGTH).toDouble();
    SatelliteEccentricity = TLELine2->mid(TLE2_SAT_ECCENTRICITY_START, TLE2_SAT_ECCENTRICITY_LENGTH).toDouble();
    SatellitePerigeeArgument = TLELine2->mid(TLE2_SAT_PERIGEE_ARG_START, TLE2_SAT_PERIGEE_ARG_LENGTH).toDouble();
    SatelliteMeanAnomaly = TLELine2->mid(TLE2_SAT_MEAN_ANOMALY_START, TLE2_SAT_MEAN_ANOMALY_LENGTH).toDouble();
    SatelliteMeanMotion = TLELine2->mid(TLE2_SAT_MEAN_MOTION_START, TLE2_SAT_MEAN_MOTION_LENGTH).toDouble();
    SatelliteRevolutionNumber = TLELine2->mid(TLE2_SAT_REVOLUTION_NUMBER_START, TLE2_SAT_REVOLUTION_NUMBER_LENGTH).toDouble();
    return 0;
}

А все методы возврата численных значений просты до невозможности и однотипны.
QString* TLE::GetSatelliteName()
{
    return SatelliteName;
}

qint16 TLE::GetSatelliteNumber()
{
    return SatelliteNumber;
}

QChar TLE::GetSatelliteClasification()
{
    return SatelliteClassification;
}

qint16 TLE::GetSatelliteDesignatorYear()
{
    return SatelliteDesignatorYear;
}

qint16 TLE::GetSatelliteDesignatorLNumber()
{
    return SatelliteDesignatorLNumber;
}

QString* TLE::GetSatelliteDesignatorLPiece()
{
    return SatelliteDesignatorLPiece;
}

qint16 TLE::GetSatelliteEpochYear()
{
    return SatelliteEpochYear;
}

double  TLE::GetSatelliteEpoch()
{
    SatelliteEpoch = SatelliteEpochStr->toDouble();
    return SatelliteEpoch;
}

QString* TLE::GetSatelliteFullEpochString()
{
    return SatelliteFullEpochString;
}

double TLE::GetSatelliteMM1Derivative()
{
    return SatelliteMM1Derivative;
}

double TLE::GetSatelliteMM2Derivative()
{
    SatelliteMM2Derivative = SatelliteMM2DerivativeStr->split('-').at(0).toDouble();
    SatelliteMM2Derivative *= qPow(10, -SatelliteMM2DerivativeStr->split('-').at(1).toDouble());
    return SatelliteMM2Derivative;
}

double TLE::GetSatelliteBSTAR()
{
    SatelliteBSTAR = ("0." + SatelliteBSTARStr->split('-').at(0)).toDouble();
    SatelliteBSTAR *= qPow(10, -SatelliteBSTARStr->split('-').at(1).toDouble());
    return SatelliteBSTAR;
}

double TLE::GetSatelliteInclination()
{
    return SatelliteInclination;
}

double TLE::GetSatelliteRightAscension()
{
    return SatelliteRightAscension;
}

double TLE::GetSatelliteEccentricity()
{
    return SatelliteEccentricity;
}

double TLE::GetSatellitePerigeeArgument()
{
    return SatellitePerigeeArgument;
}

double TLE::GetSatelliteMeanAnomaly()
{
    return SatelliteMeanAnomaly;
}

double TLE::GetSatelliteMeanMotion()
{
    return SatelliteMeanMotion;
}

double TLE::GetSatelliteRevolutionNumber()
{
    return SatelliteRevolutionNumber;
}
Однако есть методы, которые должны возвращать значение в экспоненциальной форме. К примеру, этот:
double TLE::GetSatelliteBSTAR()
{
    SatelliteBSTAR = SatelliteBSTAR = ("0." + SatelliteBSTARStr->split('-').at(0)).toDouble();
    SatelliteBSTAR *= qPow(10, -SatelliteBSTARStr->split('-').at(1).toDouble());
    return SatelliteBSTAR;
}
Метод split('-') делит строку SatelliteBSTARStr на подстроки, которые разделены символом-разделителем ('-'). В первой строке мы берем подстроку с номером 0 и конвертируем её в число с плавающей точкой. Однако после разделителя идёт экспонента.
Поэтому степень необходимо извлечь и делаем мы это абсолютно аналогично и домножаем полученное в первой строчке число на десятку в этой степени
SatelliteBSTAR *= qPow(10, -SatelliteBSTARStr->split('-').at(1).toDouble());

Пока вот так.
TODO: косметические исправления, интерфейс, продолжение кода.
« Последнее редактирование: 11 Янв 2012 [23:51:44] от argrento »
Не забыть: на следующем Астрофесте вернуть 2 рубля в буфет!

Synta Sky-Watcher BKP2001EQ5
Окуляры: 20 мм, 10 мм, 6.5 мм
Барлоу 2х, 3x. QHY5.

Оффлайн xd

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Описание столбцов можно было бы сделать перечислением, а не набором констант. Или дефайнами на крайняк.
Или ещё лучше сделать массив структур, содержащих поля:
1. Номер строки
2. Offset
3. Length
4. Указатель на метод, который будет обрабатывать это поле.
Для удобства можно сделать именование индексов этого массива перечислением.
Тогда стопиццот строк кода приведётся к одному циклу.


struct ParserRecord;

typedef int (TLE::*ParserMethod)(QString* data);

struct ParserRecord
{
  size_t LineIndex;
  size_t Offset;
  size_t Length;
  ParserMethod Parser
};

ParserRecord parserRecords[] = {
{0, 0, 24, &TLE::ParseName},
{1, 2,  5, &TLE::ParseNumber},
{1, 7,  1, &TLE::ParseClassification},
// и так далее
{0,0,0,NULL} // фиктивная запись окончания массива
}

int TLE::CreateSatelliteRecord(QString* TLELine0, QString* TLELine1, QString* TLELine2)
{
  QString* lines[] = {TLELine0, TLELine1, TLELine2};
  for (ParserRecord* record = parserRecords; record->Length != 0; ++record)
  {
    int result = (this->*(record->Parser))(lines[record->LineIndex]->substr(record->Offset, record->Length)); // вот и весь разбор
    if (result != 0) return result;
  }
}


При таком подходе вероятность косяка куда ниже.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн 1212Lupus

  • *****
  • Сообщений: 3 094
  • Благодарностей: 196
  • Мне стал не очень нравиться этот форум...
    • Сообщения от 1212Lupus
    • http://belastro.net
Я так понимаю, что использование Qt Creator автоматически подразумевает, что конечную программу можно будет скомпилировать и под Linux?
Радиоастрономы-любители -- объединяемся!


Если утро наступает в три -
Через два часа уже зажгут фонари.
Уже кончился день, а я только встал,
А я только что встал и уже устал.
(с) НОЛЬ

Оффлайн argrentoАвтор темы

  • ****
  • Сообщений: 376
  • Благодарностей: 24
  • I want to believe
    • Instagram: argrento
    • Сообщения от argrento
Я так понимаю, что использование Qt Creator автоматически подразумевает, что конечную программу можно будет скомпилировать и под Linux?
Да, именно так.
Не забыть: на следующем Астрофесте вернуть 2 рубля в буфет!

Synta Sky-Watcher BKP2001EQ5
Окуляры: 20 мм, 10 мм, 6.5 мм
Барлоу 2х, 3x. QHY5.

Оффлайн argrentoАвтор темы

  • ****
  • Сообщений: 376
  • Благодарностей: 24
  • I want to believe
    • Instagram: argrento
    • Сообщения от argrento
2. Модели расчета.
На данный момент существует 5 моделей расчета полодения и скорости спутника:
  • SGP
  • SGP4
  • SDP4
  • SGP8
  • SGP8
Первый метод, SGP,  был разработан еще аж в 1966 году Хилтоном и Кулманом (Hilton & Kuhlman) и является упрощением работы Козаи (Kozai) 1959 года. Упрощение коснулось его гравитационной модели. SGP подходит для околоземных спутников.

Следующая модель расчета, SGP4, разработана Кеном Крэнфордом (Ken Cranford) в 1970 году, и может быть использована для околоземных спутников. SGP4 - упрощение более сложной теории Лэйна и Крэнфорда (Lane & Cranford), которая использует решение Брувера (Brouwer) для его гравитационной и атмосферныой моделей.

Модель номер три SDP4 - расширение SDP4 для спутников глубокого космоса. Уравнения движения в глубоком космосе с учетом воздействия гравитационных полей Луны и Солнца были разработаны Хужзаком (Hujsak) в 1979 году.

Модель SGP8 (Hoots, 1980) применяется к околоземным спутникам и является упрощением теории Хутса (Hoots), которая использует те же гравитационную и атмосферную модели, что и Лэйн и Крэнфорд (Lane & Cranford), однако дифференциальные уравнения интегрируются иначе.

Последняя модель называется SDP8. По ней рассчитывабтся спутники, находящиеся в глубоком космосе. Эта модель использует те же расширения, что и SDP4.

При программировании методов будут использоваться константы, описанные ниже. (заодно и LaTex попробую ;))
Название переменнойФормула расчетаЗначение
CK2\[ \frac {1}{2} J_2 a_E^2 \]\[ 5.413080 \cdot 10^{-4} \]
CK4\[ - \frac{3}{8} J_4 a_E^2 \]\[ 0.62096675 \cdot 10^{-6} \]
E6A\[ 10^{-6} \]\[ 1.0^{-6} \]
QOMS2T\[ (q_0 - s)^4 (er)^4 \]\[ 1.99027916 \cdot 10^{-6} \]
XJ3\[ J_3 \]\[ -0.253881 \cdot 10^{-5} \]
XKE\[ k_e \left( \frac{er}{min} \right) ^{\frac{2}{3}} \]\[ 0.743669161 \cdot 10^{-1} \]
Здесь \[ a_E \] - экваториальный радиус земли, \[ J_2 \] - second gravitational zonal harmonic of the Earth, \[ J_3 \] - third gravitational zonal harmonic of the Earth, \[ J_4 \] - fourth gravitational zonal harmonic of the Earth, \[ \$k_e = \sqrt{G \cdot M \$} \] - G - гравитационная постоянная, M - масса Земли.
По мере надобности буду добавлять.
« Последнее редактирование: 22 Янв 2012 [22:50:56] от argrento »
Не забыть: на следующем Астрофесте вернуть 2 рубля в буфет!

Synta Sky-Watcher BKP2001EQ5
Окуляры: 20 мм, 10 мм, 6.5 мм
Барлоу 2х, 3x. QHY5.

Онлайн Serj

  • *****
  • Сообщений: 4 535
  • Благодарностей: 94
    • Сообщения от Serj
    • Тверской астроклуб
А репертуар можно заказывать? Если бы написанная программа могла ещё телескопом через ASCOM управлять, гоняясь за спутниками, то её можно было бы называть уникальной... Или задачи не те?
We have met the enemy and he is us.

Оффлайн argrentoАвтор темы

  • ****
  • Сообщений: 376
  • Благодарностей: 24
  • I want to believe
    • Instagram: argrento
    • Сообщения от argrento
А репертуар можно заказывать? Если бы написанная программа могла ещё телескопом через ASCOM управлять, гоняясь за спутниками
Заказывать-то можно, но реализация долгой будет, я же только учусь.
А насчет ASCOM'а - идея хорошая, сам давно о ней размышлял.
Не забыть: на следующем Астрофесте вернуть 2 рубля в буфет!

Synta Sky-Watcher BKP2001EQ5
Окуляры: 20 мм, 10 мм, 6.5 мм
Барлоу 2х, 3x. QHY5.

Оффлайн lazyBSD

  • *****
  • Сообщений: 3 335
  • Благодарностей: 10
    • Сообщения от lazyBSD
В очередной раз влезу со своими консолями. ;)
Нужно сразу отрезать фронт (рисовалку/gui) от всей математики.

Полезный пример: http://tinyurl.com/823hm6q
/ссылка запрещена правилами форума/

Оффлайн argrentoАвтор темы

  • ****
  • Сообщений: 376
  • Благодарностей: 24
  • I want to believe
    • Instagram: argrento
    • Сообщения от argrento
Нужно сразу отрезать фронт (рисовалку/gui) от всей математики.
Само собой. Схему "реализация-модель-представление" никто не отменял. :)
Не забыть: на следующем Астрофесте вернуть 2 рубля в буфет!

Synta Sky-Watcher BKP2001EQ5
Окуляры: 20 мм, 10 мм, 6.5 мм
Барлоу 2х, 3x. QHY5.

Оффлайн lazyBSD

  • *****
  • Сообщений: 3 335
  • Благодарностей: 10
    • Сообщения от lazyBSD
Как быть с QString, QChar итп, если у меня нет Qt и никогда не будет?
/ссылка запрещена правилами форума/

Оффлайн argrentoАвтор темы

  • ****
  • Сообщений: 376
  • Благодарностей: 24
  • I want to believe
    • Instagram: argrento
    • Сообщения от argrento
Как быть с QString, QChar итп, если у меня нет Qt и никогда не будет?
Эти типы - типы Qt. Поэтому тут несколько вариантов:
1. Всё же поставить Qt.
2. Не ставить Qt и читать исходники в блокноте.
3. Пользоваться бинарниками.
Не забыть: на следующем Астрофесте вернуть 2 рубля в буфет!

Synta Sky-Watcher BKP2001EQ5
Окуляры: 20 мм, 10 мм, 6.5 мм
Барлоу 2х, 3x. QHY5.