• 编写ros串口节点,使用官方serial包


    参考http://www.roswiki.com/read.php?tid=557&fid=39

    1.通过sudo apt-get install ros-<distro>-serial下载ROS对应版本的工具包

    serial会安装在opt/ros/<distro>/share/serial目录下,

    重启终端,输入 roscd serial,可以检测到serial包的路径,说明serial包已经安装成功

    2.使用ros自带的serial包,编写节点

    #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(); 
      
        } 

  • 相关阅读:
    day 13 闭包函数,装饰器,迭代器
    day12 可变长参数、函数对象、函数的嵌套、名称空间和作用域
    day11 文件的高级应用、文件修改的两种方式、函数的定义、函数的三种定义方式、函数的调用、函数的返回值、函数的参数
    数字类型内置方法
    基本语法之for循环
    基本语法之while循环
    python基本语法(3)
    python基本语法(2)
    python基本语法(1)
    编程及计算机组成
  • 原文地址:https://www.cnblogs.com/TooyLee/p/6104863.html
Copyright © 2020-2023  润新知