YAML :: LoadFile (std :: string const &) не находит файл [yaml-cpp в ROS] - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь использовать данные из файла yaml в коде ROS (кинетический) / c ++, поэтому 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;Я с нетерпением жду ваших вопросов и ответов

1 Ответ

0 голосов
/ 12 февраля 2019

То, что файл YAML с использованием #include "../yaml_file.yaml" выдает ошибки, указывает только на то, что этот файл находится где-то в родительском каталоге текущего каталога или одного из каталогов в пути включения, который использует компилятор.

Когдавы используете "../yaml_file.yaml" для загрузки, тогда файл должен находиться в родительском каталоге текущего каталога в этой точке выполнения.Обычно это родительский каталог каталога, из которого вы запускаете программу (который не обязательно должен быть каталогом, в котором находится ваша программа).Но если ваша программа изменяет текущий каталог (используя chdir()), и вы не знаете, где он может быть, вы можете просто напечатать результат getcwd(), чтобы получить ваши ориентиры.

Вы должны использовать #include <unistd.h> для getcwd(), и он берет указатель на символьный буфер, достаточно большой, чтобы содержать путь, и в качестве второго параметра (size_t), который может содержать буфер.(В некоторых реализациях вы можете передать NULL и выделить достаточно большой буфер, в этом случае используйте возвращаемое значение)

...