YAML::LoadFile(std::string const&) не находит файл [yaml-cpp в ROS]

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


person R.H.    schedule 12.02.2019    source источник
comment
Путь ../yaml_file.yaml настроен правильно — нет, это не так. #include "../yaml_file.yaml" может работать, потому что препроцессор C++ рассматривает путь как относительный к текущему исходному файлу, а при вызове функции времени выполнения, такой как YAML::LoadFile("../yaml_file.yaml"), он будет рассматриваться как относительный к текущему рабочему каталогу приложения, который, скорее всего, не совпадает с каталогом, в котором находится исходный файл. расположен.   -  person user7860670    schedule 12.02.2019


Ответы (1)


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

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

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

person Anthon    schedule 12.02.2019