Rosserial & STM32

Das ROS-Roboterbetriebssystem ist eine ziemlich leistungsfähige Plattform zum Erstellen von Robotersystemen, die alles umfasst, was für die Entwicklung Ihrer Projekte erforderlich ist, von den einfachsten Softwarekomponenten, die als „Knoten“ bezeichnet werden, und dem Datenaustauschprotokoll bis zur Simulationsumgebung einer echten Gazebo-Roboterplattform. Meist wird ROS in Verbindung mit solchen Mikrocontrollern auf der Arduino-Plattform verwendet. Das Internet ist voll von allerlei Tutorials zu einer Reihe von ROS und Arduino.

Derzeit liegen keine Informationen zur Verwendung des ROS-Roboterbetriebssystems in Verbindung mit dem STM32-Mikrocontroller vor. Das Internet ist nur voller Fragen.



Fangen Sie an


Um mit STM32 arbeiten zu können, benötigen wir STM32CubeMX und SystemworkbenchforSTM32. Es gibt viele Informationen über ihre Installation im Netzwerk, darauf werden wir nicht näher eingehen.

Um den Controller zu konfigurieren, gehen Sie zu STM32CubeMX

Erstellen Sie ein neues Projekt.



Wir wählen einen Mikrocontroller aus, ich habe STM32f103c8t6.



In der Peripherie geben wir an, dass der externe Quarzresonator angeschlossen ist, wir haben 2 davon



Konfigurieren Sie die Schlussfolgerungen, mit denen Sie das Debuggen des Controllers aktivieren können (wenn sich das Projekt in C ++ befindet, funktioniert das Debuggen möglicherweise nicht).



Lassen Sie uns Port 13 Ausgang C konfigurieren, an den die eingebaute LED angeschlossen ist.



Richten Sie die UART-Pins ein.



Gehen Sie zu Lock_configuration und nehmen Sie die Einstellungen wie im Bild vor.



Fahren wir mit der detaillierteren Konfiguration der Peripherie fort


UART

Einstellen des Datenwechselkurses.



DMA-Setup.





Interrupt konfigurieren, Sie müssen einen globalen Interrupt auf UART angeben



GPIO-Setup




Project Build Setup




Wir warten darauf, dass Sie zusammenkommen



Wir eröffnen das Projekt,



Erstellen eines Projekts für System Workbench für STM32


Durch Öffnen dieses Projekts in SW4STM32, Hinzufügen einer Peripheriesteuerung, Zusammenbauen und Flashen des Controllers habe ich kein Ergebnis erhalten.

Daher erstellen wir ein neues Projekt gemäß den folgenden Anweisungen und übertragen die von STM32CubeMX erhaltene Konfiguration.

Erstellen eines Projekts für System Workbench für STM32


1) Klicken Sie auf Datei> Neu> C-Projekt

2) C-Projekt
1) Geben Sie den Namen des Projekts ein
2) Wählen Sie einen Projekttyp aus: Ausführbar> Ac6 STM32 MCU-Projekt
3) Wählen Sie Toolchains: Ac6 STM32 MCU GCC
4) Klicken Sie auf "Weiter".



3) Wählen Sie einen Mikrocontroller
1) Klicken Sie auf "Neues benutzerdefiniertes Board erstellen".
1) Neue Board-Definition speichern
2) Geben Sie den Namen der neuen Karte ein: STM32F103
3) Wählen Sie eine Spanplatte: STM32F1
4) Wählen Sie MSU: STM32F103RCTx
5) Klicken Sie auf OK.
2) Wähle das Board aus, das du gerade erstellt hast!
1) Wählen Sie eine Serie: STM32F1
2) Wählen Sie eine Karte: STM32F103
3) Klicken Sie auf "Weiter".



4) Wir verbinden Bibliotheken HAL



5) Klicken Sie auf Fertig stellen

Dateien hinzufügen


Kopieren Sie den Inhalt der vom Cube erstellten src- und inc-Dateien in unsere Dateien. Kopieren Sie auch STM32F103C8Tx_FLASH.ld



Schreiben Sie die folgenden Zeilen, um den Zustand von STM32 selbst und den Code in der while-Schleife zu testen

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

Hier blinken wir einfach die LED.

Während der Montage können Probleme in der Datei stm32f1xx_hal_msp.c auftreten

Der mit der void-Funktion HAL_MspInit (void) verbundene Fehler wird wie folgt behoben.
Öffnen Sie den Ordner mit der HAL_Driver-Bibliothek, gehen Sie zu / src, öffnen Sie die Datei stm32f1xx_hal_msp_template.c und kommentieren Sie dieselbe Funktion aus:



Zusammenbauen (sollte fehlerfrei zusammengebaut werden)

Ich habe vergessen, das für die Controller-Firmware erforderliche St-Flash-Dienstprogramm zu erwähnen.

 $ 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 

ST-Link verwenden

Überprüfung der ST-Verbindungserkennung:

 $ st-info —probe 

Als Antwort sollten wir etwas sehen wie:

 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 

Um den Controller zu leeren, gehen Sie in den Ordner unseres Projekts und flashen Sie den Controller mit dem folgenden Befehl:

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

Überprüft. Alles arbeitet. Wir gehen weiter.

Da die ROS-Bibliotheken in C ++ geschrieben sind, übersetzen wir unser Projekt in ein C ++ - Projekt und ändern das Format der Dateien main.c, stm32f1xx_hal_msp.c, stm32f1xx_it.c in .cpp

Wir klonen mein Repository mit wachsenden Bibliotheken und den notwendigen Dateien, um rosserial auf STM32 zu arbeiten.

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

Fügen Sie den geklonten Ordner in das Projekt ein





Gehen wir zu den Projekteinstellungen (Eigenschaften), verbinden Sie zuerst die Bibliothek, gehen Sie ...







Layout ändern





Wir führen Optimierungen durch





Nun werden wir einige Änderungen an main.cpp vornehmen, da es fast leer ist. Als Erstes verbinden wir die ROS-Bibliothek und die Bibliotheken für die Interaktion mit ROS-Themen bzw. Datentypen dieser Themen.

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

Erstellen Sie einen Knoten, der dieses Thema veröffentlicht und akzeptiert

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

Initialisieren Sie den Knoten und die Themen in main.

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

Wir fügen auch Variablen hinzu, um mit der Zeit zu arbeiten und was wir veröffentlichen werden.

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

In der while-Schleife haben wir Folgendes. Wir werden unseren Satz nach einer bestimmten Zeit veröffentlichen.

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

Ein Projekt zusammenstellen.

Die folgenden Fehler können auftreten:







Zusammenbauen und blinken.

Jetzt direkt mit ROS interagieren.
Führen Sie in einem Terminal ROS aus.

 roscore 

Im nächsten Lauf den Knoten.

 rosrun rosserial_python serial_node.py /dev/ttyUSB0 

Wir bekommen folgendes

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

Schauen Sie sich als Nächstes in einem neuen Terminalfenster die Themen an

 rostopic list 

Wir bekommen folgende Themen:

 /chatter /diagnostics /led /rosout /rosout_agg 

Im Thema des Chatter veröffentlicht der Controller die Phrase.

Wir können es durch das Team hören

 rostopic echo /chatter 



Senden Sie nun die Daten an das geführte Thema.

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

Und wir müssen den Zustand der LED ändern.

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


All Articles