【发布时间】:2016-11-14 14:23:30
【问题描述】:
我正在尝试读取一列中包含许多浮点数的文本文件,如下例所示:
0.872
0.876
0.880
0.888
0.900
特别是我想逐行读取它,每次读取一行时,我希望这个数值存储在一个变量中,该变量必须在 ROS 主题上发布,等待时间约为 1 秒然后它必须再做一次,直到文件结束。 我正在尝试逐步写出我的问题,以便(也许)更清楚:
- 读取第一行(例如 0.872)
- 将数字 0.872 保存在变量中
- 在 ROS 主题中发布只有 0.872 作为值的变量
- 稍等
- 重复循环直到文件结束。
通过在网上和 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;
}
【问题讨论】:
-
只是好奇:什么是 ROS 主题?
-
我们称其为“空间”,ROS 节点(基本上是可执行文件)可以在其中发布和读取消息以进行它们之间的通信。
-
谢谢,现在更清楚了。
-
@RudyVelthuis 没问题! :)
-
逗号后的尾随零没有任何区别(即
0.9 == 0.900)。这只是打印时的格式问题。因此,关于数字的值,它们没有被削减。只是不打印无意义的零。
标签: c++ stream floating-point text-files ros