Enterprise Java на страже космоса

Научно-технический прогресс постепенный по своей природе. Никто не берет горсть песка с пляжа и делает из нее компьютер. Мы берем грубые инструменты и создаем с помощью них более качественные. Затем с помощью последних еще более точные и так далее. Каждое малое усовершенствование - это ступенька прогресса и все они должны быть пройдены.

Председатель Шенчжи Ян.

В сознании каждого человека есть одна простая мысль: космические технологии - это сложно. На самом деле это не так. Не все технологии, применимые в космической отрасли - это Rocket science. И последние успехи в космонавтике, ренессанс космической тематики подвигли меня на поиск проблемных областей, которые простой Enterprise Java разработчик может улучшить.

Предисловие

Самый простой способ - это пойти на сайт любой компании, работающей в космической отрасли, и поискать вакансии. Несмотря на то, что SpaceX ищет программистов, мне было отказано на этапе резюме. Видимо, государственные контракты от NASA не позволяют им нанимать людей из других стран. Видимо, по этой же причине NASA даже не ответили на моё резюме. JAXA набирает не-программистов и тех, у кого японский не ниже уровня jlpt2.

С небольшими частными компаниями должно было бы быть значительно лучше. Но Planetary Resources отказали на этапе резюме. Видимо, слишком маленькие, чтобы держать под рукой Enterprise Java разработчика. Planet попросили написать программу на Си. Я конечно вспомнил синтаксис и смог, но после пары интервью они отказали. Видимо, слишком маленькая компания, у которой нет офиса в России, и переезд в другую страну они не потянут.

Ну и, наконец, дефолт сити. Роскосмос - ни списка вакансий, ни требований.

Станции наблюдения за спутниками

Но мне повезло, и я случайно обнаружил проект Satnogs. Это проект по созданию любительских станций наблюдения за спутниками по всему миру. Можно самому распечатать на 3д принтере части станции и по инструкции собрать. Также у них есть центральный сервер, который рассылает на станции запросы для наблюдения за пролетающими спутниками и собирает данные со всего мира: https://network.satnogs.org.

Для меня, как новичка в этой области, было не совсем понятно кому и зачем это нужно. Однако, повертевшись на форумах и в mailing листах cubesat, я стал немного представлять проблематику.

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

И тут на помощь должны прийти интернет и глобальная сеть наблюдения.

Телеметрия

По мере того, как спутник вращается на орбите, он периодически посылает телеметрию. Телеметрия - это текущее состояние системы: напряжение батарей, момент вращения, температура и пр. Если постоянно получать эту информацию, то можно построить график изменения данных во времени и провести анализ.

Поскольку я прежде всего программист, меня заинтересовала именно программная часть, а в особенности digital signal processing. Как из .wav файла можно получить данные. Но прежде чем расчехлять прибор и начать кодить необходимо проанализировать существующие решения. Если вкратце, то эта область застряла где-то в 60х. Энтузиасты пересылают данные в виде скриншотов к windows программам.

Хотелось бы что-то более современное. Например, облачный сервис, который на вход получает .wav файл, а на выходе возвращает json. Почему именно такая архитектура?

  1. для того, чтобы отправить данные и получить результат не нужно специального ПО. Достаточно лишь curl, который есть во всех linux дистрибутивах;
  2. результат в текстовом формате упрощает разработку и интеграцию;
  3. микросервисная архитектура. Такой сервис будет отлично встраивается в другие более сложные системы.
Следующим этапом был выбор технологий. Поскольку специализированные железки для декодирования радио сигналов ну совсем никак не поставить в обычные датацентры, то необходимо программное декодирование. Тут все просто: gnuradio. Это стандарт де-факто для программного декодирования - достаточно мощный и бесплатный инструмент, который поддерживает множество режимов и способов работы. Как раз то, что нужно для того, чтобы работать с зоопарком различных способов кодирования сигнала. Daniel Estévez написал замечательные скрипты по декодированию сигналов различных спутников и приложил рабочие примеры.

Казалось бы вот оно, счастье. Однако, и тут есть несколько ложек дегтя:

  1. GPLv2. Это не позволит вам писать коммерческий софт по декодированию сигналов. И уж точно не подходит для облачного сервиса - кто-то должен платить за хостинг.
  2. Безумная связка C/C++/Python/Swig. Если вкратце, то в gnuradio есть понятие блока. Это такой атомарный преобразователь сигнала. Когда сигнал декодируется данные проходят через множества, связанных между собой, блоков, и на выходе из последнего блока получается результат. Так вот, блоки можно писать на С++ и python. А раз можно писать, значит кто-то обязательно напишет. В итоге часть блоков написана на Python 2, часть на Python 3, часть на C++, который иногда не компилируется и не всегда устанавливается, и все это связано через SWIG.
Переписывать уже рабочий код, который используется уже много лет и знаком многим энтузиастам, задача неблагодарная. Но помучившись с виртуальными машинами и продравшись сквозь десяток ошибок компиляции, я решил пойти на невозможное: переписать ключевые блоки на Java. Разумеется бездумно переписывать все подряд блоки не имеет смысла, поэтому я решил проверить концепцию, переписав только блоки, нужные для декодирования aausat-4. В итоге у меня получилось сделать бинарно совместимые с gnuradio блоки и декодировать сигнал.

Поскольку концепция оказалась успешной, я решил запустить облачный сервис, который по сути предоставляет REST интерфейс к библиотеке jradio. Следующим этапом я планирую подключить его к satnogs для декодирования данных.

Выводы

Даже если вы Enterprise Java разработчик, вы можете помочь Элону. Возможно, по прошествии времени Вы сможете говорить внукам, что шаттл, который летает между Марсом и Землей, каждую секунду выполняет Ваш код. Дерзайте!