Publicar lecturas de sonda con micro-ROS en Raspberry Pi Pico

Ubuntu junio 11, 2021

En esta publicación, veremos cómo conectar un sensor de rango HC-SR04 a la Raspberry Pi Pico y publicar sus lecturas en el gráfico ROS 2 usando micro-ROS. Esto se basa en la publicación anterior ‘Comenzando con micro-ROS en Raspberry Pi Pico’. Como tal, te animo a que lo leas primero si aún no estás familiarizado con el tema.

¿Un sensor que dijiste?

En este tutorial, haremos uso de uno de los sensores más comunes en robótica, un sonar. Estos sensores son económicos, bastante sencillos de usar y sorprendentemente precisos en circunstancias favorables. Los sonares se utilizan para medir distancias. Por lo tanto, se pueden utilizar para detectar y localizar obstáculos, de modo que un robot pueda evitar cosas cercanas. No es ningún misterio por qué son tan increíblemente populares.

Entonces, ¿qué es un sonar, cómo funciona, cuál debo elegir?

“Soy Bat (sensor)”

Un sonar es un sensor de ecolocalización que permite medir distancias. Para simplificar la digestión, los sonares funcionan de la misma manera que los murciélagos. No, no vuelan, cazan insectos al amanecer; ni luchan contra el crimen. Obviamente, me refería a la misma forma en que los murciélagos perciben el mundo. Un sonar está compuesto por un emisor y un receptor. El primero emite una señal de ultrasonido, que rebotará en los obstáculos enfrentados, de regreso al receptor. Al medir la diferencia de tiempo entre la emisión y la recepción de la señal, se puede calcular fácilmente la distancia recorrida por la onda de sonido y, por lo tanto, la distancia al obstáculo que reverberaba el sonido.

Esta tecnología puede sufrir todo tipo de problemas; si, por ejemplo, la onda de sonido reverbera lejos del sensor. O si es reverberado de regreso al sensor por dos obstáculos a diferentes distancias. O si es absorbido por algún material insonorizante.

Si esto aún no está claro o si deseas saber más al respecto, lo redireccionaré a su motor de búsqueda web favorito, ya que está un poco fuera del alcance de esta publicación.

¿Qué modelo de sonda elegir?

Existen muchos modelos diferentes de sonares, afortunadamente la mayoría de ellos funcionan de la misma manera. Además, se pueden encontrar por unos pocos dólares por unidad en Internet. Dirígete a tu proveedor de productos electrónicos favorito y seguro que los encontrarás a la venta.

Te recomiendo que uses el modelo ‘HC-SR04P’, que es la variante de 3.3V del inmensamente popular ‘HC-SR04’ (5V). Es este modelo (el ‘HC-SR04P’) que usaré en esta publicación. Dado su muy pequeño consumo de energía, se puede encender directamente desde el Pi Pico. Por lo tanto, toda la configuración se puede alimentar simplemente con el cable USB. En caso de que esté utilizando un paquete de 5 V, asegúrese de adaptar el cableado que se describe a continuación o, de lo contrario, corre el riesgo de dañar su Pi Pico. Como referencia, pedí un lote de 5 unidades por menos de $ 10, incluido el envío. Incluyendo el precio de Pi Pico, ¡eso es una gran cantidad de detección por el precio!

Cableado del sonar al Pi Pico

La placa ‘HC-SR04P’ viene con cuatro pines etiquetados como ‘Vcc’, ‘Gnd’, ‘Trig’ y ‘Echo’. Como ya ha adivinado, los pines Vcc y Gnd son para la línea de 3.3V y la tierra respectivamente. ‘Trig’ se utiliza para activar el sensor y ‘Echo’ informa la recepción del eco (la recepción de la onda que rebotó en un obstáculo).

A partir de ahí, y refiriéndose al Pinout Pi Pico, el cableado es sencillo:

  • 3V3 OUT (pin 36) al ‘Vcc’ del sonar
  • GND (pin 38) al ‘Gnd’ del sonar
  • GPIO 6 (pin 9) al ‘Echo’ de la sonda
  • GPIO 7 (pin 10) al ‘Trig’ de la sonda

Esta configuración se muestra en la siguiente figura.

En lo que respecta al hardware, hemos terminado. Pasemos al software.

Micro código para micro-ROS en Pi Pico

Hemos visto en la publicación anterior cómo configurar VSCode para programar micro-ros en Raspberry Pi Pico, y cómo compilar y actualizar un programa. Por lo tanto, saltaremos directamente al plato principal, omitiendo todo el código repetitivo y solo mostraremos los bits específicos de nuestra aplicación. Sin embargo, sepa que este ejemplo (y más) está completamente disponible en GitHub en artivis / mico_ros.

Muy bien, profundicemos. Nuestra aplicación se compone esencialmente de dos funciones, una que activa y lee el sensor, y una segunda, la devolución de llamada del temporizador, que llama a la primera, llena un mensaje ROS y lo publica:

// The GPIO pins to which the sonar is wired
#define GPIO_ECHO 6
#define GPIO_TRIGGER 7

/**
 * @brief Get the range value in meter.
 */
float read_range() {

  // Send an impulse trigger of 10us
  gpio_put(GPIO_TRIGGER, 1);
  sleep_us(10);
  gpio_put(GPIO_TRIGGER, 0);

  // Read how long is the echo
  uint32_t signaloff, signalon;
  do {
    signaloff = time_us_32();
  } while (gpio_get(GPIO_ECHO) == 0);

  do {
    signalon = time_us_32();
  } while (gpio_get(GPIO_ECHO) == 1);

  // Actual echo duration in us
  const float dt = signalon - signaloff;

  // distance in meter:
  // echo duration (us) x speed of sound (m/us) / 2 (round trip)
  return dt * 0.000343 / 2.0;
}

...

/**
 * @brief Read the range from the sensor,
 * fill up the ROS message and publish it.
 */
void timer_callback(rcl_timer_t *timer, int64_t /*last_call_time*/) {
  if (timer) {
    range_msg.range = read_range();
    fill_msg_stamp(range_msg.header.stamp);
    rcl_publish(&publisher, &range_msg, NULL);
  } else {
    printf("Failed to publish range. Continuing.n");
  }
}

Eso es practicamente todo. El resto del código es en su mayoría repetitivo, inicializando el GPIO, configurando el nodo micro-ROS, el editor, el temporizador y el ejecutor, y todo girando.

Tenga en cuenta que estamos usando el mensaje estándar ‘sensor_msgs / msgs / Range’. Puede encontrar su definición y un desglose de su campo online en el Documentación de la API ROS2.

Todo lo que hay que hacer ahora es compilar el código, actualizar el archivo ‘.uf2’ resultante e iniciar el agente micro-ROS.

Bip bip bip

Suponiendo que la compilación y el flasheo funcionó bien, todo lo que tenemos que hacer es conectar la placa a nuestra ordenador y ejecutar el agente micro-ROS. Para hacerlo, usamos el siguiente comando:

docker run -it --rm -v /dev:/dev --privileged --net=host microros/micro-ros-agent:foxy serial --dev /dev/ttyACM0 -b 115200

Veamos si obtenemos algo

$ ros2 topic list
/parameter_events
/pico/range
/rosout

Se anuncia el tema ‘/ pico / range’, es un buen comienzo. Veamos lo que contiene

$ ros2 topic echo /pico/range
header:
  stamp:
    sec: 145
    nanosec: 837599000
  frame_id: pico_sonar_0_link
radiation_type: 0
field_of_view: 30.0
min_range: 0.019999999552965164
max_range: 4.0
range: 12.138598442077637
---
header:
  stamp:
    sec: 145
    nanosec: 915356000
  frame_id: pico_sonar_0_link
radiation_type: 0
field_of_view: 30.0
min_range: 0.019999999552965164
max_range: 4.0
range: 12.138941764831543
---

¡Eso se ve genial!

Ahora puede jugar con su nuevo sensor, moviendo un obstáculo adelante y atrás frente a él. Tome una cinta métrica y compare la distancia informada con la medida. Puede que te sorprenda su precisión, lo sé.

¿Que sigue?

Este es un pequeño proyecto ordenado para abordar micro-ROS en Raspberry Pi Pico y las posibilidades que abre. Es realmente gratificante ver que la distancia real entre el sensor y un obstáculo está disponible en el gráfico ROS 2. Dando un paso atrás podemos empezar a ver una imagen un poco más grande; una imagen en la que uno podrá fácilmente, sin esfuerzo, agregar módulos de hardware plug and play listos para ROS2 a los robots existentes. Conectar una cámara y su alimentación aparece mágicamente en el gráfico. Un módulo IMU podría proporcionar una fuente de odometría confiable. Un motor listo para girar en un instante (juego de palabras).

Si bien aún no hemos llegado allí, definitivamente seguiré esta línea de pensamiento para mi propio Turtlebot 3. ¿Puedes creer que no tiene ningún sonar?

Afortunadamente, ahora puedo agregar fácilmente un par de ellos y hacer que mi robot deje de chocar con mi gato perezoso tirado en el suelo. Ninja involuntario, invisible para el escáner láser.

Antes de empezar a jugar con micro-ROS en su Raspberry Pi Pico, asegúrese de suscribirse a nuestro boletín para no perderse ningún tutorial próximo y más.

Esta publicación apareció por primera vez en artivis.github.io