一、问题简介

自动驾驶小车的底层的数据相当一部分是通过串口发送的,以惯导为例,惯导的定位信息大概如下所示:

$GPFPD,0,1666.330,0.000,0.015,0.129,0.00000000,0.00000000,0.000,0.000,0.000,0.000,0.000,0,0,00*4E

报文中包含着丰富的车辆状态信息,通过ROS节点,拿到这些数据,并进行处理在自动驾驶中是非常重要的,本文主要介绍了利用ROS获取串口信息的方式。
点击跳至原贴。

二、ROS获取串口数据信息

  1. 下载serial包
sudo apt-get install ros-kinetic-serial  #ros为Kinect版本

2.编写ros节点cpp文件

#include <ros/ros.h>
#include <serial/serial.h>  //ROS已经内置了的串口包
#include <std_msgs/String.h>
#include <std_msgs/Empty.h> serial::Serial ser; //声明串口对象 //回调函数
void write_callback(const std_msgs::String::ConstPtr& msg)
{ ROS_INFO_STREAM("Writing to serial port" <<msg->data); ser.write(msg->data);   //发送串口数据
} int main (int argc, char** argv)
{ //初始化节点 ros::init(argc, argv, "serial_example_node"); //声明节点句柄 ros::NodeHandle nh; //订阅主题,并配置回调函数 ,此处未使用,后续通过串口发送数据可以进行配置ros::Subscriber write_sub = nh.subscribe("write", 1000, write_callback); //发布主题 ,主题为“read”ros::Publisher read_pub = nh.advertise<std_msgs::String>("read", 1000); try { //设置串口属性,并打开串口 ser.setPort("/dev/ttyS0"); //此处需要根据惯导接的串口来进行修改。ser.setBaudrate(115200); //波特率serial::Timeout to = serial::Timeout::simpleTimeout(1000); ser.setTimeout(to); ser.open(); } catch (serial::IOException& e) { ROS_ERROR_STREAM("Unable to open port "); return -1; } //检测串口是否已经打开,并给出提示信息 if(ser.isOpen()) { ROS_INFO_STREAM("Serial Port initialized"); } else { return -1; } //指定循环的频率 ros::Rate loop_rate(10); while(ros::ok()) { if(ser.available()){ ROS_INFO_STREAM("Reading from serial port\n"); std_msgs::String result; result.data = ser.read(ser.available()); ROS_INFO_STREAM("Read: " << result.data); //将接收到的信息打印在终端上read_pub.publish(result);//发送话题数据 } //处理ROS的信息,比如订阅消息,并调用回调函数 ros::spinOnce(); loop_rate.sleep(); }
} //别忘了添加serial依赖,否则编译失败

串口信息的处理

在通过上面的ROS节点可以收到串口的信息,在终端上可以显示,但是串口信息在局部的回调函数上,要想真正拿到串口信息,还要进一步处理,本文列举了部分方法

  1. 采用全局变量的方法
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>//包含流的操作的C++头文件
std::string myStr="init";//定义全局变量并进行初始化
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{std::stringstream ss;ss << msg->data.c_str();ss >> ::myStr;//通过流操作进行传参。此处不能用=,报错显示=没有被重装载。该全局变量就可以在main()中使用了。std::cout <<"copy_data is: " << myStr <<"\n";
}
int main(int argc, char **argv)
{ros::init(argc, argv, "listener");ros::NodeHandle n;ros::Subscriber sub = n.subscribe("read", 1000, chatterCallback);ros::spin();return 0;
}
  1. 使用类方法作为回调函数

代码来自:https://blog.csdn.net/xinwenfei/article/details/89384578
http://wiki.ros.org/roscpp_tutorials/Tutorials/UsingClassMethodsAsCallbacks

#include <ros/ros.h>
#include <std_msgs/String.h>
#include <sstream>/*** This tutorial demonstrates subscribing to a topic using a class method as the callback.*/// %Tag(CLASS_WITH_DECLARATION)%
class Listener
{
public:std::string copy_data = "init init init";int count = 0;
public:void callback(const std_msgs::String::ConstPtr& msg);void print_data2(){std::cout << "Copy data is :" << copy_data << "\n";}
};
// %EndTag(CLASS_WITH_DECLARATION)%void Listener::callback(const std_msgs::String::ConstPtr& msg)
{ROS_INFO("I heard: [%s]", msg->data.c_str());std::stringstream ss;ss << msg->data.c_str();ss >> copy_data;std::cout <<"copy_data is: " << copy_data <<"\n";print_data2();++count;
}int main(int argc, char **argv)
{ros::init(argc, argv, "listener_class");ros::NodeHandle n;// %Tag(SUBSCRIBER)%Listener listener;ros::Subscriber sub = n.subscribe("chatter", 1000, &Listener::callback, &listener);ros::Rate loop_rate(10);
// %EndTag(SUBSCRIBER)%while(ros::ok() and listener.count <=3){ros::spinOnce();loop_rate.sleep();}std::cout << "After spin: \n";listener.print_data2();return 0;
}

ROS获取串口信息及后续处理(以惯导IMU XW-GI5651为例)相关推荐

  1. ROS通过串口,读写STM32和HC-SR04超声波测距信息

    ROS通过串口,读写STM32和HC-SR04超声波传感器测距信息,ROS判断距离值,将控制信息通过串口发回给STM32,点亮led灯 ROS可以通过串口与stm32进行通信,以超声波传感器为例实现R ...

  2. Jetson nano 使用ROS 实现串口通信,并且解析通信协议(C++)

    Jetson nano 使用ROS 实现串口通信 1:首先安装ros下的serial库 sudo apt-get install ros-melodic-serial 其中的melodic根据自己的r ...

  3. windows蓝牙编程——1 扫描周边蓝牙并获取蓝牙信息

    1 需要用到的接口 代码实现的功能:搜索周边蓝牙,并提示目标蓝牙是否被搜索到 详细说明就不写了,在这里列举一下,详细说明可以看上一篇文章.或者参考windows关于蓝牙编程API的官方说明,连接在下方 ...

  4. dmidecode 命令详解(获取硬件信息)

    一.简介 DMI (Desktop Management Interface, DMI)就是帮助收集电脑系统信息的管理系统,DMI信息的收集必须在严格遵照SMBIOS规范的前提下进行. SMBIOS( ...

  5. 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( JNI 传递 Bitmap | 获取位图信息 | 获取图像数据 | 图像数据过滤 | 释放资源 )

    文章目录 一.Bitmap 图像数据处理 二.Java 层 Bitmap 对象转为 JNI 层 bitmap 对象 三.获取 bitmap 中的图像数据 四.过滤 bitmap 中的图像数据 ( 获取 ...

  6. Windows Mobile 获取基站信息(LAC,CellID)

    前言: 在做手机定位应用软件,有两种方法可以实行定位: 1.利用基站定位,通过手机获取基站信息,再根据该信息获取经纬度: 2.利用GPS定位,直接获取经纬度信息. 利弊: 1.基站定位精确度低,误差范 ...

  7. winform取CPU编号、MAC地址、硬盘信息、IP地址、串口信息

    winform取CPU编号.MAC地址.硬盘信息.IP地址.串口信息 http://www.cnblogs.com/ccczqh/archive/2011/03/28/1997480.html 作者: ...

  8. android电视打印信息解析,液晶电视获取打印信息的方法与操作

    通过本文我们先来了解一下打印信息,首先要说的就是打印信息并不要打印机,只需要我们的烧录器就可以了.打印信息是什么呢,打印信息是电视机主控送出来的一段代码,我们通过电脑或是手机来查看代码,是机器本身运行 ...

  9. 微信网页授权,获取微信code,获取access_tocken,获取用户信息

    微信开发中,经常有这样的需求:获得用户头像.绑定微信号给用户发信息.. 那么实现这些的前提就是授权! 1.配置安全回调域名: 在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的" ...

最新文章

  1. FastDFS 使用经验分享
  2. 解决项目莫名奇妙的报错问题
  3. python处理路径时 sh: 1:Syntax error: ( unexpected
  4. 可爱的朋友,你是否有很多问号
  5. Deppin系统软件打开备注
  6. 计算机网络技术基础(作业2)
  7. 盘口功夫——研判股价启动前的四种征兆----
  8. AECC2015官方破解补丁/AdobeAfterEffectsCC2015中文版免费下载(AE安装教程)
  9. Ceph分布式存储系列(六):对象存储、块存储、文件存储的区别和优缺点
  10. vue 中的slot属性(插槽)的使用
  11. CCF 201312-2 ISBN号码 C++语言实现
  12. Spring+SpringMVC+Mybatis开发
  13. ZUCC_Object Oriented Programming_Lab01 Introduction to Java
  14. 非线性规划的拉格朗日乘子法python编程python包编程
  15. 编写一个函数isprime(n).判断整数n是否为素数.编写程序使用此函数,当输入一个整数时,对它进行判断,当为素数时,输出1.否则,输出0....
  16. SQL中一些实用的快捷键
  17. 利用android的通知Notification来实现msn的登录状态
  18. Burpsuite+夜神模拟器对app抓包(安卓7及其以上)
  19. React的React.FC与React.Component的初步认识
  20. 计算机图形处理与应用程序,计算机图形处理与应用

热门文章

  1. 酷炫的图片轮播框架AndroidImageSlider
  2. idea运行报路径不存在
  3. Flask03_路由传参
  4. Parasoft全面发布最广泛的MISRA规则覆盖
  5. STM32——外部中断
  6. Java+SSM网上订餐系统点餐餐厅系统(含源码+论文+答辩PPT等)
  7. 不入门级代码教程(仅供参考)
  8. PCL教程-点云滤波之体素滤波器(下采样)
  9. android 双卡铃声,铃声多多双卡版
  10. springmvc的工作原理