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回調函數中。)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章