STM32經過rosserial接入ROS通信開發

做者:良知猶存node

轉載受權以及圍觀:歡迎添加微信公衆號:羽林君python


前言

主題:串口是一種設備間經常使用的通信接口,rosserial將串口字符數據轉發到標準ROS網絡,並輸出到rosout和其日誌文件。本文將記錄如何在ROS上使用其提供的serial包進行串口通訊。linux

個人環境介紹
PC:使用的是Ubuntu 16-04 ROS-Kinetic
嵌入式端:STM32F071git

ROS機器人操做系統是用於建立機器人系統的功能強大的平臺,其中包括開發項目所需的一切,從最簡單的軟件組件(稱爲「節點」)和數據交換協議到真正的涼亭機器人平臺的仿真環境。至於ROS這個操做系統的介紹你們能夠看我以前的那篇文章《嵌入式爲何要學ROSgithub

總之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 或者 微信私我。我把我使用的代碼和編譯器一個分享給感興趣的朋友們。

相關文章
相關標籤/搜索