Rosserial & STM32

Sistem operasi robot ROS adalah platform yang cukup kuat untuk membuat sistem robot, yang mencakup semua yang diperlukan untuk mengembangkan proyek Anda dari komponen perangkat lunak paling sederhana yang disebut "node" dan protokol pertukaran data ke lingkungan simulasi platform robot Gazebo yang sebenarnya. Sebagian besar ROS digunakan bersama dengan mikrokontroler pada platform Arduino. Internet penuh dengan segala macam tutorial tentang sekelompok ROS dan Arduino.

Saat ini tidak ada informasi tentang penggunaan sistem operasi robot ROS dalam hubungannya dengan mikrokontroler STM32. Internet hanya penuh dengan pertanyaan.



Mulai


Untuk bekerja dengan STM32 kita perlu STM32CubeMX dan SystemworkbenchforSTM32. Ada banyak informasi tentang instalasi mereka di jaringan, kami tidak akan membahas ini.

Untuk mengonfigurasi pengontrol, buka STM32CubeMX

Buat proyek baru.



Kami akan memilih mikrokontroler, saya punya STM32f103c8t6.



Di pinggiran, kami menunjukkan bahwa resonator kuarsa eksternal terhubung, kami memiliki 2 di antaranya



Konfigurasikan kesimpulan yang dengannya Anda dapat mengaktifkan debugging controller (lihat ke depan, jika proyek dalam C ++, debugging mungkin tidak berfungsi)



Mari kita konfigurasikan port 13 output C, LED bawaan terhubung ke port tersebut.



Siapkan pin UART.



Pergi ke Lock_configuration dan buat pengaturan seperti pada gambar.



Mari kita beralih ke konfigurasi periferal yang lebih rinci


UART

Mengatur nilai tukar data.



Pengaturan DMA.





Konfigurasikan interupsi, Anda perlu menentukan interupsi global di UART



Pengaturan GPIO




Penyiapan membangun proyek




Kami menunggu Anda untuk berkumpul



Kami membuka proyek,



Membuat proyek untuk System Workbench For STM32


Setelah membuka proyek ini di SW4STM32, setelah menambahkan beberapa kontrol periferal, setelah merakitnya, dan menginstal controller, saya tidak mendapatkan hasil apa pun.

Oleh karena itu, kami membuat proyek baru sesuai dengan instruksi berikut, dan mentransfer konfigurasi yang diperoleh oleh STM32CubeMX.

Membuat proyek untuk System Workbench For STM32


1) Klik File> Baru> Proyek C

2) Proyek C
1) Masukkan nama proyek
2) Pilih jenis proyek: Eksekusi> Proyek MCU Ac6 STM32
3) Pilih Toolchains: Ac6 STM32 MCU GCC
4) Klik “Selanjutnya”



3) Pilih mikrokontroler
1) Klik “Buat papan kustom baru”
1) Simpan Definisi Papan Baru
2) Masukkan nama papan baru: STM32F103
3) Pilih papan chip: STM32F1
4) Pilih MSU: STM32F103RCTx
5) Klik OK.
2) Pilih papan yang baru saja Anda buat!
1) Pilih seri: STM32F1
2) Pilih papan: STM32F103
3) Klik “Selanjutnya”



4) Kami menghubungkan perpustakaan HAL



5) Klik Selesai

Menambahkan File


Salin konten file src dan inc yang dibuat oleh kubus ke file kami, juga salin STM32F103C8Tx_FLASH.ld



Untuk menguji kesehatan STM32 itu sendiri dan kode di loop sementara, tulis baris berikut

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

Di sini kita hanya mengedipkan LED.

Selama perakitan, masalah dapat terjadi pada file stm32f1xx_hal_msp.c

Kesalahan yang terkait dengan fungsi void HAL_MspInit (void) diperbaiki sebagai berikut.
Buka folder dengan pustaka HAL_Driver, buka / src, buka file stm32f1xx_hal_msp_template.c dan berikan komentar dengan fungsi yang sama:



Pasang kembali (harus berkumpul tanpa kesalahan)

Saya lupa menyebutkan utilitas st-flash yang diperlukan untuk firmware pengontrol.

 $ 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 

Menggunakan tautan ST

Pemeriksaan deteksi tautan ST:

 $ st-info —probe 

Sebagai tanggapan, kita harus melihat sesuatu seperti:

 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 

Untuk menyiram controller, buka folder proyek kami dan flash controller melalui perintah berikut:

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

Diperiksa Semuanya berfungsi. Kami melanjutkan.

Karena pustaka ROS ditulis dalam C ++, kami menerjemahkan proyek kami menjadi proyek C ++, dan mengubah format main.c, stm32f1xx_hal_msp.c, stm32f1xx_it.c file dalam .cpp

Kami mengkloning repositori saya dengan pustaka yang bertambah dan file yang diperlukan untuk bekerja rosserial di STM32.

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

Masukkan folder yang dikloning ke dalam proyek





Mari kita pergi ke pengaturan proyek (Properties), pertama-tama, hubungkan perpustakaan, pergi ...







Mengubah tata letak





Kami melakukan optimasi





Nah, sekarang kita akan membuat beberapa perubahan pada main.cpp, karena hampir kosong, hal pertama yang kita lakukan adalah menghubungkan pustaka ROS, dan pustaka untuk berinteraksi dengan topik ROS, atau lebih tepatnya, tipe data dari topik ini.

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

Buat simpul yang menerbitkan topik ini dan menerima

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

Inisialisasi simpul dan topik di utama.

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

Kami juga menambahkan variabel agar sesuai dengan waktu dan apa yang akan kami terbitkan.

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

Dalam loop sementara, kita akan memiliki yang berikut ini. Kami akan menerbitkan frasa kami setelah jangka waktu tertentu.

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

Menyusun proyek.

Kesalahan berikut mungkin muncul:







Pasang kembali dan flash.

Sekarang berinteraksi langsung dengan ROS.
Di satu terminal, jalankan ROS.

 roscore 

Selanjutnya jalankan node.

 rosrun rosserial_python serial_node.py /dev/ttyUSB0 

Kami mendapatkan yang berikut ini

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

Selanjutnya, di jendela terminal baru, lihat topiknya

 rostopic list 

Kami mendapatkan topik-topik berikut:

 /chatter /diagnostics /led /rosout /rosout_agg 

Dalam topik obrolan, pengontrol menerbitkan frasa.

Kita dapat mendengarkannya melalui tim

 rostopic echo /chatter 



Sekarang kirim data ke topik yang dipimpin.

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

Dan kita harus mengubah status LED.

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


All Articles