ROS多进程回调的实现 ROS Using different ros::CallbackQueue

原创 2016年08月31日 10:37:12

总体上分为一下步骤:

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();

    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

ROS学习之 cpp定时器

wiki链接: http://wiki.ros.org/roscpp/Overview/Timers      http://wiki.ros.org/roscpp_tutorials/Tutori...

ROS学习(十三):time 和 Timer

介绍 ROS 中的时刻、时间间隔、定时器的定义和应用。

linux使用定时器回调函数示例

liunx使用setitimer()函数设置定时器,一定间隔后触发回调函数。#include #include #include #include #include void timer_ha...

我的ROS入门(五):总算搞通ROS的服务节点订阅发布消息话题了

总算搞通ROS的服务节点订阅发布消息主题了。可以实习那几个东西。 记录一下吧,首先要一个工作空间。 在当前系统用户的home目录下的.bashrc文件中添加source /opt/ros/jade/s...

【ROS学习】(十)ROS Network(2)

上一篇所提到的ROS系统之间的网络通讯,是通过将所有机器连接到一个ros master端口,实现不同机器之间消息的传递。这种方式有个潜在的缺陷,那就是整个网络中只能存在一个ros master,相当于...

ros消息时间同步与回调

最近做ekfslam,有两个数据输入/odom 与/ img信息,刚开始这两个都是通过rosbag包回放,分别有两个toptic订阅回调函数触发不同的处理. 这在后面处理的时候又需要对这两数据进行相...

ROS学习之 cpp回调函数和轮转(spin)

wiki链接: http://wiki.ros.org/roscpp/Overview/Callbacks%20and%20Spinning 资料(云飞机器人实验室的一篇小文): http://ww...

ROS学习(十四):ROS Spinning

ROS 单线程与多线程 Spinning
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)