如果这个问题对你来说太简单,我很抱歉,但我没有良好的编程技巧和ROS知识。我有一个ROS主题,其中发布了一些心跳间隔的数字,以秒为单位。我需要订阅这个主题并做这样的阐述:我的想法是有一个十个数字的小数组,我可以连续存储十个心跳。然后我有一个更大的60个数字的数组,必须上升十个位置,以便在底部有小数组的最新十个值,它必须“扔掉”十个最老的值(我做了一些研究也许我必须使用向量而不是数组,因为在我阅读的C ++数组中是固定的)。然后我必须每次在文本文件中打印这60个值(我的意思是在循环中,因此文本文件将被连续覆盖)。此外,我看到ROS以这种方式输出主题中的数据:data: 0.987
每列数据与列中的---
除以其他数据。我真正想要的是,因为我需要它来以这种方式读取文本文件的脚本,是一个文本文件,其中值在一列中没有空格和其他符号或单词,如下所示:
0.404
0.952
0.956
0.940
0.960
我在下面提供了我的节点的代码,其中,现在,我只做了订阅部分,因为我不知道如何做我以后要做的事情。提前感谢您的帮助!!!
代码:
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "../include/heart_rate_monitor/wfdb.h"
#include <stdio.h>
#include <sstream>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <vector>
int main(int argc, char **argv)
{
ros::init(argc, argv, "writer");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("/HeartRateInterval", 1000);
ros::spin();
return 0;
}
注意:我没有包含Float32 / 64标头,因为我将心跳作为字符串发布。我不知道这是否有意义。
编辑:我将在发布者节点的代码下面包含在ROS主题上发布数据的代码。
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "../include/heart_rate_monitor/wfdb.h"
#include <stdio.h>
#include <sstream>
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
int main(int argc, char **argv)
{
ros::init(argc, argv, "heart_rate_monitor");
ros::NodeHandle n;
ros::Publisher pub = n.advertise<std_msgs::String>("/HeartRateInterval", 1000);
ros::Rate loop_rate(1);
while (ros::ok())
{
ifstream inputFile("/home/marco/Scrivania/marks.txt");
string line;
while (getline(inputFile, line)) {
istringstream ss(line);
string heart;
ss >> heart;
std_msgs::String msg;
msg.data = ss.str();
pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
}
return 0;
}
由于发布的内容是“变量”msg
,我尝试将代码作为答案替换为string_msg
变量msg
,但没有任何变化。谢谢!
答案 0 :(得分:1)
我不确定我到底知道你想要什么,但这里有一个简短的例子,它可以做你需要的。
我在这里使用mouseAnimation.DrawAbsolute(Sprites.MousePointer, g, mouse.x, mouse.y, 4, 4, deltaTime);
来获得60个值的循环缓冲区。您在代码中缺少的是回调函数std::deque
,每次收到新邮件时都会为订阅者调用它。
我没有编译这段代码,所以它可能不会立即编译,但基础知识就在那里。
process_message