ROS系统的串口数据读取和解析

摘自:https://blog.csdn.net/Tansir94/article/details/81357612?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-3-81357612.nonecase&utm_term=ros%20%E6%9F%A5%E7%9C%8Bttyusb0&spm=1000.2123.3001.4430

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

Tansir94 2018-08-02 13:56:47 14151 收藏 83

分类专栏: ROS学习篇 文章标签: 串口

版权

一、Ubuntu下的串口助手cutecom

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

dmesg | grep ttyS*
  • 1

这里写图片描述

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

参考:
https://blog.csdn.net/u014695839/article/details/81209082

https://zm12.sm-tc.cn/?src=l4uLj4zF0NCIiIjRnJGdk5CYjNGckJLQq5CQhrOamtCP0MnOz8vHyczRl4uSkw%3D%3D&uid=712f083c01cd636faabd3f599a744351&hid=5f6a9b7ebab420e7dfe77286863c8963&pos=5&cid=9&time=1533273988450&from=click&restype=1&pagetype=0000004000000402&bu=news_natural&query=ROS%E7%B3%BB%E7%BB%9F%E4%B8%8B%E4%B8%B2%E5%8F%A3%E7%BC%96%E7%A8%8B&mode=&v=1&force=true&wap=false&uc_param_str=dnntnwvepffrgibijbprsvdsdichei

首先,下载serial软件包:

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

进入下载的软件包的位置

roscd serial
  • 1

若是安装成功会看到:

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

新建工作空间级程序包:

cd
mkdir -p serialPort/src
cd serialPort
catkin_make
source devel/setup.bash
cd src
catkin_create_pkg serialPort std_msgs roscpp serial
cd serialPort/src
touch serialPort.cpp
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在新建的serialPort.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); 
      //发布主题 
      ros::Publisher read_pub = nh.advertise<std_msgs::String>("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。

猜你喜欢

转载自blog.csdn.net/sinat_16643223/article/details/108894538
今日推荐