如何相对于 Launch 文件引用 Yaml 文件?
How To Reference Yaml File Relative to Launch File?
我有一个正在加载 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”。鉴于此启动文件由不同的用户和存储库位置在多台机器上使用,我显然不能对路径进行硬编码。那么现在怎么办?如何相对于启动文件的位置引用它?
我能找到的最佳答案是使用 $(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>
虽然看起来有点傻。没有引用相对于启动文件本身的路径?肯定想要更好的答案。
如果您的 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
如果您使用的是 ROS 包,则启动文件夹位于包的根文件夹中,因此 $(find package)
实际上是您的启动文件之前的一个文件夹
我们可以为指定的节点设置环境变量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" />
我有一个正在加载 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”。鉴于此启动文件由不同的用户和存储库位置在多台机器上使用,我显然不能对路径进行硬编码。那么现在怎么办?如何相对于启动文件的位置引用它?
我能找到的最佳答案是使用 $(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>
虽然看起来有点傻。没有引用相对于启动文件本身的路径?肯定想要更好的答案。
如果您的 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
如果您使用的是 ROS 包,则启动文件夹位于包的根文件夹中,因此 $(find package)
实际上是您的启动文件之前的一个文件夹
我们可以为指定的节点设置环境变量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" />