Rosserial y STM32

El sistema operativo robótico ROS es una plataforma bastante poderosa para crear sistemas robóticos, que incluye todo lo necesario para desarrollar sus proyectos desde los componentes de software más simples llamados "nodos" y el protocolo de intercambio de datos hasta el entorno de simulación de una plataforma robótica Gazebo real. En su mayoría, ROS se utiliza junto con dichos microcontroladores en la plataforma Arduino. Internet está lleno de todo tipo de tutoriales sobre un montón de ROS y Arduino.

Actualmente no hay información sobre el uso del sistema operativo robótico ROS junto con el microcontrolador STM32. Internet solo está lleno de preguntas.



Empezar


Para trabajar con STM32, necesitamos STM32CubeMX y SystemworkbenchforSTM32. Hay mucha información sobre su instalación en la red, no nos detendremos en esto.

Para configurar el controlador, vaya a STM32CubeMX

Crea un nuevo proyecto.



Seleccionaremos un microcontrolador, tengo STM32f103c8t6.



En la periferia, indicamos que el resonador de cuarzo externo está conectado, tenemos 2 de ellos



Configure las conclusiones a través de las cuales puede habilitar la depuración del controlador, (mirando hacia adelante, si el proyecto está en C ++, la depuración puede no funcionar)



Configuremos el puerto 13 de salida C, el LED incorporado está conectado a él.



Configure los pines UART.



Vaya a Lock_configuration y realice la configuración como en la imagen.



Pasemos a una configuración más detallada de la periferia.


UART

Establecer el tipo de cambio de datos.



Configuración de DMA





Configure la interrupción, debe especificar una interrupción global en UART



Configuración GPIO




Configuración de construcción del proyecto




Estamos esperando que te reúnas



Abrimos el proyecto,



Crear un proyecto para System Workbench para STM32


Al abrir este proyecto en SW4STM32, agregar un control periférico, ensamblarlo y flashear el controlador, no obtuve ningún resultado.

Por lo tanto, creamos un nuevo proyecto de acuerdo con las siguientes instrucciones y transferimos la configuración obtenida por STM32CubeMX.

Crear un proyecto para System Workbench para STM32


1) Haga clic en Archivo> Nuevo> Proyecto C

2) Proyecto C
1) Ingrese el nombre del proyecto
2) Seleccione un tipo de proyecto: Ejecutable> Proyecto MCU Ac6 STM32
3) Seleccione Cadenas de herramientas: Ac6 STM32 MCU GCC
4) Haga clic en "Siguiente"



3) Elija un microcontrolador
1) Haga clic en "Crear un nuevo tablero personalizado"
1) Guardar nueva definición de tablero
2) Ingrese el nombre de la nueva placa: STM32F103
3) Elija una placa de chip: STM32F1
4) Seleccione MSU: STM32F103RCTx
5) Haz clic en Aceptar.
2) ¡Selecciona el tablero que acabas de crear!
1) Seleccione una serie: STM32F1
2) Elija un tablero: STM32F103
3) Haga clic en "Siguiente"



4) Conectamos bibliotecas HAL



5) Haga clic en Finalizar

Agregar archivos


Copie el contenido de los archivos src e inc creados por el cubo en nuestros archivos, también copie STM32F103C8Tx_FLASH.ld



Para probar el estado de STM32 y el código en el bucle while, escriba las siguientes líneas

HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); HAL_Delay(100); 

Aquí solo parpadeamos el LED.

Durante el ensamblaje, pueden producirse problemas en el archivo stm32f1xx_hal_msp.c

El error asociado con la función vacía HAL_MspInit (vacío) se corrige de la siguiente manera.
Abra la carpeta con la biblioteca HAL_Driver, vaya a / src, abra el archivo stm32f1xx_hal_msp_template.c y comente la misma función:



Vuelva a armar (debe ensamblar sin errores)

Olvidé mencionar la utilidad st-flash necesaria para el firmware del controlador.

 $ sudo apt-get install cmake $ sudo apt-get install libusb-1.0.0 $ git clone github.com/texane/stlink.git $ cd stlink $ make release $ cd build/Release; sudo make install $ sudo ldconfig 

Usando el enlace ST

Comprobación de detección de enlace ST:

 $ st-info —probe 

En respuesta, deberíamos ver algo como:

 Found 1 stlink programmers serial: 563f7206513f52504832153f openocd: "\x56\x3f\x72\x06\x51\x3f\x52\x50\x48\x32\x15\x3f" flash: 262144 (pagesize: 2048) sram: 65536 chipid: 0x0414 descr: F1 High-density device 

Para vaciar el controlador, vaya a la carpeta de nuestro proyecto y actualice el controlador con el siguiente comando:

 cd workspace/ros_stm32_2/ st-flash write Debug/ros_stm32_2.bin 0x8000000 

Comprobado Todo funciona Seguimos adelante.

Como las bibliotecas ROS están escritas en C ++, traducimos nuestro proyecto a un proyecto C ++ y cambiamos el formato de los archivos main.c, stm32f1xx_hal_msp.c, stm32f1xx_it.c en .cpp

Estamos clonando mi repositorio con bibliotecas en crecimiento y los archivos necesarios para trabajar rosserial en STM32.

 git clone https://gitlab.com/ivliev123/ros_lib 

Inserte la carpeta clonada en el proyecto





Vayamos a la configuración del proyecto (Propiedades), en primer lugar, conecte la biblioteca, vaya ...







Cambiar el diseño





Realizamos optimizacion





Bueno, ahora haremos algunos cambios en main.cpp, ya que está casi vacío, lo primero que hacemos es conectar la biblioteca ROS y las bibliotecas para interactuar con los temas ROS, o más bien, los tipos de datos de estos temas.

 #include <ros.h> #include <std_msgs/String.h> #include <std_msgs/UInt16.h> 

Cree un nodo que publique este tema y acepte

 void led_cb( const std_msgs::UInt16& cmd_msg){ HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); } ros::NodeHandle nh; std_msgs::String str_msg; ros::Publisher chatter("chatter", &str_msg); ros::Subscriber<std_msgs::UInt16> sub("led", led_cb); 

Inicialice el nodo y los temas en main.

  nh.initNode(); nh.advertise(chatter); nh.subscribe(sub); 

También agregamos variables para trabajar con el tiempo y lo que publicaremos.

 const char * hello = "Hello World!!"; int chatter_interval = 1000.0 / 2; int chatter_last = HAL_GetTick(); 

En el ciclo while, tendremos lo siguiente. Publicaremos nuestra frase después de cierto tiempo.

  if (nh.connected()) { if(HAL_GetTick() - chatter_last > chatter_interval) { str_msg.data = hello; chatter.publish(&str_msg); chatter_last = HAL_GetTick(); } } nh.spinOnce(); 

Armando un proyecto.

Pueden aparecer los siguientes errores:







Vuelva a armar y flash.

Ahora interactuando directamente con ROS.
En una terminal, ejecute ROS.

 roscore 

En la próxima ejecución del nodo.

 rosrun rosserial_python serial_node.py /dev/ttyUSB0 

Obtenemos lo siguiente

 [INFO] [1551788593.109252]: ROS Serial Python Node [INFO] [1551788593.124198]: Connecting to /dev/ttyUSB0 at 57600 baud [INFO] [1551788595.233498]: Requesting topics... [INFO] [1551788595.258554]: Note: publish buffer size is 2048 bytes [INFO] [1551788595.259532]: Setup publisher on chatter [std_msgs/String] [INFO] [1551788595.275572]: Note: subscribe buffer size is 2048 bytes [INFO] [1551788595.276682]: Setup subscriber on led [std_msgs/UInt16] 

Luego, en una nueva ventana de terminal, mira los temas

 rostopic list 

Recibimos los siguientes temas:

 /chatter /diagnostics /led /rosout /rosout_agg 

En el tema de la conversación, el controlador publica la frase.

Podemos escucharlo a través del equipo.

 rostopic echo /chatter 



Ahora envíe los datos al tema conducido.

 rostopic pub /led std_msgs/UInt16 "data: 0" 

Y tenemos que cambiar el estado del LED.

Source: https://habr.com/ru/post/443022/


All Articles