参数#
Autoware ROS 节点已声明参数,这些参数的值在节点启动期间以参数文件的形式提供.参数文件中应存在所有具有相应值的预期参数.根据应用程序,可能需要修改参数值.
从 ROS 官方文档中查找有关参数的更多信息:
工作流程#
一个使用 declare_parameter(...) 函数应:
- 使用 declare_parameter(...) 无默认值
- 创建参数文件
- 创建 Schema 文件
此工作流背后的基本原理是将经过验证的单一事实来源传递给 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_..._NAME 和 INSERT_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>
- 启动参数文件
- 当用户为用户的车辆创建启动包时,用户应将启动文件中调用的节点的节点参数文件复制为
启动参数文件. - 然后,将专门针对用户的车辆自定义启动参数文件.
- 启动参数文件的示例存储在
autoware_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 - 边界 - 类型相关,例如 integer、range 和 size
提示和技巧#
使用完善的标准可以使用传统工具.以下是如何使用 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 `文件相关联.