YAML::LoadFile(std::string const&) 找不到文件 [ROS 中的 yaml-cpp]

YAML::LoadFile(std::string const&) does not find file [yaml-cpp in ROS]

本文关键字:文件 ROS yaml-cpp 找不到 中的 LoadFile std string YAML const      更新时间:2023-10-16

我正试图在ROS(动能)/c++代码中使用yaml文件中的数据,因此yaml-cpp对我来说似乎是一个不错的选择。我的代码不会产生错误,但无法正常工作:

YAML::LoadFile函数似乎找不到我的文件,因为以下几行进入异常:

YAML::Node yamlnode_;     
try{
yamlnode_= YAML::LoadFile("../yaml_file.yaml");
}
catch(std::exception &e){
ROS_ERROR("Failed to load yaml file");
}

通过包括yaml-cpp

#include <yaml-cpp/yaml.h>

似乎是工作的,因为YAML::函数在之后被识别。


路径../yaml_file.yaml设置正确,我也通过在程序中检查过

#include "../yaml_file.yaml"

这会产生解析错误(正如预期的那样),向我表明找到了正确的文件(但显然无法包括在内)。


yaml_file.yaml在多个.xaro文件中成功使用。


请记住,我对ROS和yaml-cpp有些陌生;我期待着看到你的问题和答案

使用#include "../yaml_file.yaml"包含YAML文件会抛出错误,这只表明该文件位于当前目录或编译器使用的包含路径中某个目录的父目录中。

当使用"../yaml_file.yaml"进行加载时,文件需要在执行时位于当前目录的父目录中。这通常是启动程序的目录的父目录(不必是程序所在的目录)。但是,如果您的程序更改了当前目录(使用chdir()),并且您不知道它可能"在"哪里,您可以只想打印getcwd()的结果来获得您的方位。

对于getcwd(),应该使用#include <unistd.h>,它需要一个指向足够大的字符缓冲区的指针来容纳路径,并将缓冲区可以容纳的(size_t)作为第二个参数。(对于某些实现,可以传递NULL,并分配足够大的缓冲区,在这种情况下使用返回值)