【问题标题】:Publisher/Subscriber on the same node C++ ROS同一节点上的发布者/订阅者 C++ ROS
【发布时间】:2022-08-09 02:03:19
【问题描述】:

我的目标是创建一个订户和一个出版商在里面同一个节点

我想访问关于rosbag 主题的可用消息的一部分。

该线程的消息如下:

Type: radar_msgs/RadarDetectionArray

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
radar_msgs/RadarDetection[] detections
  uint16 detection_id
  geometry_msgs/Point position
    float64 x
    float64 y
    float64 z
  geometry_msgs/Vector3 velocity
    float64 x
    float64 y
    float64 z
  float64 amplitude

我只希望访问位置“x”,然后再发布。

#include \"ros/ros.h\"
#include \"std_msgs/String.h\"
#include \"radar_msgs/RadarDetection.h\"
#include \"radar_msgs/RadarDetectionArray.h\"
#include \"geometry_msgs/Point.h\"

//radar_msgs::RadarDetectionArray pub_data;

double pub_data;

void srr2Callback(const radar_msgs::RadarDetection msg)
{   
    pub_data = msg.position.x;
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, \"talker\");
    ros::NodeHandle n;

    ros::Publisher chatter_pub = n.advertise<radar_msgs::RadarDetection>(\"srr2_detections\", 1000);
    ros::Subscriber sub = n.subscribe(\"/rear_srr/rear_right_srr/as_tx/detections\", 1000, srr2Callback);
    ros::Rate loop_rate(10);
    
    int count = 0;
    while (ros::ok())
    {
            chatter_pub.publish(pub_data);
            ros::spinOnce();
            loop_rate.sleep();
            ++count;
    }
    return 0;
}

我也分享我得到的错误!

error: request for member ‘__getMD5Sum’ in ‘m’, which is of non-class type ‘const double’
     return m.__getMD5Sum().c_str();

error: request for member ‘__getDataType’ in ‘m’, which is of non-class type ‘const double’
     return m.__getDataType().c_str();

    标签: c++ ros publisher subscriber


    【解决方案1】:

    这里:

    chatter_pub.publish(pub_data);
    

    您将在期望 radar_msgs::RadarDetection 的主题中发布 double

    该错误告诉您它不能在 double 上调用 __getMD5Sum,这显然是准确的。

    如果你打算发布一个 double 你必须为该类型创建一个特定的发布者:

    ros::Publisher chatter_pub = n.advertise<std_msgs::Float64>("srr2_detections", 1000);
    

    但即使有了这个改变,你也不应该直接发布双精度,你必须做这样的事情:

    std_msgs::Float64 msg;
    msg.data = pub_data;
    chatter_pub.publish(msg);
    

    如果您不想更改发布者的类型,也可以使用 radar_msgs::RadarDetection 执行此操作:

    radar_msgs::RadarDetection msg;
    msg.x = pub_data;
    chatter_pub.publish(msg);
    

    【讨论】:

      猜你喜欢
      • 2021-07-28
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多