Марсоход Curiosity: C++ и особенности автономного передвижения

Интереснейший доклад с CPP Con приоткрывает завесу над тем, как устроено управление марсоходом Curiosity.

[youtube=http://www.youtube.com/watch?v=3SdSKZFoUa8&feature=player_embedded]

Одной из основных сложностей в управлении устройством, находящимся на Марсе, является существенное время прохождения сигнала. Лишь в одну сторону требуется 4 минуты 22 секунды. Задача становится еще более трудной, если узнать, что антенны Deep Space Network делятся между многими космическими миссиями. Команда Curiosity может отправлять сигнал всего лишь один раз в сутки, а получать лишь несколько раз в день. Поэтому инженеры в течение дня готовят команды для управления ровером. Команды управления включают в себя управление движением, использование механической руки и проведение экспериментов.

После выполнения команд марсоход отправляет результаты работы и наблюдений на спутник на орбите Марса. Отправка сигнала сразу на Землю, потребовала бы гораздо больше энергии, чем на спутник, находящийся в 322 километрах  на орбите.

Разработка марсохода, способного практически самостоятельно перемещаться по поверхности, является сложной задачей, требующей работы тысяч людей.  Объем работы впечатляет еще больше, если узнать технические характеристики компьютера ровера:  частота процессора 133 МГц и 128 Мб оперативной памяти (адресуемой памяти лишь 32 Мб).

Характеристики Curiosity во втором столбце

Программный код содержит более 100 модулей, каждый из которых общается с другими через очередь сообщений с минимальным числом блокировок и разделяемой памяти. Модуль навигации – один из наиболее объемных и занимает 10% от всего объектного кода.

Большая часть кода для автономного передвижения написана на C++.  Исторически исследователи использовали C++ для разработки высокоуровневых автономных алгоритмов, таких как:  стерео-зрение, построение карт, планирование пути и визуальная одометрия. Однако до 2000 года C++ код никогда не летал на Марс, все модули разрабатывались на языке C.  При разработке марсоходов разработчики оценили, что риск ошибки при переписывании существующего протестированного кода с C++ на C выше, чем использование новой среды на C++.  С++ победил!

Марсоход Curiosity имеет множество стерео-камер, позволяющих надежно оценивать обстановку вокруг, даже если с частью камер возникнут проблемы.

Марсоход умеет передвигаться в нескольких режимах. Во-первых, конечно же, есть полностью ручной режим  прямого управления. Этот режим использовался во время первых движений по планете,  чтобы получить представление о безопасности окружающей территории.

Режим визуальной одометрии – отслеживания пройденного расстояния по изменению положения объектов. Если колеса крутятся, а камни или дюны остались там же, то, скорее всего, ровер застрял.  Важной способностью программного обеспечения оценивать возможность продолжения автоматического движения без вмешательства человека.

Марсоход сравнивает признаки, найденные на изображении для отслеживания изменений своего положения

При движении ровер постоянно оценивает опасности на его пути и выбирает оптимальный маршрут. Для этого ведется черно-белая фотосъемка с четырех стерео-камер. За счёт пары камер можно определить расстояние до объектов. Распознанные объекты наносятся на трехмерную карту, которая анализируется на предмет возможности её пересечь. Каждое препятствие проверяется на наличие выступов, уровень наклона, неровность. Непроходимые препятствия  считаются больше на размер ровера и помечаются на карте, чтобы центр марсохода был на безопасном расстоянии от препятствия. Ровер выбирает наиболее короткий безопасный маршрут к установленной цели. Марсоход останавливается каждые 0.5 – 1.5 метров и производит перерасчет маршрута. Стоит отметить, что максимальная скорость ровера всего лишь 5 сантиметров в секунду, в день марсоход проезжает не больше полутора сотен метров.

Выбор оптимального безопасного маршрута

Для расчета оптимального пути по карте препятствий использовался новый алгоритм Field D*, эффективно работающий в случае небольших уточнений карты по мере перемещения камеры.

Возражения против C++

  • Исключения: слишком много неопределенности, сложно контролировать все возможные пути выполнения.
  • Шаблоны: избыточный код, количество ресурсов компьютера ровера крайне ограничено.
  • Множественное наследование: недостаточный опыт использования в среде управления марсоходом
  • Перегрузка операторов: возможные ошибки разработчиков при изменениях кода другими людьми.
  • Динамическое выделение памяти: беспокойство об ограниченности памяти кучи, неопределенность времени при сборе мусора.

Практически все указанные беспокойства разрешаются использованием встраиваемого C++ – нет исключений, шаблонов, множественного наследования. Можно лишь перегружать операторы new и delete. С помощью собственного менеджера памяти  операторы new и delete перегружены, чтобы никогда не использовать системное выделение памяти, память резервируется в заранее созданных при инициализации приложения пулах памяти.  Тщательные юнит-тесты проверяют код на отсутствие утечек памяти.

Программное обеспечение для планирования передвижений марсохода на Земле так же было написано на C++. Скачанные данные о движении автоматически дополнялись графической аннотацией и отправлялись на телефоны разработчиков команды.

Статус передвижения Curiosity на экране телефона инженера

Ссылки по теме:

  • Презентация о марсоходах MER/MSL

 

Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *