Skip to content

参数#

Autoware ROS 节点已声明参数,这些参数的值在节点启动期间以参数文件的形式提供.参数文件中应存在所有具有相应值的预期参数.根据应用程序,可能需要修改参数值.

ROS 官方文档中查找有关参数的更多信息:

工作流程#

一个使用 declare_parameter(...) 函数应:

此工作流背后的基本原理是将经过验证的单一事实来源传递给 ROS 节点并在 Web 文档中使用.该方法降低了使用无效参数值的风险,并使文档维护更加容易.这是通过以下方式实现的:

  • declare_parameter(...) 如果参数文件中缺少预期参数,则引发异常
  • 架构验证 CI 中的参数文件并呈现参数表,如下图所示

    flowchart TD
        NodeSchema[Schema file: *.schema.json]
        ParameterFile[Parameter file: *.param.yaml]
        WebDocumentation[Web documentation table]
    
        NodeSchema -->|Validation| ParameterFile
        NodeSchema -->|Generate| WebDocumentation

注意:参数值仍然可以修改并绕过验证,因为在运行时没有验证.

声明参数函数#

它是 declare_parameter(...) 函数,该函数在节点启动期间设置参数值.

declare_parameter<INSERT_TYPE>("INSERT_PARAMETER_1_NAME"),
declare_parameter<INSERT_TYPE>("INSERT_PARAMETER_N_NAME")

由于没有提供_default_value_,因此如果提供的 *.param.yaml 文件中缺少参数,该函数将引发异常.将下表中 C++ Type_列中的类型用于 declare_parameter(...) 函数,替换 _INSERT_TYPE.

ParameterType 枚举 C++ 类型
PARAMETER_BOOL bool
PARAMETER_INTEGER int64_t
PARAMETER_DOUBLE double
PARAMETER_STRING std::string
PARAMETER_BYTE_ARRAY std::vector<uint8_t>
PARAMETER_BOOL_ARRAY std::vector<bool>
PARAMETER_INTEGER_ARRAY std::vector<int64_t>
PARAMETER_DOUBLE_ARRAY std::vector<double>
PARAMETER_STRING_ARRAY std::vector<std::string>

该表已从 参数类型参数值 派生而来.

参见示例:Lidar Apollo Segmentation TVM Nodes declare function

参数文件#

参数文件最小,因为无需向用户提供其他信息,例如描述或类型.这是因为关联的架构文件提供了其他信息.使用下面的模板作为 ROS 节点的起点.

/**:
  ros__parameters:
    INSERT_PARAMETER_1_NAME: INSERT_PARAMETER_1_VALUE
    INSERT_PARAMETER_N_NAME: INSERT_PARAMETER_N_VALUE

注意:使用 /** 而不是显式的节点命名空间,这允许将参数文件传递给已 重新映射ROS 节点.

要使模板适应 ROS 节点,请将所有参数的每个 INSERT_PARAMETER_..._NAMEINSERT_PARAMETER_..._VALUE 替换为 ..._VALUE.每个 declare_parameter(...) 将一个参数作为输入.所有参数文件都应该有 .param.yaml 后缀,以便可以正确应用自动格式.

Autoware 的 ROS 包有以下两种类型的参数文件:

  • 节点参数文件
    • Node 参数文件存储 Autoware 中为每个包提供的默认参数.
    • 如果在节点中声明了 ROS 参数,则 Autoware 中的所有节点都必须有一个参数文件.
    • 对于 FOO_package ,参数应存储在 FOO_package/config 中.
    • 默认情况下,各个软件包的启动文件必须加载 node 参数:
<launch>
  <arg name="foo_node_param_path" default="$(find-pkg-share FOO_package)/config/foo_node.param.yaml" />

  <node pkg="FOO_package" exec="foo_node">
    ...
    <param from="$(var foo_node_param_path)" />
  </node>
</launch>
  • 启动参数文件

JSON 架构#

JSON 架构 用于验证参数文件,确保其具有正确的结构和内容.为此,使用 JSON 架构被视为云原生开发的最佳实践.在为 ROS 节点定义 Schema 时,应使用下面的 Schema 模板作为起点.

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "INSERT_TITLE",
  "type": "object",
  "definitions": {
    "INSERT_ROS_NODE_NAME": {
      "type": "object",
      "properties": {
        "INSERT_PARAMETER_1_NAME": {
          "type": "INSERT_TYPE",
          "description": "INSERT_DESCRIPTION",
          "default": "INSERT_DEFAULT",
          "INSERT_BOUND_CONDITION(S)": INSERT_BOUND_VALUE(S)
        },
        "INSERT_PARAMETER_N_NAME": {
          "type": "INSERT_TYPE",
          "description": "INSERT_DESCRIPTION",
          "default": "INSERT_DEFAULT",
          "INSERT_BOUND_CONDITION(S)": INSERT_BOUND_VALUE(S)
        }
      },
      "required": ["INSERT_PARAMETER_1_NAME", "INSERT_PARAMETER_N_NAME"],
      "additionalProperties": false
    }
  },
  "properties": {
    "/**": {
      "type": "object",
      "properties": {
        "ros__parameters": {
          "$ref": "#/definitions/INSERT_ROS_NODE_NAME"
        }
      },
      "required": ["ros__parameters"],
      "additionalProperties": false
    }
  },
  "required": ["/**"],
  "additionalProperties": false
}

架构文件路径为 INSERT_PATH_TO_PACKAGE/schema/ ,架构文件名为 INSERT_NODE_NAME.schema.json .要使模板适应 ROS 节点,请替换每个 INSERT_... 并添加所有参数 1..N.

请参阅示例:基于_Image投影的融合 - Pointpainting_ 架构

属性#

参数具有多个属性,有些是必需的,有些是可选的.强烈建议使用 optional 属性(如果适用),因为它们提供有关参数的有用信息,并且可以确保参数的值在其边界内.

必需#

-名字 -类型 - 参见 JSON Schema types -描述

可选#

-违约 - 经过测试和验证的值,参见 JSON Schema default - 边界 - 类型相关,例如 integerrangesize

提示和技巧#

使用完善的标准可以使用传统工具.以下是如何使用 VS Code 将架构链接到参数文件的示例.这使开发人员能够使用方便的功能,例如自动完成和参数绑定验证.

在托管项目的根目录中,创建一个包含两个文件的 .vscode 文件夹;extensions.json 包含

{
  "recommendations": ["redhat.vscode-yaml"]
}

以及 settings.json 包含

{
  "yaml.schemas": {
    "./INSERT_PATH_TO_PACKAGE/schema/INSERT_NODE_NAME.schema.json": "**/INSERT_NODE_NAME/config/*.param.yaml"
  }
}

RedHat YAML 扩展允许使用 JSON 架构验证 YAML 文件, yaml.schemas 设置将 .schema.json 文件与 config/ 文件夹中的所有 .param.yaml `文件相关联.