Rosserial & STM32

Le système d'exploitation robotique ROS est une plate-forme assez puissante pour créer des systèmes robotiques, qui comprend tout le nécessaire pour développer vos projets depuis les composants logiciels les plus simples appelés «nœuds» et le protocole d'échange de données jusqu'à l'environnement de simulation d'une véritable plate-forme robotique Gazebo. La plupart du temps, ROS est utilisé en conjonction avec de tels microcontrôleurs sur la plate-forme Arduino. Internet regorge de toutes sortes de tutoriels sur un tas de ROS et d'Arduino.

Il n'existe actuellement aucune information sur l'utilisation du système d'exploitation robotique ROS avec le microcontrôleur STM32. Internet est plein de questions.



Commencez


Pour travailler avec STM32, nous avons besoin de STM32CubeMX et SystemworkbenchforSTM32. Il y a beaucoup d'informations sur leur installation sur le réseau, nous ne nous attarderons pas là-dessus.

Pour configurer le contrôleur, accédez à STM32CubeMX

Créez un nouveau projet.



Nous allons sélectionner un microcontrôleur, j'ai STM32f103c8t6.



En périphérie, nous indiquons que le résonateur à quartz externe est connecté, nous en avons 2



Configurez les conclusions par lesquelles vous pouvez activer le débogage du contrôleur (à l'avenir, si le projet est en C ++, le débogage peut ne pas fonctionner)



Configurons la sortie C du port 13, la LED intégrée y est connectée.



Configurez les broches UART.



Accédez à Lock_configuration et effectuez les réglages comme dans l'image.



Passons à une configuration plus détaillée de la périphérie


UART

Réglage du taux d'échange de données.



Configuration DMA.





Configurer l'interruption, vous devez spécifier une interruption globale sur UART



Configuration GPIO




Configuration de la construction du projet




Nous vous attendons pour vous réunir



Nous ouvrons le projet,



Création d'un projet pour System Workbench pour STM32


Après avoir ouvert ce projet dans SW4STM32, après avoir ajouté un certain contrôle périphérique, l'avoir assemblé et flasher le contrôleur, je n'ai obtenu aucun résultat.

Par conséquent, nous créons un nouveau projet selon les instructions suivantes et transférons la configuration obtenue par STM32CubeMX.

Création d'un projet pour System Workbench pour STM32


1) Cliquez sur Fichier> Nouveau> Projet C

2) Projet C
1) Entrez le nom du projet
2) Sélectionnez un type de projet: exécutable> projet Ac6 STM32 MCU
3) Sélectionnez les chaînes d'outils: Ac6 STM32 MCU GCC
4) Cliquez sur "Suivant"



3) Choisissez un microcontrôleur
1) Cliquez sur «Créer un nouveau tableau personnalisé»
1) Enregistrer la nouvelle définition de la carte
2) Entrez le nom de la nouvelle carte: STM32F103
3) Choisissez une carte à puce: STM32F1
4) Sélectionnez MSU: STM32F103RCTx
5) Cliquez sur OK.
2) Sélectionnez le forum que vous venez de créer!
1) Sélectionnez une série: STM32F1
2) Choisissez une carte: STM32F103
3) Cliquez sur "Suivant"



4) Nous connectons les bibliothèques HAL



5) Cliquez sur Terminer

Ajout de fichiers


Copiez le contenu des fichiers src et inc créés par le cube dans nos fichiers, copiez également STM32F103C8Tx_FLASH.ld



Pour tester l'intégrité de STM32 lui-même et le code dans la boucle while, écrivez les lignes suivantes

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

Ici, nous clignotons simplement la LED.

Pendant l'assemblage, des problèmes peuvent survenir dans le fichier stm32f1xx_hal_msp.c

L'erreur associée à la fonction void HAL_MspInit (void) est corrigée comme suit.
Ouvrez le dossier avec la bibliothèque HAL_Driver, accédez à / src, ouvrez le fichier stm32f1xx_hal_msp_template.c et commentez la même fonction:



Réassemblez (devrait assembler sans erreurs)

J'ai oublié de mentionner l'utilitaire st-flash nécessaire au firmware du contrôleur.

 $ 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 

Utilisation du lien ST

Contrôle de détection de liaison ST:

 $ st-info —probe 

En réponse, nous devrions voir quelque chose comme:

 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 

Pour vider le contrôleur, allez dans le dossier de notre projet et flashez le contrôleur via la commande suivante:

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

Vérifié. Tout fonctionne. Nous continuons.

Les bibliothèques ROS étant écrites en C ++, nous traduisons notre projet en projet C ++ et modifions le format des fichiers main.c, stm32f1xx_hal_msp.c, stm32f1xx_it.c en .cpp

Nous clonons mon référentiel avec des bibliothèques en croissance et les fichiers nécessaires pour travailler rosserial sur STM32.

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

Insérez le dossier cloné dans le projet





Allons dans les paramètres du projet (Propriétés), tout d'abord, connectez la bibliothèque, allez ...







Changer la disposition





Nous réalisons l'optimisation





Eh bien, nous allons maintenant apporter quelques modifications à main.cpp, car il est presque vide, la première chose que nous faisons est de connecter la bibliothèque ROS et les bibliothèques pour interagir avec les sujets ROS, ou plutôt les types de données de ces sujets.

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

Créez un nœud qui publie cette rubrique et accepte

 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); 

Initialisez le nœud et les rubriques dans main.

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

Nous ajoutons également des variables pour travailler avec le temps et ce que nous publierons.

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

Dans la boucle while, nous aurons les éléments suivants. Nous publierons notre phrase après un certain temps.

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

Monter un projet.

Les erreurs suivantes peuvent apparaître:







Remontez et flashez.

Interagit maintenant directement avec ROS.
Dans un terminal, exécutez ROS.

 roscore 

Dans la prochaine exécution, le nœud.

 rosrun rosserial_python serial_node.py /dev/ttyUSB0 

Nous obtenons ce qui suit

 [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] 

Ensuite, dans une nouvelle fenêtre de terminal, regardez les sujets

 rostopic list 

Nous obtenons les sujets suivants:

 /chatter /diagnostics /led /rosout /rosout_agg 

Dans le sujet du bavardage, le contrôleur publie la phrase.

On peut l'écouter à travers l'équipe

 rostopic echo /chatter 



Envoyez maintenant les données au led du sujet.

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

Et nous devons changer l'état de la LED.

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


All Articles