• 2.1 发布与订阅C++


    功能介绍

    完成一个节点发布消息,另一个节点接收前一个节点发布的消息

    1、工作空间

    1.1 创建工作空间lee_ws

    mkdir -p ~/lee_ws/src
    cd ~/lee_ws/src/
    catkin_init_workspace 
    cd ~/lee_ws/
    catkin_make
    echo "source ~/lee_ws/devel/setup.bash" >> ~/.bashrc
    source devel/setup.bash 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.2 创建功能包lee

    cd ~/lee_ws/src
    catkin_create_pkg lee std_msgs rospy roscpp
    cd ~/lee_ws/
    catkin_make
    source ~/lee_ws/devel/setup.bash 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.3 VScode编辑ros参数配置

    快捷键 ctrl + shift + B 调用编译,选择:catkin_make:build这一行,点击小齿轮配置设置,修改.vscode/tasks.json 文件,将下面复制进去即可
    这么配置的原因:下一次快捷键 ctrl + shift + B直接进行代码编译
    路径: .vscode/tasks.json

    {
    	"version": "2.0.0",
    	"tasks": [
    		{
    			//代表提示的描述性信息
    			"label": "catkin_make:debug", 
    
    			//可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
    			"type": "shell",  
    
    			//这个是我们需要运行的命令
    			"command": "catkin_make",
    			
    			"args": [],
    		   
    			"group": {"kind":"build","isDefault":true},
    			
    			//可选always或者silence,代表是否输出信息			
    			"presentation": {"reveal": "always"},
    			
    			"problemMatcher": "$msCompile"
    		}
    	]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    2、发布者代码 C++

    路径: /home/lee/lee_ws/src/lee/src/lee_pub.cpp

    2.1 代码部分

    #include "ros/ros.h"
    #include "std_msgs/String.h" //普通文本类型的消息
    #include 
    
    int main(int argc, char  *argv[])
    {   
        //解决在终端上打印中文不会出现乱码,二选一或两个一起选都行
        setlocale(LC_CTYPE, "zh_CN.utf8");
        setlocale(LC_ALL, "");
    
        //初始化节点:命名(唯一)
        // 参数1和参数2 为节点传值使用
        // 参数3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一
        ros::init(argc,argv,"lee_pub");
    
        //实例化节点句柄
        ros::NodeHandle nh;
        
        //创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::String
        ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);
    
        //组织发布的数据
        std_msgs::String msg;  //创建 msg 对象
        std::string msg_Basics = "数字:"; 
        int count = 0; //消息计数器
    
        //等待3秒钟,让publisher有足够的时间完成roscore注册,不然还未注册成功就开始发送消息了
        ros::Duration(3.0).sleep(); 
    
        //设置循环周期1秒6次的频率
        ros::Rate F(6);
    
        //节点存在,ros::ok()为1
        while (ros::ok())
        {
            //使用 stringstream 拼接字符串与编号
            std::stringstream ss;
            ss << msg_Basics << count;//数据拼接
            msg.data = ss.str();
    
            //发布消息
            pub.publish(msg);
            //终端打印发布的消息
            ROS_INFO("发布的消息为:%s",msg.data.c_str());
    
            //延时
            F.sleep();
            count++;
            ros::spinOnce();
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    2.2 CMakeLists.txt部分

    在install上面直接添加如下代码即可

    add_executable(lee_pub src/lee_pub.cpp)
    target_link_libraries(lee_pub ${catkin_LIBRARIES})
    
    • 1
    • 2

    3、订阅者代码 C++

    路径: /home/lee/lee_ws/src/lee/src/lee_sub.cpp

    3.1 代码部分

    #include "ros/ros.h"
    #include "std_msgs/String.h"
    
    //接收到订阅的消息后,进入回调函数
    void chatterCallback(const std_msgs::String::ConstPtr& msg){
    
        ROS_INFO("接收到了:%s",msg->data.c_str());
    
    }
    
    int main(int argc, char  *argv[])
    {
        //解决在终端上打印中文不会出现乱码,二选一或两个一起选都行
        setlocale(LC_CTYPE, "zh_CN.utf8");
        setlocale(LC_ALL, "");
    
        //初始化节点:命名(唯一)
        // 参数1和参数2 为节点传值使用
        // 参数3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一
        ros::init(argc,argv,"lee_sub");
    
        //实例化节点句柄
        ros::NodeHandle nh;
    
        //创建一个Subscriber,订阅名为chatter的topic,注册回调函数为chatterCallback
        ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",10,chatterCallback);
    
        //设置循环调用回调函数
        ros::spin();//循环读取接收的数据,并调用回调函数处理
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    3.2 CMakeLists.txt部分

    在install上面直接添加如下代码即可

    add_executable(lee_sub src/lee_sub.cpp)
    target_link_libraries(lee_sub ${catkin_LIBRARIES})
    
    • 1
    • 2

    4、代码测试

    4.1 启动rosmaster

    roscore
    
    • 1

    4.2 启动 lee_pub 节点

    rosrun lee lee_pub 
    
    • 1

    4.3 启动 lee_sub 节点

    rosrun lee lee_sub 
    
    • 1

    5、结果

    在这里插入图片描述

  • 相关阅读:
    智慧工地管理系统源码 智慧大屏、手机APP、SaaS模式
    《SpringBoot+Dubbo+Seata分布式事务实战》
    [2023.09.26]: JsValue的转换体验与as关键字的浅析
    35.浅谈贪心算法
    【JVM系列】- 挖掘·JVM堆内存结构
    深度学习入门(四十六)计算机视觉——区域卷积神经网络(R-CNN)系列
    电影票小程序插件 电影票CPS插件 电影票微信小程序插件
    Python基础 – 使用别人代码的模块机制
    计算机专业毕业设计演示视频(论文+系统)_kaic
    生物素标记肽Biotin-εAhx-GLKLRFEFSKIKGEFLKTPEVRFRDIKLKDN
  • 原文地址:https://blog.csdn.net/weixin_44692299/article/details/127855237