esimonsite

Introducción a micro-ROS

Introducción a micro-ROS y detalles de instalación

Que es micro-ROS?

micro-ROS es una extensión de ROS que permite la integración de microcontroladores y microprocesadores para el desarrollo de sistemas robóticos y automatizados.

Video de youtube: Introducción a Micro-ROS

Diferencias entre micro-ROS vs rosserial

micro-ROS es el sustituto de Rosserial por distintos motivos, si sigues usando rosserial te pueden interesar:

Diferencias en el rendimiento:

micro-ROS proporciona una solución de comunicación más completa y flexible, lo que permite una mejor integración de microcontroladores y microprocesadores en el ecosistema ROS. Además, micro-ROS es más adecuado para aplicaciones que requieren un alto rendimiento y una baja latencia.

Diferencias en las versiones de ROS:

Ten en cuenta que si estás utilizando ROS2, micro-ROS es complatible mientras que rosserial no es compatible. Por otro lado, si se está usando ROS1, entonces la elección adecuada es rosserial.

Instalación

Necesitamos instalar Micro-ROS en los dos elementos de la comunicación: Un PC con ROS2 y un microcontrolador compatible.

“Esuquema de conexión de micro-ros”

Para el PC tendremos que instalar el Micro-ROS Agent. Este Nodo de ROS se instalá como cualquier nodo de ROS y deberá ser ejecutado cada vez que querramos iniciar la comunicación.

link a guia de instalación en Inglés

Instalación del agente

El agente se instala de manera parecida a todos los nodos de ROS2

Lista de comandos:


# moverse a la carpeta home
cd ~
# crear carpeta para microros-ws
mkdir microros_ws
# entrar en la carpeta
cd microros_ws
# clonar el código fuente
git clone -b $ROS_DISTRO https://github.com/micro-ROS/micro_ros_setup.git src/micro_ros_setup

# instalar dependencias
sudo apt update && rosdep update
rosdep install --from-path src --ignore-src -y

# si nunca has usado colcon ejecuta:
# sudo apt install python3-colcon-common-extensions

# compilar proyecto
colcon build

# configurar variables de entorno
source install/local_setup.bash

# crear y compilar agente
ros2 run micro_ros_setup create_agent_ws.sh
ros2 run micro_ros_setup build_agent.sh

# configurar variables de entorno
source install/local_setup.bash

# ejecutar el agente
ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyUSB0

Instalación de Micro-ROS en un microcontrolador

En este punto hay muchas maneras de realizar la instalación. En este post voy a centrarme en una en concreto pero podeis investigar alternativas.

link al repositorio

La opción que mejor me ha funcionado es la combinación de Visual Studio Code + PlaformIO + micro_ros_platformio.

“Esuquema de conexión de micro-ros”

Ya he usado Visual Studio Code + PlaformIO en algún otro proyecto y es una forma bastante cómoda de programar micros.

A continuación os dejo la configuración de un ejemplo usando el ESP32.

Código para el ESP32

Una vez habeis instalado Visual Studio Code y PlaformIO tendréis que subsituir los siguientes archivos:

plaformio.ini


[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
board_microros_transport = serial
lib_deps =
    https://github.com/micro-ROS/micro_ros_platformio

main.cpp


#include <Arduino.h>
#include <micro_ros_platformio.h>

#include <rcl/rcl.h>
#include <rclc/rclc.h>
#include <rclc/executor.h>

#include <std_msgs/msg/int32.h>

#if !defined(MICRO_ROS_TRANSPORT_ARDUINO_SERIAL)
#error This example is only avaliable for Arduino framework with serial transport.
#endif

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;
rcl_timer_t timer;

#define RCCHECK(fn) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){error_loop();}}
#define RCSOFTCHECK(fn) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){}}

// Error handle loop
void error_loop() {
  while(1) {
    delay(100);
  }
}

void timer_callback(rcl_timer_t * timer, int64_t last_call_time) {
  RCLC_UNUSED(last_call_time);
  if (timer != NULL) {
    RCSOFTCHECK(rcl_publish(&publisher, &msg, NULL));
    msg.data++;
  }
}

void setup() {
  // Configure serial transport
  Serial.begin(115200);
  set_microros_serial_transports(Serial);
  delay(2000);

  allocator = rcl_get_default_allocator();

  //create init_options
  RCCHECK(rclc_support_init(&support, 0, NULL, &allocator));

  // create node
  RCCHECK(rclc_node_init_default(&node, "micro_ros_platformio_node", "", &support));

  // create publisher
  RCCHECK(rclc_publisher_init_default(
    &publisher,
    &node,
    ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32),
    "micro_ros_platformio_node_publisher"));

  // create timer,
  const unsigned int timer_timeout = 1000;
  RCCHECK(rclc_timer_init_default(
    &timer,
    &support,
    RCL_MS_TO_NS(timer_timeout),
    timer_callback));

  // create executor
  RCCHECK(rclc_executor_init(&executor, &support.context, 1, &allocator));
  RCCHECK(rclc_executor_add_timer(&executor, &timer));

  msg.data = 0;
}

void loop() {
  delay(100);
  RCSOFTCHECK(rclc_executor_spin_some(&executor, RCL_MS_TO_NS(100)));
}

Una vez hemos subido el programa podremos comprobar si todo ha funcionado:

Leer valores desde el PC

&ldquo;Esuquema de conexión de micro-ros&rdquo;