做者:良知猶存node
轉載受權以及圍觀:歡迎添加微信公衆號:羽林君python
主題:串口是一種設備間經常使用的通信接口,rosserial將串口字符數據轉發到標準ROS網絡,並輸出到rosout和其日誌文件。本文將記錄如何在ROS上使用其提供的serial包進行串口通訊。linux
個人環境介紹:
PC:使用的是Ubuntu 16-04 ROS-Kinetic
嵌入式端:STM32F071git
ROS機器人操做系統是用於建立機器人系統的功能強大的平臺,其中包括開發項目所需的一切,從最簡單的軟件組件(稱爲「節點」)和數據交換協議到真正的涼亭機器人平臺的仿真環境。至於ROS這個操做系統的介紹你們能夠看我以前的那篇文章《嵌入式爲何要學ROS》github
總之ROS是一個在機器人設備端比較經常使用的分佈式處理框架,可是由於ROS的包不少功能也比較複雜,因此通常都是跑在linux系統的板卡上,像stm32一類的單片機就使用的比較少,可是若是咱們想用ROS的通信接口到咱們STM32中,那咱們應該怎麼作呢?算法
這個時候就要提起rosserial,這個ROS提供一種嵌入式節點和運行在主控PC上的ros master通訊的方式,使得在嵌入式節點上編寫、運行ros節點成爲可能,主要用於轉接IO和各種傳感器,運行底層控制算法。
要使用rosserial,顯然須要分別在嵌入式板卡和主控PC上部署,當前支持的板卡有:
arduino stm32等這些比較熱門的嵌入式端。
微信
可是目前關於結合STM32微控制器使用ROS機器人操做系統的信息,其實網上使用的仍是不多,不過網上仍是有幾個比較好的的stm32結合ROS使用的代碼,其中有一個stm32rc和rtt的配置,不過RTT的配置我使用以後發現有些問題,已經給RTT在github的倉庫提交了問題
不過RT_Thread官網的文檔中心仍是作的很好的,對於使用ROSSERIAL的包在STM32仍是介紹的很詳細,你們有興趣能夠去看一下網絡
https://www.rt-thread.org/document/site/tutorial/smart-car/ros-connect/ros-connect/框架
首先stm32 ROS serial的使用分爲兩部分,分別爲PC端ROS環境接收數據, 嵌入式端STM32進行發送ROS數據。分佈式
首先我是使用的其餘人分享一個包進行開發的,使用的是makefile文件進行編譯,編譯器選擇的是
gcc-arm-none-eabi-4_9-2015q3
程序文件以下所示:
這裏的配置方法其實就和咱們平時的用庫函數配置STM32串口的方法沒什麼區別,只不過是配置程序放到了HardwareSerial這個類成員函數中。
從程序文件的名稱你們應該就能夠看出來,這個部分的文件也是作外設等的基本配置,數據的基本發送和接收部分。例如:這裏面wheel的配置
其中rsolib其實就是使用ROS的時候程序中須要的頭文件,ros msg的各類類。
這些類是咱們定義ROS的topic或者service節點時候發送的數據類型,以及ROS serial的串口配置等頭文件都在這個包裏面
stm32lib是stm32配置時候的各類庫文件,包括stm32f0xx.h、CMSIS、庫文件和啓動彙編文件
這個部分是比較重要的,main函數的部分除了初始化,咱們也能夠定義咱們須要的topic節點。
initialise(); ros::NodeHandle nh; nh.initNode() while (!nh.connected()) { // nh.loginfo("ros is not connect\r\n"); nh.spinOnce(); } sensor_msgs::ChannelFloat32 VelFeedBack; ros::Publisher velfeedbackpub("VelFb_", &VelFeedBack); nh.advertise(velfeedbackpub); nh.spinOnce(); float fbVel[7]; while (1) { if ((millis() - previous_debug_time) >= (1000 / DEBUG_RATE)) //定時發送 { VelFeedBack.name = "r"; VelFeedBack.values = fbVel; VelFeedBack.values_length = 7; velfeedbackpub.publish(&VelFeedBack); } nh.spinOnce(); }
makefile.include文件中,和正常的IDE選項同樣,裏面包含了芯片選擇、編譯選擇、連接選擇、以及相應的程序文件目錄設置。
其中芯片我選擇了STM32F072
編譯選項我按照默認,也沒有修改,其中交叉編譯器是用的 arm-none-eabi-gxx
makefile 文件中我設置了我自行定義的程序文件
此外我還下載了 arm-none-eabi-gxx 的包
編譯前先用export 配置一個編譯器的選項:
其中我下載好的編譯器目錄在 /home/lyn/M0/gcc-arm-none-eabi-4_9-2015q3
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/lyn/M0/gcc-arm-none-eabi-4_9-2015q3/bin
使用 make 命令 編譯,最後會在當前目錄生成一個main.bin文件,這個時候咱們就能夠把main.bin文件經過j-link或者st-link下載軟件把程序下載到板子中去。
PC端安裝ROS你們能夠參考我以前的ROS安裝的文章,通常安裝ROS都是安裝的全功能版本(全功能含有ROSSERIAL),若是你只是安裝了部分的話,那你還須要多進行安裝ROS serial
sudo apt-get install ros-kinetic-rosserial-python
我是使用咱們最多見的USB轉串口工具鏈接到個人電腦端口。
咱們首先檢查串口號 用命令 「ls /dev/ttyUSB*」 必定要在程序中USB的參數徹底一致。
首先在一個終端開啓 roscore
而後使用咱們安裝好的 rosserial_python 進行啓動節點
rosrun rosserial_python serial_node.py /dev/ttyUSB0 _baud=115200
固然第一次啓動會進行報錯,權限不夠,拒絕訪問,,此時咱們就須要對USB的權限進行設置,使得 /dev/ttyUSB0 能夠被讀寫
sudo chmod 777 /dev/ttyUSB0
在啓動過程當中,咱們就能夠看到咱們設置的publis的 VelFb_就初始化了。
此時咱們使用 rostopic list 就能夠看到相應註冊好的通訊點,而後再使用
rostopic echo /VelFb_
這就是我使用STM32接入ROS節點的方法,你們有什麼更好的建議能夠一塊兒和我交流,若是你們對代碼感興趣,能夠在公衆號後臺回覆我 STM32使用ROSLIB 或者 微信私我。我把我使用的代碼和編譯器一個分享給感興趣的朋友們。