Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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