Введение
Во время смены «Большие вызовы», организованного ОЦ «Сириус», я занимался апгрейдом наноспутника SiriusSat. Моей целью было установить на спутнике камеру Raspberry Pi Camera Module v2.1 на платформе Raspberry pi. Об этом процессе я и хотел бы рассказать.
Цель эксперимента: установка камеры на спутник и осуществление автономного управления ею.
Этапы работы:
Знакомство со спутником.
Цели установки камеры.
Процесс подключения.
Налаживание связи.
Интеграция с бортовым компьютером спутника.
Разработка ПО.
Передача данных по CAN шине.
Анализ работы и выводы.
§1. Пару слов о спутнике
Разрабатываемый нашей командой спутник BumbleBee (приложение 1, рисунок 1) должен был стать усовершенствованным аналогом спутников SiriusSat-1 и SiriusSat-2 (приложение 1, рисунок 2), разработанных во время смены «Большие вызовы» в 2017 году. Основными отличиями нашей миссии являлось то, что мы хотели запускать его на полярную орбиту (в отличие от SiriusSat’ов, которые сейчас находятся на орбите МКС), а также провести эксперимент эксплуатации камеры Raspberry Pi Camera module v 2.1 (приложение 2, рисунок 1) в открытом космосе.
§2. Зачем устанавливать камеру?
Установка камеры позволяет осуществить:
а) восстановление ориентации спутника в космосе по снимкам с камеры,
б) получение изображения Земли из космоса.
Конечно, есть некоторый процент вероятности, что камера не сможет получить внятного изображения, на это есть ряд причин, например, высокоэнергетические частицы в атмосфере земли, способные засветить матрицу. Но этот риск вполне оправдан: за сравнительно небольшую цену в размере менее 1% от общей стоимости спутника, мы имеем шанс получить дешёвый способ фотографировать космос!
§3. Процесс подключения
Н алаживание связи
Прежде всего, возникла необходимость «подружить» камеру и процессор Raspberry Pi 3. Для этого к плате была подключена камера, монитор, клавиатура, а далее произведена настройка опций операционной системы «Raspbian» для поддержки работы камеры. Данная операционная система обладает встроенной библиотекой для работы с камерой на языке программирования Python. Самые первые снимки были получены с помощью консольной команды и тривиального кода на этом языке, использующего общую библиотеку.
Интеграция с бортовым компьютером спутника
С подключением камеры к спутнику было не всё так просто. В отличие от используемой для отладки платы, внутри космического аппарата был установлен Raspberry Pi Compute Module 3, для программирования которого требовалась специальная микросхема, которой у нас, к сожалению, не оказалось. Модуль был «намертво» припаян к плате спутника, в связи, с чем нам пришлось вручную выводить и паять требуемые для камеры порты. В результате плата приняла следующий облик – приложение 3, рисунок 1.
Разработка ПО
Основными требованиями по функционалу камеры и процессора были:
возможность по запросу пользователя производить снимок с заданным разрешением и цветным или черно-белым режимами;
скачивать из внутренней памяти спутника выбранный по имени файл;
осуществлять повторные попытки скачивания выбранных файлов;
выводить на экран пользователя список всех доступных снимков во внутренней памяти спутника;
удалять выбранный по имени файл из внутренней памяти спутника, для освобождения памяти;
форматировать хранилище снимков спутника.
Очень важно было сделать так, чтобы спутник фотографировал «по щелчку», а потом отправлял фотографию на землю. Операционная система позволяла свободно программировать на языке Python, но я решил попробовать написать код на языках «C++» и «C».Для этого потребовалось установить компилятор. Что заняло около часа по времени, т.к. процессор не обладал достаточной вычислительной мощностью. Кроме того, эту процедуру требовалось повторить несколько раз на разных Compute Module’ях.
В Интернете я нашёл библиотеку для С++, позволяющую управлять камерой и производить снимки. Она обладала всем функционалом, который нам был необходим - регулируемым разрешением картинки и изменяемыми цветовыми режимами. Весь основной функционал писался на С++, но впоследствии пришлось перейти на С. Си++ стал использоваться только для управления камерой. Что послужило причиной такого перехода я объясню позже.
Ещё одной проблемой стало то, что найденная мною библиотека сохраняла снимки в несжатом формате bmp. Они весили порядка 100 кб при маленьком разрешении, что было совершенно недопустимо. Находящиеся в нашем распоряжении антенны могли передавать информацию со скоростью 7000-8000 бод. При больших размерах, была велика вероятность того, что снимок попросту мог не догрузиться и один непринятый пакет (из нескольких сотен пакетов) мог испортить всю картину. Для решения этой проблемы я использовал скрипт на Python, конвертирующий несжатые снимки в jpg, а также провёл опыты с черно-белым снимком. Серая jpg-картинка при наименьшем разрешении весила в ~25 раз меньше, чем цветная bmp-картинка. Затем я добавил в алгоритм захвата снимков автоматическую конвертацию из bmp в jpg и переименования снимка в “1.jpg”, “2.jpg” и т.д. Так закончилась работа над первым пунктом.
Вывод списка файлов на экран также был реализован с помощью Python скрипта, вызываемого из основного C++ файла. Некоторые простые задачи я старался решать просто – использовать коды на Python.
Прописать процессы удаления файлов и полного форматирования хранилища также не составило особого труда. Для удобства я разделял типы операций на административные (вывод списка и удаления файлов, форматирование) и рабочие (фотографирование и скачивание снимков).
Продумать все возможности скачивания снимков на подключенный ноутбук оказалось сложнее – на орбите не будет ноутбука и сети типа Wi-Fi.
Передача данных по CAN шине
В космическом пространстве общение между спутником и Землёй производится с помощью антенн. Но, кроме общения с Землёй, спутнику также необходимо «общаться» с его внутри бортовыми системами (рисунок 2, приложение 3). Для этого он снабжён CAN шиной, на сегодняшний день широко используемой в автомобильной промышленности и устройствах “умный дом”.
Передача информации по протоколу CAN отличается от привычных для нас способов, например протокола I2C. В CAN шинах типы сигналов делятся на 4 вида: кадр данных, удаленный кадр, кадр ошибки и кадр перегрузки. Я не буду останавливаться на каждом из них, так как мы пользуемся в основном кадром данных для передачи изображений. Кадр данных не может передать большое количество информации, сравнимое с размерами полученных нами фотографий. Для этого информацию необходимо раздробить на множество пакетов, которые затем по очереди отправляются посредством антенны.
Автоматическое фрагментирование информации было включено в специальную библиотеку для работы с информацией в протоколе CAN, которую нам предоставила компания «СПУТНИКС». Но и тут обнаружились свои «подводные камни» - библиотека была написана для работы с С и не хотела «дружить» с С++. Именно это и послужило причиной переноса всех административных функций на язык С. Мне оказалось проще реализовать простые функции наряду со сложным процессом передачи файлов. И, как уже было упомянуто ранее, С++ использовался только для написания кода манипуляций с камерой.
Для того чтобы спутник начал передавать нам данные, его необходимо было об этом «попросить». Поэтому приём сигналов осуществлялся антеннами, которые по CAN шине передавали их в процессор компьютера. Чтобы исключить возможность перепутывания «команд» системами спутника, каждой из них был присвоен отдельный уникальный номер (ID) «команды», указываемый в самом начале CAN сигнала. Для процессора Raspberry мы выделили отдельные ID «команд». Библиотека позволила не только посылать сигналы, но и принимать их по протоколу CAN. По умолчанию ПО постоянно «говорит» процессору «слушать» какие команды в CAN шине, и если ID сигнала совпадает с ожидаемым ID, то программа считывает данные команды и в соответствии с ними осуществляет нужное действие.
Итогом проделанной работы стал алгоритм работы ПО, с которым вы можете познакомиться в приложении 3(рисунок 3).
Заключение
Итак, за месяц, проведённый в ОЦ «Сириус», нашей команде удалось реализовать эксперимент по разработке систем управления камерой для спутника формата CubeSat на 99,5%. Мы встретили множество препятствий, но ни одно из них не помешало нам реализовать поставленные задачи и прийти к заветной цели.
Прежде я не занимался написанием программ на С++ и Python. Мне были известны лишь основные принципы алгоритмизации и частичное строение кода на С. Полученный за время экспериментальной работы опыт, стал для меня очень ценным.
Итогом работы - были тесты работы функций ПО. Программа помогала стабильно отлавливать сигналы из CAN шины и передавать требуемые команды. Полученные снимки были не высокого качества, но очертания предметов на них вполне различим. При запросе вывода списка фотографий по CAN шине благополучно передавались данные, а после команды удаления при повторном запросе списка можно было заметить уменьшение количества файлов. Скачивание снимка сопровождалось большим потоком данных в терминале CAN шины, тоже происходило при запросе повторной загрузки картинки. А если после тестирования накопилось множество не нужных фотографий, то команда форматирования успешно стирала их. Таким образом, весь необходимый функционал работал отлажено в штатном режиме.
Литература
Библиотека для работы с камерой на языке C++ - https://www.uco.es/investiga/grupos/ava/node/40
Руководство по настройке камеры - https://projects.raspberrypi.org/en/projects/getting-started-with-picamera
Краткое пособие по CAN шине - http://www.micromax.ru/solution/theory-practice/articles/2160/
Рис. 1. Наноспутник BumbleBee формата Cubesat
Приложение 1
Рис. 2. Наноспутники SirusSat-1 и SiriusSat-2
Raspberry Pi Camera Module v 2.1
Приложение 2
Приложение 3
Рис. 1. Перепаянная плата
Рис. 2. Спутник в собранном виде
Рис. 3. Алгоритм работы ПО