网站 | Python API - Rust API | 指南 | Discord
dora-rs是什么?
数据流导向机器人架构(dora-rs)是一个使机器人应用程序的创建快速简单的框架。
构建机器人应用程序可以概括为将硬件、算法和人工智能模型整合在一起,并使它们相互通信。在dora-rs,我们尝试:
- 通过支持Python、C、C++和ROS2,使硬件和软件的集成变得简单。
- 通过使用零拷贝Arrow消息,使通信具有低延迟。
dora-rs仍处于实验阶段,您可能会遇到一些错误,但我们正在努力使其尽可能稳定。
性能
dora-rs可以展现令人印象深刻的性能,比当前的ROS2 Python状态快17倍!这是使用我们自己的共享内存服务器和Apache Arrow来实现零拷贝数据传递的结果。
数据流范式
dora-rs实现了一种声明式数据流范式,其中任务被分割为作为独立进程隔离的节点。
每个节点定义其输入和输出以与其他节点连接。
nodes:
- id: webcam
custom:
source: webcam.py
inputs:
tick: dora/timer/millis/50
outputs:
- image
- id: object_detection
custom:
source: object_detection.py
inputs:
image: webcam/image
outputs:
- bbox
- id: plot
custom:
source: plot.py
inputs:
image: webcam/image
bbox: object_detection/bbox
节点可以是:
- 自定义节点,其中dora-rs作为原生库嵌入。
- 运行时节点,其中dora-rs处理主循环并运行用户定义的操作符。这使得dora-rs功能丰富,因为我们可以运行诸如"热重载"之类的功能。
数据流范式的优势在于创建了一个抽象层,使机器人应用程序模块化且易于配置。
通信
同一机器上的节点间通信通过共享内存处理,分布式机器上则通过TCP处理。我们的共享内存实现跟踪跨进程的消息,并在过时时丢弃它们。共享内存槽被缓存以避免新的内存分配。
消息格式
节点使用Apache Arrow数据格式进行通信。
Apache Arrow是一种用于平面和层次数据的通用内存格式。Arrow内存格式支持零拷贝读取,实现了闪电般快速的数据访问,无需序列化开销。它定义了一个C数据接口,不需要任何构建时或链接时的依赖要求,这意味着dora-rs除了您喜欢的语言的原生编译器之外,不需要任何编译步骤。
Opentelemetry
dora-rs使用Opentelemetry来记录所有的日志、指标和跟踪。这意味着数据和遥测可以使用共享抽象进行链接。
Opentelemetry是一个开源的可观察性标准,使dora-rs的遥测数据可以被大多数后端收集,如elasticseach、prometheus、Datadog等。
Opentelemetry是语言无关的,后端不可知的,并且可以轻松收集分布式数据,这使它非常适合dora-rs应用程序。
热重载
dora-rs为Python实现了热重载,这意味着您可以在运行时更改Python代码,同时保持状态完整。
使用特性标志:--attach --hot-reload
,dora-rs会监视代码更改并重新加载已修改的节点。
您可以在以下链接查看故障安全机制:https://github.com/dora-rs/dora/pull/239
自编码机器人:代码RAG(进行中)
您可以通过将热重载与检索增强生成(RAG)结合使用来轻松创建自编码机器人,RAG将根据您的提示生成代码修改。 参见:examples/python-operator-dataflow
自编码机器人只是我们希望推动的机器人与大型语言模型结合的冰山一角。还有很多我们尚未探索的领域,比如:
安装
最快的方法:
cargo install dora-cli --locked
pip install dora-rs # 用于Python API
dora --help
有关安装的更多信息,请查看我们的指南。
入门
- 安装示例Python依赖:
pip install -r https://raw.githubusercontent.com/dora-rs/dora/v0.3.5/examples/python-operator-dataflow/requirements.txt
- 获取一些示例操作符:
wget https://raw.githubusercontent.com/dora-rs/dora/v0.3.5/examples/python-operator-dataflow/webcam.py
wget https://raw.githubusercontent.com/dora-rs/dora/v0.3.5/examples/python-operator-dataflow/plot.py
wget https://raw.githubusercontent.com/dora-rs/dora/v0.3.5/examples/python-operator-dataflow/utils.py
wget https://raw.githubusercontent.com/dora-rs/dora/v0.3.5/examples/python-operator-dataflow/object_detection.py
wget https://raw.githubusercontent.com/dora-rs/dora/v0.3.5/examples/python-operator-dataflow/dataflow.yml
- 启动数据流
dora up
dora start dataflow.yml --attach --hot-reload
确保有一个网络摄像头
要停止数据流,可以使用 ctrl+c
如果想进一步探索,可以添加一个yolov8操作器,请查看我们的入门指南:https://www.dora-rs.ai/docs/guides/getting-started/yolov8/
ROS2 桥接
- 无需编译即可传递消息到ROS 2
- 自动转换ROS 2消息 <-> Arrow数组
import random
import pyarrow as pa
# 配置样板代码...
turtle_twist_writer = ...
## 基于Arrow的ROS2 Twist消息
## 不需要导入ROS2
message = pa.array([{
"linear": {
"x": 1,
},
"angular": {
"z": 1
},
}])
turtle_twist_writer.publish(message)
你可能想使用ChatGPT来编写Arrow格式:https://chat.openai.com/share/4eec1c6d-dbd2-46dc-b6cd-310d2895ba15
硬件
我们认为可能适合尝试dora-rs的酷炫硬件🙋 我们没有受到制造商的赞助:
价格 | 开源 | Github | 类型 | Dora项目 | |
---|---|---|---|---|---|
DJI 机甲大师 S1 | 550$ | SDK | https://github.com/dji-sdk/RoboMaster-SDK | 机器人 | https://huggingface.co/datasets/dora-rs/dora-robomaster |
DJI 机甲大师 EP 核心 | 950$ | SDK | https://github.com/dji-sdk/RoboMaster-SDK | 机器人,机械臂 | |
DJI Tello | 100$ | 无人机 | |||
BitCraze Crazyflies | 225$ | 固件, 库, SDK | https://github.com/bitcraze | 无人机 | |
AlexanderKoch-Koch/low_cost_robot | 250$ | 全部 | https://github.com/AlexanderKoch-Koch/low_cost_robot | 机械臂 | |
xArm 1S | 200$ | 机械臂 | |||
Wavego | 250$ | 四足机器人 | |||
AINex | 800$ | 人形机器人 |
更多信息:https://docs.google.com/spreadsheets/d/1YYeW2jfOIWDVgdEgqnMvltonHquQ7K8OZCrnJRELL6o/edit#gid=0
文档
完整文档可在我们的网站上找到
讨论
我们的主要交流渠道是:
欢迎就任何话题、问题或想法与我们联系。
我们还有贡献指南。
支持矩阵
dora-rs | 期望 | |
---|---|---|
一级支持 | Python, Rust | C, C++, ROS 2 |
二级支持 | C, C++, ROS2 | |
热重载 | Python | Rust (https://github.com/orgs/dora-rs/discussions/360) |
消息格式 | Arrow | 原生 |
本地通信 | 共享内存 | 自定义中间件, 零拷贝GPU IPC, 进程内tokio::channel 通信 |
远程通信 | TCP (参见: https://github.com/dora-rs/dora/issues/459) | 自定义中间件, Zenoh |
指标、追踪和日志 | Opentelemetry | 原生日志库集成到Opentelemetry |
数据归档 | Parquet (dora-record) | |
可视化和注释 | OpenCV | rerun.io |
支持的平台 (x86) | Windows, macOS, Linux | |
支持的平台 (ARM) | macOS, Linux | |
配置 | YAML |
不稳定功能
dora-rs
Ros2桥接被标记为不稳定。
功能被标记为不稳定可能有几个原因:
- 我们不确定确切的API。名称、函数签名或实现在将来可能会改变。
- 该功能尚未经过广泛测试。在实际场景中使用时可能会出现错误。
- 该功能与完整的dora-rs API集成得不太好。你可能会发现它在一个上下文中工作,但在另一个上下文中不工作。
将功能发布为不稳定允许我们从在实际场景中使用dora-rs的用户那里收集重要反馈。 这有助于我们在最终批准之前对其进行微调。 只对稳定、经过充分测试的功能感兴趣的用户可以避开API的这部分。
标记为不稳定的功能可能会在任何时候发生变化,而不被视为重大变更。
许可
本项目采用Apache-2.0许可。查看NOTICE.md获取更多信息。