ROS+VScode 话题通信 发布方&订阅方

目录

1、建立工作目录

1.1建立文件

1.2VScode内

1.3运行:

1.4查看接受的信息

 2、发送方

2.1文件结构

2.2代码及注释说明

3、订阅方

3.1文件结构

3.2代码及注释说明

4、运行结果


1、建立工作目录

1.1建立文件

mkdir -p ZTest/src
cd ZTest
catkin_make
code.

1.2VScode内

打开VScode利用SSH连接主机到ZTest,对src目录执行:


建立工作包(自己命名),我这里命名的是plumbing_pub_sub


再弹出一个框输入:rospy roscpp std_msgs(依赖包)

1.3运行:

1.3、1.4是第二三部分撰写完毕后再执行的,第二部分建立的文件是demo01_pub.cpp(发送方文件),第三部分建立的是demo02_sub.cpp(接收方文件)

在文件撰写完毕后这样做

修改CMakeLists.txt(135行左右):
add_execytable(文件名(映射名称1)  文件地址)


target_link_libraries(同文件名(映射名称1)
 {  }
)

 

修改完毕后:

先编译:shift+ctrl+b
再添加终端(bash):roscore(运行ros核心,运行一次即可)

再次添加终端(bash):source  ./devel/setup.bash
    rosrun  包名 文件名(映射名1)   (eg rosrun plumbing_pub_sub demo02_sub)

1.4查看接受的信息

接受数据打印:
rostopic echo fang//打印键名为fang的信息

 2、发送方

2.1文件结构

2.2代码及注释说明

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>

/*
    发布方:
    1、包含头文件
        ROS中文本类型-》std_msgs/String.h
    2、初始化ROS
    3、创建节点句柄
    4、创建发布者对象
    5、编写发布逻辑并发布数据
*/
int main(int argc,char *argv[])
{
    setlocale(LC_ALL,"");//解决中文乱码问题

    //2、初始化ROS节点
    ros::init(argc,argv,"out");//发出
    //3、创建节点句柄
    ros::NodeHandle nh;
    /*
    4、创建发布者对象 
    nh.advertise<M>(string &topic,int32 queue_size);
        M:发布类型
        string:字符串类型,主题,自己定义
        queue_size:消息长度(int32),用于缓冲,是queue类型,多了将前面的挤出
    */
    ros::Publisher pub=nh.advertise<std_msgs::String>("fang",10);
    /*
    5、编写发布逻辑并发布数据
    //要求以10HZ频率发布,文本后添加编号
    //循环发布
    */
    //先创建被发布的消息
    std_msgs::String msg;
    ros::Rate rate(1);//1HZ
    //编写循环,循环中发布数据 

    //设置编号
    int count=0;
    //休眠三秒钟防止前几条数据不能发出,句柄还在注册
    //ros::Duration(3).sleep();
    while(ros::ok()){
        count++;
        msg.data="hello";

        std::stringstream ss;
        ss<<"hello"<<count;

        msg.data=ss.str();

        pub.publish(msg);//发布对象内容是msg

        //添加日志:
        ROS_INFO("发布的数据是:%s",ss.str().c_str());
        
        rate.sleep();//睡0.1秒
        ros::spinOnce();//处理回调函数
    }      
    return 0;
}

3、订阅方

3.1文件结构

同2.1

3.2代码及注释说明

/*
    实现流程:
        1.包含头文件 
        2.初始化 ROS 节点:命名(唯一)
        3.实例化 ROS 句柄
        4.实例化 订阅者 对象
        5.处理订阅的消息(回调函数)
        6.设置循环调用回调函数

*/
// 1.包含头文件 
#include "ros/ros.h"
#include "std_msgs/String.h"

void doMsg(const std_msgs::String::ConstPtr& msg_p){
    //msg_p表示传入的消息,通过msg_p处理数据
    ROS_INFO("我听见:%s",msg_p->data.c_str());
    // ROS_INFO("我听见:%s",(*msg_p).data.c_str());
}
int main(int argc, char  *argv[])
{
    setlocale(LC_ALL,"");
    //2.初始化 ROS 节点:命名(唯一)
    ros::init(argc,argv,"listener");
    //3.实例化 ROS 句柄
    ros::NodeHandle nh;

    //4.实例化 订阅者 对象
    //使用回调函数处理接受到的数据
    ros::Subscriber sub = nh.subscribe<std_msgs::String>("fang",10,doMsg);
    //5.处理订阅的消息(回调函数)

    //6.设置循环调用回调函数
    ros::spin();//循环读取接收的数据,并调用回调函数处理

    return 0;
}

4、运行结果

发送方:

订阅方:

猜你喜欢

转载自blog.csdn.net/hihui1231/article/details/121939854
今日推荐