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

    }
}


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

leggedrobotics free gait 足式机器人自由步态 苏黎世机器人系统实验室

免费步态一种腿部机器人通用控制架构免费步态是一种用于对腿式机器人的多功能,强大和任务导向控制的软件框架。自由步态界面定义了一个全身抽象层,以适应各种任务空间控制命令,例如末端执行器,关节和基础运动。使...
  • ZhangRelay
  • ZhangRelay
  • 2017年08月15日 14:44
  • 834

基于ros---一个完整的实现topic 发布和监听的类和msg的简单使用(使用c++)

首先,需要把ID_Data.msg拷贝到当前包的msg目录内,当然可以直接新建ID_Data.msg文件在msg目录内其内容只有两行如下:  int32 id int16[8] data  然后在C...
  • hookie1990
  • hookie1990
  • 2017年01月06日 15:10
  • 1126

ros launch文件编写和节点启动顺序控制

ROS可以通过launch文件进行节点的管理、初始参数的设置,但是launch文件不能指定节点的启动顺序,因此本文简单介绍下通过launch进行节点启动管理,通过shell来控制节点启动顺序。 1,我...
  • hookie1990
  • hookie1990
  • 2016年12月28日 16:32
  • 1903

如何在ROS环境中解码.bag格式数据

由于Udacity开源的数据使用了.bag格式,所以在解码其数据的时候,废了一番周折。首先,查看.bag文件信息使用rosbag info **.bag,具体如图所示:然后,根据上面信息修改expor...
  • lanyuxuan100
  • lanyuxuan100
  • 2017年04月10日 18:47
  • 1519

通过ROS的Node(节点)调用bhand_controller服务实现barrett_hand基本动作控制

简介:编写一个node,实现通过该node进行barrett机械手的初始化。bhand_controller提供很多关于机械手操作的服务,如我们可以通过终端运行下面命令: $ rosservice c...
  • hookie1990
  • hookie1990
  • 2016年08月18日 22:38
  • 734

ros talker listener主要基本api 介绍

1 void ros::init void ros::init ( const M_string &  remappings,     const std::string &...
  • hookie1990
  • hookie1990
  • 2016年08月17日 15:44
  • 671

ros节点/话题/服务...管理工具multimaster_fkie的安装和简单使用

源码在https://github.com/fkie/multimaster_fkie/tree/indigo-devel,新建一个ros工作空间,或直接在当前工作空间的src目录下,git git ...
  • hookie1990
  • hookie1990
  • 2017年02月17日 09:54
  • 666

ROS学习--如何结合launch文件使用参数服务器

ROS学习--如何结合launch文件使用参数服务器 ROS(Robot Operating System)接触了将近两年了,最常用的也就是发布话题与订阅话题,前一段时间刚刚把Rviz与/t...
  • hookie1990
  • hookie1990
  • 2016年12月26日 22:58
  • 578

使用qt开发ros应用

利用Qtcreator编写ROS程序,你必须先确保在启动qtcreator环境时把ros环境也添加进了。(类似于你启动终端  会先加载~/.bashrc配置相应环境变量信息) 修改qt creato...
  • hookie1990
  • hookie1990
  • 2016年07月21日 22:05
  • 826

《ROS精品入门》学习笔记四:ROS中的空间描述与变换

一.学习内容 本节课主要讲了一下内容: 1.空间描述与变换的基本概念 2.ROS中tf的使用方法 3. tf使用示例。示例一:使用tf使一个turtle跟踪另一个turtle;示例二:使...
  • NNNNNNNNNNNNY
  • NNNNNNNNNNNNY
  • 2016年09月22日 11:08
  • 2770
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ROS多进程回调的实现 ROS Using different ros::CallbackQueue
举报原因:
原因补充:

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