Как ссылаться на файл Yaml относительно файла запуска?

У меня есть файл запуска, который загружает файл yaml:

<launch>
    <rosparam command="load file="filename.yaml" />
    <node pkg="my_package" type="my_package_node" name="my_package_node" />
</launch>

Файл filename.yaml не может быть найден, пока я не укажу полный путь: "/home/username/blah/blah/blah". Поскольку этот файл запуска используется на нескольких машинах разными пользователями и в разных местах хранилища, я, очевидно, не могу жестко прописать путь. Что теперь? Как я могу ссылаться на него относительно расположения файла запуска?

3 ответа

Решение

Лучший ответ, который я мог найти, - это использовать $(найти имя_пакета) в качестве отправной точки:

<launch>
    <rosparam command="load file="$(find package_name)/../../yamlFolder/filename.yaml" />
    <node pkg="my_package" type="my_package_node" name="my_package_node" />
</launch>

Кажется глупым, хотя. Нет ссылки на путь относительно самого файла запуска? Определенно хотел бы лучшего ответа.

Мы можем установить переменную окружения PWD для указанного узла, например, мы хотим передать конфигурационный файл rviz в rviz, относительный путь может быть таким:

<arg name="rviz_file" value="$(eval env('PWD')+'/config/showme.rviz')"/>
<node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rviz_file)" required="true" />

Если вы используете пакеты ROS, папки запуска находятся в корневой папке пакета так $(find package) на самом деле одна папка перед вашим файлом запуска

Если ваш файл yaml находится в пакете ROS, то я думаю, что используя find Аргумент подстановки, как вы делаете в своем ответе, является самым чистым маршрутом. Если это где-то еще, я бы предложил использовать переменные среды с чем-то вроде

<launch>
  <arg name="yaml_path" default="$(optenv YAML_PATH)"/>
  <arg     if="$(eval yaml_path == '')" name="yaml_file" value="$(env HOME)/some_folder/filename.yaml" />
  <arg unless="$(eval yaml_path == '')" name="yaml_file" value="$(arg yaml_path)/filename.yaml"/>
  <rosparam command="load" file="$(arg yaml_file)"/>
</launch>

Этот вид дает лучшее из всех миров. Если вы установили YAML_PATH в качестве переменной среды (например, export YAML_PATH="$HOME/some_path" из терминала или в вашем bashrc), то путь для yaml_file буду использовать это. Если не, optenv будет оценивать пустую строку и аргумент yaml_file будет установлен некоторый путь по умолчанию относительно вашей домашней папки. И, если у вас есть пользователь, который вообще не хочет связываться с переменными среды, он все равно может передать путь вручную, вызвав его следующим образом:

roslaunch my_launch_file.launch yaml_path:=/home/my_name/my_preferred_folder
Другие вопросы по тегам