我想存储一个来自ROS主题的数组消息,以便进一步阐述

时间:2016-11-18 16:18:30

标签: c++ arrays text messages ros

如果这个问题对你来说太简单,我很抱歉,但我没有良好的编程技巧和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,但没有任何变化。谢谢!

1 个答案:

答案 0 :(得分:1)

我不确定我到底知道你想要什么,但这里有一个简短的例子,它可以做你需要的。

我在这里使用mouseAnimation.DrawAbsolute(Sprites.MousePointer, g, mouse.x, mouse.y, 4, 4, deltaTime); 来获得60个值的循环缓冲区。您在代码中缺少的是回调函数std::deque,每次收到新邮件时都会为订阅者调用它。

我没有编译这段代码,所以它可能不会立即编译,但基础知识就在那里。

process_message