目录
介绍
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 # 设置环境变量
获取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-sender
或pyarrow-assert
的DATA
参数,在二者不一致时运行会产生报错
输出:
... [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 arrow
和pkg-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桥接功能。
准备相关依赖
由于例子与turtlesim
和AddTwoInts
相关
$ 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_cpp
Jazzy 中应该是默认的,如果在.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数据流
准备相关依赖
由于例子与turtlesim
和AddTwoInts
相关
$ 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安装
- 依赖
- python 3.7或更高版本
- pip 9.0.1或更高版本
- 安装gprc:
python -m pip install grpcio #或者在系统范围内安装 sudo python -m pip install grpcio
-
安装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服务
-
可能踩坑
在递归克隆gRPC仓库时容易在克隆子模块时失败, 导致模块缺失, 后续编译(C++版本)虽然可能顺利通过, 但会缺少部分功能无法运行gRPC框架;
openloong实例
在dora-rs/ospp2025openloong仓库
Openloong-proto
文件夹提供了openloong的gRPC-proto控制接口
GPS导航
使用gRPC微服务获取机器人当前位置
在dora-rs/ospp2025openloong仓库gps_navigaton_gprc文件夹提供了机器人GPS导航server和client的python实现
-
使用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目录下 -
启动gRPC server服务
在安装有gRPC的python环境下执行
python gps_navigation_server.py
-
启动gRPC client服务 在安装有gRPC的python环境下执行
python gps_navigation_client.py
-
执行预期效果
上肢控制
在dora-rs/ospp2025openloong仓库
upper_controller
文件夹提供了机器人上肢控制器server和client的python实现
-
使用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目录下 -
启动gRPC server服务
在安装有gRPC的python环境下执行
python upper_controller_server.py
-
启动gRPC client服务
在安装有gRPC的python环境下执行
python upper_controller_client.py
-
执行预期效果
openloong-dora工作流
在dora-rs/ospp2025openloong仓库openloong-dora-workflow文件夹提供了使用dora工作流控制机器人底盘定点移动和机械臂抓取的python实现
-
使用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.proto
和protoFiles/chassis_controller.proto
并将生成的文件放在proto目录下 -
启动gRPC server服务
在安装有gRPC的python环境下执行以下命令启动上肢控制器
python upper_controller_server.py
在安装有gRPC的python环境下执行以下命令启动底盘控制器
python chassis_controller_server.py
-
启动dora工作流 在安装有dora和gRPC的python环境执行:
dora run workflow/dataflow.yml --uv
-
预期执行效果
dora数据流正常打印交互信息, 机器人工作状态正常, demo在B站演示视频查看