跳过主要内容

数据流规范

数据流是通过 YAML 文件指定的。 本节介绍我们文件格式当前的草案。 现在它仅包含基本功能,稍后我们将在引入更多高级特性时进行扩展。

数据流

数据流通过以下格式指定:

nodes:
- id: foo
# ... (见下文)
- id: bar
# ... (见下文)

输入和输出

每个算子或自定义节点的输出都有一个单独的命名空间。 要引用输出,可以使用 <operator>/<output> 语法。 这样算子之间就不会发生名称冲突。

输入操作使用 <name>: <operator>/<output> 语法指定,其中 <data> 是使用于操作的内部名称。 此名称映射的主要优势,是相同的算子,可被在不同输入上多次重用执行。

节点

节点被如下格式定义:

nodes:
- id: some-unique-id
# 对于有多个算子的节点
operators:
- id: operator-1
# ... (见下文)
- id: operator-2
# ... (见下文)



- id: some-unique-id-2
custom:
source: path/to/timestamp
env:
- ENVIRONMENT_VARIABLE_1: true
working-directory: some/path

inputs:
input_1: operator_2/output_4
input_2: custom_node_2/output_4
outputs:
- output_1

# 唯一算子
- id: some-unique-id-3
operator:
# ... (见下文)

节点必须提供 operators 字段或 custom 字段,但不能同时提供两者。 具有 operators 字段的节点运行一个 dora 运行时进程,该进程运行和管理指定的算子。 具有 custom 字段的节点运行一个自定义可执行程序。

自定义节点

自定义节点通过 run 字段,像一个正常 shell 操作, 指定可执行名称和参数。 通过 env 可选字段,能够为进程设置环境变量。 可选字段 working-directory 允许程序启动后覆写目录。

与 dora 数据流的其余部分集成,自定义节点必须指定其输入和输出,类似于算子。 他们能在算子和其它自定义节点间引用输出。

算子

算子通过如下格式定义:

- id: 唯一算子 id
name: 人类易读算子名称
description: 一个算子目的的可选描述。

inputs:
input_1: 源算子2/输出1
input_2: 自定义节点1/输出1
outputs:
- 输出1

## 其中之一:
shared_library: "path/to/shared_lib" # 前缀为 `lib ` 的文件扩展将被自动添加
python: "path/to/python_file.py"
wasm: "path/to/wasm_file.wasm"

算子必须列出全部他们的输入和输出。 输入可以链接到其他算子或自定义节点的任意输出。

多种路径实现一个算子:

  • 作为兼容C的共享库
  • 作为Python对象
  • 做为 WebAssembly (WASM) 模块

每个算子必须只指定一个实现。 实现必须遵循 dora 指定的特定格式。

示例

nodes:
- id: rust-node
custom:
build: cargo build -p rust-dataflow-example-node
source: ../../target/debug/rust-dataflow-example-node
inputs:
tick: dora/timer/millis/10
outputs:
- random
- id: runtime-node
operators:
- id: rust-operator
build: cargo build -p rust-dataflow-example-operator
shared-library: ../../target/debug/rust_dataflow_example_operator
inputs:
tick: dora/timer/millis/100
random: rust-node/random
outputs:
- status
- id: rust-sink
custom:
build: cargo build -p rust-dataflow-example-sink
source: ../../target/debug/rust-dataflow-example-sink
inputs:
message: runtime-node/rust-operator/status

TODO: 与 ROS 1/2 集成

为了 dora-rs 算子与 ROS1 或 ROS2 算子集成,我们计划提供特殊的 桥接算子。 这些算子行为在一个数据流框架中作为接收器,并推送全部消息至一个不同的数据流框架,在该框架中它们充当源。

例如,我们计划提供一个 to_ros_2 算子,这需要一个单个的 data 输入,然后发布到指定的 ROS 2 数据流。