Микрокомпьютер: Raspberry PI 4 Model B 8 GB RAM Часть 1 Распаковка
В этом видео расскажу про микрокомпьютер Raspberry PI 4 Model B 8 GB RAM, комплектацию, размеры, особенности и необходимые аксессуары.
В этом видео расскажу про микрокомпьютер Raspberry PI 4 Model B 8 GB RAM, комплектацию, размеры, особенности и необходимые аксессуары.
24 февраля 2020 г.
Суперкомпьютер Oracle Raspberry Pi, крупнейший из известных кластеров Raspberry Pi, был награжден одним из 10 лучших проектов Raspberry Pi 2019 года от Tom's Hardware.
https://www.tomshardware.com/features/top-raspberry-pi-proje...
Вот его история.
Рождение идеи
В 2018 году небольшая группа энтузиастов предпродажной подготовки из Oracle Switzerland представила свой 12-узловой кластер Raspberry Pi на хакатоне Hackzurich. Кластер был собран в виде узла 3x4, имитирующего центр обработки данных Oracle Cloud с 3 доменами доступности. Он запускал полностью рабочий кластер Kubernetes поверх него и мог демонстрировать отказоустойчивость узла и домена доступности. Кластер оказался настоящим магнитом для людей. Яркие светодиоды, симпатичный кластер и неудовлетворенное любопытство «что он делает?»
Заложен фундамент суперкомпьютера Raspberry Pi.
Он становится большим
Вернувшись с хакатона, у нас в голове возникла идея портативной демонстрационной станции, которую мы можем использовать на конференциях и демонстрировать, что такое облачные технологии.
Мы не только сможем продемонстрировать простые сценарии аварийного переключения и поддержания работоспособности, но и с чем-то вроде Kubernetes или проекта Oracle Fn наверху, мы сможем создать множество автономных демонстраций, поместить их в каталог в Интернете и затем продемонстрировать в прямом эфире на конференции. Каталог также позволит нам легко подключаться к нему в течение года и в любой точке мира без необходимости иметь физический доступ к кластеру. И используя такой автономный программный стек, любое другое оборудование, использующее тот же стек, будь то кластер Raspberry Pi или нет, также сможет использовать те же самые демонстрации. Было ясно, что это открывает множество возможностей, но следующий вопрос заключался в том, насколько далеко мы зайдем.
Сначала мы думали о построении модульного кластера из 128 узлов. Модульный в том смысле, что мы создадим 8 отдельных блоков кластеров с 16 узлами, которые затем можно было бы объединить в более крупные кластеры (8x16, 4x32, 2x64, 1x128).
Это дало бы нам несколько преимуществ, например, наличие нескольких кластеров, которые могут путешествовать по миру и одновременно присутствовать на разных конференциях. В случае, если нам потребуется больше вычислительной мощности или произойдет более крупное событие, когда мы захотим продемонстрировать больший кластер, мы могли бы легко сложить их до нужного размера. Для выделенных событий, таких как Oracle Code One, мы просто объединим их все в один большой кластер.
Как уже было сказано, сначала мы думали о 128 узлах, но проходя через это, мы спросили себя, кто еще делал что-то подобное раньше, и, что более важно, какой кластер сегодня самый большой? Поэтому мы сделали шаг назад, провели небольшое исследование и вскоре обнаружили, что в наши дни 128 узлов больше не представляют собой ничего особенного.
Например, был The Beast v2, 144-узловой кластер Raspberry Pi, который был разработан как демонстрационная установка для balena.io. Мы также обнаружили эксперимент с облачным кластером Bolzano Raspberry Pi, который представлял 300-узловой кластер Raspberry Pi.
https://www.balena.io/blog/the-evolution-of-the-beast-contin...
https://www.anandtech.com/show/12037/cheap-supercomputers-la...
Самый большой кластер Raspberry Pi, который мы смогли найти, был создан отделом высокопроизводительных вычислений Лос-Аламосской национальной лаборатории с стремительно развивающимся кластером Raspberry Pi на 750 узлов. При этом у нас была четкая цель: что бы мы ни делали, оно должно выходить за пределы 750 узлов. Поскольку мы были гиками, мы знали, что следующим логическим числом будет 1024, и поэтому мы начали создавать кластер Raspberry Pi с 1024 узлами.
Строительство суперкомпьютера
Когда мы начали строительство модульного кластера с 1024 узлами, мы вскоре поняли, что наши планы не обязательно сработают в срок, который мы имели в виду: Oracle Code One 2019.
Создание модульного кластера добавило значительных усилий и времени, которого было слишком мало, чтобы завершить вовремя для Code One 2019. Учитывая, что нам не нужен модульный аспект кластера для конференции, поскольку мы все равно хотели иметь один большой кластер для Code One, мы приостановили эту идею и решили пойти на одну-единственную синюю коробку. Внутри вы найдете:
Стеллажи высотой 5 x 2 метра
1 сервер Supermicro 1U Xeon
18 USB-блоков питания
22 сетевых коммутатора
49 держателей Raspberry Pi, напечатанных на 3D-принтере
1060 Raspberry Pi
Подождите, 1060 Raspberry Pi? Да! Как оказалось, 1024 Raspberry Pi были отличной идеей, но, собрав стойку, мы обнаружили, что внутри у нас все еще есть место. Что же делать? Зря тратить место или заполнить стойку дополнительными Raspberry Pi? Что ж, мы выбрали последнее, и поэтому наш кластер Raspberry Pi с 1024 узлами стал кластером Raspberry Pi с 1060 узлами.
Затем мы начали искать необходимые компоненты. 1060 Raspberry Pi - это довольно много.
Любую операцию, которую вам нужно выполнить, будь то подключение сетевого кабеля или установка винта, вам придется проделать это как минимум 1060 раз. Добавьте к этому 1060 SD-карт, и вы потратите немало времени на прошивку этих карт, не говоря уже о подключении их к каждой Raspberry Pi и, возможно, установке на них дополнительного программного обеспечения.
Поэтому вместо того, чтобы покупать 1060 SD-карт, мы решили загружать их все по сети с одного центрального сервера (сервера Supermicro 1U Xeon). Загрузка по сети позволила нам установить и настроить программное обеспечение только один раз, и если какие-либо изменения должны произойти, они также произойдут только один раз. Поскольку мы были Oracle, для нас было естественным загрузить Oracle Linux для ARM вместо Raspbian по умолчанию.
https://blogs.oracle.com/linux/announcing-oracle-linux-7-for...
На Oracle Code One 2019
Нам удалось создать и продемонстрировать кластер на Oracle Code One 2019.
Мы выбрали увлекательную демонстрацию, созданную с использованием Java, которая не только показывала использование кластера на большом экране, но и искажала картину конференции.
Участники могли отправлять сообщения в кластер, чтобы освободить это изображение. Как только сообщение было получено, случайный узел отправлялся дальше и освобождал часть изображения в реальном времени. Задача заключалась в том, чтобы как можно быстрее отправить как можно больше сообщений, чтобы прояснить всю картину. Таким образом, участники могли не только получить удовольствие от аппаратной инженерии, которая здесь работает, но и весело взаимодействовать с кластером. Демонстрация также побудила участников использовать подход краудсорсинга и работать вместе, что косвенно помогло им пообщаться с другими участниками.
Как только картина прояснялась, мы ставили новую и начинали все сначала. Это, безусловно, привлекло внимание людей, не только посетителей Code One, но и социальных сетей, а также таких людей, как ServeTheHome и Tom's Hardware.
https://www.servethehome.com/oracle-shows-1060-raspberry-pi-...
https://www.tomshardware.com/news/oracle-raspberry-pi-superc...
Благодарим вас всех!
За пределами Oracle Code One 2019
После завершения Oracle Code One 2019 мы вернулись к списку идей. Было еще много выдающихся вещей, о которых мы думали, но пока не удосужились. Но какой из них заняться в первую очередь? Что ж, иметь один большой кластер было круто, но нам очень, очень понравилась идея иметь более мелкие кластеры, которые могли бы путешествовать по миру в одно и то же время.
Итак, для следующей цели мы решили пойти на мини-кластеры. И как лучше всего что-нибудь сделать? Установив крайний срок, который для этого проекта мы установили для Open World London 2020, который произошел всего две недели назад.
И вот, мы представляем вам мини-кластер Raspberry Pi на 84 узла:
На этот раз мы решили помочь поиску внеземного разума (SETI) с нашим кластером через проект SETI@Home. И снова наш кластер имел большой успех и привлек внимание всего мира, несмотря на то, что он был меньше своего старшего брата.
Дорога впереди
Так что же впереди? На доске все еще есть много идей, которыми мы займемся в обозримом будущем. Одна из наших целей по-прежнему состоит в том, чтобы сделать эти кластеры Raspberry Pi полностью облачными и использовать на них такие технологии, как Kubernetes и Fn Project. Нам также по-прежнему нравится идея иметь демонстрационный каталог, который может использоваться любым кластером в любой точке мира, на каком бы мероприятии он ни присутствовал в настоящее время. И, конечно же, мы еще не отказались от идеи сделать эти кластеры модульными. Но тем временем у нас появились и новые идеи.
Один из них - сделать (большой) кластер сердцем и центром для опыта Oracle Code One с поддержкой IoT и позволить ему захватывать и обрабатывать множество различных показаний датчиков события в реальном времени с помощью Oracle Cloud.
Пока не решено, какой из этих идей мы займемся следующей. Но уже ясно одно: дорога еще впереди, и мы с нетерпением ждем ее ...
Здравствуйте.
Может кто делал собственно сабж?
Имеется малина, к ней по USB подключен внешний HDD на котором лежат торренты. Хочу подключить к ней же по USB M2 SSD и перенести туда систему. И если вопрос собственно в клонировании microSD на SSD не стоит (утилит масса, как и виндовых так и линуксовых), то как малина поймёт, что система находится на SSD, а не на HDD?
Я бутлоадер обновил и в raspi-config есть пункты в меню, где можно выбрать с чего загрузка будет в будущем. В оффициальной документации написано, что эти настройки хранятся в EEPROM. Но в этой же документации не написано, что делать, если USB-устройств хранения больше одного. То ли не предусмотрено такое (что вряд ли), то ли я не понимаю нюансов (что скорее всего).
Может у кого был подобный опыт? Поделитесь, пожалуйста.
Ни и гуглил и яндексил и даже рамблернур. Но не нашел . как читать записывать данные в еепром 24 серии размером 8К ну можно и не 8К. Подскажите дайте примерчик на питоне
Те из вас, кто читал предыдущие части моей истории, сейчас наверняка пристально разглядывают эту картинку и у них в голове появляются вопросы. Если вы присоединились только к 3-й части — все равно запрыгивайте, начало истории у меня в профиле.
Эта часть будет разбита на две (а не на три, как обычно). Здесь вас ждет: техническая часть, бухгалтерия, подготовка к запуску, запуск и поиск. В следующей части: результаты, видео и выводы.
Как можно догадаться — мы снова это сделали. Мы запустили свой самодельный стратостат из "плохого" гелия и "не надежного" GPS-трекера, и привезли немного интересного из стратосферы. Хотите узнать почему это фото именно такое?
Вступление
Да потому, что мы сделали запуск ночью… Мы, конечно, не планировали запуск ночью, но "человек предполагает, а COVID располагает"… Так что расписание наше пришлось подвинуть, пока все не перестали кашлять и запуск сдвинулся на будний день. А там у всех дневная работа, заботы и т.п. Перенести на ближайшие выходные не получилось уже из-за меня — мне надо было срочно улетать домой. В общем — это был вечер буднего дня.
По секрету скажу (я эту мысль никому из команды ранее не озвучивал, иначе меня засмеяли бы), что у меня была идея запустить ночью, когда-нибудь. Я, почему-то, думал, что GoPro вытащит неплохой ночной вид на видео. Но, как вы понимаете, не вытащила, хоть и снимала с максимальным для нее ISO 1600. Хотя фото это мне нравится — на нем Луна :-)
Все! На этом можно заканчивать! Да нет, конечно. У меня опять получился какой-то лонг-рид: я расскажу как все было и почему все было именно так.
Для начала небольшое отступление для вновь подключившихся. Около года назад мы с друзьями решили собрать свое нечто, способное подняться на высоту 30+ км, записать там видео и некоторые данные, вроде влажности, температур, давления и т.п. Мы назвали это самодельный стратостат. В первой части статьи приведен подробный план постройки этого аппарата (все этапы). Во второй части мы учли некоторые ошибки прошлого и повторили запуск(-и). 3апускали мы 3 раза, всего было 4 шара, улетело из них на тот момент — 2. И вот, наш 4-й запуск, в который полетел, улетел и прилетел наш 5-й шар — Vostok-4 (да-да, naming convention описан во второй части статьи).
В целом, всю нашу историю за прошедший год можно изобразить вот этой совершенной инфографикой:
Да, вы снова видите эту цифру: 35794м. И на фотке из заголовка она, и тут она. Все верно. Но обо всем по порядку.
Конструкция
Общая конструкция
Хоть я и обещал в прошлый раз, что технических изменений не будет, но, как говорится — еще ни один план не пережил начало битвы. А битва у нас случилась с парашютом. Дело в том, что за все наши запуски наш самый первый парашют поистрепался. Я упоминал уже, что, даже после первого запуска, он немного надорвался на внутренней поверхности купола. Повреждение было не критичным и мы запустились с ним еще раз. Это его и добило. Нет, посадка Vostok-3b была мягкой, но парашют окончательно пришел в негодность и мы решили его заменить.
Почему-то, наш конструктор посчитал хорошей идеей вместо одного парашюта сделать два. Ну, на самом деле, аргумент его был весьма прост: больше парашютов — мягче посадка (суммарная площадь поверхности, создающей сопротивление, ведь больше). Помогло это или почему не помогло — обсудим в результатах. А сейчас очень важный нюанс: первый парашют был бесстропный, вторые два со стропами. И я вам наперед скажу: если не хотите проблем — со всей силы ищите бесстропные парашюты.
Итак, у нас 2 стропных парашюта, каждый из которых крепится своим фалом к горловине шара. Снизу, от строп парашютов идут независимые фалы к еще одному фалу, который уже крепится к полезной нагрузке. Схематично это выглядит так (масштаб не учтен):
Существует древняя истина: чем больше в системе элементов — тем чаще она ломается. Это правда, я про это знал и… ничего конструктору не сказал. Представленная схема креплений Vostok-4 сильно сложнее прошлых версий. Тут и фалов вагон, и парашютные стропы, и их соединения. В общем — так себе идея. Но проверить стоило.Следующим изменением был сам шар — основа всей конструкции. Как вы могли заметить на инфографике, каждый раз мы запускали разные шары. На этот раз мы раздобыли у китайских коллег царь-шар массой 2 килограмма. Это в 6 раз больше чем было у Vostok-3b. Ну и он не подвел.
Ссылка на шар: aliexpress
Заявленные характеристики следующие:
Да, по ссылке шары >2000г отсутствуют. Так что мы заказали тот что на 2кг, а потом уже, пообщавшись с продавцом, выяснили что можно заказать шарик и покруче. Стоит их пробовать или нет — решайте сами. Сразу скажу, что шар на 2кг обошелся нам примерно в 25000 руб. К тому же, у меня большие сомнения насчет возможности подъема выше 38км без реактивной тяги — уж очень мало там воздуха. Так что, если хотите наверняка — берите максимум 2кг.
Полезная нагрузка
Тут без изменений. Ничего не убавили, ничего не добавили. Даже павербанки летали те же, что и в прошлый раз. Пролистываем.
Программирование
А вот тут с изменениями :-)
Но с одной оговоркой: на Vostok-4 летала та же версия ПО, что и на Vostok-3b. Все изменения, описанные тут, сделаны по результатам анализа телеметрии Vostok-4 и эта версия еще никуда не летала! По этой же причине бранч не влит в мастер.
Вот предмет обсуждения: bugfix/report_gaps
А произошло следующее. В основном цикле есть такое условие:
Я объяснял в первой части, что точка синхронизации всех параметров телеметрии — время, полученное по GPS. Соответственно, не имея данных GPS — нет смысл записывать отчет. Или есть? На самом деле есть, т.к. во-первых: нам не так уж и важно абсолютное время — достаточно относительного (просто записывать каждую секунду). Во-вторых: гораздо более удачной точкой синхронизации может стать высота, а не время. А высота у нас не только от GPS, но ее можно вычислить и по барометрической формуле (и мы это делали в первой статье). Но этот метод требует определенного оборудования за бортом. Например, градусника, способного измерить очень низкие температуры (ниже -40C). Наш внешний градусник ограничен нижней планкой в -40C, а внутренний — подвержен влиянию нашей системы климатизации (нагревается от RPI и охлаждается забортным воздухом).
В общем, данные GPS не сильно важны (но очень желательны), оттого появилось это || _reportService.ReportFileCreated. Так уж получилось, что хоть 1 раз, но GPS нам необходим — чтобы сгенерировать имя файла отчета ¯\(ツ)/¯ А дальше уже можно и без GPS, и все должно быть хорошо.
Но, листая телеметрию с этого запуска, вылезло вот это:
Видите, видите? "Расстояние" между 2-я этими соседними строчками немного больше чем 1 секунда. Оно почти полчаса! Откуда? Что? Как? Да, очевидно что мы потеряли GPS на какое-то время, но ведь, следуя условию в основном цикле, мы все равно должны были записать данные с сенсоров.
Одной из возможных причин потери сигнала GPS могло быть вот это:
Мы не знаем, в какой момент это произошло, но есть не нулевая вероятность, что изоляция перетерлась на подъеме (когда шар больше всего крутило) и это послужило "началом конца". Эта антенна была закреплена на центральном парашютном фале и вполне могла там и запутаться. Это конечно лишь мои догадки, но все же.
Причина оказалась совсем детской — NullReferenceException вот тут:
Мда… Собственно, это и есть весь фикс. Но этот случай вынудил меня написать юнит-тесты для всего этого хозяйства, чему и посвящено 99% изменений в бранче с фиксом. Сейчас там конечно не full coverage, но основные моменты я покрыл.
Раньше я быстро писал некрасивый и нерабочий код, но спустя многие годы упорной работы я перестал писать его быстро
Единственной проблемой было то, что все классы библиотеки для работы с SenseHAT (SenseHatNet) — не абстрактные, не реализуют интерфейс, да еще и запечатанные. Такая диспозиция вынуждает меня создавать пограничные интерфейсы, а я такое не очень люблю, но сделать их пришлось. Других проблем не было.
Сами тесты (если интересно) посмотрите в репозитории, а тут мы посмотрим на результаты.
До фикса:
После фикса:
Нуштош... заодно прогнали тесты с записью в файл, убедились, что теперь все "ок" и двинули дальше
Бухгалтерия
Тут почти все идеально, наконец-то :-)
Траты были только на расходники: шар и гелий. Ну и на новые парашюты. Теоретически, их тоже можно вписать в расходники, но чуть более long-term. С другой стороны — так можно все что угодно вписать в расходники. Ведь ничто не вечно. Тем не менее мы не рассматривали конструкцию как "полностью переиспользуемую" на протяжении долго времени. А для нескольких запусков одного нормального парашюта вам должно хватить. Единственное, что вы 100% будете докупать — это шар и гелий.
Подготовка к запуску
Этот пункт был подробно рассмотрен в первой части статьи, с тех пор механика поиска места запуска не изменилась. FPLN и Landing Predictor вам в помощь.
Но! Тут хочу отметить один важный момент: меня много раз в комментариях дергали вопросом обеспечения безопасности полетов и, в целом, "легализации" этого занятия. Как то: получение разрешения на использование воздушного пространства и подача плана полета в организацию воздушного движения. В прошлый раз я ответил в комментариях, почему не могу сейчас описать этот процесс в статье. Эта же причина сохранилась и по сей день, но мы над этим работаем и все выглядит так, будто бы дело сдвинулось с мертвой точки. Да, планы мы всегда (!) подавали, но процесс их подачи на данный момент непригоден для описания в виде "инструкции". А так как это очень важная часть всей нашей затеи — мы решили довести этот вопрос до пригодного состояния и выложить это как небольшую, но отдельную часть серии статей про самодельный стратостат. Как минимум это сильно облегчит поиск этой информации для тех, кто решит повторить этот путь. Так что ждите, будет отдельно и по делу про "ОрВД, ЕЦ, СЦ и ФГУП" и прочие генераторы случайных букв в российских госструктурах.
Запуск
Помните, в прошлый раз на поиск наш гитарист притащил лодку? В этот раз на запуск он притащил тент 6x4 метра. Несмотря на то, что запуск Vostok-3a провалился по причине наших кривых рук, он решил что проблема не в нас, а в тенте. И сшил на заказ новый, белый и красивый. Смысл использования тента при запуске был тем же, что и всегда — уменьшить нагрузку на горловину шара, пока его надувают гелием. Ведь шар надо удерживать за "что-то", чтобы он не улетел раньше времени (как случилось с Vostok-2). Ну вот...
¯\(ツ)/¯
Честно говоря, этот вариант использования тента мне даже больше понравился и он не лишен смысла. Сейчас объясню разницу с запуском Vostok-2.
После провала с Vostok-2, нашим скорополительным решением стал злополучный тент. Надо было его лишь правильно растянуть над местом запуска и надувать шар под ним. Тогда это практически ликвидировало бы нагрузку на горловину. Но! Как вы можете помнить, Vostok-2 то мы перекачали. Это "раз". "Два": масса шара Vostok-2 — 800 граммов. Масса шара Vostok-4 — 2000 граммов. В 2,5 раза тяжелее. За счет чего, даже при том же количестве гелия внутри — он и сам себя будет неплохо прижимать к земле. Так что, если закачать правильно количество гелия и иметь достаточно тяжелый шар — надобность в тенте над ним пропадает. Вот мы и решили использовать тент "под ним".
Рекомендуемое количество гелия зависит от начального диаметра шара. И, в случае с шарами L-800 и L-2000, это 1 баллон 40л с давлением 150 атм.Расстелить тент на земле — не бесполезное занятие. Вершки-корешки, палки-копалки, да мало ли мусора в лесу валяется? Любая мусоринка может повлиять на целостность шара еще до запуска! Так что, как подстраховку, рекомендую расстелить хотя бы полиэтилен и надувать уже на нем.
И так, мы расположились, разделились, каждый по своим делам. Первым делом запитали наш афроящик:
Ждем пока красный свет не сменится на зеленый. А если не сменится — значит дело плохо и надо разбираться прям там в лесу. Но, спустя несколько секунд видим что все ок:
А еще видим, что на нем нет крышки. Это не потому, что мы ее еще не поставили. Это потому, что мы ее забыли сделать. По пути мы заскочили в строительный магазин и купили лист самого обычного пенопласта. Его недостатки я описывал уже: он слишком толстый и хрупкий для наших нужд. Но, когда у вас стоит выбор между "ничего" и "плохой пенопласт" — выбирайте пенопласт. Там же нарезали себе крышку, проделали в ней отверстие для крепления парашютов и заклеили короб. Из-за спешки (и пенопласта) отверстие для крепления получилось слишком большим и через него в полете поступал забортный воздух. Что не очень хорошо сказалось на климате внутри коробки и это будет видно при разборе телеметрии. А вы помните, что основная проблема, возникающая из-за низких температур — быстрая разрядка элементов питания. А питание — это всё. Это и камера, и телеметрический модуль, и поисковый трекер. Да, каждый узел имеет независимое питание, но все они расположены внутри коробки. Так что батарейки надо беречь и греть. В данном случае, наши аккумуляторы выдержали. Но лучше так не рисковать.
Больше приключений не было. Мы спокойно закачали ровно 1 баллон на 40л, слегка придерживая шар рукой за горловину. Благодаря массе шара — это было не сложно.
Прицепили парашютный фал к шару, фал полезной нагрузки к парашютам и просто разжали руки, отпустив шарик в ночное небо. И стали мониторить, пока была такая возможность (напоминаю: поисковый трекер фиксирует высоту только до 10км):
Я же говорил в прошлый раз, что мы больше никогда не будем пытаться искать трекер в день запуска? Честно говоря, сейчас таких планов тоже не было. Это бессмысленно. Улететь он может на сотни километров (и улетел), да, к тому же, на дворе ночь! Но мы решили все же подождать — вдруг он упадет рядом с дорогой, в легкой доступности? Мы развели костерок, сообразили поесть и принялись ждать. План был такой: ждем до полуночи, если нет новостей — едем по домам, если есть новости — смотрим где упал и решаем. До полуночи с момента запуска оставалось 4 часа, а мы уже знаем, что примерно столько наши шары и летают. Так что шансы узнать место приземления в этот же день были вполне реальны.
Тем временем зонд начал рапортировать о наборе высоты:
И набирал он ее довольно бодро: чуть больше чем за час — 7553 метра. Неплохо для двухкилограммового шара. Дальше, очевидно, он преодолел рубеж в 10км и пропал с радаров. Мы доели шашлык, дождались полуночи и, не получив сигнала от трекера, двинулись домой. Нас ждали 400км пути и поиск этого несчастного в другой день. Опять не повезло.
Поиск и спасение
И, практически ровно в полночь, он проснулся. Но...
Во-первых — снова болото. Во-вторых — что-то тут не так с показаниями. Высота 128 метров? Нуууу, в принципе, это возможно. Скорость не нулевая? Это очень странно. Он либо лежит (и 128 метров это высота поверхности в данной местности над уровнем моря), либо продолжает лететь на такой высоте. Но больше всего меня насторожило вот это: Low Battery!
Если он не лежит на поверхности (скорость не нулевая же) и вот-вот разрядится — будет чрезвычайно сложно его найти. Честно говоря, к такому никто готов не был. Поисковый трекер у нас считался самым надежным элементом системы и от него зависел успех миссии.
Прямо посреди шоссе мы стояли и ждали, в надежде, что трекер пришлет еще одно сообщение. Он настроен присылать треки раз в 5 минут при наличии движения и раз в сутки "статус-сообщение". Да, сигнал GPS не всегда стабильный, и иногда пропадает — это нормально. Но мы прождали не меньше получаса, а нового трека не было. Все портило Low Battery — если бы не оно, я был бы абсолютно спокоен. С полностью заряженными аккумуляторами этот трекер может проработать месяцы. А за это время сигнал нет-нет, да появится. Но он все не появлялся… Что ж, в этот день мы уже точно ничего не могли сделать и двинули дальше в сторону дома с еще худшим настроением, чем было.
Практически 2-е суток он молчал. Двое суток мы в 8 рук тиранили приложение трекера своими запросами. К концу второго дня, принимая во внимание разряжающуюся батарею, надежды уже практически ни у кого не было. Но вдруг, мне в спам посыпалось:
И это означало лишь одно — придется нам снова ехать во всякие
Ну ладно, не так далеко, конечно.
Было бы смешно, если бы он упал не в болото. Но он, по привычке, упал в болото:
А я ни разу не удивлен… Новгородская область богата на болота. Раньше надо было думать, когда выбирали место запуска. Хорошо хоть рек рядом не оказалось.
К сожалению, в этот момент я уже сидел в аэропорту и смотрел на самолеты. Так что искать и доставать наш "Vostok-4" ребятам предстояло без меня. Когда я слушал эту историю по телефону — это звучало как-то так:
Аааа, медведи! Выстрелы! 700 верст по голову в болоте!!1 Взяли шашлык, но пришлось есть грибы! В той деревне все УМЕРЛИ!
Но сейчас, когда прошли недели, можно отбросить эмоции и взглянуть на ситуацию спокойно. Расстояние от точки высадки до зонда по прямой ~5км. Но по прямой там леса\болота. Давайте посмотрим, как шли участники нашей викторины:
A: точка высадки. Дорога, по карте, идет до деревни "Степаново" (точка C). На самом деле — нет. Ну, формально может дорога там и идет, но проехать по ней нельзя. Так что спешились и двинули на своих двоих
B: Свернули раньше времени, ушли немного в лес. Пришлось возвращаться назад. Тем более, что тут был обнаружен след медведя на земле (см. фото-пруф ниже)
C: Дошли до крайней деревни — Степаново. Это туда шла "дорога"
D: От "Степаново" пошли на север — тут начиналось первое болото. Да, болот там много и, так или иначе, но парочку пришлось бы пересечь
E: Пересекли первое болото. Не без потерь — потеряли носок (провалился гитарист под воду немного) :-)
F: Напрямую на северо-восток было не пройти — мешал лес. Откатились немного вдоль лесополосы на юго-запад. Тут начиналось второе болото
G: Пересекли и его. Зонд лежал по ожидаемым координатам — финиш
Весь маршрут — 8.14км в одну сторону. Еще столько же — обратно. Много это или нет (в условиях пересеченной местности и с нагрузкой из сухпайков) — решайте каждый для себя.
Как я уже упоминал — я (не участник этих событий) описываю это спустя недели. Так что довольно сухо и "по фактам". На самом же деле, они смогли мне выдать более-менее связный рассказ только через 2 дня после завершения этой вылазки — настолько сильно они вымотались. Да, и с точки G они мне отзвонились, и из машины по пути домой тоже. Но это больше походило на бессмысленное мычание в трубку, чтобы доложить, что они еще дышат. Тогда я думал, что они на меня обозлились, мол — отправил к черту на рога, а сам сидит там на диване и ест круассан. Но, так часто бывает при физическом и моральном истощении — просто не до разговоров. Точно так же было и при поиске Vostok-3b. Так что я старался терпеливо ждать, пока они отдышатся.
Тем не менее вылазка всем понравилась. Места там очень красивые. Грибов вагон (никаких грибовизоров не надо), очень аутентичная заброшенная церковь, заброшенные деревни, даже медведи там водятся!
И снова, из-за ограничений Pikabu, тут придется остановиться. Мы вернемся с результатами и выводами на следующий день. Fly safe, cmdr!
Ну что же, запуская свой самосборный стратостат впервые:
мы понаделали много ошибок. Часть из них мы исправили, часть заменили на новые :-) Еще, по реакции аудитории, мы прикинули, что техническая и приключенческая части имеют разный отклик у сообщества. Так что мы, впредь, постараемся разбивать статьи на 2 части: техническую + финансовую (А) и все остальное (Б). Совсем не публиковать техническую часть я не могу, т.к. это противоречит изначальной цели проекта - без нее "кто-то другой" стратостат не соберет (да и техническая в этот раз повеселей). Поехали?
Вступление
Кратко напомню, что тут происходит и что будет происходить дальше. Давненько уже (больше года назад) задумали мы с друзьями собрать с нуля и запустить (а потом и найти/достать) свой стратостат. Полных инструкций в интернете оказалось немного, поэтому появилась первая часть этой статьи. Как и любой проект — этот проект должен иметь финал. А чтобы иметь финал — нужно иметь конкретные цели проекта. Из целей были выделены две: достичь высоты 30км и получить видео в 4k с высоты 30км. Ни одна из целей не была достигнута в первом запуске (напомню, там было: 19км и видео до 7км), так что проект продолжил развиваться.
Давайте сначала я опишу naming convention, чтобы не путаться дальше в истории. Я разделяю 2 сущности: запуск и шар. Сделано это потому, что в один запуск мы можем запустить (поправить бы тавтологию) несколько шаров. А нам нужна адресация до конкретного запуска-шара. Итак. Первый наш шар носил название Vostok-1 — первый запуск, единственный шар. За ним был Vostok-2 — второй запуск, единственный шар. Далее Vostok-3a и Vostok-3b — 3й запуск, два шара. Vostok-2 и Vostok-3a потерпели крушение на старте.
Vostok-2
Первой нашей проблемой была высота. И с ней также связан неудачный запуск второго шара. Высоту мы решили победить увеличением объема шара. Был выбран шар L-800 (800 это масса шара в граммах, таблица ниже). А если больше шар, то и гелия надо больше, правильно? Правильно. Но мы совершили ужасную ошибку и тут и с Vostok-1: за целевой объем шара мы приняли не ту величину. Мы их сильно перекачивали. Vostok-1 улетел чудом, Vostok-2 не выдержал такого издевательства и сошел с рельс на старте. Давайте разберемся где я накосячил в оба запуска.
Вот технические характеристики шаров. Vostok-1 имел шар L-300. Вроде все ясно, только одно мне было не ясно: в чем разница между начальным и рабочим диаметрами. Я, почему-то, подумал, что если есть слово "гелий" — значит нам туда. Оказалось, что нет. Рабочий диаметр, это некое усредненное значение на высоте. А нам надо было использовать начальный диаметр как цель для наших расчетов. Давайте посчитаем количество гелия для этих шаров и разных диаметров по формуле из первой статьи:
В обоих случаях разница значительная. Уже на старте мы перекачали шар почти вдвое! Но, т.к. мы докачивали шар до его рабочего диаметра — он не взрывался (этот же диаметр — рабочий!). Проблема оказалась в подъемной силе. Во втором случае она очень, очень значительная. Пока ребята накачивали его, им пришлось буквально висеть на нем вдвоем и третий подстраховывал. Это создало значительную нагрузку на горловину шара, за которую его и держали. И, не выдержав растяжения, горловина порвалась, унеся в небо 50000 рублей. От такого количества гелия местные птицы еще 3 дня орали смешным голосом.
Итак, осознав свою ошибку, мы получили серьезное преимущество — теперь мы знали, что гелия нам надо вдвое меньше. А гелий и, непосредственно, шар — это единственные невозвратные ресурсы наших запусков. Иначе говоря — мы сильно снизили стоимость запуска.
Vostok-3a
Это был шар L-600. Мы закачали правильное количество гелия. И даже немного подстраховались (как мы тогда думали), используя тент для удержания шара в процессе накачки, чтобы не создавать нагрузку на горловину. Подвела нас анатомическая аномалия всех членов команды (проще говоря — руки из ж...). И этот шар успешно улетел в ветки деревьев, об которые и взорвался.
Выдержав минуту молчания, мы вспомнили, что когда-то давно то мы заказывали 2 шара L-300. Как раз на случай неудачи. И сейчас был именно такой случай. Так как гелия мы всегда берем немного с запасом (мало ли стравит где или еще чего), то немного у нас еще оставалось. Да и шар этот был почти вдвое меньше, так что и гелия надо было сильно меньше. Закачав остатки в 300-й шар мы, уже особо ни на что не рассчитывая, просто отпустили его в небо без долгих прощаний. Это был наш Vostok-3b. Об этом запуске и пойдет речь в этой статье, т.к. он оказался успешным!
Список оборудования и компонентов
На самом деле, оборудования, в сумме, докупалось прилично. Но тут я не буду перечислять все купленное, а сосредоточусь только на том, что реально улетело на Vostok-3b.
Некоторые разделы будут выглядеть как: ничего не изменилось, идем дальше. Я оставил структуру статьи как в первой части для обратной совместимости
Состав полезной нагрузки почти не подвергся изменениям: это все та же RPI 4B (+Sense HAT + GPS HAT) + GoPro 7 black.
Добавлю только пару фото компонентов черного ящика (ранее их не было), так как я забирал его домой для ремонта, который не пригодился, но об этом упомяну чуть детальней далее по тексту:
Помимо увеличения объема шара, для достижения расчетной высоты мы решили так же экономить и вес полезной нагрузки. Проанализировав массу компонентов, мы поняли, что можем хорошо сэкономить на аккумуляторах (павербанках). В первый запуск это было 2 павербанка по 20000 mAh, каждый массой ~300г. Взглянув на телеметрию Vostok-1, мы поняли, что бОльшую часть времени наш зонд работал на земле, соответственно таких емкостей (как минимум для RPI) — нам не надо. И решили порезать емкость банок вдвое. Обеих. Взяли 2 павербанка 10000 mah с массой 180г каждый. И не прогадали, экономия массы ощутимая, емкости хватило на обе подсистемы и даже немного с запасом.
Ну и мы не стали в этот раз класть бутылку виски :)
По оборудованию это все. Переходим к облегчению конструкции.
Конструкция
Далее мы решили переделать корпус. Корпус первого востока был слишком большой для наших нужд и это было нерационально — пенополистирол тоже имеет вес. Мы так же пробовали различные материалы, в частности, пенопласт.
Но, несмотря на значительную экономию массы — пенопласт не подходил по ряду причин. Например, он был слишком хрупким и мог развалиться от нагрузки создаваемой подъемной силой шара. В итоге мы откатились до пенополистирола, но срезали ему лишнюю крышу:
Размеры нового бокса:
Общая конструкция
Схема та же, что и с Vostok-1. Единственное что мы добавили (по совету из комментариев на YouTube) — боковые стабилизаторы. Помогли они или нет — сложно судить. Забегая вперед скажу: судя по телеметрии и даже видео — да, крутило меньше чем в первый раз. Но и условия полета были другие. Так что тут мне сложно судить о целесообразности этого решения в нашей задаче. И, несмотря на то, что стабилизаторы увеличат массу — мы все же решили рискнуть и приклеили пластиковые треугольники по бокам:
Это вид бокса уже после того, как мы его нашли (и сняли верхнюю крышку). Фотки до я, почему-то, не смог найти. Но суть стабилизаторов это передает.
Да, и, как видите — GoPro на этот раз мы решили закрепить целиком снаружи на пластиковые стяжки, продетые сквозь корпус. Во избежание перегрева в стенках бокса. По причине экономии массы короба, мы так же решили не использовать внешние 2-3-х-осевые стабилизаторы для GoPro (хотя один такой был закуплен и весит он прилично по нашим меркам).
Полезная нагрузка
Как я уже упоминал, заменили только павербанки. Так же, решили немного перекомпоновать компоненты в соответствии с новыми размерами бокса. Но смысл остался тот же: внизу грелка (RPI), над ней аккумуляторы обогреваемые RPI, по бокам сопла для поступления забортного воздуха для охлаждения RPI. Эти сопла так же используются для крепления бокса к парашютному фалу. Не буду вставлять схему охлаждения, т.к. это точно та же система, что и в Vostok-1. Она хорошо себя показала в тот запуск и мы решили ничего не ломать:
Приклеили так же несколько пенопластовых балок для фиксации компонентов нагрузки:
Итак. Что же нам это дало? Напомню, что Vostok-1 имел массу полезной нагрузки 2.5кг. После проведенных манипуляций, нам удалось снизить ее вдвое — 1375г:
Посчитав себя хорошими мальчиками, мы закончили с нагрузкой и двинулись дальше.
Программирование
Ничего не менялось перед полетом. Все тот же софт на dotnet полетел, прилетел и доставил нам всю телеметрию.
Но вот после полета был небольшой рефакторинг. Дело в том, что в этот раз наш зонд очень сильно промок. Когда мы его нашли и я поднял его с земли — из него вылилось ведро воды. Карта памяти не пострадала, но вот телеметрический модуль заводиться больше не хотел. LED матрица вела себя странно — то включалась, то нет. Так что без хирургического вмешательства было не установить: что конкретно отлетело? Я взял модуль домой и, поочередно снимая платы, выяснил что проблема где-то в SenseHAT. Подебажив свой код немного, выяснилось, что выбрасывается исключение именно на обращении к LED матрице, вот тут:
Это часть класса StatusReportService, который не имеет интерфейса и, чтобы понять: а все остальное работает ок или не ок — нужно было заэкстрактить интерфейс и за mock-ать этот сервис. Что и было проделано в единственном коммите.
Как оказалось — все остальное работает штатно. А как оказалось после еще одной перезагрузки — LED матрица тоже заработала штатно ¯\(ツ)/¯
Нуштош. Хорошо, что все хорошо закончилось. Пролистываем.
Бухгалтерия
Уффф… Тут все сложно, но есть и хорошие новости. Как вы помните, первый запуск влетел нам в копеечку — примерно 80000р (из которых реально полетело 75000р) без учета стоимости GoPro 7 black (т.к. она на тот момент у меня уже была и не входила в расходы этого проекта). На GoPro накиньте еще 35000, итого 115000р на первый запуск. Но, там же я отметил, что при оптимистичном развитии событий — из невозвратного у нас только гелий и шар. Все остальное возвращается, находится и запускается снова. При пессимистичном развитии (не нашли, не смогли достать зонд) — конечно все придется покупать заново. Но мы нашли :) Так что бОльшую часть расходов заняли именно гелий и шар, и, как я упоминал в начале статьи — необходимое количество гелия мы так же сократили вдвое (благодаря исправлению ошибки в расчетах). Так что запуски наши серьезно подешевели, хотя и пришлось докупать всякое по мелочи. Давайте посмотрим на такую же, как и в первой статье, таблицу, но для Vostok-3a — Vostok-3b:
Зеленый сектор — то что реально полетело в 3й запуск
Желтый сектор — было куплено, но можно было бы обойтись и без этого
Красный сектор — было куплено, но в этот запуск не пригодилось (можно было не покупать)
Как видите — в этот раз намного скромней. Львиную долю составляют именно гелий и шары. Шар L-2000 (царь-шар, массой 2кг) не успели доставить к нужной дате, так что вместо него полетели L-600 и L-300. L-300 был куплен еще к первому запуску и в эти расходы не входит.
Вооот, вот с такими ценами — запускам быть! Ну, если тут все ясно — двигаемся дальше.
Подготовка к запуску
Тоже никаких откровений, по сравнению с первым запуском. Но мы решили не запускать из того же места по 2м причинам:
1. Ребятам очень не понравилось прошлое болото (да и аренда вездехода дело не дешевое)
2. Хотелось разнообразить приключения
Так что мы снова отправились на fpln.ru смотреть — где не летают самолеты и нет никаких закрытых/бесполетных зон. Затем сходили на predict.habhub.org прикинуть — куда должен упасть наш зонд из той или иной точки запуска (желательно, чтобы падал подальше от болот). Ну и, поголосовав немного, выбрали одну. Все как в первый запуск — едем дальше.
На этом я завершу часть "А". В части "Б" вас ждут: Запуск, Поиск и спасение, Результаты и Выводы. Она выйдет совсем скоро, оставайтесь на связи и... Fly safe, cmdr!
И так, в прошлых двух постах (часть 1а и часть 1б) мы разработали, собрали и запустили наш самодельный стратостат с камерой и телеметрическим модулем. Пришло время попытаться его найти, спасти и посмотреть - что он привез?
Поиск и спасение
Ооооо, это был самый волнительный и насыщенный этап! Как только аппарат оторвался от земли (а точнее от рук) я, как оператор ЦУП, затаился в ожидании первых координат от поискового трекера.
И первый трек не заставил себя долго ждать. Приведу сразу весь маршрут, полученный с поискового трекера и давайте немного его обсудим:
Расстояние между конечными точками ~100км. Хотя расчетное было около 200км. Наш зонд немного не долетел. Но с этим разберемся в результатах.
Наивысшая точка (F) по этим показаниям — 9800м. Дело в том, что у нашего поискового трекера предел измерения высоты — 10км. Так что это еще не значит, что зонд выше не поднимался, нет. Просто после этой точки он… пропал! Я, разумеется, ожидал этого и ждал, и ждал, и ждал. Ну сколько он может там летать над 10км? Ну час, ну максимум два. Учитывая, что расчетное время всего полета было 2ч 25мин. Но обратите внимание на дату и время в этой точке (верхняя часть):
А теперь взглянем на следующую точку — G:
Где тебя носило больше суток ( ´・・)ノ(._.`)?! Я все морги-больницы обзвонил все это время не спал и мониторил показания (да что уж там — все мониторили). Но, видимо, условия для передачи сигнала были не благоприятные. Хорошо что запас автономности у этого трекера очень хороший — он до сих пор передает координаты на тех же аккумах. Ок, в итоге нашелся, посмотрим где упал?
Упал он на краю лютого болота в 4-х километрах от ближайшей дороги. На фотках это не так видно, но поверьте — ребята там были (дважды) — болото непроходимое.
Ближайшая дорога:
Край болота:
Побродили несколько часов вокруг и, благоразумно не став геройствовать, позвонили мне со словами: ололо, нам нужен вертолет! Явно нужен был план. Соваться туда ногами (болотоходами, снегоступами и прочими средствами бывалых разведчиков) никто не захотел. Вариант — забыть и простить даже не рассматривался.
Вертолет, как водится, не на каждом углу припаркован. Более реалистичный вариант — вездеход! Начали шерстить интернеты, друзей и соцсети. Не скажу, что прям на каждом шагу раздают вездеходы в аренду — в поисках мы провели несколько дней. Наконец вышли на одних ребят, Питерские производители вездеходов, которым нужен был, внезапно, демо-ролик их детища :3 И они согласились предоставить их вездеход с командой, если мы оплатим им сутки работы видеографа (так они его назвали). Что ж, из альтернатив был только другой вездеход, но почти вдвое дороже. Так что мы начали соглашаться. Ребята подготовили свой вездеход (все это время поисковый трекер передавал статусные сигналы раз в сутки, так что мы были вполне спокойны: его не украли медведи и он не утонул) и мы получили вот это:
Согласитесь, выглядит, как то, что надо!
Не буду вставлять фотки с катанием на нем по болотам, лучше в конце прикреплю видео ;-) Итог этих покатушек, как вы понимаете, весьма успешен. Вот наш короб, открытый сразу после того, как мы его подобрали:
Да, бутылка с понятной жидкостью все это время летала вместе с оборудованием. Она там была как презент нашедшему — виски из стратосферы. К счастью, нашедшими оказались мы, так что и презент — нам. Радовались, как дети, чесслово =)
Результаты
Ну наконец-то. Давайте поговорим о том, что же мы вытащили из болота ценой таких усилий.
Разумеется все кинулись проверять камеру. Это фото — это один из последних кадров (я выбрал покрасивей) из заснятого видео. Вообще, по расчетам, запаса аккумулятора камеры должно было хватить еще и на приземление и на полежать немного. Но, как видите, не хватило — она записала всего 25 минут видео (4k60fps), из которых 7 на земле перед запуском. Мы строили разные теории почему так произошло. В итоге, поковырявшись уже дома с оборудованием, выяснили: был сломан USB порт на павербанке для камеры. В какой момент он был сломан — неизвестно. Но пока основная версия такова: подключили и включили камеру, как-то сломался порт, камера продолжала работать от внутреннего аккумулятора пока он не сел. Из-за внутреннего аккумулятора мы не смогли вовремя распознать поломку, а его запаса, по экспериментам, хватает примерно на 25-30 минут записи.
Когда все остыли, пришло время ковырять показания нашего самописца — он отработал на все 100! И сейчас будет поток графиков, построенных по его показаниям. Так как RPI работал долгое время на земле (до и после запуска), я, для удобства анализа, обрезал куски данных с земли.
На шкале X всегда будет время в секундах с момента отрыва от поверхности. Поехали!
График набора высоты по показаниям GPS HAT:
Взглянув на него, мы видим: максимальная высота, которую он набрал на 2247-й секунде полета, составила 18993 метра над уровнем моря! Это выше чем Эверест, это выше чем летают любые пассажирские самолеты! Но прилично ниже расчетных 30км. Взглянув на то что осталось от, непосредственно, шара, мы предположили, что мы его просто перекачали и он взорвался раньше положенного. Была у меня еще версия что мы его недокачали. Но тогда бы он повисел на высоте, пока гелий не выйдет и опустился бы целым на землю. А от него ничего не осталось. Значит — перекачали. Учтем на будущее.
Еще по этому графику можно прикинуть — на какой высоте остановилась запись. Приблизительно на 7км. Так что кадр выше примерно с высоты всего 7км.
Раз уж у нас есть показания барометра, забавы ради (практической пользы не несет), я решил рассчитать относительную высоту по барометрической формуле и сравнить эти показания с данными GPS:
Как видим — корреляция есть, отклонения не сказать чтобы пугающие (макс. высота получилась 16183 метра).
Теперь, что же там с давлением?
Мы видим, как падало давление с набором высоты (эффект ожидаемый). Все в той же точке 2247 было зафиксировано минимальное значение — 58 миллибар. Для сравнения — на поверхности было 1050 миллибар. Т.е. всего 5.7% от давления на поверхности!
Как там работал наш кустарный охладитель? Температура внутри бокса:
Как видно — скакнула до 38,5C, но это очень далеко от предельной. Так что никто не перегрелся и никто не замерз. Да и в целом — разброс всего 33-35 считаю очень хорошим результатом.
Что в этот момент происходило снаружи? Снова график 2-в-1, чтобы не захламлять картинками:
Помните я сетовал на градусник? Вооот. Как видите — провал ниже -40. Значит там было еще холоднее! И второй вывод, который тут можно сделать: самая холодная точка — не самая высокая!
Насколько наш климатизатор страдал, можно оценить по графику разницы температур Inside vs Outside:
Как видите — разность температур доходила почти до 80! Не сказать что хардкор, но прилично.
Ну и последний на сегодня показатель — влажность:
Там довольно сухо, да. Влажность падала до 3%. Ну а откуда ей там взяться?
Хватит графиков. Это, конечно же не все показания, которые записал наш RPI, но статья и так уже слишком разрослась. Так что я оставлю ссылку на полную телеметрию:
Видео
Использование вездехода по назначению:
Видео полета с бортовой камеры:
Выводы
Итак, несмотря на то, что расчетная высота достигнута не была: 19км против 30км — все равно считаю, что проект завершился успешно. Тем более, это был первый опыт подобного рода для всех участников проекта. Давайте обозначим технические проблемы, возникшие в процессе этого мероприятия:
- Камера не записала весь полет.
Возможная причина: поломка аккумулятора на запуске.
Возможное решение: заменить внешний аккумулятор, удалить внутренний аккумулятор перед запуском (позволит отследить проблему с внешним на ранних этапах)
- Не была достигнута расчетная высота.
Возможная причина: перекачали шар. Закачали 1.5 баллона вместо расчетных 1.36
Возможное решение: закачать меньше гелия (1.36 баллона)
- Порвался парашют. Не прям в хлам, пара мелких отверстий сбоку. Купол не пострадал и на полетные характеристики это не повлияло. Решение тут только одно — заменить парашют на новый во избежание дальнейшего распространения повреждений.
- Приземление в труднодоступной местности.
Причина: ранний взрыв шара
Возможное решение: закачать правильное количество гелия. 100% гарантии это не даст, но по итогу, расчетная траектория совпала с реальной, за исключением того, что нагрузка приземлилась раньше положенного времени.
На этом все, всем чистого неба над головой и удачи!
P. S. История публикуется в хронологическом порядке "как было на тот момент". С тех пор мы произвели еще несколько запусков разной успешности (как в + так и в -), учли многие ошибки, вносили изменения в конструкцию, рассматривали разные параметры телеметрии и т.п. Но это все - в будущих частях. Если будет интересно.
Одна вакансия, два кандидата. Сможете выбрать лучшего? И так пять раз.
Продолжаем продолжать
Вторая подчасть первой части "инструкции" по сборке своего стратостата из мангала и детских травм. Она будет немного скучновата, но без нее у вас ничего не полетит. Так что давайте перетерпим эту часть и дальше будет веселее :-)
Мы закончили на описании отладки dotnet приложения на RPI. Теперь давайте немного осмотрим сам код.
Программирование
Сразу ссылка на репозиторий с исходниками — GitHub
Я очень долго откладывал этот раздел для написания, т.к. софт был написан год назад и я почти забыл все те ужасы, которые мне пришлось побороть, сражаясь с китайскими комплектующими. Но попробуем хоть что-то наковырять. Сейчас я лишь заменил project reference на nuget package, т.к. зачем-то я скачивал исходники проекта нугет пакета (надеюсь просто так, сейчас солюшен билдится).
Как и в системе "театр-вешалка", dotnet приложение начинается с конфигурации. Конфигурации DI, логгеров и вот этого всего. В нашем случае в функции Main:
Как видите, мы пошли путем использования IHostedService как основной крутилки нашего логгера, настроили SerialPort для доступа к GPS HAT (зачем-то я его инжектю в hosted service, вместо того чтобы использовать там GpsModuleCommand, очевидно проглядел тогда), добавили наши сервисы для доступа к SenseHat в контейнер DI и настроили логирование в консоль. Тут все — host.RunAsync()!
Не буду приводить тут содержимое каждого файла, кому надо — посмотрят на гитхабе. Тут обрисую основную идею. Вся она описана в нашем хостед сервисе RpiProbeHostedService. Содержммое метода StartAsync:
Итак, для начала нам нужно узнать в каком состоянии наш GPS HAT. Т.к. тот факт, что он включен — еще не означает, что включен непосредственно GPS модуль. Если GPS выключен — включаем его и идем дальше.
А дальше у нас бесконечный цикл с задержкой в 1с. В первую очередь нам нужны показания GPS — так как это есть точка синхронизации всех данных. Так же, дата из этих показаний используется как имя файла-репорта. Так что нам эти данные прям очень нужны.
Затем собираем данные с SenseHat и внешнего градусника и записываем это все в файл-репорт. Вот и вся нехитрая логика.
С SenseHat проблем не было вообще никаких. А сейчас, при написании статьи, оказалось что с тех пор MS даже добавила его поддержку в свою iot library. Тут подробнее — MSDN.
Проблемы, как вы догадались, были с внешним градусником. Я перепробовал с десяток разных проектов на разных языках (Python в их числе). Но ни один не заработал именно с этим градусником. Пару раз было очень близко, но видимо моя модель чуть-чуть отличалась и показания отрицательных температур были неверны. Это сейчас, с остывшей головой, я понимаю — если проблема в месте, где присутствует минус — надо смотреть на тип данных. И таки да, замена byte на sbyte сделала свое дело. Но тогда, год назад, я был на грани отчаяния. Метод ReadTemperature:
Метод хоть и небольшой, но содержит парочку magic numbers. Знаете, где вы найдете их объяснение? Нигде. Это все наковыряно и проверено (методом проб и ошибок) из разных проектов. Так что если у вас такой градусник — поздравляю, ваши страдания окончены.
Не стоит забывать, что наш самописец не подключен к монитору и нам надо бы как-то понимать — все ли на нем работает штатно. Для этих целей я использовал LED матрицу на SenseHat. Она небольшая, всего 8x8, так что выводить туда картинки не получится. Но получится мигать/светить лампочками. Более чем достаточно в столь аскетичном устройстве. Код метода DisplayStatus:
Видим, что я инкапсулировал координаты лампочки, которой надо посветить, в класс ответа от конкретной функции (GPS ответ, Sense ответ, ответ от внешнего градусника и т.п.). Все эти response реализуют интерфейс IResponse:
Соответственно, обязаны предоставлять статус в формате "Успех\провал" и координаты ячейки LED куда его поместить, и делают это на свое усмотрение. Не буду говорить что это идеальный дизайн, но, как минимум год назад, мне он показался подходящим. Вот, например, как реализует свой статус ответ от SenseHat:
Итого у нас есть 5 подсистем:
1. GPS модуль: вкл\выкл
2. GPS модуль: координаты получены и прочитаны
3. SenseHat
4. Внешний градусник: показания есть\нет
5. Лог-файл: координаты имеются\нет
Таким образом, маркером того, что мы готовы к запуску, будет служить 5 зеленых индикаторов на матрице.
GPS HAT тоже не вызвал особых проблем, насколько я помню. За исключением новости (для меня), что для работы с SerialPort нужны привелегии root и его ответ пришлось немного попарсить:
Положение всех компонентов ответа указано в документации.
Еще 1 момент — EventBased подход я решил не использовать, но он вроде работает и методы для него (DataReceived) остались в коде. Честно говоря, не помню почему я так решил, но думаю причины были.
Перейдем к финансам.
Бухгалтерия
Быстренько пробежимся по моей нелюбимой части — сколько все это чудо стоит. В этот манускрипт не попали: стоимость камеры (она у меня уже на тот момент и так была), стоимость спасения и всякая мелочевка, типа клея и винтиков. Эти позиции сильно субъективны.
Внизу 2 суммы: одна за все позиции, вторая (Minimum) — это только если запускать одну камеру — без RPI и всего с ней связанного. Как видите, поисковый трекер вместе с подпиской занимают ~30% цены всего аппарата. Так что если найдете вариант подешевле — это хороший повод сэкономить.
Также, в процессе моих экспериментов, я накупил много лишнего — это красная секция в табличке. Это то, что совсем не пригодилось. Желтая секция — это то, без чего можно было бы обойтись. Эдакая ни вам, ни нам середина. Запуск только лишь зеленой секции означает запуск только камеры и RPI с Sense Hat. Мы запускали зеленую + желтую.
Конечно тут есть простор для оптимизации. Например, я считаю, что вместо GPS HAT можно было бы найти что-то подешевле, за парашют мы тоже явно переплатили, карту памяти для RPI можно смело брать 16Гб (а то и меньше), ну и так далее. Но это все было в первый раз, хотелось подстраховаться — отсюда и цена соответствующая.
Подготовка к запуску
Прежде всего надо понять — где запускать? Если вы житель мегаполиса, у меня для вас плохие новости — нигде. Ладно шучу, не все так плохо =)
Главное — надо никому не мешать. Рядом не должно быть ни воздушных трасс, ни аэродромов, ни запретных или бесполетных зон. Выбирать место надо с учетом предполагаемой траектории движения (которая зависит от ветра и вертикальной скорости аппарата).
Для этого можно воспользоваться сервисом FPLN: включаем в настройках показ всего что нам нужно и ищем глазами свободное место. Вот чисто для примера такое (в зависимости от предполагаемой траектории):
Откуда нам взять предполагаемую траекторию? Тоже есть сервис. CUSF Landing Predictor 2.5. Вбиваем наши варианты и параметры и смотрим что будет:
Совмещаем картинку с FPLN и смотрим — подходит/не подходит? Если нет — ищем новое место, если да — поздравляю.
Для прогнозирования ветра можно использовать Windy. CUSF Landing Predictor так же учитывает направление и силу ветра на выбранное время и координаты. Как вспомогательное средство, можно использовать FlightRadar чтобы помониторить в реальном времени самолеты в предполагаемом районе запуска.
Ну что. Если вы дошли до этого этапа, значит бОльшая часть пути позади. Впереди запуск!
Запуск
Со слов участников: Выбрали точку, заправили тарантас, взяли пару баллонов гелия и двинули на место. Описывать тут особо нечего. Имейте только ввиду — шар такого размера с гелием имеет неплохую подъемную силу! Так что придерживайте его пока будете надувать (а лучше привяжите временно).
В этой операции использовались:
1. Клапан Голубева
2. Переходник под него
3. Шланг
4. Переходник со шланга на баллон 3/4 дюйма
Убедитесь что GPS трекер включен! Без него — вся эта затея будет провалена сразу после запуска. Далее подключаем питание к RPI и GoPro. Ждем успешный статус на RPI, включаем запись видео на камере, запаковываем короб, крепим к парашютному фалу, парашют к шару и… Поехали!
Нуштош... Скучности, так необходимые, заканчиваются, как и лимит символов на пост у Pikabu. В следующей части (Часть 1в) нас ждет: Поиск и спасение, Результаты (анализ телеметрии), Видео с бортовой камеры (и не только) и Выводы
Оставайтесь на связи и: Fly safe, cmdr!