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

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

我正在尝试在 ROS(kinetic)/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 在多个 .xacro 文件中成功使用。


请记住,我对 ROS 和 yaml-cpp 比较陌生;我期待看到您的问题和答案

使用 #include "../yaml_file.yaml" 包含 YAML 文件抛出错误仅表示该文件位于当前目录或编译器使用的包含路径中的目录之一的父目录中。

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

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