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串口通信模块(当然用山外助手也是一样可行的):

ROS项目开发实战(一)——STM32与ROS串口通信_第1张图片  

图 1

  在ROS下主要运用asio,本人找了许多方法,这种比较简洁实用,接下来就是在ROS下设置与底层相匹配的通信协议格式了,按照图1相应的设置程序如下:

#include                   
#include 
//asio头文件

#include 
#include
#include   
//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回调函数中。)


你可能感兴趣的:(ROS)