| @@ -429,4 +429,4 @@ Dora yolov8 目标检测示例代码:https://pan.baidu.com/s/1uXXjFkpgeT_iHdNJ | |||||
| $ pip install numpy opencv-python pyarrow ultralytics | $ pip install numpy opencv-python pyarrow ultralytics | ||||
| ``` | ``` | ||||
| **内容编写** : **`李扬`** | |||||
| 内容编写 : **`李扬`** | |||||
| @@ -1,6 +1,6 @@ | |||||
| # 介绍 | # 介绍 | ||||
| `Dora-rs` 是一个用于构建**实时模块化机器人应用程序**的框架。它使用声明式数据流 ,其中任务被拆分成称为节点的独立进程。这些节点使用高性能 通过事件流传输的 `Arrow` 数据格式,由本地管理 守护进程和中央协调器 。用户使用 `CLI` 与 `Dora` 交互 并使用语言 `API` 绑定开发自定义组件。 | |||||
| **`dora-rs`** (Dataflow-Oriented Robotic Architecture) 是一种旨在简化基于 **人工智能的具身智能机器人** 应用开发的中间件 。其核心理念是将复杂的机器人应用程序建模为声明式的有向图,即“数据流” 。这种范式从根本上促进了系统的模块化、可配置性和可扩展性 。 | |||||
| ## 为什么选择`Dora-rs` | ## 为什么选择`Dora-rs` | ||||
| @@ -30,10 +30,10 @@ | |||||
| 命令行 (`CLI`):你通过一个简单的命令行工具,就能像“总指挥”下达命令一样,去启动、停止或管理整个机器人程序。 | 命令行 (`CLI`):你通过一个简单的命令行工具,就能像“总指挥”下达命令一样,去启动、停止或管理整个机器人程序。 | ||||
| API 接口 (`Language-API Bindings`):如果你想自己写一个新的功能模块(比如加个“机械臂模块”),`Dora-rs` 允许你用 Python、C++ 等多种主流编程语言来开发,然后轻松地把它接入到整个“流水线”里。 | |||||
| API 接口 (`Language-API Bindings`):如果你想自己写一个新的功能模块(比如加个“机械臂模块”),`Dora-rs` 允许你用 Rust、Python、C++ 等多种主流编程语言来开发,然后轻松地把它接入到整个“流水线”里。 | |||||
| ## `Dora-rs`流程图 | ## `Dora-rs`流程图 | ||||
|  |  | ||||
| **内容编写** : **`李扬`** | |||||
| 内容编写 : **`李扬`** | |||||
| @@ -93,4 +93,4 @@ Options: | |||||
| -V, --version Print version | -V, --version Print version | ||||
| ``` | ``` | ||||
| **内容编写** : **`李扬`** | |||||
| 内容编写 : **`李扬`** | |||||
| @@ -10,7 +10,7 @@ | |||||
| [数据消息/Arrow Data](./data-message) 作为高效数据传输的格式。 | [数据消息/Arrow Data](./data-message) 作为高效数据传输的格式。 | ||||
| 现在,我们来谈谈如何实际编写这些节点和操作符的代码 ,让它们完成各自的工作。你用 `Python` 或 `Rust` 编写的自定义逻辑如何连接到 `dora 运行时`来接收输入并发送输出?这时, **`API 绑定`** 就派上用场了。 | |||||
| 现在,我们来谈谈如何实际编写这些节点和操作符的代码 ,让它们完成各自的工作。你用 `Python` 或 `Rust` 编写的自定义逻辑如何连接到 `dora 运行时`来接收输入并发送输出?这时, **`API Binding` 绑定** 就派上用场了。 | |||||
| ## 代码的翻译器和工具包 | ## 代码的翻译器和工具包 | ||||
| @@ -183,4 +183,4 @@ def process_operator_data(data): | |||||
| 现在您已经了解了如何使用 `API 绑定`为各个组件编写代码,让我们缩小范围并查看用于管理和运行整个数据流的主要工具: **`Dora CLI 命令行`** 。 | 现在您已经了解了如何使用 `API 绑定`为各个组件编写代码,让我们缩小范围并查看用于管理和运行整个数据流的主要工具: **`Dora CLI 命令行`** 。 | ||||
| **内容编写** : **`李扬`** | |||||
| 内容编写 : **`李扬`** | |||||
| @@ -2,7 +2,7 @@ | |||||
| 欢迎回到 `dora` 教程!在[事件流](./event-stream)中,我们学习了节点和操作符通过事件流接收信息,包括携带数据的 INPUT 事件。但是,这些数据在事件内部是什么样的? `dora` 又是如何高效地传输这些数据的,尤其是对于图像或传感器读数等大数据项? | 欢迎回到 `dora` 教程!在[事件流](./event-stream)中,我们学习了节点和操作符通过事件流接收信息,包括携带数据的 INPUT 事件。但是,这些数据在事件内部是什么样的? `dora` 又是如何高效地传输这些数据的,尤其是对于图像或传感器读数等大数据项? | ||||
| 本章深入探讨 `dora` 数据处理的核心: `数据消息`及其对 `Apache Arrow` 格式的使用。 | |||||
| 本章深入探讨 `dora` 数据处理的核心: **`数据消息`** 及其对 **`Apache Arrow`** 格式的使用。 | |||||
| ## 对速度的需求:处理大数据 | ## 对速度的需求:处理大数据 | ||||
| @@ -124,4 +124,4 @@ for event in node: | |||||
| 现在您已经了解了数据如何流动和表示,让我们看看您将用来在 `Node` 或 `Operator` 代码中与 `dora 运行时`进行交互的工具: **`API Bingding 绑定`** 。 | 现在您已经了解了数据如何流动和表示,让我们看看您将用来在 `Node` 或 `Operator` 代码中与 `dora 运行时`进行交互的工具: **`API Bingding 绑定`** 。 | ||||
| **内容编写** : **`李扬`** | |||||
| 内容编写 : **`李扬`** | |||||
| @@ -1,6 +1,8 @@ | |||||
| # 数据流 | # 数据流 | ||||
| 欢迎来到 `dora` 教程! `dora` 是一个强大的框架,旨在帮助您构建复杂的应用程序,尤其是那些需要处理实时数据的应用程序,例如机器人技术或 `AI` 引用。但是,如何设计和管理这些需要不同组件协同工作并共享信息的应用程序呢?这就是 `Dataflow` 的概念! | |||||
| 欢迎来到 `dora` 教程! `dora` 是一个强大的框架,旨在帮助您构建复杂的应用程序,尤其是那些需要处理实时数据的应用程序,例如机器人技术或 `AI` 引用。 | |||||
| 但是,如何设计和管理这些需要不同组件协同工作并共享信息的应用程序呢?这就是 **`Dataflow 数据流`** 的概念! | |||||
| ## 您应用程序的“蓝图” | ## 您应用程序的“蓝图” | ||||
| @@ -129,4 +131,4 @@ dora run dataflow.yml | |||||
| 现在您已经了解了整体数据流蓝图,下一章让我们深入了解构成该蓝图的各个构建块: **`Node 节点`** 。 | 现在您已经了解了整体数据流蓝图,下一章让我们深入了解构成该蓝图的各个构建块: **`Node 节点`** 。 | ||||
| **内容编写** : **`李扬`** | |||||
| 内容编写 : **`李扬`** | |||||
| @@ -4,7 +4,7 @@ | |||||
| 但是,如何才能将完成的 `Dataflow` 和 `Node/Operator` 代码真正地运行在 `dora` 上呢?如何让 `dora` 启动、停止所有操作,或者查看哪些程序正在运行? | 但是,如何才能将完成的 `Dataflow` 和 `Node/Operator` 代码真正地运行在 `dora` 上呢?如何让 `dora` 启动、停止所有操作,或者查看哪些程序正在运行? | ||||
| 这就是 `Dora CLI` 的作用所在! | |||||
| 这就是 **`Dora CLI` 命令行** 的作用所在! | |||||
| ## 您的 `Dora` 指挥中心 | ## 您的 `Dora` 指挥中心 | ||||
| @@ -169,4 +169,4 @@ dora destroy | |||||
| 现在您已经了解了如何使用 `CLI` 命令 `dora` ,让我们深入了解接收这些命令并管理运行节点的关键组件之一: **`Dora Daemon 守候进程`** 。 | 现在您已经了解了如何使用 `CLI` 命令 `dora` ,让我们深入了解接收这些命令并管理运行节点的关键组件之一: **`Dora Daemon 守候进程`** 。 | ||||
| **内容编写** : **`李扬`** | |||||
| 内容编写 : **`李扬`** | |||||
| @@ -12,7 +12,7 @@ | |||||
| 您的 `Dataflow` 需要跨越所有这些机器。您将在每台机器上运行一个 `Dora Daemon` 来管理本地节点 。但是,如何让系统在正确的机器上启动正确的节点 ,协调它们之间通过网络的通信,并管理这个分布式应用程序的整个生命周期呢? | 您的 `Dataflow` 需要跨越所有这些机器。您将在每台机器上运行一个 `Dora Daemon` 来管理本地节点 。但是,如何让系统在正确的机器上启动正确的节点 ,协调它们之间通过网络的通信,并管理这个分布式应用程序的整个生命周期呢? | ||||
| 这就是 **`Dora Coordinator`** 的工作。 | |||||
| 这就是 **`Dora Coordinator` 协调器** 的工作。 | |||||
| ## 空中交通管制塔 | ## 空中交通管制塔 | ||||
| @@ -136,4 +136,4 @@ dora stop my_dataflow_id --coordinator-addr 192.168.1.100 | |||||
| 至此,我们对 `dora` 核心概念的入门教程就结束了。我们介绍了`数据流`、`构建块(节点、操作符)`、`通信机制(事件流、数据消息/Arrow Data、API 绑定)`以及`运行时基础架构(命令行界面、守护进程、协调器)`。现在,您对 `dora` 工作原理及其主要组件的作用有了基本的了解,这将帮助您更深入地构建自己的实时数据流应用程序。 | 至此,我们对 `dora` 核心概念的入门教程就结束了。我们介绍了`数据流`、`构建块(节点、操作符)`、`通信机制(事件流、数据消息/Arrow Data、API 绑定)`以及`运行时基础架构(命令行界面、守护进程、协调器)`。现在,您对 `dora` 工作原理及其主要组件的作用有了基本的了解,这将帮助您更深入地构建自己的实时数据流应用程序。 | ||||
| **内容编写** : **`李扬`** | |||||
| 内容编写 : **`李扬`** | |||||
| @@ -7,7 +7,7 @@ | |||||
| 当您使用 `Dora CLI` 运行类似 `dora run` 命令时,实际上是在告诉 `dora` 执行您的数据流。但是,`CLI` 程序本身并不是运行节点和管理所有复杂通信的程序。 | 当您使用 `Dora CLI` 运行类似 `dora run` 命令时,实际上是在告诉 `dora` 执行您的数据流。但是,`CLI` 程序本身并不是运行节点和管理所有复杂通信的程序。 | ||||
| 这项工作落到了构成 `dora` 运行时的后台进程身上。 | 这项工作落到了构成 `dora` 运行时的后台进程身上。 | ||||
| 这些后台进程中最重要的一个,尤其是在单机上运行的 **`Dora 守护进程 (Dora Daemon)`** 就是它。 | |||||
| 这些后台进程中最重要的一个,尤其是在单机上运行的 **`Dora Daemon` 守护进程** 就是它。 | |||||
| ## 本地交通经理 | ## 本地交通经理 | ||||
| @@ -92,4 +92,4 @@ dora run yolo.yml | |||||
| 现在我们了解了本地管理器(守护进程),让我们了解一下协调多个守护进程并管理跨不同机器的数据流的组件: **`Dora Coordinator 协调器`** 。 | 现在我们了解了本地管理器(守护进程),让我们了解一下协调多个守护进程并管理跨不同机器的数据流的组件: **`Dora Coordinator 协调器`** 。 | ||||
| **内容编写** : **`李扬`** | |||||
| 内容编写 : **`李扬`** | |||||
| @@ -4,31 +4,31 @@ | |||||
| `节点`和`操作符`都需要一种方法来感知需要关注的事件发生——例如新数据到达或停止命令。它们是如何接收这些重要通知的? | `节点`和`操作符`都需要一种方法来感知需要关注的事件发生——例如新数据到达或停止命令。它们是如何接收这些重要通知的? | ||||
| 这就是 **`事件流`** 发挥作用的地方。 | |||||
| 这就是 **`Event Stream` 事件流** 发挥作用的地方。 | |||||
| ## 节点(或操作员)的收件箱 | |||||
| ## 节点(或操作符)的收件箱 | |||||
| 想象一下,一个节点或操作员就像一个坐在办公桌前准备处理任务的微型办公室职员。他们不会随意开始工作;他们需要被告知新任务何时到来以及任务是什么 。 | |||||
| 想象一下,一个节点或操作符就像一个坐在办公桌前准备处理任务的微型办公室职员。他们不会随意开始工作;他们需要被告知新任务何时到来以及任务是什么 。 | |||||
| `事件流`就像是节点或操作员的收件箱或通知源 。它是一个连续的消息流,告知工蜂完成工作所需的一切信息。 | |||||
| `事件流`就像是节点或操作符的收件箱或通知源 。它是一个连续的消息流,告知工蜂完成工作所需的一切信息。 | |||||
| 无论您的代码是作为独立节点进程运行还是作为运行时节点内的操作员运行,它都会通过其专用`事件流`接收信息。 | |||||
| 无论您的代码是作为独立节点进程运行还是作为运行时节点内的操作符运行,它都会通过其专用`事件流`接收信息。 | |||||
| ## 事件流中包含哪些类型的消息? | ## 事件流中包含哪些类型的消息? | ||||
| 事件流不仅仅用于传入数据。它包含不同类型的消息, `dora` 称之为 **“事件”** 。这些事件会告诉您的节点或操作员数据流和系统中正在发生的事情。 | |||||
| 事件流不仅仅用于传入数据。它包含不同类型的消息, `dora` 称之为 **“事件”** 。这些事件会告诉您的节点或操作符数据流和系统中正在发生的事情。 | |||||
| 以下是您通常会在信息流中发现的主要事件类型: | 以下是您通常会在信息流中发现的主要事件类型: | ||||
| - **INPUT:** 这是最常见的事件。它表示新数据已到达节点(或算子)定义的某个输入。该事件将包含数据本身,并告知您数据来自哪个输入。这就是节点和算子接收需要处理的数据的方式。 | - **INPUT:** 这是最常见的事件。它表示新数据已到达节点(或算子)定义的某个输入。该事件将包含数据本身,并告知您数据来自哪个输入。这就是节点和算子接收需要处理的数据的方式。 | ||||
| - **InputClosed:** 此事件表示节点(或算子)的某个输入源已关闭或断开连接。如果正在为此输入生成数据的节点/算子完成其工作或崩溃,则可能会发生这种情况。您的代码可能需要对此做出反应,例如在关键输入丢失时优雅地关闭。 | - **InputClosed:** 此事件表示节点(或算子)的某个输入源已关闭或断开连接。如果正在为此输入生成数据的节点/算子完成其工作或崩溃,则可能会发生这种情况。您的代码可能需要对此做出反应,例如在关键输入丢失时优雅地关闭。 | ||||
| - **STOP:** 此事件是来自 `dora 运行时`的命令,告知 `Node` 或 `Operator` 关闭。当您使用 `dora CLI` 停止数据流,或者数据流自然结束时(例如,所有输入都关闭,没有其他工作要做)时,就会发生这种情况。您的代码应该监听此事件并干净地退出。 | - **STOP:** 此事件是来自 `dora 运行时`的命令,告知 `Node` 或 `Operator` 关闭。当您使用 `dora CLI` 停止数据流,或者数据流自然结束时(例如,所有输入都关闭,没有其他工作要做)时,就会发生这种情况。您的代码应该监听此事件并干净地退出。 | ||||
| - **RELOAD:** 此事件表示节点或操作员应重新加载其配置或逻辑(如果支持热重载)。这是一项高级功能,允许在不完全重启的情况下更改数据流。 | |||||
| - **RELOAD:** 此事件表示节点或操作符应重新加载其配置或逻辑(如果支持热重载)。这是一项高级功能,允许在不完全重启的情况下更改数据流。 | |||||
| - **ERROR:** 表示事件流本身发生了不可恢复的错误。 | - **ERROR:** 表示事件流本身发生了不可恢复的错误。 | ||||
| ## 节点和操作员如何监听流 | |||||
| ## 节点和操作符如何监听流 | |||||
| 您的节点或操作员代码使用您选择的语言的 `dora API 绑定`与事件流进行交互(我们将在第 6 章:API 绑定中介绍 API)。 | |||||
| 您的节点或操作符代码使用您选择的语言的 `dora API 绑定`与事件流进行交互(我们将在第 6 章:API 绑定中介绍 API)。 | |||||
| 典型的模式是进入一个循环,反复向事件流询问“下一个”事件。然后,代码检查事件的类型及其详细信息,以决定采取什么操作。 | 典型的模式是进入一个循环,反复向事件流询问“下一个”事件。然后,代码检查事件的类型及其详细信息,以决定采取什么操作。 | ||||
| @@ -108,6 +108,6 @@ print("Node stopping gracefully.") | |||||
| `事件流` 是 `dora` 中的一个基本概念。它是节点和操作符接收其运行所需的所有信息的重要通信渠道,包括传入数据 ( `INPUT` )、输入源关闭信号 ( `InputClosed` ) 以及系统命令( `STOP` 、 `RELOAD` )。通过监听此事件流,您的节点和操作符代码可以动态地响应数据流的状态。`dora` 运行管理这些事件流,并根据数据流蓝图将事件传递给相应的节点和操作符。 | `事件流` 是 `dora` 中的一个基本概念。它是节点和操作符接收其运行所需的所有信息的重要通信渠道,包括传入数据 ( `INPUT` )、输入源关闭信号 ( `InputClosed` ) 以及系统命令( `STOP` 、 `RELOAD` )。通过监听此事件流,您的节点和操作符代码可以动态地响应数据流的状态。`dora` 运行管理这些事件流,并根据数据流蓝图将事件传递给相应的节点和操作符。 | ||||
| 现在您已经了解了节点和操作员如何接收通知,让我们仔细看看 `INPUT` 事件中经常包含的 **`DataMessage/Arrow Data 数据`** 本身 。 | |||||
| 现在您已经了解了节点和操作符如何接收通知,让我们仔细看看 `INPUT` 事件中经常包含的 **`DataMessage/Arrow Data 数据`** 本身 。 | |||||
| **内容编写** : **`李扬`** | |||||
| 内容编写 : **`李扬`** | |||||
| @@ -1,6 +1,8 @@ | |||||
| # 节点 | # 节点 | ||||
| 欢迎回到 `dora` 的教程!在[上一章:数据流](./dataflow)中,我们了解到数据流是 `dora` 系统的蓝图,它使用 `YAML` 文件定义了所有部分以及数据在它们之间流动的方式。现在,让我们深入研究这些单独的部分 —— **节点**(`nodes`)。 | |||||
| 欢迎回到 `dora` 的教程!在[上一章:数据流](./dataflow)中,我们了解到数据流是 `dora` 系统的蓝图,它使用 `YAML` 文件定义了所有部分以及数据在它们之间流动的方式。 | |||||
| 现在,让我们深入研究这些单独的部分 —— **节点 `nodes`**。 | |||||
| ## 应用程序中的工蜂 | ## 应用程序中的工蜂 | ||||
| @@ -124,4 +126,4 @@ print("Node stopping.") | |||||
| 现在我们了解了各个处理单元(节点),让我们看一下在节点内部构建逻辑的常用方法,特别是在处理许多输入和输出时: **`Operator 操作符`** 的概念。 | 现在我们了解了各个处理单元(节点),让我们看一下在节点内部构建逻辑的常用方法,特别是在处理许多输入和输出时: **`Operator 操作符`** 的概念。 | ||||
| **内容编写** : **`李扬`** | |||||
| 内容编写 : **`李扬`** | |||||
| @@ -2,7 +2,7 @@ | |||||
| 欢迎回来!在[数据流](./dataflow)中,我们学习了 `dora` 应用程序的整体蓝图以及它如何连接各个部分。在[节点](./node)中,我们深入探讨了这些节点部分,并了解到每个节点通常作为一个独立的进程运行,执行特定的任务,并通过数据流 `YAML` 中定义的输入和输出进行通信。 | 欢迎回来!在[数据流](./dataflow)中,我们学习了 `dora` 应用程序的整体蓝图以及它如何连接各个部分。在[节点](./node)中,我们深入探讨了这些节点部分,并了解到每个节点通常作为一个独立的进程运行,执行特定的任务,并通过数据流 `YAML` 中定义的输入和输出进行通信。 | ||||
| 现在,让我们探索一种在 `Node` 内部添加更多结构和可重用性的方法: `Operator` 的概念。 | |||||
| 现在,让我们探索一种在 `Node` 内部添加更多结构和可重用性的方法: **`Operator 操作符`** 的概念。 | |||||
| ## 节点内部更小、可重复使用的步骤 | ## 节点内部更小、可重复使用的步骤 | ||||
| @@ -187,4 +187,4 @@ class Operator: | |||||
| 现在我们了解了节点和操作符,让我们看看数据在系统中移动的基本概念: **`Event Stream 事件流`** 。 | 现在我们了解了节点和操作符,让我们看看数据在系统中移动的基本概念: **`Event Stream 事件流`** 。 | ||||
| **内容编写** : **`李扬`** | |||||
| 内容编写 : **`李扬`** | |||||
| @@ -3,8 +3,8 @@ pageType: home | |||||
| hero: | hero: | ||||
| name: Dora中文社区 | name: Dora中文社区 | ||||
| text: 机器人开发的未来范式 | |||||
| tagline: 安全 · 高效 · 极简如诗 | |||||
| text: 为AI时代打造的现代机器人框架 | |||||
| tagline: 极简 · 安全 · 高效 | |||||
| actions: | actions: | ||||
| - theme: brand | - theme: brand | ||||
| text: 探索教程 → | text: 探索教程 → | ||||
| @@ -16,7 +16,7 @@ export default defineConfig({ | |||||
| // cleanUrls: true, | // cleanUrls: true, | ||||
| // }, | // }, | ||||
| head: [ | head: [ | ||||
| '<meta name="内容编写" content="Leon 李扬">', | |||||
| '<meta name="Author" content="李扬">', | |||||
| ], | ], | ||||
| themeConfig: { | themeConfig: { | ||||
| socialLinks: [ | socialLinks: [ | ||||
| @@ -13,13 +13,13 @@ | |||||
| } | } | ||||
| .rspress-home-hero-image { | .rspress-home-hero-image { | ||||
| max-width: 300px; | |||||
| margin-bottom: 20px; | |||||
| max-width: 260px; | |||||
| margin-bottom: 80px; | |||||
| } | } | ||||
| @media (min-width: 768px) { | @media (min-width: 768px) { | ||||
| .md\:text-6xl { | .md\:text-6xl { | ||||
| font-size: 3.60rem; | |||||
| font-size: 2.50rem; | |||||
| line-height: 1; | line-height: 1; | ||||
| } | } | ||||
| } | } | ||||