我正在使用ROS将 double 变量发布到ROS主题上。本主题将宣传该主题,以便任何订阅者都可以访问该数据。 以下是我用于发布数据的代码:
ros::NodeHandle n;
ros::Publisher Auc_pub = n.advertise<std_msgs::Float64>("/auc", 1000);
std_msgs::Float64 areaValue;
areaValue.data.push_back(Area)
Auc_pub.publish(areaValue);
此处区域是 double 变量,我需要在主题 / auc 上发布它。我无法构建此文件,因为不知道如何将 Area 变量输入 areaValue 。
答案 0 :(得分:1)
如果您查看std_msgs::Float64
的文档,则会显示它包含一个数据字段,该字段名为data
,在C ++中的类型为double
。
因此,在您的代码中,您只需:
areaValue.data = Area
假设Area
是double
。
我建议您查看ROS wiki上的基本Writing a simple Publisher and Subscriber教程。
修改强>
如果原始帖子中的内容是您的整个代码,那么它可能不会完全按照您的想法执行。如果您使用publisher
的默认构造函数,则会立即向其发送消息published
。发布时该主题的任何节点subscribed
都将获得该消息,然后该主题将变得清晰。如果您希望主题subscribes
的任何节点接收上面发布的最后一条消息,请执行以下操作:
ros::Publisher Auc_pub = n.advertise<std_msgs::Float64>("/auc", 1000, true);
最后一个bool true
告诉publisher
它应该latch发布的消息。
但是还有另一个问题,假设这是你的所有代码:你永远不会spin,所以你的节点启动,advertises
它的主题,在它上面发布一条消息,然后关闭,以此为主题(假设主题没有subscribed
)。您需要在main
:
ros::spin();
这将使节点保持活动状态(从而使主题保持活动状态),直到ros::ok()
返回false
,I.E。直到节点被杀死。
当然,您的消息仍然只会发布一次,但该主题至少会保持活力。如果您希望定期广播该消息,请使用ros::Timer
并将pulish
电话放入计时器的回拨中。
但严重的是,请阅读tutorials,他们会引导您完成所有这些工作。
答案 1 :(得分:1)
我终于找到了问题的解决方案。我在代码中有多个ros:spinOnce()。还有片段
ros::NodeHandle n;
ros::Publisher Auc_pub = n.advertise<std_msgs::Float64>("/auc", 1000);
std_msgs::Float64 areaValue;
areaValue.data;
Auc_pub.publish(areaValue);
发布商 Auc_pub 已创建并销毁(因为我已将发布商包含在函数中......我的错误)。相反,我将发布者包含在主要功能中,其中发布者仅创建一次并保持活动直到执行完成。而且,感谢@aruisdante你的建议有所帮助。