如何引用Yaml文件相对于启动文件?

问题描述 投票:0回答:4

我有一个正在加载yaml文件的启动文件:

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

除非我输入完整的路径:“/ home / username / blah / blah / blah”,否则无法找到filename.yaml文件。由于此启动文件由不同用户和存储库位置在多台计算机上使用,我显然无法对路径进行硬编码。那么现在怎么办?如何相对于启动文件的位置引用它?

yaml ros launch
4个回答
1
投票

我发现自己的最佳答案是使用$(find package_name)作为起点:

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

虽然看起来有点傻。没有引用相对于启动文件本身的路径?肯定会有更好的答案。


1
投票

如果您正在使用ROS包,则启动文件夹位于Package的根文件夹中因此$(find package)实际上是启动文件之前的一个文件夹


0
投票

如果您的yaml文件位于ROS包中,那么我认为使用find替换arg就像您在答案中所做的那样是最干净的路径。如果它在其他地方,我会建议利用environment variables

<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设置为环境变量(例如来自终端或bashrc中的export YAML_PATH="$HOME/some_path"),那么yaml_file的路径将使用它。如果没有,optenv将评估为空字符串,并且arg yaml_file将设置为相对于您的主文件夹的某个默认路径。并且,如果您的用户根本不想弄乱环境变量,他们仍然可以通过调用它来手动传递路径

roslaunch my_launch_file.launch yaml_path:=/home/my_name/my_preferred_folder

0
投票

我们可以为指定节点设置环境变量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" />
© www.soinside.com 2019 - 2024. All rights reserved.