###### tags: `控制組` ###### tags: `stm32` # STM32_ROS > [name=江承翰(neoblacktea.ee10@nycu.edu.tw)] > [name=徐冠東(gordondonghsu.ee10@nycu.edu.tw)] ## 實現ROS和STM32通訊 使用ROS(Robot Operating System)的一個功能包——rosserial和rosserial_python與STM32進行通信。這可以將STM32與ROS系統集成在一起,以實現更高級別的控制和傳感器讀取。 (方法二比較完整,可以互相對照) 為了讓stm32能取topic與丟topic,必須學習相關的安裝設定。 以下是參考網站: 1. https://hackmd.io/@JINGCCC/rosserial_1 2. https://hackmd.io/@JINGCCC/rosserial_2?utm_source=preview-mode&utm_medium=rec 裝在樹莓派上的rosserial: ``` cd ws/src git clone -b gcc7-fixes https://github.com/ros-drivers/rosserial.git cd ~/ws catkin_make ``` 要注意在修正裡面的STM32HardWare.h時要再多修正兩個地方 ![](https://i.imgur.com/pi8cVk3.jpg) 還有在執行python的code時可能會有版本的問題需要修正 如果上面的方法有錯誤,可以參考第二種方式,過程大同小異: https://www.youtube.com/watch?v=cq0HmKrIOt8 注意: 影片中使用github上examples中的.ioc檔,這裡可以使用自己寫的,並且要注意板子型號。 注意: 影片中會把STM32的資料夾移來移去,應該只是要把Code(.ioc檔)從linux分享到windows,再導入CubeIDE程式中。 ### Github網址: rosserial_stm32: https://github.com/yoneken/rosserial_stm32 ros-drivers/rosserial https://github.com/ros-drivers/rosserial ### Dugger檔案生成問題 ![](https://i.imgur.com/7IBVkzi.png) 影片中會用到,用來生成bin檔案以配合*STM32 ST-LINK utility*燒入板子,但是可能會出現無法正常輸出bin檔案的現象。 Go to project properties: ![](https://i.imgur.com/KUxmoF3.png) 把生成檔案的選項勾起來就好。 也可參考: https://community.st.com/s/question/0D50X0000AlgEerSQE/how-to-generate-bin-file-after-building-with-cubeide 如果使用vscode的燒入stm32指令: ``` make flash ``` ## 輸出結果 ### 使用指令 ![](https://i.imgur.com/X86uUsE.png) ### 試著使用listener接收 ```cpp= #include "ros/ros.h" #include "std_msgs/String.h" #include <string> #include <sstream> #include <iostream> using namespace std; ros::Publisher chatter_pub; void chatterCallback(const std_msgs::String::ConstPtr& msgs){ //manupulate ROS_INFO("%s, I gonna give up!", msgs->data.c_str()); std::stringstream ss(msgs->data.c_str()); std_msgs::String msgs2;//msgs2 //msgs2.data = to_string( 2*stoi(ss.str()) ); //ROS_INFO("give up %s", msgs2.data.c_str()); chatter_pub.publish(msgs2); // } int main(int argc, char **argv){ ros::init(argc, argv, "listener"); ros::NodeHandle n; chatter_pub = n.advertise<std_msgs::String>("answer", 1000); ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback); ros::spin(); return 0; } ``` ![](https://i.imgur.com/ean2Ldv.png) ![](https://i.imgur.com/pVRvFkv.png) ### 其他參考網址 https://blog.csdn.net/leida_wt/article/details/109690562 ## USB的問題 1. 檢查串口設備的權限是否正確。可以使用以下命令檢查串口設備的權限: ``` ls -l /dev/ttyUSB0 ``` 如果權限不正確,使用以下命令更改權限:(666 可改 777) ``` sudo chmod 666 /dev/ttyUSB0 ``` 2. 使用以下命令檢查串口設備是否存在: ``` ls /dev/ttyUSB* ``` 3. 檢查串口驅動程序是否正確安裝。使用以下命令檢查串口驅動程序是否已正確安裝: ``` lsmod | grep usbserial ``` 如果輸出結果為空,則可能是由於缺少usbserial模塊導致的問題。可以使用以下命令安裝: ``` sudo modprobe usbserial ``` ## 一些問題與解決 ### stm32的ioc檔的配置 ![](https://i.imgur.com/inMt17w.png) 使用的Tx、Rx的腳位要設定為PC10、PC11,然後如果重新update code後,會產生新的main.c檔,先去修改新生成的Makefile,把main.c刪掉後重make,確認沒問題再把main.c檔案刪掉 然後把TTL模組的腳位接到對應腳位上,下圖為參考 ![](https://i.imgur.com/JFh6Jkz.jpg) ### 資料夾參考: ![](https://i.imgur.com/Lirbiqq.png) ### 實作參考影片 https://drive.google.com/file/d/1oIwdNyJG9nbNdNBNNXg4QoY7BTC8TplY/view?usp=sharing ### 懷疑硬體問題 "Error opening serial: Could not configure port: (25, 'Inappropriate ioctl for device')" 可能的硬件故障包括: 1. 嘗試重新插拔設備。 2. 如果芯片受到損壞,它可能無法正常工作。嘗試在另一台計算機上測試該設備,以確定是否存在硬件故障。 3. 串口設備的供電不足或過載。如果設備無法獲得足夠的電力,它可能無法正常工作。請確保讓設備接收到足夠的電力,並檢查設備是否受到過載。 懷疑設備存在硬件故障,聯繫設備製造商或供應商進行更進一步的故障排除或維修。 解決:接上TTL模組 ## 和vscode的整合 為了使開發更加便利,需要把CubeIDE的功能整合到vscode上 詳細內容可以參照另一篇筆記stm32_development 這邊提出一些需要注意的改動 首先是c_cpp_properties.json檔,arm_gcc_path需要填入自己的安裝路徑 接著把rosserial需要的標頭檔放入Inc底下 再來需要到設定裡調整C_Cpp: Intelli Sense Engine 改成Tag Parser,解決標頭檔尋找不到的問題 ![](https://hackmd.io/_uploads/HJeYPEdu3.png) 目前遇到問題:![](https://hackmd.io/_uploads/ByS2DNduh.png) 解決:重複宣告的錯誤,在main.pp裡 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) "的函式被重複宣告,刪掉或註解即可。 ps:經過測試,rosserial最好用USART,而不是UART(高機率有問題),這裡是使用USART3,設置依照前面的參考文章。 publish實作結果:https://youtu.be/wytX6c5N7FQ 傳輸100筆資料遺失兩筆左右 subscribe實作結果:https://youtu.be/-Q643sg0QOw 傳輸100筆資料遺失一筆左右 ## 使用subscriber變數要注意的 變數會有extern的宣告,此宣告方式是為了檔案間能夠分享變數,其使用方式要注意,可以參考AUV code裡的寫法。 主要的思路是比如說在A.cpp更改了A這個變數,那在B.cpp宣告 extern A就可以看到A的數值變化,但在B.cpp是不能更改這個extern A的 要傳遞資訊也可以用class的Constructor extern參考文章: 1. https://stackoverflow.com/questions/1041866/what-is-the-effect-of-extern-c-in-c 2. https://www.google.com.hk/amp/s/www.geeksforgeeks.org/understanding-extern-keyword-in-c/amp/ rosserial_python安裝教學: 1. https://answers.ros.org/question/237465/importerror-no-module-named-rosserial_python/ 2. https://hackmd.io/@925/S13-14zRc?type=view) 3. 安裝rosserial可能會遇到的類似問題: https://blog.csdn.net/Shushan1/article/details/118976650 4. extend rosserial 到不同workspace ``` catkin config --extend ~/rosserial_ws/devel cakin build ``` ## 升級成ROS2 https://github.com/lFatality/stm32_micro_ros_setup 其他參考: https://hackmd.io/@925/S13-14zRc?type=view