帮助自己记录一些ros的基础知识3(最基础的话题通信,回调函数)

本文展示了如何在ROS环境中创建一个发布者节点和订阅者节点进行通信。发布者节点设置话题并按一定频率发送消息,订阅者节点则监听同一话题并调用回调函数处理接收到的消息。C++代码中包含了ROS节点的初始化、消息类型定义及消息发布与订阅的实现。
摘要由CSDN通过智能技术生成

1.发布方

   二者需要设置相同的话题

//1.包含头文件

#include "ros/ros.h"

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

#include <sstream>

int main(int argc, char  *argv[])

{  

    //设置编码让中文能够使用

    setlocale(LC_ALL,"");

    //2.初始化 ROS 节点

    // 参数1为参数个数和参数2为参数列表 参数3 是节点名称(必须唯一)

    ros::init(argc,argv,"talker");

    //3.实例化 ROS 句柄

   //n 是全局命名空间 nh 是局部命名空间(目前不清楚有啥用)

    ros::NodeHandle nh;//该类封装了 ROS 中的一些常用功能

    //4.实例化 发布者 对象

 

//Publisher advertise(const std::string& topic, uint32_t queue_size, bool latch = false)

//1发布消息使用的话题 2等待发送给订阅者的最大消息数量大于这个数要清除

//如果为 true,该话题发布的最后一条消息将被保存,并且后期当有订阅者连接时会将该消息发送给//订阅者   

ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);

    //5.组织被发布的数据,并编写逻辑发布数据

    //数据(动态组织)

    std_msgs::String msg;

    std::string msg_front = "卷死咯"; //消息前缀
 

    //逻辑(一秒10次)

    ros::Rate r(1);

    while (ros::ok())    //节点不死这个ros::ok就是为1就能一直循环

    {

        //使用 stringstream 拼接字符串与编号

        std::stringstream ss;

        ss << msg_front << count;

        msg.data = ss.str();

        //发布消息

        pub.publish(msg);

        //加入调试,打印发送的消息

        ROS_INFO("发送的消息:%s",msg.data.c_str());

        //根据前面制定的发送频率自动休眠 休眠时间 = 1/频率;

        r.sleep();

        ros::spinOnce();//回调函数只回调一次

    }

    return 0;

}

2.订阅方

// 1.包含头文件

#include "ros/ros.h"

#include "std_msgs/String.h"

void doMsg(const std_msgs::String::ConstPtr& 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.实例化 订阅者 对象
//1订阅的话题2消息队列长度,超出长度时,头部的消息将被弃用

//3当订阅到一条消息时,需要执行的回调函数4

    ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",10,doMsg);

    //     5.设置循环调用回调函数

    ros::spin();//循环读取接收的数据,并调用回调函数处理与上面spinonce不同为多次循环

    return 0;

}

3.Cmakelist.txt文件

  以前总结过

4.回调函数

spinOnce();回调一次在循环体内,处理所有可用的回调函数

spin();进入循环处理回调

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值