ROS多進程回調的實現 ROS Using different ros::CallbackQueue

總體上分爲一下步驟:

1 用 ros::CallbackQueue定義需要的回調隊列;

ros::CallbackQueue state_callback_queue;

2 將回調隊列初始化進subscriber中。例如下面所示:

ros::SubscribeOptions ops=ros::SubscribeOptions::create<bhand_controller::State>(
                "/bhand_node/state",
                1,
                state_callback,
                ros::VoidPtr(),
                &state_callback_queue
                )

ros::Subscriber listen_state=bhand_state.subscribe(ops);
3 定義ros::AsyncSpinner,並初始化回調隊列,第一個參數代表幾個進程,但是目前並不知道有什麼特殊用處。

ros::AsyncSpinner state_spinner(1,&state_callback_queue);
4 啓動調用。

state_spinner.start();
備註:

(1) 注意subscriber的緩存隊列的大小,會影響回調結果,這與ROS的回調機制相關,ROS在發生回調是會將所有隊列中的消息分別送往回調函數中,因此如果隊列未被及時更新,可能出現多次重複響應,因此建議設置爲1,或者慎重考慮下運行頻率相關。

(2)可通過在回調函數中加標誌位的方式實時停止回調。下面在回調函數中使得init_state_flag置1,break跳出while或for的循環.

    while(ros::ok())
    {
        if(init_state_flag == 1)
        {
            state_spinner.stop();
            break;
        }
        state_spinner.start();

    }

(3)不要把初始化的定義語句,諸如ros::Subscriber listen_state=bhand_state.subscribe(ops);放在沒有ros.sleep的while(ros::ok()),否則會不能觸發消息回調,而且編譯不會提示任何問題。

5 該部分完整的實例如下;

ros::CallbackQueue state_callback_queue;
void state_callback(const bhand_controller::State::ConstPtr& msg)
{

    .......

    init_state_flag=1;//也可在需要位置置1
}
int main(int argc,char **argv)
{
    ros::init(argc,argv,"example_srv_bhand");

    //monitor the state of the hand.
    ros::NodeHandle bhand_state;

    ros::SubscribeOptions ops=ros::SubscribeOptions::create<bhand_controller::State>(
                "/bhand_node/state",
                1,
                state_callback,
                ros::VoidPtr(),
                &state_callback_queue
                );
    ros::Subscriber listen_state=bhand_state.subscribe(ops);
    
    ros::AsyncSpinner state_spinner(1,&state_callback_queue);

    while(ros::ok())
    {
        if(init_state_flag == 1)
        {
            state_spinner.stop();
            break;
        }
        state_spinner.start();

    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章