2016-11-18 37 views
0

如果這個問題對您來說太簡單了,但是我沒有很好的編程技巧和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_msgmsg代碼代替,但一切都沒有改變。謝謝!

+0

在process_message函數的第二個函數中解決了用'> = 10'更改'== 10'的問題。答案的評論部分有詳細的解釋。謝謝! – Marcofon

回答

1

我不確定我是否完全明白你想要什麼,但這裏是一個簡單的例子,它可以做你需要的。我使用std::deque有60個值的循環緩衝區。你的代碼中缺少的是一個回調函數process_message,每次收到新消息時都會爲用戶調用。

我沒有編譯這段代碼,所以它可能無法立即編譯,但基本知識在那裏。

#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 <deque> 


static std::deque<std::string> queue_buffer; 
static int entries_added_since_last_write = 0; 

void write_data_to_file() 
{ 
    // open file 
    std::ofstream data_file("my_data_file.txt"); 
    if (data_file.is_open()) 
    { 
    for (int i = 0; i < queue_buffer.size(); ++i) 
    { 
     data_file << queue_buffer[i] << std::end; 
    } 
    } 
    else 
    { 
    std::cout << "Error - Cannot open file." << std::endl; 
    exit(1); 
    } 
    data_file.close(); 
} 

void process_message(const std_msgs::String::ConstPtr& string_msg) 
{ 
    // if buffer has already 60 entries, throw away the oldest one 
    if (queue_buffer.size() == 60) 
    { 
    queue_buffer.pop_front(); 
    } 

    // add the new data at the end 
    queue_buffer.push_back(string_msg.data); 

    // check if 10 elements have been added and write to file if so 
    entries_added_since_last_write++; 
    if (entries_added_since_last_write == 10 
     && queue_buffer.size() == 60) 
    { 
    // write data to file and reset counter 
    write_data_to_file(); 
    entries_added_since_last_write = 0; 
    } 
} 

int main(int argc, char **argv) 
{ 
    ros::init(argc, argv, "writer"); 
    ros::NodeHandle n; 
    ros::Subscriber sub = n.subscribe("/HeartRateInterval", 1000, process_message); 
    ros::spin(); 
    return 0; 
} 
+0

非常感謝您的回覆@cassinaj和您的努力!對於最近的答案,我很抱歉,但是我離開了我的電腦兩天。我嘗試編譯它,但我有這個錯誤:'/home/marco/catkin_ws/src/heart_rate_monitor/src/scrittore.c pp:在函數'void process_message(const ConstPtr&)':/ home/marco/catkin_ws/src/heart_rate_monitor/src/scrittore.c pp:46:37:error:'const ConstPtr'has no member named'data'queue_buffer.push_back(string_msg.data);'你有什麼想法嗎?我試圖自己去尋找它 – Marcofon

+0

string_msg-> data will work。 – Vtik

+0

也許函數'void process_message(const std_msgs :: String :: ConstPtr&string_msg)'它只需要msg而不是string_msg?我在發佈者和訂閱者教程中找到它。無論如何,即使我改變它,我得到幾乎相同的錯誤。對不起,我的無知 – Marcofon

相關問題