欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-22 10:08:46
...

一、Ubuntu下的串口助手cutecom

下载:sudo apt-get install cutecom
打开:sudo cutecom
ROS学习篇(三)ROS系统的串口数据读取和解析(组合导航系统)
查看电脑链接的串口信息(名称):

dmesg | grep ttyS*

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

二、使用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版本

进入下载的软件包的位置

roscd serial

若是安装成功会看到:

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

新建工作空间级程序包:

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

在新建的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}
 )

运行roscore,运行节点看是否能打开串口。如果提示Unable to open port,是由于权限不够引起的,进行如下操作
创建文件:(若使用的是ttyACM将ttyusb替换即可)

sudo gedit /etc/udev/rules.d/70-ttyusb.rules

在打开的文件中添加

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

To be continue。

相关标签: 串口

上一篇: STM32下的USART串口通信程序

下一篇: