栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

ros知识点2:ros节点订阅话题(包含用C++类处理回调函数)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ros知识点2:ros节点订阅话题(包含用C++类处理回调函数)

1 创建节点订阅话题
#include"ros/ros.h"
#include"std_msgs/String.h"
void doMsg(const std_msgs::String::ConstPtr &msg)
{
    // 通过msg获取并操作订阅到的数据
    ROS_INFO("翠花订阅的数据:%s",msg->data.c_str());

}
int main(int argc, char *argv[])
{
    // 解决中文乱码问题
    setlocale(LC_ALL,"");
    // 初始化ros节点
    ros::init(argc,argv,"GuiHua");
    // 创建节点句柄
    ros::NodeHandle nh;
    // 创建订阅者对象
    ros::Subscriber sub=nh.subscribe("fang",10,doMsg);
    ros::spin();

    return 0;
}

程序解读:
订阅节点话题,并用回调函数对该话题进行处理

   ros::Subscriber sub=nh.subscribe("fang",10,doMsg);

回调函数的消息类型 std_msgs::String来自于fang的消息格式,ConstPtr &msg是一个常引用指针

void doMsg(const std_msgs::String::ConstPtr &msg)
2 订阅话题时,将订阅函数写入c++类中
// 将回调函数放在类中
#include"ros/ros.h"
#include"std_msgs/String.h"
class chatter_sub
{

public:
    chatter_sub(){};
    void chatterCallback(const std_msgs::String::ConstPtr &msg){
        // 通过msg获取并操作订阅到的数据
    ROS_INFO("翠花订阅的数据:%s",msg->data.c_str());
    };
    ~chatter_sub();
};

chatter_sub::~chatter_sub()
{
}

int main(int argc, char*argv[])
{
    // 解决中文乱码问题
        setlocale(LC_ALL,"");
    ros::init(argc,argv,"GuiHua_class");
    ros::NodeHandle nh;
    chatter_sub s8;
    ros::Subscriber sub=nh.subscribe("fang_class",1000,&chatter_sub::chatterCallback,&s8);
    ros::spin();
    return 0;
}

代码实现流程如下:
(1)ros初始化节点
(2)创建节点句柄
(3)创建类对象chatter_sub s8;类的构造函数中默认为空
(3)写入订阅话题的函数
ros::Subscriber sub=nh.subscribe(“fang_class”,1000,&chatter_sub::chatterCallback,&s8);
fang_class为订阅节点话题名,1000为队列长度,&chatter_sub::chatterCallback为回调函数,另外还需要传入一个参数(类的)

3 1和2回调函数的区别

在定义subscriber时和不使用类时有很大的不同.
不使用类时,我们是这么写的

ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);

使用类时,我们是这么写的

ros::Subscriber sub = n.subscribe("chatter", 1000, &subInt8::chatterCallback, &s8);

即原来我们只需要把回调函数名作为参数写在n.subscribe中,现在我们需要用&类名::函数名代替原来那个参数,之后还需要增加一个参数,即在定义subscriber之前定义好的类的对象名&对象名.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/347441.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号