Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

目录

介绍

Dora是运行实时多AI和多硬件应用程序的支持多语言的框架。

Dora by Examples是一系列可运行的示例,旨在帮助用户快速入门和学习如何使用Dora框架。这些示例涵盖了各种应用场景,包括各类传感器使用,图像分类、目标检测、语音识别,电机控制等。包括Python、Rust、C++等语言的示例。

安装

Dora 提供了多种安装方式

pip install dora-rs-cli
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/dora-rs/dora/releases/latest/download/dora-cli-installer.sh | sh
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/dora-rs/dora/releases/latest/download/dora-cli-installer.sh | sh
powershell -ExecutionPolicy ByPass -c "irm https://github.com/dora-rs/dorareleases/latest/download/dora-cli-installer.ps1 | iex"
cargo install dora-cli
docker pull ghcr.io/dora-rs/dora-slim #拉取镜像
docker run ghcr.io/dora-rs/dora-slim dora --help #运行容器
git clone https://github.com/dora-rs/dora.git
cd dora
cargo build --release -p dora-cli
PATH=$PATH:$(pwd)/target/release

important

本文主要围绕主分支的最新代码展开,如果想获得完全相同体验请尽量使用主分支上的Dora。 所有的样例以及部分多编程语言涉及到的特定包(Rust Crates)只在源码中给出,现阶段推荐从源码安装

确认完成安装

$ dora --version
dora-cli 0.3.11

从源码安装dora(以Ubuntu24.04为例)

安装Rust

安装rustup,rustup是管理Rust版本、编译工具链的重要工具

$ sudo apt install curl -y # 安装curl,如果未安装
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # 弹出选项,回车选择默认安装即可
$ export PATH=$PATH:$HOME/.cargo/bin # 设置环境变量

rustup安装画面

获取Dora源代码

$ sudo apt install git -y # 安装git,如果未安装
$ git clone https://github.com/dora-rs/dora.git
$ cd dora

编译Dora-CLI

Dora-CLI是非常实用的命令行工具,它提供了许多方便的命令来管理Dora项目。

$ sudo apt install build-essential -y # 安装C/C++编译环境相关的包(包括g++等),如果未安装
$ cargo build --release --package dora-cli

添加到环境变量

$ export PATH=$PATH:$(pwd)/target/release # 添加到环境变量

或者可以选择官方提供的脚本

$ ./install.sh

基础

在本章节中,我们将介绍一些基础概念和工具,帮助您开始使用Dora。

echo

路径: ./examples/echo

关键词:Node, Dataflow

Dora中,一个逻辑功能通常作为节点(Node)。不同逻辑功能的交互依赖于信息的交互(Dataflow)。为了方便不同节点之间的组合,Dora使用yaml文件来声明消息的“流动”。

yaml不仅声明了不同节点消息的输入、输出,还可以声明节点构建(编译、安装)的过程。在使用这些节点之前需要先进行构建。

构建

tip

如果使用uv管理的python可在命令中加入--uv参数

进入examples/echo文件夹,执行命令

$ dora build dataflow.yaml # --uv

输出:

Using Python 3.11.12 environment at: ...
Resolved 4 packages in 1.20s
      Built pyarrow-sender @ ...
Prepared 1 package in 693ms
Installed 1 package in 1ms
 ~ pyarrow-sender==0.3.11 (...)
Using Python 3.11.12 environment at: ...
Resolved 4 packages in 4ms
      Built dora-echo @ ...
Prepared 1 package in 507ms
Installed 1 package in 1ms
 + dora-echo==0.3.11 (...)
Using Python 3.11.12 environment at: ...
Resolved 4 packages in 3ms
      Built pyarrow-assert @ ...
Prepared 1 package in 499ms
Installed 1 package in 1ms
 ~ pyarrow-assert==0.3.11 (...)

运行

依据yaml文件运行Dora框架:

$ dora run dataflow.yaml # --uv

输出:

... INFO run_inner: dora_daemon::log:     pyarrow-assert finished successfully...

各节点的作用

node-hub提供了很多现成的方便复用的节点

Dora中通过环境变量为节点提供参数

  • pyarrow-sender节点:生成了内容为DATA的信息
  • dora-echo节点:将输入的内容发送出去
  • pyarrow-assert节点:判断接收消息与DATA是否一致

额外的尝试

更改pyarrow-senderpyarrow-assertDATA参数,在二者不一致时运行会产生报错 输出:

... [ERROR]
Dataflow failed:

Node `pyarrow-assert` failed: exited with code 1 with stderr output: ...

多守护进程(Daemon)

地址:examples/multiple-daemons 关键词:Daemon, Coordinator

Dora通过Coordinator来协调多个Daemon的运行。Daemon可以来自不同的机器。这是Dora分布式的基础。

启动准备

启动一个协调器(Coordinator)

$ dora coordinator

其运行ip与端口的绑定设置,可通过添加--help参数来查看,样例中用默认的设置即可。

启动守护进程(Daemon)

$ dora daemon --machine-id A
$ dora daemon --machine-id B

分别启动两个分别名为A和B的守护进程。 可以通过--coordinator-addr--coordinator-port来指定协调器的地址和端口。 具体可以参考dora daemon --help

构建

$ dora build dataflow.yml

可以通过--coordinator-addr--coordinator-port来指定协调器的地址和端口。 具体可以参考dora build --help

运行

$ dora start dataflow.yml

可以通过--coordinator-addr--coordinator-port来指定协调器的地址和端口。 具体可以参考dora start --help

编程语言

Dora的核心部分及大部分功能虽然使用Rust编写,但是也为其它编程语言提供了可编程接口支持多种编程语言,包括Python、C++等。

在本节中将展示不同编程语言中Dora的使用。

C/C++

需要预先准备的包

为了实现C/C++多语言混合编程,需要准备好相关的包。 需要从源码安装Dora,并且构建相关包:

  • 运行时
$ cargo build -p dora-runtime # --release
  • 如果需要使用C API
$ cargo build -p dora-node-api-c # --release
$ cargo build -p dora-operator-api-c # --release
  • 如果需要使用Rust API
$ cargo build -p dora-node-api-cxx # --release
$ cargo build -p dora-operator-api-cxx # --release

当使用启用release编译时,需注意将连接的地址target/debug替换为target/release 如果对Rust与C++的混合编译感兴趣,可以参阅cxx.rs

C++ 样例

数据流(Dataflow)

地址:./examples/c++-dataflow

关键词:C++, Node, Operator

Dora相关包的准备

需要预先准备的包 官方样例中使用clang++进行编译,实测g++也是可以使用的,对于大部分的Linux发行版(如Ubuntu等)使用默认安装的g++即可。

C API

构建

alias CXX='clang++' # CXX='g++'
mkdir build

# 构建算子
CXX -c operator-c-api/operator.cc -std=c++17 -o operator-c-api/operator.o -fPIC
CXX -shared operator-c-api/operator.o -ldora_operator_api_c -L../../target/debug/ -o ./build/liboperator_c_api.so

# 构建节点
CXX node-c-api/main.cc -lm -lrt -ldl -pthread -L../../target/debug -ldora_node_api_c -o ./build/node_c_api
#TBD#
#TBD#

Rust API

构建

alias CXX='clang++' # CXX='g++'
mkdir -p build

# 构建算子
cp ../../target/cxxbridge/dora-operator-api-cxx/src/lib.rs.h ./build/dora-operator-api.h
cp ../../target/cxxbridge/dora-operator-api-cxx/src/lib.rs.cc ./build/operator-bridge.cc
CXX -c ./operator-rust-api/operator.cc -std=c++17 -I./operator-rust-api -o operator-rust-api/operator.o -fPIC
CXX -c ./build/operator-bridge.cc -std=c++17 -I./operator-rust-api -o ./build/operator-bridge.o -fPIC
CXX -shared ./operator-rust-api/operator.o ./build/operator-bridge.o -ldora_operator_api_cxx -L../../target/debug/ -o ./build/liboperator_rust_api.so

# 构建节点
cp ../../target/cxxbridge/dora-node-api-cxx/src/lib.rs.h ./build/dora-node-api.h
cp ../../target/cxxbridge/dora-node-api-cxx/src/lib.rs.cc ./build/node-bridge.cc
CXX ./node-rust-api/main.cc ./build/node-bridge.cc -lm -lrt -ldl -pthread -L../../target/debug -ldora_node_api_cxx -o ./build/node_rust_api
#TBD#
#TBD#

运行

$ dora run dataflow.yaml

相关节点功能概览

  • node-c-api:使用C API对接收到的数据进行计数,并返回计数
  • node-rust-api: 使用Rust API对接收到的数据进行计数,并返回计数
  • operator-c-api:使用C API接受数据并除以2后发出
  • operator-rust-api:使用Rust API对接收到的所有消息进行计数,并将收到的消息发出

数据流(Arrow Dataflow)

地址:./examples/c++-arrow-dataflow

关键词:Arrow,Dataflow

Apache Arrow 是通用的、列式格式的、快速数据交换和内存中分析工具。支持多种语言。

安装Arrow

更详细的安装说明与选项请参考Arrow官方安装文档

$ sudo apt update
$ sudo apt install -y -V ca-certificates lsb-release wget
$ wget https://packages.apache.org/artifactory/arrow/$(lsb_release --id --short | tr 'A-Z' 'a-z')/apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb
$ sudo apt install -y -V ./apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb
$ sudo apt update
$ sudo apt install -y -V libarrow-dev # For C++

构建

通过pkg-config --libs arrowpkg-config --cflags arrow获得系统安装的Arrow库相关的编译设置

$ mkdir build
$ cp ../../target/cxxbridge/dora-node-api-cxx/src/lib.rs.cc ./build/node-bridge.cc
$ cp ../../target/cxxbridge/dora-node-api-cxx/src/lib.rs.h ./build/dora-node-api.h
$ alias CXX=g++
$ CXX ./build/node-bridge.cc ./node-rust-api/main.cc -std=c++17 -lm -lrt -ldl -pthread -ldora_node_api_cxx -L../../target/debug/ $(pkg-config --libs arrow) $(pkg-config --cflags arrow) -o ./build/node_rust_api

运行

dora run dataflow.yml

C数据流

地址:./examples/c-dataflow

关键词:Dataflow, C

构建C API相关包

$ cargo build -p dora-node-api-c
$ cargo build -p dora-operator-api-c

Node

Source

$ alias C=gcc # 用clang亦可以
$ C node.c -lm -lrt -ldl -pthread -ldora_node_api_c -L../../target/debug/ -o ./build/c_node

Sink

$ C sink.c -lm -lrt -ldl -pthread -ldora_node_api_c -L../../target/debug/ -o ./build/c_sink

Operator

$ C -c operator.c -o build/operator.o -fPIC # 编译
$ C -shared build/operator.o -L../../target/debug/ -ldora_operator_api_c -o ./build/liboperator.so

CMake数据流

地址:./examples/cmake-dataflow

关键词:CMake, Dataflow

CMake是一个跨平台的构建系统,它允许开发者使用简单的脚本来描述项目的依赖关系和构建规则,从而实现跨平台的构建。C/C++ Dora项目也可以使用CMake来构建。

构建

$ cmake -DDORA_ROOT_DIR=../../ -B./build . # 通过DORA_ROOT_DIR变量指定Dora项目的根目录
$ cmake --build ./build
$ cmake --install ./build

运行

$ dora run dataflow.yml

ROS2数据流

地址:./examples/c++-ros2-dataflow

关键词:ROS2

确保ROS2环境已正确安装和配置

Dora通过ros2-client与ROS进行交互 C++ API为了与ROS通信,需要启用ROS2桥接功能。

准备相关依赖

由于例子与turtlesimAddTwoInts相关

$ sudo apt install ros-jazzy-turtlesim ros-jazzy-examples-rclcpp-minimal-service
$ source /opt/ros/jazzy/setup.bash
$ cargo build --package dora-node-api-cxx --features ros2-bridge
$ mkdir build
$ cp ../../target/cxxbridge/dora-node-api-cxx/dora-node-api.cc ./build/dora-node-api.cc
$ cp ../../target/cxxbridge/dora-node-api-cxx/dora-node-api.h ./build/dora-node-api.h
$ cp ../../target/cxxbridge/dora-node-api-cxx/dora-ros2-bindings.cc ./build/dora-ros2-bindings.cc
$ cp ../../target/cxxbridge/dora-node-api-cxx/dora-ros2-bindings.h ./build/dora-ros2-bindings.h

当ROS2中的包出现变化时,需要重新构建dora-node-api-cxx从而确保dora-ros2-bindings的正确性。 在构建前务必先source需要使用的ROS环境,以确保各ROS包能被检测到并生成桥接文件

编译

$ alias CXX=g++ # clang++ 也可以
$ CXX ./node-rust-api/main.cc ./build/dora-ros2-bindings.cc ./build/dora-node-api.cc -std=c++17 -lm -lrt -ldl -lz -pthread -ldora_node_api_cxx -L ../../target/debug/ -o ./build/node_rust_api

运行

打开另外两个终端

需要使用rmw_fastrtps_cppJazzy 中应该是默认的,如果在.bashrc等地方设置成了别的注意要设置回来。 更改设置后重启daemon,ros2 daemon stop, ros2 daemon start

启动turtlesim

$ source /opt/ros/jazzy/setup.bash
$ ros2 run turtlesim turtlesim_node

启动AddTwoInts服务

$ source /opt/ros/jazzy/setup.bash
$ ros2 run examples_rclcpp_minimal_service service_main

启动Dora节点

$ dora run dataflow.yml

CUDA基准测试

Python

为了更方便的管理Python包,Dora推荐使用uv进行管理

安装UV

$ sudo apt install curl # 安装curl,如果未安装
$ curl -LsSf https://astral.sh/uv/install.sh | sh

Python 样例

数据流(Dataflow)

地址:examples/python-dataflow

关键词:Python, Dataflow

官方的Node Hub文件夹中提供了许多现成的节点 本例中用到的有

  • opencv-video-capture用于读取摄像头
  • dora-yolo用于进行目标检测
  • dora-rerun用于进行可视化

dataflow.yml除了用于描述输入输出外,还可以通过build字段进行简单的构建或安装

准备Python环境

$ uv venv -p 3.10 --seed

安装对应的包

当在dora build时加上--uv标签,会自动在使用pip前添加uv以使用uv管理的Python版本

$ dora build dataflow.yml --uv

运行

$ dora run dataflow.yml --uv

默认的视图中可能只包含照片项,在弹出的rerun窗口中右键时间轴上的/项,点击添加到新的视图中

运行效果

动态节点

$ dora build dataflow_dynamic.yml --uv # 安装所需要的节点
$ dora up # 启动本地的 daemon 和 coordinator
$ dora start dataflow_dynamic.yml --uv

在另外一个中端窗口运行

$ uv run opencv-plot --name plot

算子(Operator)

地址:examples/python-operator-dataflow

关键词:Operator

Operator提供了更加轻量化的方案,并且有更多Dora的高级功能,拥有更快的通信速度。

安装依赖

$ uv venv -p 3.11 --seed # 创建环境
$ uv pip install -e ../../apis/python/node # 安装Dora Python API
$ source .venv/bin/activate
$ pip install -r requirements.txt # 安装依赖,如果要体验dataflow_llm,则使用requirements_llm.txt

由于Operator暂未适配--uv标签作为启动参数,为了使用uv管理的Python,所以要在终端中source .venv/bin/activate

$ dora run dataflow.yml

运行效果

异步

地址:examples/python-async

关键词:异步

$ uv venv -p 3.11 --seed # 创建环境
$ uv pip install -e ../../apis/python/node # 安装Dora Python API
$ dora build dataflow.yml --uv # 安装依赖

运行

$ dora run dataflow.yml --uv

本例较为简单展示了使用Python通过异步方式进行消息IO。

  • receive_data.py 异步接收数据
  • send_data.py 发送数据

多Python环境共存

地址:examples/python-multi-env

关键词:多环境

uv通过VIRTUAL_ENV环境变量可以切换不同的Python的环境,则只需要在dataflow.yml中配置即可

构建环境

$ uv venv -p 3.11 -n env_1
$ uv venv -p 3.11 -n env_2
$ dora build dataflow.yml --uv

运行

$ dora run dataflow.yml --uv

运行效果应与python-dataflow一致。

ROS2数据流

准备相关依赖

由于例子与turtlesimAddTwoInts相关

$ sudo apt install ros-jazzy-turtlesim ros-jazzy-examples-rclcpp-minimal-service

准备Python环境

$ uv venv -p 3.10 --seed
$ uv pip install -e ../../apis/node

启动

启动turtlesim

$ source /opt/ros/jazzy/setup.bash
$ ros2 run turtlesim turtlesim_node

启动AddTwoInts服务

$ source /opt/ros/jazzy/setup.bash
$ ros2 run examples_rclcpp_minimal_service service_main
$ source /opt/ros/jazzy/setup.bash
$ dora run dataflow.yml --uv

Rust

Rust 样例

Rust数据流(Dataflow)

Rust网址数据流

通过git获取节点

Rust ROS2数据流

进阶

可视化

使用相机

av1编码

深度相机

深度图像处理

物体识别

大语言模型

OpenAI

语音到语音

语音到文字

追踪

翻译

视觉语言模型

场景应用

alexk-lcr

aloha

reachy

reachy1

reachy2

reachy2远程

lebai

so100

远程

franka

PiPer

其他样例

基准测试

Python Arrow测试

附录

词汇表

  • 节点(Node)
  • 算符(Operator)
  • 协作器(Coordinator)

其具体关系请参阅Dora设计

ROS2安装

ROS2安装的详细文档,请以ROS2官方文档为准

locale  # check for UTF-8

sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8

locale  # verify settings

启用需要的仓库

sudo apt install software-properties-common
sudo add-apt-repository universe

sudo apt update && sudo apt install curl -y
export ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F\" '{print $4}')
curl -L -o /tmp/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo $VERSION_CODENAME)_all.deb" # If using Ubuntu derivates use $UBUNTU_CODENAME
sudo dpkg -i /tmp/ros2-apt-source.deb

安装相应包

sudo apt install ros-jazzy-desktop
# or sudo apt install ros-jazzy-desktop

目录

介绍

Openloong是由人形机器人(上海)有限公司运营的开源项目,目标是推动人形机器人全场景应用、助力具身智能时代的到来。


项目背景

在具身智能领域,开源人形机器人项目 Openloong 具有重要的研究与应用价值。当前该项目使用 ROS 作为中间件,但 ROS 存在诸多问题。其架构设计在大规模、复杂的具身智能系统中面临挑战,数据传输性能有局限,AI能力也存在困难。而 Dora-rs 机器人中间件在AI 框架支持,运行速度、软件质量以及安全可信等方面优势突出,能契合机器人对下一代软件平台的严苛要求。因此,有必要将 dora-rs 机器人框架移植到 Openloong 项目中,以解决现有问题。

Dora Openloong的目标是改进 Openloong 项目的架构设计,解决 ROS 架构在复杂具身智能系统中的通信拓扑复杂、AI 能力弱等问题,提高系统的可扩展性。提升数据传输性能,降低通信延迟,确保在处理大量实时数据时系统的实时性,满足机器人实时避障、快速响应交互指令等场景的需求。优化计算资源管理,在资源受限的嵌入式设备上充分利用硬件资源,提高系统性能,减少对机器人续航能力和运行效率的影响。提供便捷的AI预集成框架,增加对机器人AI能力的支持


项目实现

本项目在ospp2025-openloong仓库提供了一系列开发示例并提供了相关文档, 旨在帮助用户快速上手Openloong-Dora框架, 这些示例包含: Openloong机器人导航、Openloong上肢控制、Openloong底盘控制、Openloong抓取示例等,示例使用Python语言实现;

开发环境准备

Dora环境

dora环境安装见dora官方文档


Openloong微服务框架gRPC安装

  1. 依赖
  • python 3.7或更高版本
  • pip 9.0.1或更高版本
  • 安装gprc:
    python -m pip install grpcio
    #或者在系统范围内安装
    sudo python -m pip install grpcio
    
  1. 安装gprc工具

    python -m pip install grpcio-tools
    

    从Github仓库下载官方最新版本代码以及相关示例

    git clone -b v1.73.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc
    

    examples/python/helloworld目录下运行:

    python greeter_server.py
    

    在另一个终端中, examples/python/helloworld目录下运行:

    python greeter_client.py
    

    以上顺利完成可启动gRPC服务

  2. 可能踩坑

    在递归克隆gRPC仓库时容易在克隆子模块时失败, 导致模块缺失, 后续编译(C++版本)虽然可能顺利通过, 但会缺少部分功能无法运行gRPC框架;

openloong实例

dora-rs/ospp2025openloong仓库Openloong-proto文件夹提供了openloong的gRPC-proto控制接口


GPS导航

使用gRPC微服务获取机器人当前位置

dora-rs/ospp2025openloong仓库gps_navigaton_gprc文件夹提供了机器人GPS导航server和client的python实现

  1. 使用gRPC编译proto

    在安装有gRPC的python环境中执行:

    python -m grpc_tools.protoc -I./protoFiles --python_out=proto --pyi_out=proto --grpc_python_out=proto protoFiles/gps_navigation.proto
    

    gRPC会读取proto文件protoFiles/gps_navigation.proto并将生成的文件放在proto目录下

  2. 启动gRPC server服务

    在安装有gRPC的python环境下执行

    python gps_navigation_server.py
    
  3. 启动gRPC client服务 在安装有gRPC的python环境下执行

    python gps_navigation_client.py
    
  4. 执行预期效果


上肢控制

dora-rs/ospp2025openloong仓库upper_controller文件夹提供了机器人上肢控制器server和client的python实现

  1. 使用gRPC编译proto

    在安装有gRPC的python环境中执行:

    python -m grpc_tools.protoc -I./protoFiles --python_out=proto --pyi_out=proto --grpc_python_out=proto protoFiles/upper_controller.proto
    

    gRPC会读取proto文件protoFiles/upper_controller.proto并将生成的文件放在proto目录下

  2. 启动gRPC server服务

    在安装有gRPC的python环境下执行

    python upper_controller_server.py
    
  3. 启动gRPC client服务

    在安装有gRPC的python环境下执行

    python upper_controller_client.py
    
  4. 执行预期效果


openloong-dora工作流

dora-rs/ospp2025openloong仓库openloong-dora-workflow文件夹提供了使用dora工作流控制机器人底盘定点移动和机械臂抓取的python实现

  1. 使用gRPC编译proto

    在安装有gRPC的python环境中执行以下命令生成上肢控制的相关代码:

    python -m grpc_tools.protoc -I./protoFiles --python_out=proto --pyi_out=proto --grpc_python_out=proto protoFiles/upper_controller.proto
    

    在安装有gRPC的python环境中执行以下命令生成底盘控制的相关代码:

    python -m grpc_tools.protoc -I./protoFiles --python_out=proto --pyi_out=proto --grpc_python_out=proto protoFiles/chassis_controller.proto
    

    gRPC会读取proto文件protoFiles/upper_controller.protoprotoFiles/chassis_controller.proto并将生成的文件放在proto目录下

  2. 启动gRPC server服务

    在安装有gRPC的python环境下执行以下命令启动上肢控制器

    python upper_controller_server.py
    

    在安装有gRPC的python环境下执行以下命令启动底盘控制器

    python chassis_controller_server.py
    
  3. 启动dora工作流 在安装有dora和gRPC的python环境执行:

    dora run workflow/dataflow.yml --uv
    
  4. 预期执行效果

    dora数据流正常打印交互信息, 机器人工作状态正常, demo在B站演示视频查看