zoukankan      html  css  js  c++  java
  • Subscribe的第四个参数用法

    看别人的代码真的是很好的学习过程啊

    之前用Subscribe订阅的时候都是简单的用法形如:

    ros::Subscriber sub = node.subscribe<uhf_rfid_api::UhfRfid>("messageepc", 0, rfid_callback) ;

    这样只用三个参数。

    然后在实际中,如果想要给回调函数传参数可以用C++ 的boost库中的boost::bind() 函数,如:

    image_transport::Subscriber sub = it.subscribe(topic_root + "/camera/image", 0, boost::bind(image_callback, _1, &pub_vt));

    这里,boost::bind中的第一个参数是回调函数名,第二个 _1 是一个占位符,因为回调函数image_callback的第一个参数是msg,要给它留位置。第三个,就是传的一个参数。以此扩展,如果想要传两个参数,这样:boost::bind(image_callback, _1, &pub_vt, &pub_odo),不要把_1当做参数个数哈

    然后在回调函数里面,这样用:

    void image_callback(sensor_msgs::ImageConstPtr image, ros::Publisher * pub_vt)

    就可以把参数写在第二个实参的位置了O(∩_∩)O

    然后来说今天的重点,我学到的第四个参数的用法,先上示例:

    ros::Subscriber mysub = nh.subscribe("/move_cmd", 0, &Robot::moveCallback, &tars);

    在API里的原型是这样的:

    template<class M , class T >
    Subscriber ros::NodeHandle::subscribe(const std::string &        topic,
                                          uint32_t                   queue_size,
                                          void(T::*)(M)              fp,
                                          T *                        obj,
                                          const TransportHints &     transport_hints = TransportHints() 
                                          )                          [inline]

    看上面原型要注意的是回调函数,应该是和第四个参数的在同一个类中,上面的例子是都在类T中,并且fp和obj都是指针类型 * 的。

    解释下用法,第四个参数的T* obj是将类T的对象实例的指针传给同类的回调函数,void(T::*)(M)  fp。因此在实例类obj中,如果改了一个变量的值,在回调函数中也能体现出来。这样,就相当于类中使用全局变量了。

    好了,解释完了,放我实现的栗子:

    void Robot::moveCallback(const fsm_robot::rcmd_move msg)
    {
      cmd_int = n;
      n++;
    }

    这里,cmd_int就是类实例中中的全局变量了

  • 相关阅读:
    htmilunit-- 针对抓取js生成的数据
    httpClient get方式抓取数据
    post方式的数据抓取
    利用win10自带的系统配置禁止开机启动项和程序
    linq中怎么实现多条件关联的左右连接
    win10提示管理员已阻止你运行此应用,如何强制运行
    远程连接SQL Server 2014遇到的问题和解决
    eclipse中删除多余的tomcat server
    resultMap之collection聚集
    empty()和remove()的区别
  • 原文地址:https://www.cnblogs.com/wlzy/p/6800828.html
Copyright © 2011-2022 走看看