看別人的代碼真的是很好的學習過程啊
之前用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就是類實例中中的全局變量了