• ROS系统通过类定义实现数据处理并重新发布在另一话题


     在实际应用中,经常需要在同一个节点内接受数据,在回调函数中将数据进行处理,再将新数据重新发布在另一个新话题上。

    实现步骤:

    1. 定义一个数据处理类SubscribeAndPublish,设置2个pub成员对象和1个sub成员对象为public。

     2. 在主函数中发布原始消息;

    3. 将callback定义为成员函数,并使用新的pub将消息发布出去。

    测试程序代码如下:

    1. #include <ros/ros.h>
    2. #include"std_msgs/String.h"
    3. class SubscribeAndPublish
    4. {
    5. public:
    6. SubscribeAndPublish()
    7. {
    8. //Topic you want to publish
    9. pub_ = n_.advertise<std_msgs::String>("/published_topic", 1);
    10. pub_callback = n_.advertise<std_msgs::String>("/callback_topic", 1);
    11. //Topic you want to subscribe
    12. sub_ = n_.subscribe("/published_topic", 1, &SubscribeAndPublish::callback, this); //注意这里,和平时使用回调函数不一样了。
    13. }
    14. void callback(const std_msgs::String& input)
    15. {
    16. std_msgs::String output;
    17. output.data = input.data;
    18. output.data.append(" treated!");
    19. //.... do something with the input and generate the output...
    20. ROS_INFO("callbacked and published on /callback_topic");
    21. pub_callback.publish(output);
    22. // ROS_INFO("callback published");
    23. }
    24. public:
    25. ros::NodeHandle n_;
    26. ros::Publisher pub_;
    27. ros::Publisher pub_callback;
    28. ros::Subscriber sub_;
    29. };//End of class SubscribeAndPublish
    30. int main(int argc, char **argv)
    31. {
    32. //Initiate ROS
    33. ros::init(argc, argv, "subscribe_and_publish");
    34. //Create an object of class SubscribeAndPublish that will take care of everything
    35. SubscribeAndPublish SAPObject;
    36. std_msgs::String msg;
    37. msg.data = "from main";
    38. ros::Rate loop_rate(1);
    39. while (ros::ok())
    40. {
    41. SAPObject.pub_.publish(msg);
    42. ROS_INFO("main published on /published_topic");
    43. ros::spinOnce();//处理订阅话题的所有回调函数callback(),
    44. loop_rate.sleep();
    45. }
    46. return 0;
    47. }

    打印来原始话题的消息和新话题的消息:

    rostopic echo /published_topic
    rostopic echo /callback_topic

    得到原始数据和处理过后的数据的结果。

             

  • 相关阅读:
    【JVM】synchronized与锁升级
    文献阅读总结(3)Neural Graph Collaborative Filtering
    使用键盘控制Franka机械臂运动
    详解 Spark 核心编程之 RDD 持久化
    Solana链上应用Crema因黑客攻击停运
    寄存器(内存访问)
    C/C++教程 从入门到精通《第二十二章》——Qt控件详解
    SystemVerilog Assertions应用指南 第一章(1.24章节 “or”运算符)
    链表-哈希表 详解
    力扣刷题-二叉树-二叉树的高度与深度
  • 原文地址:https://blog.csdn.net/weixin_50084948/article/details/133386206