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就是類實例中中的全局變量了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM