У вас есть робот, работающий под управлением ROS, и вы хотели бы иметь возможность контролировать его и/или управлять им с помощью внешнего интерфейса. Что такое экономически эффективное решение полного стека? Я представлю стек, который я использую в Robotnik, испанской робототехнической компании, которую недавно купила Universal Robots.

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

ROS (Robot Operating System) + CPP, Python

Это стандартный пакет промежуточного программного обеспечения для робототехники. ROS1 предлагает отличные инструменты для быстрой разработки программных систем для робототехники. ROS2 расширяет эти возможности, значительно повышая безопасность и производительность производственных роботов. C++ и Python являются наиболее поддерживаемыми языками программирования, но также доступны клиентские библиотеки для других языков. Я использую Python и C++ для создания частей стека Robotnik и работаю над добавлением этих компонентов в Robot Web Tools (см. ниже).

unittest, pytest, Google Test

unittest и pytest являются официально поддерживаемыми средами тестирования Python для ROS1 и ROS2 соответственно, а Google Test работает с кодом C++ для ROS1 и ROS2.

Акции на гитхабе

Лучший инструмент для автоматизации рабочих процессов CI/CD.

Веб-инструменты для роботов

Программный пакет, который позволяет программным компонентам, не относящимся к ROS, взаимодействовать с роботом/системой ROS. Веб-приложения JavaScript лучше всего поддерживаются с помощью библиотеки roslibjs с отличными библиотеками 2D и 3D визуализации. roslibjs поддерживает как ROS1, так и ROS2.

ТипСкрипт + HTML

TypeScript добавляет безопасность типов в JavaScript.

Стандартные веб-приложения JavaScript+HTML наиболее естественно подходят для roslibjs, но они также могут взаимодействовать с другими языками интерфейса; Dart, Kotlin и Swift прекрасно совместимы с JavaScript. Если вы хотите создавать 3D-визуализации с помощью библиотеки Robot Web Tools ros3djs, вы можете поместить ее в веб-представление Flutter, Android или iOS. Если бы Robotnik решил поддерживать несколько платформ, Flutter был бы на вершине списка.

Реагировать

ReactJS — это ультрапопулярная библиотека для рендеринга JavaScript, созданная и поддерживаемая Meta, также известной как Facebook. Это позволяет нам создавать повторно используемые реактивные веб-компоненты для рендеринга веб-приложений. С недавним Hooks API React поощряет более функциональный стиль разработки, который избегает использования классов.

React Native — еще один убедительный выбор: вы можете использовать его для создания iOS, Android и веб-приложений из единой кодовой базы. Но в настоящее время у Robotnik нет веских причин поддерживать несколько платформ.

Предупреждение: React лучше всего подходит для веб-приложений, а не для веб-сайтов. Чтобы обсудить, чем хорош React, ознакомьтесь с эпизодом JavaScript Jabber Web Performance with Alex Russell.

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

РедвудДжС

Этот полнофункциональный фреймворк React является детищем Тома Престона-Уорнера, основателя и бывшего генерального директора Github. Вдохновленный Rails, он объединяет многочисленные технологии в стек, четко разделяющий серверную часть и интерфейс.

Официальный Туториал — это полноценная книга из 7 глав, и у нее сильное сообщество — я посещаю еженедельник Makers Hour.

Я был бы одинаково доволен Ruby on Rails или Phoenix+Elixir, но предпочитаю не добавлять в наш стек дополнительный язык программирования.

Супабаза/Постгрес

Supabase — это саморазвертываемая BaaS с открытым исходным кодом (Back-End-as-a-Service). Supabase упрощает аутентификацию пользователей и доступ к базе данных. Если ваш вариант использования позволяет это, Google Firebase — это более многофункциональное и зрелое решение: облачное решение с закрытым исходным кодом для всей вашей серверной части. И Auth0 был бы моим выбором для аутентификации, если бы я мог полагаться на облачный доступ.

Supabase предоставляет API поверх Postgres, последний из которых является объектно-реляционной базой данных с открытым исходным кодом; он имеет традиционные функции SQL, но также поддерживает такие форматы хранения, как Binary JSON.

В основном я использую Supabase для его функций аутентификации, поскольку RedwoodJS уже предоставляет уровни API поверх баз данных SQL. Предупреждение об аутентификации Supabase: реализация RBAC неудобна, поэтому я бы использовал Auth0, если бы мог.

Вите

Высокопроизводительный и гибкий инструмент сборки с возможностью горячей перезагрузки. Он требует небольшой настройки, в отличие от ванильного вебпака. Если вы не используете фреймворк с полным стеком, такой как RedwoodJS, я все равно не верю, что есть еще какая-то причина использовать create-react-app.

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

Материальный интерфейс + Эмоция

Фреймворки/решения для стилей — это слой стека, из-за которого мне больше всего некомфортно в веб-разработке; такие решения, как Flutter и SwiftUI, предоставляют 1–2 библиотеки визуальных компонентов и официальный способ стилизации каждого из них, в то время как количество решений, доступных для стилизации HTML, огромно.

Я оценил десятки вариантов и выбрал Material UI:

  • С 2014 года они создают интуитивно понятные компоненты React, которые удовлетворяют потребности компаний любого размера.
  • Их приверженность доступности непоколебима.
  • Пользовательский интерфейс материалов соответствует элегантному стандарту Google Material Design 2.

Emotion — это стандартная библиотека CSS-in-JS для Material UI. Я доверяю мнению разработчиков Material UI, но эмоции — не всегда правильный выбор.

Вот и все на этот раз! По состоянию на 7 марта 2023 г., когда я отредактировал эту статью, включив в нее RedwoodJS, я реализовал RBAC в своем шаблоне и готов к работе с Python и C++ ROS.