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 创建功能包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.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"
		}
	]
}

2、发布者代码 C++

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

2.1 代码部分

#include "ros/ros.h"
#include "std_msgs/String.h" //普通文本类型的消息
#include <sstream>

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;
}

2.2 CMakeLists.txt部分

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

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

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;
}

3.2 CMakeLists.txt部分

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

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

4、代码测试

4.1 启动rosmaster

roscore

4.2 启动 lee_pub 节点

rosrun lee lee_pub 

4.3 启动 lee_sub 节点

rosrun lee lee_sub 

5、结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值