【问题标题】:I want to publish in a ROS topic floating numbers from a text file我想从文本文件中发布 ROS 主题浮点数
【发布时间】:2016-11-14 14:23:30
【问题描述】:

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

0.872
0.876
0.880
0.888
0.900

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

  1. 读取第一行(例如 0.872)
  2. 将数字 0.872 保存在变量中
  3. 在 ROS 主题中发布只有 0.872 作为值的变量
  4. 稍等
  5. 重复循环直到文件结束。

通过在网上和 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


【解决方案1】:

另外

#include <iomanip>

然后,在输出值之前

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

docos

【讨论】:

  • 我还注意到只有在最后一位数字为零时才会出现切割,比如 0.900 被切割成 0.9
  • @Marcofon 似乎您还应该将std::fixed 添加到输出stackoverflow.com/a/33005025/597607
  • 谢谢!!现在它起作用了!其他部分有什么想法吗? :)
  • @BoPersson 我能够将所有这些代码放在一个 ROS 节点上,然后毫无问题地运行它,我正在尝试做消息部分,你有什么提示吗?再次感谢你!感谢 Adrian,因为解决方案的一部分是你的!
【解决方案2】:

这是我经过一番努力和运气后得到的代码!它做了我想要的,唯一的小问题是我可以使用 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;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 2022-01-06
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多