ros自定义消息队列

ros中默认消息队列只有一个,也就是说,即使你的话题在另外一个线程注册订阅,也会在主线程通过ros::spin / ros::spinOnce来获取到该话题的消息,并进入回调。
如果说,我们主线程需要固定频率来进行计算,而有一个服务/话题需要消耗很长时间,由于只有一个消息队列该服务会有阻塞到主线程的运算的
这里就引入了自定义消息队列,我们可以将比较耗时间的服务,或者需要分离的两类计算分别放在不同的队列中
比较常见的方式

    ros::NodeHandle nh;
    nh.setCallbackQueue(&my_callback_queue);

此时通过 nh节点句柄注册的消息或者服务都不会进入主消息队列,也就是通过ros::spin / ros::spinOnce无法在获取到该话题/服务的回调,可以使用ros::CallbackQueue::callAvailable() and ros::CallbackQueue::callOne()来手动操作

my_callback_queue.callAvailable(ros::WallDuration());

各种*Spinner对象也可以使用指向回调队列的指针,而不是使用默认的:

ros::AsyncSpinner spinner(0, &my_callback_queue);
spinner.start();

或者

ros::MultiThreadedSpinner spinner(0);
spinner.spin(&my_callback_queue);

以下为案例

#include "ros/ros.h"
#include "ros/callback_queue.h"
#include "std_msgs/Bool.h"
#include <thread>

using namespace std;

class CallOnce
{
private:
public:
  CallOnce();
  ~CallOnce();

  ros::NodeHandle nh;
  ros::NodeHandle nh2;
  ros::Subscriber test1_sub_;
  ros::Subscriber test2_sub_;
  //自定义消息队列
  ros::CallbackQueue my_queue;

  void callback1(const std_msgs::BoolConstPtr& msg);

  void callback2(const std_msgs::BoolConstPtr& msg);

  thread* t2;
  void thread2();

};

CallOnce::CallOnce()
{
  test1_sub_ = nh.subscribe("/test1", 1, &CallOnce::callback1, this);
  //线程2
  t2 = new thread(&CallOnce::thread2, this);
}

CallOnce::~CallOnce()
{
}

void CallOnce::callback1(const std_msgs::BoolConstPtr& msg)
{
  cout << "callback 1" << endl;
}

void CallOnce::callback2(const std_msgs::BoolConstPtr& msg)
{
  cout << "callback 2" << endl;
  sleep(2);
}

void CallOnce::thread2()
{
  //将nh2节点句柄的消息队列设为my_queue
  nh2.setCallbackQueue(&my_queue);
  test2_sub_ = nh2.subscribe("/test2", 1, &CallOnce::callback2, this);
  //等待回调
  ros::AsyncSpinner spinner(0, &my_queue);
  spinner.start();
  ros::waitForShutdown();
}


int main(int argc, char* argv[])
{
  ros::init(argc, argv, "call_once");

  CallOnce call_once;
  ros::Rate rate(10);
  while (ros::ok())
  {
    cout << " thread 1 spin" << endl;
    ros::spinOnce();
    cout << " thread 1 spin end" << endl;
    rate.sleep();
  }

  ros::shutdown();
  call_once.t2->join();
  return 0;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB中添加ROS自定义消息,需要遵循以下几个步骤: 步骤1: 创建自定义消息的文件夹 首先,在MATLAB工作目录下创建一个文件夹,用于存放自定义消息文件。例如,可以创建一个名为"my_msgs"的文件夹。 步骤2: 创建.msg文件 在"my_msgs"文件夹中创建一个扩展名为.msg的文件,用于定义自定义消息的结构和字段。在该文件中,可以定义消息的名称、数据类型以及其他需要的字段。 步骤3: 编译自定义消息 在命令窗口中,使用"rosgenmsg"命令来编译自定义消息。例如,输入"rosgenmsg('my_msgs')"来编译"my_msgs"文件夹中的自定义消息。 步骤4: 添加生成的消息包 编译完成后,会在当前文件夹中生成一个名为"gen"的文件夹。将该文件夹复制到MATLAB的工作目录下。 步骤5: 添加自定义消息的路径 在MATLAB中,使用"rosgenmsg"函数生成的消息包默认是不在ROS消息路径中的。因此,需要将其添加到ROS消息路径中。可以通过设置ROS_PACKAGE_PATH环境变量来实现。例如,在MATLAB命令窗口中输入"setenv('ROS_PACKAGE_PATH', fullfile(pwd, 'gen'))",将gen文件夹添加到ROS消息路径中。 步骤6: 加载自定义消息 最后,可以使用"loadlibrary"函数来加载自定义消息。例如,输入"loadlibrary('my_msgs')"来加载"my_msgs"中定义的消息。 完成以上步骤后,就可以在MATLAB中使用自定义消息了。可以使用"rospublisher"和"rossubscriber"函数发布和订阅自定义消息,或者在MATLAB中创建自定义ROS节点来处理自定义消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值