博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ROS系统的串口数据读取和解析
阅读量:4083 次
发布时间:2019-05-25

本文共 2512 字,大约阅读时间需要 8 分钟。

 

摘自:

ROS学习篇(三)ROS系统的串口数据读取和解析(组合导航系统)

2018-08-02 13:56:47 14151

分类专栏: 文章标签:

版权

一、Ubuntu下的串口助手cutecom

下载:sudo apt-get install cutecom

打开:sudo cutecom
这里写图片描述
查看电脑链接的串口信息(名称):

dmesg | grep ttyS*
  • 1

这里写图片描述

二、使用ROS提供的serial包实现串口通信

参考:

首先,下载serial软件包:

sudo apt-get install ros-kinetic-serial  #ros为Kinect版本
  • 1

进入下载的软件包的位置

roscd serial
  • 1

若是安装成功会看到:

$:/opt/ros/kinetic/share/serial
  • 1

新建工作空间级程序包:

cdmkdir -p serialPort/srccd serialPortcatkin_makesource devel/setup.bashcd srccatkin_create_pkg serialPort std_msgs roscpp serialcd serialPort/srctouch serialPort.cpp
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在新建的serialPort.cpp中复制如下代码:

#include 
#include
//ROS已经内置了的串口包 #include
#include
serial::Serial ser; //声明串口对象 //回调函数 void write_callback(const std_msgs::String::ConstPtr& msg) { ROS_INFO_STREAM("Writing to serial port" <
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); //发布主题 ros::Publisher read_pub = nh.advertise
("read", 1000); try { //设置串口属性,并打开串口 ser.setPort("/dev/ttyUSB0"); 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(50); 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(); } }

连接串口设备,通过第一部分给出的查看电脑连接串口号,更改上述程序中的ser.setPort("/dev/ttyUSB0");

更改CMakeList.txt文件,添加如下两行:

add_executable(${PROJECT_NAME}_node src/serialPort.cpp)add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})target_link_libraries(${PROJECT_NAME}_node   ${catkin_LIBRARIES} )
  • 1
  • 2
  • 3
  • 4
  • 5

运行roscore,运行节点看是否能打开串口。如果提示Unable to open port,是由于权限不够引起的,进行如下操作

创建文件:(若使用的是ttyACM将ttyusb替换即可)

sudo gedit /etc/udev/rules.d/70-ttyusb.rules
  • 1
  • 2

在打开的文件中添加

KERNEL=="ttyUSB[0-9]*", MODE="0666"
  • 1

To be continue。

你可能感兴趣的文章
通过mavlink实现自主航线的过程笔记
查看>>
Ardupilot飞控Mavlink代码学习
查看>>
这些网站有一些嵌入式面试题合集
查看>>
我觉得刷题是有必要的,不然小心实际被问的时候懵逼,我觉得你需要刷个50份面试题。跟考研数学疯狂刷卷子一样!
查看>>
我觉得嵌入式面试三要素:基础吃透+项目+大量刷题,缺一不可。不刷题是不行的。而且得是大量刷,刷出感觉套路,别人做题都做得是固定题型套路条件反射了,你还在那慢慢理解慢慢推是不行的,也是考研的教训。
查看>>
相机标定的目的:获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的选择和平移矩阵),内参和外参系数可以对之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像。
查看>>
现在来看,做个普罗米修斯的docker镜像对我而言并不难,对PX4仿真环境配置也熟悉了。
查看>>
删除docker容器和镜像的命令
查看>>
VINS-Fusion Intel® RealSense™ Depth Camera D435i
查看>>
使用Realsense D435i运行VINS-Fusion并建图
查看>>
gazebo似乎就是在装ROS的时候一起装了,装ROS的时候选择的是ros-melodic-desktop-full的话。
查看>>
React + TypeScript 实现泛型组件
查看>>
TypeScript 完全手册
查看>>
React Native之原理浅析
查看>>
Git操作清单
查看>>
基础算法
查看>>
前端面试
查看>>
React Hooks 异步操作踩坑记
查看>>
聊聊编码那些事,顺带实现base64
查看>>
TypeScript for React (Native) 进阶
查看>>