如果這個問題對您來說太簡單了,但是我沒有很好的編程技巧和ROS知識,我很遺憾。我有一個ROS主題,其中發佈了幾秒鐘內心跳間隔的數字。我需要訂閱這個話題,並做這種闡述:這個想法是有十個數字的小陣列,我可以連續存儲10個心跳。然後我有更多的60個數字,必須增加10個位置才能在底部獲得小數組的最新十個數值,並且必須「丟棄」十個最古老的數值(我做了一些研究也許我不得不使用一個向量而不是一個數組,因爲在我讀的時候,C++數組是固定的)。然後我必須在文本文件中每次打印這60個值(我的意思是在一個循環中,所以文本文件將不斷被覆蓋)。此外,我看到ROS以這種方式輸出來自主題的數據:data: 0.987
,其中每列數據由---
劃分爲一列。我真正想要的,因爲我需要它的腳本以這種方式讀取文本文件,是一個文本文件,其中值均在一列沒有空格等標誌或文字,像這樣:我想存儲一個ROS主題的消息以供進一步闡述
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;
}
注:我不包括浮點32/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
代碼代替,但一切都沒有改變。謝謝!
在process_message函數的第二個函數中解決了用'> = 10'更改'== 10'的問題。答案的評論部分有詳細的解釋。謝謝! – Marcofon