Образовательный ROS2-робот: аппаратная архитектура и выбор компонентов

7eb4057eaaf385e1298e5a80fb236655.png

Наша цель — придумать ROS2-робота для старших классов школ и университетов. Чтобы он помогал изучать современные технологий при минимальной стоимости компонентов и простоте сборки. А также чтобы был потенциал модернизации для участия в соревнованиях. Расскажу вам о текущем состоянии этого проекта.

Основные целевые характеристики малого ROS2-робота 2025 года:

  1. Варианты конструкции и комплектации:

    1.1. минимальнный мобильный робот — до 10 000 рублей на ESP32 и связь с ноутбуком по WI‑FI;

    1.2. мобильный робот с простым манипулятором — до 20 000 рублей;

    1.3. мобильный робот с простым манипулятором и Raspberry PI 5 — до 30 000 рублей;

  2. Размеры должны вписываться в прямоугольник до 20×20 сантиметров.

  3. Поддержка ROS2 Jazzy.

  4. Моторы с энкодером.

  5. Обязательное наличие лидара для работы SLAM и навигации.

  6. Полностью open‑source: список компонентов со ссылками для покупки, файлы для 3D печати, лазерной резки, исходный код прошивки микроконтроллера, исходный код который работает на одноплатном компьютере и ноутбуке, документация, все необходимые инструкции, учебные материалы.

  7. Возможность подключения дополнительных сенсоров и камер.

  8. Модульность, переиспользуемость, расширяемость.

  9. Компоненты должны быть распространены и легко покупаемы в России или на AliExpress.

  10. Корпус из подручных средств или печатаемый на 3D-принтере, вырезаемый лазерным резаком из фанеры или оргстекла.

Сам по себе ROS2 является надстройкой над операционной системой Linux: набор библиотек и программных пакетов, в том числе библиотеки транспорта для микроконтроллеров, обеспечивающие стандартизированную связь с компьютером. ROS2 изначально создавали для быстрой и удобной разработки различных роботов. Весь исходный код открыт и распространяется со свободной лицензией для коммерческого использования.

Особо стоит отметить, что ROS2 стал стандартом в робототехнике, и написано много использующих его мини‑программ с открытым исходным кодом для роботов, которые можно свободно скачивать с Github и использовать в своём роботе, для огромного спектра задач автономной работы.

Для тех, кому понравилась идея народного ROS2-робота и хочется сделать вклад в open-source, мы организуем ежегодный хакактон по сборке и программированию ROS2 робота. Приходи создавать, писать документацию и общаться с единомышленниками!

Предполагается, что учебные материалы по сборке и программированию ROS2-робота разработанные в рамках этой инициативы ROS‑сообщества и ежегодных хакатонов, будут использоваться учителями в школах и преподавателями в университетах. Каждый год робот будет совершенствоваться и расширять функциональность. Каждому читателю — в дом по ROS2-роботу!

Аппаратная архитектура

Типичная аппаратная архитектура ROS2-робота выглядит так:

Самая распрастраненная архитектура.
Самая распрастраненная архитектура.

Сам ROS2 работает на одноплатном компьютере и ноутбуке. Прошивка микроконтроллера может быть как с поддержкой пересылки ROS2 сообщений через micro-ros, так может быть и прошивка без поддержки ROS2 сообщений, а передача сообщений на компьютер от микроконтроллерва и обратно проводиться на самописном протоколе, тогда на компьютере нужно будет написать ROS2 ноду которая будет конвертировать сообщения из самописного протокола в ROS2 сообщения. Подробнее про это поговорим позже.

Почему бы не управлять моторами и датчиками напрямую через GPIO Raspberry Pi?

Так лучше не делать в серьёзных проектах, но в учебных можно
Так лучше не делать в серьёзных проектах, но в учебных можно

Этот вариант не рекомендуется, так как нагрузка по обработке данных с датчиков ляжет на центральный процессор, и это затормозит выполнение других программ. Например, в Raspberry Pi нет аппаратного обработчика данных с энкодера мотора, поэтому вам придётся повесить выходы энкодеров на прерывания, что будет прерывать выполнение программ. А если обрабатывать энкодеры по таймеру, то вы рискуете пропустить их обновление из-за низкой частоты таймера. Поэтому в серьёзных роботах такое подключение обычно не применяют, а работу с низкоуровневыми сенсорами и электроникой поручают микроконтроллеру, получая от него уже обработанные данные.

Так как ROS2 реализует в том числе микросервисную архитектуру, то он легко масштабируется на несколько роботов или несколько компьютеров посредством локальной сети, например так:

Несколько одноплатных компьютеров на одном или нескольких роботах
Несколько одноплатных компьютеров на одном или нескольких роботах

В целом, для того, чтобы запустить ROS2, вам достаточно только одного компьютера с операционной системой Linux, желательно Ubuntu или Debian. Для разработки и обучения сам робот не обязателен, так как его работу можно полноценно симулировать в Gazebo.

Физический робот не нужен!
Физический робот не нужен!

Если вы не имеете возможности поставить ROS2 на свой ноутбук, то вы можете вести разработку через VNC (удалённый рабочий стол), SSH или в браузере, по такой схеме:

На Raspberry Pi устанавливается VNC Server, который стримит изображение рабочего стола
На Raspberry Pi устанавливается VNC Server, который стримит изображение рабочего стола

С появлением возможности передавать данные между микроконтроллером и компьютером по протоколу mirco-ros и Wi-Fi, делать роботов стало ещё проще и дешевле:

Наш выбор!
Наш выбор!

То есть ROS2 предоставляет гибкую архитектуру для роботов, которую вы можете сконфигурировать под свою задачу. Для удешевления проекта мы будем собирать первого робота на ESP32.

Выбор компонентов

Одноплатный компьютер

Прежде чем выбирать одноплатник, определитесь, какая производительность вам нужна и какую версию ROS2 будете использовать.

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

Список ROS2-дистрибутивов:

b188e19f0a5a193f9c3fffbfc44694fc.png

Зелёным выделены так называемые LTS-релизы: их авторы будут исправлять ошибки в течение нескольких лет. Рекомендую всегда выбирать именно такие.

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

3a120c05f8f20291bdde7dadf194ee37.png

Хоть и заявляется о поддержке Windows и macOS, настоятельно рекомендую выбрать Linux, чтобы не иметь проблем с зависимостями при компиляции пакетов.

Почему лучше выбрать Ubuntu, а не другой дистрибутив? Тогда у вас пакеты будут устанавливаться через apt в скомпилированном виде, с минимумом проблем.

Что делать если у вас Ubuntu другой версии или вообще другой дистрибутив?

  • Компилировать на свой страх и риск все пакеты из исходного кода и пытаться решить проблемы с зависимостями.

  • Использовать VirtualBox — виртуальную машину, в которой вы сможете запустить операционную систему с Ubuntu нужной версии.

  • Использовать Docker — контейнер с необходимым образом операционной системы, установленными программами и настроенной средой. Рекомендованный вариант!

Рекомендованные одноплатные компьютеры:

  • Raspberry Pi 5 16gb;

  • Jetson;

  • Orange Pi;

  • NUC.

Микроконтроллер

Здесь есть две развилки:

  1. Написать свой протокол передачи данных между микроконтроллером и компьютером, и тогда подойдёт любой микроконтроллер.

  2. Использовать Micro-ROS с протоколом Micro XRCE-DDS (микроконтроллеры из списка поддерживаемых).

Что ещё стоит учитывать при выборе?

  • Наличие аппаратной поддержки счётчиков энкодеров мотора.

  • Количество пинов входов-выходов.

  • Напряжение на пинах.

В целом, тут выбор сводится к четырём лагерям:

  • Arduino — низкий порог входа;

  • Raspberry Pi Pico — низкий порог входа;

  • STM32 — высокий порог входа, но больше всего возможностей;

  • ESP32 — дешёвый и c Wi-Fi на Micro-ROS.

С какой версией чипа ESP32 использовать Micro-ROS? ESP32 или ESP32-S3.

Моторы

Лучше брать сразу с хорошими энкодерами, так как они нам понадобятся для одометрии, которая нужна для алгоритмов SLAM и навигации.

Моторы можно разделить на коллекторные и бесколлекторные. Коллекторные:

  • JGB37–520 (рекомендуемые);

  • JGA25–370;

  • JGA25-BL2418;

  • TT (для маленьких роботов);

  • N20 (для микророботов);

  • L-shaped DCGM-3865.

Бесколлекторные:

  • От гироскутера (для продвинутых пользователей, желательно знакомых с STM32)

  • https://github.com/Shadowru/HoverRobot;

  • DDSM400;

  • DDSM210;

  • DDSM115;

  • шаговые.

Драйвер мотора

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

Для коллекторных и шаговых моторов:

  • L298N (самый простой, дешёвый и надёжный);

  • TA6586 (посовременнее).

Для бесколлекторных моторов:

  • Odrive;

  • Vesc;

  • Mjbots moteus;

  • Arduino SimpleFOC;

  • из гироскутера;

  • https://hoverboard-robotics.github.io/;

  • ROS2-драйвер 

  • https://github.com/Shadowru/HoverRobot.

Инерциальный измерительный блок (IMU)

В его состав входят гироскоп и акселерометр, иногда ещё магнитометр и барометр. Акселерометр измеряет линейное ускорение, гироскоп — угловое. Магнитометр измеряет ориентацию относительно магнитного поля Земли, обычно его в роботах не используют, так как он сильно «шумит» из-за электрических наводок от соседних компонентов.

На данный момент в народном роботе рекомендуется использовать ICM-20948.

Лидар

a44dfda982f6a203dc8fb6d8cd9185f0.png

Это устройство измеряет расстояние до предметов. Принцип действия такой: лидар испускает лазерный луч, тот отражается от поверхностей, и по времени приёма отражённого луча вычисляется расстояние. 

Лидары бывают разных видов, для простоты разделим на однолучевые (вращаются на 360 градусов) и многолучевые (или в виде матрицы). В народном роботе мы будем использовать однолучевой вращающийся, то есть сканирующий плоскость вокруг робота.

Из известных недорогих моделей  можно рекомендовать:

  • RPLIDAR A1

  • RPLIDAR C1

  • YDLIDAR X4

На Aliexpress большой выбор китайских лидаров, но не для всех есть хорошая документация и ROS-драйверы.

Для простоты и надёжности рекомендую подключение по USB. Для надёжности — по Ethernet. Лидары от пылесосов подключаются по UART. Питание лидара должно быть без «шумов».

Если вы хотите ещё дешевле, то можно использовать лидары от пылесосов, которые продаются на Aliexpress как запчасти:

  • сравнение дешёвых лидаров;

  • статья о них;

  • Arduino-библиотека.

Для самого дешёвого лидара Xiaomi LDS02RR вам понадобиться изготовить переходную плату. Или можно просто купить необходимые диод, транзистор и конденсатор и спаять их на макетной плате.

Или вот, например, проверенный и простой в использовании без дополнительных хлопот лидар для робота-пылесоса Dreame D9 F9 D9 Pro D9 Plus L10 Pro W10.

Лазерный лидар LDS Lidar для робота-пылесоса Dreame D9 F9 D9 Pro D9 Plus L10 Pro W10.
Лазерный лидар LDS Lidar для робота-пылесоса Dreame D9 F9 D9 Pro D9 Plus L10 Pro W10.

Примечание. Хотя продавцы утверждают, что все эти лидары безопасны, и то же говорится в технических паспортах и руководствах пользователя, но всё же, какую бы модель вы ни приобрели, НИКОГДА не смотрите в лазер лидара. И не позволяйте делать этого детям и животным.

Помните, что лазерный луч может отражаться от полированных поверхностей, особенно зеркал, поэтому избегайте их при использовании робота с лидаром. Зачем такая дополнительная предосторожность, если продавец или производитель утверждает, что его лидар безопасен? Даже если вы доверитесь обещаниям, устройство может получить повреждения (упасть, удариться) и потенциально стать небезопасным для вашего зрения.

Понижающий преобразователь питания

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

Преобразователи бывают двух видов: уже настроенные с завода на определённое выходное напряжение, или с подстроечным резистором, который вы крутите отвёрткой до нужного напряжения.

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

Сервоприводы

Это вспомогательные моторы, с помощью которых приводят в движение разные дополнительные устройства: антенны, манипуляторы и прочее. В нашем случае с помощью сервомоторов мы будем поворачивать робота. А управлять ими будем по ШИМ‑сигналу или по специальному протоколу (TTL, RS486 или CAN).

Если вам не нужна обратная связь, куда и на сколько на самом деле повернулся сервопривод, то вам будет достаточно модели с управлением по ШИМ: SG90, SG92R, MG90S, MG995 или MG996R.

А если требуется сервопривод с обратной связью, то обратите внимание на модели от Dynamixel (хорошие, но дорогие) или Feetech.

Так как в дальнейшем мы планируем использовать в образовательном роботе программу для манипуляторов MoveIt, то сразу будем выбирать серво с обратной связью. Например:

  • Feetech ST3215 (основные степени вращения);

  • Feetech SCS0009 (захват);

  • модели от Waveshare.

Контроллер сервоприводов

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

Для PWM‑серво (ШИМ) можно взять 16-канальный 12-битный PWM‑драйвер PCA9685 I2C IIC. Для TTLсерво — Feetech SCServo TTL или Feetech FE‑TTLinker‑Мини.

Преобразование сигнальных линий 3,3 → 5,5 → 3,3 вольта

Так как пины ESP32 на вход и выход рассчитаны на 3,3 вольта, а датчики у вас могут быть на 5 вольт, то вам понадобится преобразовать сигналы в нужное напряжение. Это можно сделать, спаяв схему с резисторами на макетной плате или использовав специальные преобразователи. Или купив готовую модель, например, «Модуль преобразователя логического уровня I2C IIC на 8 каналов 3.3V 5V».

Камеры

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

Камеры можно поделить на следующие категории:

  • монокамеры — одна камера;

  • стереокамеры — две камеры для вычисления расстояния до объекта в каждом пикселе (но сделать это невозможно из‑за отсутствия текстур на изображении, поэтому неизбежны «дыры», в которых расстояние не известно).

  • стереокамеры с инфракрасной подсветкой — «дыр» будет меньше;

  • TOF‑камеры — возвращает расстояние в каждом пикселе изображения с помощью лазера.

Иногда в камеры ещё добавляют IMU для работы алгоритмов визуально-инерциальной одометрии или SLAM.

Вот список камер от Rosindustrial, для которых точно есть хорошие ROS-пакеты-драйверы.

Также есть MIPI-CSI-камеры, которые подключаются к Raspberry Pi или Jetson через специальный разъём. Искать их лучше всего здесь:

  • https://www.arducam.com/

  • https://www.e-consystems.com/

  • https://leopardimaging.com/

  • https://www.waveshare.com/product/raspberry-pi/cameras.htm

Если вы хотитеполучить максимум от алгоритмов компьютерного зрения, избегания препятствий, SLAM и т. д., то берите Realsense D435I. В ней есть специальный чип, который сам вычисляет карту глубины и выдаёт её по USB, то есть вам не придётся тратить на это время основного процессора. При этом благодаря инфракрасной подсветке карта получится достаточно точной.

Что ещё нужно знать про камеры? Они бывают с глобальным затвором (global shutter — изображение считывается с матрицы сразу целиком) или с построчным считыванием (rolling shutter). Вторые — гораздо дешевле, но у них есть недостаток: при относительно быстром повороте камеры влево‑вправо возникает характерное искажение картинки: она наклоняется, словно нижняя часть движется быстрее верхней.

55ee176539f9586bec8b8114049551b5.png

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

В народном роботе мы будем использовать камеру ESP32-CAM, она передаёт изображение через Wi-Fi по micro-ros. Да, качество картинки не очень и, скорее всего, будет запаздывание, но для образовательных целей её должно быть достаточно.

Макетная плата

Не обязательна, но к ней будет удобно припаивать компоненты.

d3b5640b40279fbacf42b45287c3b4a4.png

Также можно рассмотреть беспаечный вариант:

024cb9ed8faea0d3d25c7981a15ab384.png

Аккумулятор

Самым простым и дешёвым вариантом будет скомпоновать нужное напряжение из элементов Li‑Ion типоразмера 18 650, с максимальным напряжением на одну банку 4,2 вольта. Нам будет достаточно конфигурации 2s, то есть два элемента, соединённых последовательно, что даст нам 8,4 вольт. Этого хватит для вращения моторов в версии на 6 вольт, так как на L298N будет падение напряжения 2 вольта, для ESP32 понизим напряжение до 5 вольт через DC‑DC, а сервоприводы тоже будут работать, но чуть‑чуть не оптимально. Также можно рассмотреть вариант 3s, который нам даст максимум 12,6 В. Такой вариант стоит рассматривать с моторами на 12 вольт, а подключать сервоприводы к таким аккумуляторам напрямую уже нельзя.

Помните, что аккумуляторы Li‑Ion 18 650 нельзя заряжать выше 4,2 вольта, могут загореться. Разряжать менее 3 вольт тоже не рекомендуется, начнётся быстрая деградация. Лучше брать ячейки со встроенной защитой от переразряда или «пищалкой», которая просигнализируют о низком заряде.

Звуковой индикатор напряжения:

ce3d897a21cfd6e5f9a2b940fbb6ac74.png

Вольтметр:

3111917334f0400f6fe0fed2073c61ff.png

Плата заряда аккумулятора

Type-C:

d576daf3620dde501bb494e03dee9b5e.png

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

Чтобы во время заряда балансировать ячейки для более долгой жизни аккумуляторов, лучше использовать балансировочную плату:

fa3582a6f0e7236af3eb1befcd11634e.png

Микропереключатели для бампера

Если выхотите сделать подобие тактильного бампера, срабатывающего при касании, то можно использовать микропереключатели:

e6918fcbc7631d5a9821ec0a9fcf8006.png

Корпус

Самый дешёвый вариант — это подобрать пластиковый контейнер:

73082c4a8b9b9a71b50c8db8bfd2df11.png

Нужно измерить размеры моторов и купить в соседнем бытовом магазине или на Aliexpress подходящий по размерам контейнер.

65d95f8b9acd65f11078ba56e314b618.pngd242ba580cbdb091c7d5707702abca21.png

Второй вариант — это вырезать на лазерном станке пластины из оргстекла или фанеры и скрепить их стойками.

aa7accea7decc3e48d0b9cb5ab96336d.png

Третий вариант — распечатать корпус на 3D принтере:

7f0b9ba15ef497b82d77e80ce5a1d010.png31103584e794dd6d00e954bf8b2b9bb5.png3e9f7c03e9eff9668eba59dd97cc61c2.png
  • https://makerspet.com/blog/loki-pet-robot/

  • https://makerspet.com/blog/robot-bill-of-materials/

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

60d4bc1589d59ee44b352fe1494a85d1.png48ec0f239a16107376b095467edecf79.pngeac6cb47bd241ed5554adb7ffea3e587.png124154bf0b50f3f55e67c35e670b681c.png
  • https://www.researchgate.net/publication/370562455_ROMR_A_ROS-based_Open-source_Mobile_Robot

  • https://hackaday.io/project/161891-transpotter-ng

  • https://github.com/Jana-Marie/transpOtterNG

f5fbf1cb582868900bb5a5a0ce151356.png

Манипулятор

2b36dab0c32c7a787e49aed21eb599db.png2de743728fc0cea73422baf585bcccf8.png

Инструкция по сборке. Чертёж нужно переделать под выбранные сервоприводы от Feetech 

Альтернативная конструкция, но для наших задач нужно увеличить размер.

Ещё варианты:  

  • https://www.thingiverse.com/thing:4624879

  • https://www.thingiverse.com/thing:407800

  • https://www.instructables.com/Wheel-Arm/

Поворотное колесо

Мебельные ролики:

214bac9ef4324f920dc9d40cda40be69.png

Роликовое колесо:

11035e3a0250639bb47c1173d4a3a68f.png

Дальномер или датчики препятствий

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

В качестве дешёвого и точного дальномера могу посоветовать VL53L0X.

Датчик напряжения

Это устройство нужно для программного контроля напряжения аккумулятора. Самый простой вариант — делитель напряжения на двух резисторах: 2 кОм + 1 кОм. При рабочем напряжении робота 8 В получаем диапазон считываемых напряжений от 0 до 2,8 В, что укладывается в диапазон для микроконтроллеров с логическими уровнями 3,3 В и 5 В.

02c526b0832ff866d509450938abc455.png

Датчик тока

Это устройство для программного измерения потребления тока на всём роботе или в отдельных компонентах. Один из вариантов — модуль INA3221. Три канала позволяют контролировать ток через двигатели, звенья манипулятора и захват.

Код проекта контроля тока при сжатии гриппера и библиотека.

Заключение

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

Вот список рекомендуемых компонентов.

Если вам не нужна манипуляция предметами, то можете смело собирать только вариант мобильного робота, сервоприводы можно купить позднее, если захотите.

Практически всё можно найти в российских интернет‑магазинах, и что‑то будет даже дешевле, чем заказывать из Китая. Но, возможно, многим проще будет всё закупить на Aliexpress. Для продвинутых есть ещё магазин для внутреннего рынка Китая Taobao, но даже просто зарегистрироваться на нём — тот ещё квест, не говоря уже о покупке и организации доставки. Хотя там могут продаваться компоненты и роботы, которых нет на Aliexpress.

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

Для тех, кому понравилась идея народного ROS2-робота и хочется сделать вклад в open‑source, мы организуем ежегодный хакактон по сборке и программированию ROS2 робота. Приходи создавать, писать документацию и общаться с единомышленниками!

В следующей статье мы рассмотрим программную архитектуру ROS2-робота.

© Habrahabr.ru