iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
0
Software Development

ROS進階學習筆記系列 第 4

Day 04 - Callback Function Arguments加在哪?

  • 分享至 

  • xImage
  •  

延續昨天的callback function,今天來講講callback function要如何input其他參數吧!
有時候我們想在呼叫callback的時候可以參考到其他的參數進行運算,但是官網上的範例code在撰寫subscriber時總是只讓callback input收到的那個message啊,通常長得像這樣:

in python:
rospy.Subscriber("topic", msg_type, callback)

in c++:
ros::Subscriber sub = n.subscribe("topic", 1000, callback);

而他們所呼叫的callback function就會只input一個參數,也就是傳進來的message物件:

in python:
def callback(data):
    rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)

in c++:
void callback(const std_msgs::String::ConstPtr& msg){
    ROS_INFO("I heard: [%s]", msg->data.c_str());
}

那我們究竟要如何在callback函式後面多加幾個input呢? 就讓我們繼續看下去吧 (´・ω・`)

python版

python版其實超級簡單直觀的,就是把參數加在後面就對了XD,如果需要兩個以上參數的話就需要用()包起來,他會被視為一個list傳入callback中,如下:

#input 一個參數時:
def callback(data, arg):
    rospy.loginfo(data, arg)

sub = rospy.Subscriber("topic", message_type, callback, arg)


#input 兩個以上參數時:
def callback(data, args):
    arg1 = args[0]
    arg2 = args[1]

sub = rospy.Subscriber("topic_name", String, callback, (arg1, arg2))

雖然其實很簡單,但是因為ROS官網沒有這個範例,所以我還是記錄在這邊,供大家和我未來需要用到時做參考。

c++版

c++板就沒這麼容易了QQ,官網說明C++版本其實並沒有設計可以提供input參數的方法,網路上有教學可以使用boost::bind()操作,但是我試過覺得很不方便XD 所以我後來都用物件打包的方式,覺得方便操作又有程式可讀性,推廣給大家參考XD

class Listener
{
private:
    int arg1;
    bool arg2;
public:
  void callback(const std_msgs::String::ConstPtr& msg);
};

//in function def:
void Listener::callback(const std_msgs::String::ConstPtr& msg){
    //arg1 and arg2 can be called here
}

//in main function:
    Listener listener;
    ros::Subscriber sub = n.subscribe("topic", 1000, &Listener::callback, &listener);

當然還是可以使用boost::bind()進行操作啦,不過有興趣的可以自己去看連結XD

Reference

http://www.minsung.org/2018/07/passing-arguments-to-python-callback-in-rospy-ros/
http://wiki.ros.org/roscpp_tutorials/Tutorials/UsingClassMethodsAsCallbacks
https://android.developreference.com/article/13485026/ROS+subscribe+callback+-+using+boost%3A%3Abind+with+member+functions


上一篇
Day 03 - Callback Function的好朋友 Spin & SpinOnce
下一篇
Day 05 - Publish Topic 要做Header好麻煩?
系列文
ROS進階學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言