程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Subscribe的第四個參數用法,subscribe參數用法

Subscribe的第四個參數用法,subscribe參數用法

編輯:C++入門知識

Subscribe的第四個參數用法,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就是類實例中中的全局變量了

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved