Autoware 是基于 ROS 开发的自动驾驶仿真软件,所以在Autoware 中除了算法的源码之外,有一类重要的文件,launch 文件。
launch 文件是用来启动 ROS 节点,定义参数以及设置默认值的,一般有.launch.xml、.launch.py或.launch.yaml 等格式。本文解读的是 Autoware 的基础 launch 文件之一,autoware.launch.xml。
.launch.xml 使用 xml (Extensible Markup Language) 语言编写的。.luanch.xml 文件的基本结构是
<?xml version="1.0" encoding="UTF-8"?>
<launch>
...
</launch>
- version=“1.0” 表明使用的是XML 1.0 版本。encoding=“UTF-8” 表示文档使用UTF-8编码。
代码的第一部分是参数定义和设置
<!-- Essential parameters -->
<arg name="map_path" description="point cloud and lanelet2 map directory path"/>
<arg name="vehicle_model" description="vehicle model name"/>
<arg name="sensor_model" description="sensor model name"/>
<arg name="use_pointcloud_container" default="true" description="launch pointcloud container"/>
<arg name="pointcloud_container_name" default="pointcloud_container"/>
<!-- Optional parameters -->
<!-- Modules to be launched -->
<arg name="launch_vehicle" default="true" description="launch vehicle"/>
<arg name="launch_system" default="true" description="launch system"/>
<arg name="launch_map" default="true" description="launch map"/>
<arg name="launch_sensing" default="true" description="launch sensing"/>
<arg name="launch_sensing_driver" default="true" description="launch sensing driver"/>
<arg name="launch_localization" default="true" description="launch localization"/>
<arg name="launch_perception" default="true" description="launch perception"/>
<arg name="launch_planning" default="true" description="launch planning"/>
<arg name="launch_control" default="true" description="launch control"/>
<!-- Global parameters -->
<arg name="use_sim_time" default="false" description="use_sim_time"/>
<!-- Essential parameters --> 中定义和设置了地图路径,车辆模型,传感器模型,点云容器。在调用autoware.launch.xml 可以直接传参数进行修改。例如:
ros2 launch autoware_launch autoware.launch.xml map_path:="$MAP" vehicle_model:="$VEHICLE" sensor_model:="$SENSOR" launch_planning:=false
<!-- Optional parameters --> 部分主要是定义不同模块是否启动的 bool 值。在后面的代码中会使用相应的bool 值启动不同的模块。
<!-- Global parameters --> 是一个全局参数的定义,名为use_sim_time。它具有默认值为false,表示是否使用仿真时间。全局参数是在ROS系统中全局范围内使用的参数,对整个系统的行为产生影响。use_sim_time参数用于控制ROS系统是否使用仿真时间。如果该参数设置为true,系统将使用仿真器提供的时间,而不是真实时间。
<!-- Vehicle -->
<arg name="vehicle_id" default="$(env VEHICLE_ID default)" description="vehicle specific ID"/>
<arg name="launch_vehicle_interface" default="true" description="launch vehicle interface"/>
<!-- Control -->
<arg name="check_external_emergency_heartbeat" default="false"/>
<!-- Map -->
<arg name="lanelet2_map_file" default="lanelet2_map.osm" description="lanelet2 map file name"/>
<arg name="pointcloud_map_file" default="pointcloud_map.pcd" description="pointcloud map file name"/>
<!-- System -->
<arg name="system_run_mode" default="online" description="run mode in system"/>
<arg name="launch_system_monitor" default="true" description="launch system monitor"/>
<arg name="launch_dummy_diag_publisher" default="false" description="launch dummy diag publisher"/>
<!-- Tools -->
<arg name="rviz" default="true" description="launch rviz"/>
<arg name="rviz_config" default="$(find-pkg-share autoware_launch)/rviz/autoware.rviz" description="rviz config"/>
<!-- Perception -->
<arg name="perception_mode" default="lidar" description="select perception mode. camera_lidar_radar_fusion, camera_lidar_fusion, lidar_radar_fusion, lidar, radar"/>
<arg name="traffic_light_recognition/enable_fine_detection" default="true" description="enable traffic light fine detection"/>
<!-- Vehicle -->
定义的参数是 vehicle_id 和 launch_vehicle_interface。vehicle_id 具有默认值 $(env VEHICLE_ID default)。这里使用了 $(env VEHICLE_ID default) 语法来获取环境变量VEHICLE_ID的值作为默认值。它表示车辆的特定ID。launch_vehicle_interface,它具有默认值true。它表示是否启动车辆接口。
<!-- Control -->
参数check_external_emergency_heartbeat(默认为true)启用了来自外部模块的紧急停车请求功能。该功能需要一个~/input/external_emergency_stop_heartbeat话题用于监测外部模块的健康状态,而且如果没有该话题,车辆控制模块将无法启动。当不使用"外部紧急停车"功能时,check_external_emergency_heartbeat参数必须设置为false。
<!-- System -->
<arg name="system_run_mode" default="online" description="run mode in system"/>: 这是一个名为system_run_mode的参数定义,它具有默认值为online。它用于指定系统的运行模式。
<arg name="launch_system_monitor" default="true" description="launch system monitor"/>: 这是一个名为launch_system_monitor的参数定义,它具有默认值为true。它用于指定是否启动系统监视器。
<arg name="launch_dummy_diag_publisher" default="false" description="launch dummy diag publisher"/>: 这是一个名为launch_dummy_diag_publisher的参数定义,它具有默认值为false。它用于指定是否启动虚拟诊断发布器。
<!-- Tools -->
<arg name="rviz" default="true" description="launch rviz"/>: 这是一个名为rviz的参数定义,它具有默认值为true。它用于指定是否启动RViz可视化工具。
<arg name="rviz_config" default="$(find-pkg-share autoware_launch)/rviz/autoware.rviz" description="rviz config"/>: 这是一个名为rviz_config的参数定义,它具有一个默认值。默认值通过$(find-pkg-share autoware_launch)/rviz/autoware.rviz的语法确定,它表示在autoware_launch包中查找rviz/autoware.rviz文件作为默认配置文件路径。
<!-- Perception -->
<arg name="perception_mode" default="lidar" description="select perception mode. camera_lidar_radar_fusion, camera_lidar_fusion, lidar_radar_fusion, lidar, radar"/>: 这是一个名为perception_mode的参数定义,它具有默认值为lidar。它用于选择感知模式,可根据需要从camera_lidar_radar_fusion、camera_lidar_fusion、lidar_radar_fusion、lidar和radar中进行选择。
<arg name="traffic_light_recognition/enable_fine_detection" default="true" description="enable traffic light fine detection"/>: 这是一个名为traffic_light_recognition/enable_fine_detection的参数定义,它具有默认值为true。它用于启用交通灯精细检测功能。
<!-- Global parameters -->
<group scoped="false">
<include file="$(find-pkg-share global_parameter_loader)/launch/global_params.launch.py">
<arg name="use_sim_time" value="$(var use_sim_time)"/>
<arg name="vehicle_model" value="$(var vehicle_model)"/>
</include>
</group>
这部分代码是在launch文件中包含另一个launch文件,即global_params.launch.py。在这个include标签中,file属性指定了要包含的文件路径。通过这个include标签,可以将global_params.launch.py文件的内容插入到当前的launch文件中。
- 在global_params.launch.py文件中,使用了两个arg标签来传递参数值:
<arg name="use_sim_time" value="$(var use_sim_time)"/>: 这个arg标签用于传递名为use_sim_time的参数,它的值是当前launch文件中名为use_sim_time的变量的值。
<arg name="vehicle_model" value="$(var vehicle_model)"/>: 这个arg标签用于传递名为vehicle_model的参数,它的值是当前launch文件中名为vehicle_model的变量的值。
- 通过这样的方式,global_params.launch.py文件中可以使用这些参数值,以便进行进一步的配置和使用。
<!-- Vehicle -->
<group if="$(var launch_vehicle)">
<include file="$(find-pkg-share tier4_vehicle_launch)/launch/vehicle.launch.xml">
<arg name="vehicle_model" value="$(var vehicle_model)"/>
<arg name="sensor_model" value="$(var sensor_model)"/>
<arg name="vehicle_id" value="$(var vehicle_id)"/>
<arg name="launch_vehicle_interface" value="$(var launch_vehicle_interface)"/>
<arg name="config_dir" value="$(find-pkg-share individual_params)/config/$(var vehicle_id)/$(var sensor_model)"/>
</include>
</group>
<!-- System -->
<group if="$(var launch_system)">
<include file="$(find-pkg-share autoware_launch)/launch/components/tier4_system_component.launch.xml"/>
</group>
<!-- Map -->
<group if="$(var launch_map)">
<include file="$(find-pkg-share autoware_launch)/launch/components/tier4_map_component.launch.xml"/>
</group>
<!-- Sensing -->
<group if="$(var launch_sensing)">
<include file="$(find-pkg-share autoware_launch)/launch/components/tier4_sensing_component.launch.xml"/>
</group>
<!-- Localization -->
<group if="$(var launch_localization)">
<include file="$(find-pkg-share autoware_launch)/launch/components/tier4_localization_component.launch.xml"/>
<!-- <include file="$(find-pkg-share autoware_launch)/launch/components/map4_localization_component.launch.xml"/> -->
</group>
<!-- Perception -->
<group if="$(var launch_perception)">
<include file="$(find-pkg-share autoware_launch)/launch/components/tier4_perception_component.launch.xml"/>
</group>
<!-- Planning -->
<group if="$(var launch_planning)">
<include file="$(find-pkg-share autoware_launch)/launch/components/tier4_planning_component.launch.xml"/>
</group>
<!-- Control -->
<group if="$(var launch_control)">
<include file="$(find-pkg-share autoware_launch)/launch/components/tier4_control_component.launch.xml"/>
</group>
<!-- API -->
<group>
<include file="$(find-pkg-share autoware_launch)/launch/components/tier4_autoware_api_component.launch.xml"/>
</group>
-
这一部分的代码主要是利用前面定义的数据,启动不同的子系统,如 部分,
-
如果launch_vehicle的值为true,则会执行标签中指定的vehicle.launch.xml文件,并传递一些参数值:
<arg name="vehicle_model" value="$(var vehicle_model)"/>: 这个arg标签用于传递名为vehicle_model的参数,它的值是当前launch文件中名为vehicle_model的变量的值。
<arg name="sensor_model" value="$(var sensor_model)"/>: 这个arg标签用于传递名为sensor_model的参数,它的值是当前launch文件中名为sensor_model的变量的值。
<arg name="vehicle_id" value="$(var vehicle_id)"/>: 这个arg标签用于传递名为vehicle_id的参数,它的值是当前launch文件中名为vehicle_id的变量的值。
<arg name="launch_vehicle_interface" value="$(var launch_vehicle_interface)"/>: 这个arg标签用于传递名为launch_vehicle_interface的参数,它的值是当前launch文件中名为launch_vehicle_interface的变量的值。
<arg name="config_dir" value="$(find-pkg-share individual_params)/config/$(var vehicle_id)/$(var sensor_model)"/>: 这个arg标签用于传递名为config_dir的参数,它的值是通过$(find-pkg-share individual_params)/config/$(var vehicle_id)/$(var sensor_model)语法确定的路径值。
- 通过这样的方式,可以将参数值传递给被包含的vehicle.launch.xml文件,以便进行进一步的配置和使用。