作者:良知猶存
轉載授權以及圍觀:歡迎添加微信公眾號:羽林君
前言
主題:串口是一種設備間常用的通訊接口,rosserial將串口字符數據轉發到標准ROS網絡,並輸出到rosout和其日志文件。本文將記錄如何在ROS上使用其提供的serial包進行串口通信。
我的環境介紹:
PC:使用的是Ubuntu 16-04 ROS-Kinetic
嵌入式端:STM32F071
ROS機器人操作系統是用於創建機器人系統的功能強大的平台,其中包括開發項目所需的一切,從最簡單的軟件組件(稱為“節點”)和數據交換協議到真正的涼亭機器人平台的仿真環境。至於ROS這個操作系統的介紹大家可以看我之前的那篇文章《嵌入式為什么要學ROS》
總之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/
ROSLib實戰的使用
首先stm32 ROS serial的使用分為兩部分,分別為PC端ROS環境接收數據, 嵌入式端STM32進行發送ROS數據。
首先我是使用的其他人分享一個包進行開發的,使用的是makefile文件進行編譯,編譯器選擇的是
gcc-arm-none-eabi-4_9-2015q3
程序文件如下所示:
其中Bsp包里面主要是stm32串口串口配置的文件和時間定時的程序文件:
這里的配置方法其實就和我們平時的用庫函數配置STM32串口的方法沒什么區別,只不過是配置程序放到了HardwareSerial這個類成員函數中。
Dirver包中是我進行自定義的各種電機控制和IMU等的程序包
從程序文件的名稱大家應該就可以看出來,這個部分的文件也是做外設等的基本配置,數據的基本發送和接收部分。例如:這里面wheel的配置
lib目錄下有兩個lib庫:
其中rsolib其實就是使用ROS的時候程序中需要的頭文件,ros msg的各種類。
這些類是我們定義ROS的topic或者service節點時候發送的數據類型,以及ROS serial的串口配置等頭文件都在這個包里面
stm32lib是stm32配置時候的各種庫文件,包括stm32f0xx.h、CMSIS、庫文件和啟動匯編文件
再下面src目錄里面就放着我們的main.cpp
這個部分是比較重要的,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();
}
最后面是部分是makfile文件,其中makefile文件分了兩部分,一個include頭文件,一個makefile文件。
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端連接
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 或者 微信私我。我把我使用的代碼和編譯器一個分享給感興趣的朋友們。