ROS/ROS2工程中的路径管理

1 Launch文件访问yaml

ROS2中,launch文件可以用python编写,且后缀名为.launch.py,由于python比传统的xml更加灵活,因此,可以在launch文件中找到某个package的yaml。yaml通常存在package下面的config目录下,这是一个convention。

举例如下,使用了PathJoinSubstitution方法,将yaml的路径进行了拼接,有一点需要注意的是package的名称尽可能不要改变。这样对于launch文件,就只需要确保目录结构不变,无需修改具体路径名称。

由于FindPackageShare返回的是share下面的package路径,而不是src下package的目录,因此,在CMakeLists.txt中,需要增加:

install(DIRECTORY
  config
  DESTINATION share/${PROJECT_NAME}/
)

相当于把yaml从src复制了一份到install/share下面。
launch文件内容如下:


"""Launch lidar tracking demo"""

from launch import LaunchDescription
from launch.substitutions import LaunchConfiguration
import launch_ros.actions

from launch_ros.substitutions import FindPackageShare
from launch.substitutions import PathJoinSubstitution

def generate_launch_description():

   pcl_yaml_file = PathJoinSubstitution(
           [FindPackageShare("lidar_tracking"), "config", "pcl_and_feature_map.yaml"]
   )
   
   return LaunchDescription([
        launch_ros.actions.Node(
            package='lidar_tracking', executable='foxglove_translator', output='screen',
            ros_arguments=['--params-file', pcl_yaml_file]),
#        launch_ros.actions.Node(
#            package='lidar_tracking', executable='perception_node', output='screen',
#            ros_arguments=['--params-file', '/home/novauto/workspace/pcl_and_feature_map.yaml'])

    ])

2 yaml文件中存路径

  • 在ROS/ROS2中,使用参数服务器的方式读取,如用launch文件加载
  • 在非ROS/ROS2中,使用yaml的相关库函数对文件内容进行操作

2.1 不涉及大量类似内容

在YAML中写出绝对路径,更换设备时,进行修改,尽量不要在C++中进行拼接。

2.2 涉及大量类似内容

以NuScenes数据集为例,其目录结构如下图所示,有214个文件夹,编号从0到213
在这里插入图片描述

每个文件夹下面都有类似的内容,且其命名有明显的规则。

在这里插入图片描述
对于这类resource,由于其体积大(6.6GB),一般在设备上只会有一份,由不同算法工程所共享,这样最好是 在yaml文件里存储其最顶层目录,比如:

resource_dir: home/scarlett/bevdet_demo/resource/nuscenes-0103

然后在C++程序中使用for循环等方式拼接其具体图像或者bin文件的名称。
更换设备时,需要在yaml中进行修改。

3 不要在ROS/ROS2 源码中写相对路径

使用./或者…/是不被推荐的,因为ROS节点运行时应该是在install目录下,而./通常会用于访问src目录下的资源,除非这个资源也被install到了install目录,不然这种方式是无法打开对应文件的。总而言之,不推荐。

猜你喜欢

转载自blog.csdn.net/weixin_45910027/article/details/130872507
今日推荐