ROS踩坑|用一个节点订阅和发布多个话题

ROS踩坑|用一个节点订阅和发布多个话题,第1张

ROS踩坑|用一个节点订阅和发布多个话题 问题描述

写了一个节点,要从激光雷达发布的话题中订阅点云信息,并将点云信息处理之后再发布出去。涉及到一个节点同时订阅和发布多个话题。
测试时发现节点只能订阅,不能发布话题,且订阅的话题数据也无法使用。

解决办法

经过查找才发现,是因为自己把发布topic的函数写在main函数中了,这就造成订阅的数据无法被发布的函数使用,因为只能在订阅的回调函数中才能使用该信息。因此我的解决办法是把发布topic的函数 写在了订阅回调中即可。
参考链接中给出了另一种解决办法:定义了一个类,把publisher和subscriber都放入类中。
这里我粘贴处第一种方法的代码 想看第二中方法的自行点击链接

```cpp
# include
# include
# include

// 定义为全局变量
static ros::Subscriber sub1;
static ros::Subscriber sub2;
static ros::Publisher pub1;
static ros::Publisher pub2;

// 回调函数1
void callback1(const std_msgs::Float32ConstPtr& flt){
    std_msgs::Float32 pub_flt;
    pub_flt.data = flt->data+0.4;
    pub1.publish(pub_flt);

    std::cout<<"receive flt:"<data<data+" hahaha";
    pub2.publish(str_msg);

    std::cout<<"receive str:"<data<("processed_flt", 1);
    pub2 = nh.advertise("processed_str",1);

    // 循环执行
    ros::spin();
    return 0;
}

另外 如何想要设置发布和订阅不同的频率 可以使用pubrate函数

  ros::Rate pub_rate(50);
  //让其在主题“/cmd_vel”发布速度控制消息,启智ROS的核心节点会从这个主题获取vel_pub发布的消息,并控制机器人底盘执行消息包里的速度值。
  vel_pub.publish(vel_cmd);
    //循环等待回调函数
  pub_rate.sleep();
参考资料

http://zhaoxuhui.top/blog/2019/10/20/ros-note-7.html

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5503847.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-13
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存