我想在ROS主题中发布文本文件

时间:2016-11-14 14:23:30

标签: c++ stream floating-point text-files ros

我试图在一个列中读取包含许多浮点数的文本文件,如下例所示:

0.872
0.876
0.880
0.888
0.900

特别是我想逐行读取它,并且每次读取一行时我希望这个数值存储在一个必须在ROS主题上发布的变量中,等待时间约为1秒然后它必须再次执行,直到文件结束。 我试图一步一步地写出我的问题(可能)更清楚:

  1. 阅读第一行(例如0.872)
  2. 将数字0.872保存在变量
  3. 发布在ROS主题中仅包含0.872作为值的变量
  4. 等一下
  5. 重复循环,直到文件结束。
  6. 通过网络搜索和Stack Overflow搜索,我编写了一个代码,暂时在终端上打印数字(即使它不是我想要的),因为我不会这样做。虽然我已阅读过教程,但我知道如何实现ROS命令的发布。 但有些数字似乎是这样的:

    0.876
    
    0.88
    
    0.888
    
    0.9
    
    0.9
    
    0.876
    
    0.904
    
    0.908
    
    0.88
    

    而不是与其他数字精确度相等。 这是我现在编写的代码:

    #include <iostream>
    #include <fstream>
    #include <sstream>
    using namespace std;
    
    int main()
    {
        ifstream inputFile("/home/marco/Scrivania/marks.txt");
        string line;
    
        while (getline(inputFile, line))
        {
            istringstream ss(line);
            float heart;
    
            ss >> heart;
            cout << heart << endl << endl;
        }
    

    注意:它是用普通的C ++语言编写的,没有任何ROS命令,如ROS init等。所以,如果你能告诉我如何做到这一点你会很棒,因为我只做了一个到目前为止ROS的节点。

    编辑:在放入ROS节点,编译和执行时建议的修改,它运行没有问题。 然后我尝试添加主题部分,但没有成功。我更新了以下代码:

    #include "ros/ros.h"
    #include "std_msgs/Float32.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;
    
    
    ifstream inputFile("/home/marco/Scrivania/marks.txt");
    string line;
    
    while (getline(inputFile, line))
    {
        istringstream ss(line);
    
        float heart;
    
        ss >> heart;
    
        //std::cout << std::fixed << std::setprecision(3) << heart << endl  << endl;
    }
    
    ros::Publisher HeartRateInterval_pub = n.advertise<std_msgs::Float32>("HeartRateInterval", 1000);
    
    ros::Rate loop_rate(1);
    
    int count = 0;
    while (ros::ok())
    {
    
    std_msgs::Float32 msg;
    
    std::stringstream ss;
    ss << std::cout << std::fixed << std::setprecision(3) << heart << endl << endl << count;
    msg.data = ss.str();
    
    HeartRateInterval_pub.publish(msg)
    
    ROS_INFO("%s", msg.data.c_str());
    
    ros::spinOnce();
    
    loop_rate.sleep();
    
    ++count;
    }
    
    return 0;
    
    }
    

2 个答案:

答案 0 :(得分:0)

此外

#include <iomanip>

然后,在输出值

之前
cout << setprecision(3) << heart //... etc

docos

答案 1 :(得分:0)

这是我经过多次努力和好运之后获得的代码!它做我想要的,唯一的小问题是我可以使用Ctrl + c关闭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;

}