Arduino
Что вы узнаете в этом разделе:
- Какие микроконтроллеры используются в роботе TurtleBro
- Как настроить Arduino IDE для работы с роботом
- Как создать простую программу-издатель на microROS
- Как подключить microROS-агент для связи с ROS2
- Как проверить работу программы на Arduino через топики ROS2
- Основы работы с библиотекой micro_ros_arduino
Arduino и плата TurtleBro
На системной плате TurtleBro находится два микроконтроллера. Первый — это STM32F4, на котором работает внутренняя прошивка, обеспечивающая все системные потребности платы (управление моторами, контроль питания, одометрию и т.п.)
И второй — это AT91SAM3X8E, функционально полностью совместимый с платами Arduino DUE. Для этого микроконтроллера вы можете самостоятельно разрабатывать скетчи, и загружать их на плату TurtleBro при помощи Arduino IDE.
Работа вашей программы (скетча) никаким образом не повлияет на функционирование системной платы.
Подключение и настройка ArduinoIDE
Полное руководство по настройке ArduinoIDE располагается в инструкции к роботу, в разделах Arduino и microROS. Изучите эти разделы как часть данного урока
По этой инструкции, вам необходимо установить программу ArduinoIDE и установить библиотеку micro_ros_arduino.
Создание простого Издателя на microros-arduino
За основу, мы возьмем пример из официальной документации microros
Для упрощения, уберем все лишнее, и оставим наиболее простой для понимания вариант microros_publisher_lite
#include <micro_ros_arduino.h>
#include <stdio.h>
#include <rcl/rcl.h>
#include <rcl/error_handling.h>
#include <rclc/rclc.h>
#include <rclc/executor.h>
#include <std_msgs/msg/int32.h>
rcl_publisher_t publisher;
std_msgs__msg__Int32 msg;
rclc_executor_t executor;
rclc_support_t support;
rcl_allocator_t allocator;
rcl_node_t node;
void setup() {
set_microros_transports();
delay(2000);
allocator = rcl_get_default_allocator();
//create init_options
rclc_support_init(&support, 0, NULL, &allocator);
// create node
rclc_node_init_default(&node, "micro_ros_arduino_node", "", &support);
// create publisher
rclc_publisher_init_default(
&publisher,
&node,
ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32),
"micro_ros_arduino_node_publisher");
msg.data = 0;
}
void loop() {
rcl_publish(&publisher, &msg, NULL);
msg.data++;
delay(100);
}
Разберемся с программой, в начале программы мы подключаем необходимые библиотеки и объявляем переменные
//Подключение micro_ros_arduino
#include <micro_ros_arduino.h>
//Необходимых библиотек
#include <stdio.h>
#include <rcl/rcl.h>
#include <rcl/error_handling.h>
#include <rclc/rclc.h>
#include <rclc/executor.h>
//Подключение сообщения
#include <std_msgs/msg/int32.h>
//Объявление переменных
rcl_publisher_t publisher;
std_msgs__msg__Int32 msg;
rclc_executor_t executor;
rclc_support_t support;
rcl_allocator_t allocator;
rcl_node_t node;
Функция setup() инициализирует все объекты
void setup() {
//Настройка типа подключения. В этот момент происходит чтение default_transport.cpp
set_microros_transports();
delay(2000);
allocator = rcl_get_default_allocator();
//create init_options
rclc_support_init(&support, 0, NULL, &allocator);
// create node
rclc_node_init_default(&node, "micro_ros_arduino_node", "", &support);
// Создание объекта Издателя в переменной publisher
// Тип сообщения Int32
// название топика micro_ros_arduino_node_publisher
rclc_publisher_init_default(
&publisher,
&node,
ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32),
"micro_ros_arduino_node_publisher");
msg.data = 0;
}
Ну и главный цикл, довольно простой. Мы с задержкой 100мс публикуем данные в топик из простого счетчика.
void loop() {
rcl_publish(&publisher, &msg, NULL);
msg.data++;
delay(100);
}
Так как наша программа на Arduino пытается связаться с ROS только при запуске (в блоке setup()), то для ее функционирования необходим уже работающий microros-агент.
Запустим его перед загрузкой скетча
ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/serial/by-id/usb-Silicon_Labs_CP2102N_USB_to_UART_Bridge_Controller_0010-if00-port0 -b 115200
Также вы можете перезапустить программу на Arduino, нажав на кнопку reset рядом с arduino, программа при инициализации опять попытается подключиться к агенту
Загрузим программу в плату Arduino.
Посмотрим что у нас появилось в топиках
ros2 topic list
===
/imu
/joint_states
/micro_ros_arduino_node_publisher
/odom
/parameter_events
Мы видим топик micro_ros_arduino_node_publisher
Посмотрим, что в нем происходит
ros2 topic echo /micro_ros_arduino_node_publisher
data: 565
---
data: 566
---
data: 567
Данные в топике, созданном на плате Arduino мы видим в общей системе ROS.
Дополнительные материалы
Пример программы Издателя, на основе официальной документации microros_publisher
Пример программы, проверяет соединение с Агентом, и переподключения если связь восстанавливается microros_reconnection