1. 程式人生 > >ROS專案開發實戰(一)——STM32與ROS串列埠通訊

ROS專案開發實戰(一)——STM32與ROS串列埠通訊

    本文主要釋出一些作者從零開始開發ROS的專案實戰經驗,包括一些經驗與本文遇到坑時的解決方案,ROS因為版本不同與開發環境不同在實際開發中會遇到各類問題,下面就細細道來。

一、環境搭建

    本人開發環境 ——上位機:MAC主機+PD虛擬機器+Ubuntu12.04(64位)+Hydro,底層:STM32F407    

先說下為什麼是PD虛擬機器,現在主流的電腦安裝Ubuntu容易出現沒有無線網絡卡驅動的問題(如果你的電腦有請忽略),虛擬機器不用擔心網絡卡問題,並且虛擬機器安裝Ubuntu更方便(如果你的電腦是UEFI,安裝Ubuntu將會遇到一些麻煩),相比之下虛擬機器其實用起來更方便一些(本人直觀感受)。

現在很多人用Ubuntu14.04+indigo,本人也建議用14.04,本文通訊程式碼在兩個版本下都可以順利執行。

二、STM32與ROS串列埠通訊

    本人STM32串列埠通訊模組(當然用山外助手也是一樣可行的):

  

圖 1

  在ROS下主要運用asio,本人找了許多方法,這種比較簡潔實用,接下來就是在ROS下設定與底層相匹配的通訊協議格式了,按照圖1相應的設定程式如下:

#include <boost/asio.hpp>                  
#include <boost/bind.hpp>
//asio標頭檔案

#include <ros/ros.h>
#include<stdio.h>
#include <std_msgs/String.h>  
//ros標頭檔案 
using namespace std;
using namespace boost::asio;  
using namespace ros;  
    
io_service iosev;
serial_port sp(iosev,"/dev/ttyUSB0");
//全域性定義主要是為了在ros回撥函式中使用,/dev/ttyUSB0根據自己實際情況修改
之後是ros主程式:
int main(int argc, char** argv) {
    ros::init(argc, argv, "boost");       //
    ros::NodeHandle n;                      //
    
    sp.set_option(serial_port::baud_rate(115200));
    sp.set_option(serial_port::flow_control(serial_port::flow_control::none));
    sp.set_option(serial_port::parity(serial_port::parity::none));
    sp.set_option(serial_port::stop_bits(serial_port::stop_bits::one));
    sp.set_option(serial_port::character_size(8));//按照圖1進行通訊設定
    
    ros::spin();
    unsigned char date[6]={0x55,0x7a,0x01,0x07,0x00,0xd7};
//通訊命令,按照自己的實際情況修改,底層一般是16進位制按位校驗,位的宣告可為unsigned char
    
     write(sp, buffer(date, 6));//命令寫入
     read(sp, buffer(buf,100));//接收底層反饋資訊,buf若顯示未定的可自行定義
     iosev.run();
    return 0;
}
以上命令只是傳送一次,在ROS下最好建立cmd_pub與cmd_sub命令接收與釋出者,並在/STM32_cmd話題上進行資訊互動,即可完成命令的實時釋出與獲取,以下部分可自己編寫。(提示:在main中建立pub與sub,將date與write放在sub回撥函式中。)