序
本文主要发布一些作者从零开始开发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回调函数中。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)