This hub contains useful pre-built nodes for Dora.
Feel free to modify this README with your own nodes so that it benefits the community.
| Type | Title | Description | Support | Downloads | License |
|---|---|---|---|---|---|
| Camera | Kornia GST Capture | Video Capture using Gstreamer | β | ||
| Camera | Kornia V4L Capture | Video stream for Linux Cameras | β | ||
| Camera | PyOrbbeckSDK | Image and depth from Orbbeck Camera | π | ||
| Camera | PyRealsense | Image and depth from Realsense | Linuxπ Macπ οΈ |
||
| Camera | OpenCV Video Capture | Image stream from OpenCV Camera | β | ||
| Peripheral | Keyboard | Keyboard char listener | β | ||
| Peripheral | Microphone | Audio from microphone | β | ||
| Peripheral | PyAudio(Speaker) | Output audio from speaker | β | ||
| Actuator | Feetech | Feetech Client | π | ||
| Actuator | Dynamixel | Dynamixel Client | π | ||
| Chassis | Agilex - UGV | Robomaster Client | π | ||
| Chassis | Dora Kit Car | Open Source Chassis | π | ||
| Chassis | DJI - Robomaster S1 | Robomaster Client | π | ||
| Arm | Alex Koch - Low Cost Robot | Alex Koch - Low Cost Robot Client | π | ||
| Arm | Agilex - Piper | Agilex arm client | π | ||
| Arm | Lebai - LM3 | Lebai client | π | ||
| Robot | Trossen - Aloha | Aloha client | π | ||
| Robot | Pollen - Reachy 1 | Reachy 1 Client | π | ||
| Robot | Pollen - Reachy 2 | Reachy 2 client | π | ||
| Voice Activity Detection(VAD) | Silero VAD | Silero Voice activity detection | β | ||
| Speech to Text(STT) | Whisper | Transcribe audio to text | β | ||
| Object Detection | Yolov8 | Object detection | β | ||
| Segmentation | SAM2 | Segment Anything | Cudaβ
Metalπ οΈ |
||
| Large Language Model(LLM) | Qwen2.5 | Large Language Model using Qwen | β | ||
| Vision Language Model(VLM) | InternVL | InternVL is a vision language model | π | ||
| Vision Language Model(VLM) | Qwen2.5-vl | Vision Language Model using Qwen2.5 VL | β | ||
| Vision Language Action(VLA) | RDT-1B | Infer policy using Robotic Diffusion Transformer | π | ||
| Translation | Opus MT | Translate text between language | π | ||
| Translation | ArgosTranslate | Open Source translation engine | π | ||
| Text to Speech(TTS) | Kokoro TTS | Efficient Text to Speech | β | ||
| Recorder | Llama Factory Recorder | Record data to train LLM and VLM | π | ||
| Recorder | LeRobot Recorder | LeRobot Recorder helper | π | ||
| Visualization | Plot | Simple OpenCV plot visualization | β | ||
| Visualization | Rerun | Visualization tool | β | ||
| Simulator | Mujoco | Mujoco Simulator | π | ||
| Simulator | Gymnasium | Experimental OpenAI Gymnasium bridge | π | ||
| Simulator | Carla | Carla Simulator | π | ||
| nan | Kornia Sobel Operator | Kornia image processing Sobel operator | β |
| Type | Title | Description | Last Commit |
|---|---|---|---|
| Audio | Speech to Text(STT) | Transform speech to text. | |
| Audio | Translation | Translate audio in real time. | |
| Vision | Vision Language Model(VLM) | Use a VLM to understand images. | |
| Vision | YOLO | Use YOLO to detect object within image. | |
| Vision | Camera | Simple webcam plot example | |
| Model Training | Piper RDT | Piper RDT Pipeline | |
| Model Training | LeRobot - Alexander Koch | Training Alexander Koch Low Cost Robot with LeRobot | |
| ROS2 | C++ ROS2 Example | Example using C++ ROS2 | |
| ROS2 | Rust ROS2 Example | Example using Rust ROS2 | |
| ROS2 | Python ROS2 Example | Example using Python ROS2 | |
| Benchmark | GPU Benchmark | GPU Benchmark of dora-rs | |
| Benchmark | CPU Benchmark | CPU Benchmark of dora-rs | |
| Tutorial | Rust Example | Example using Rust | |
| Tutorial | Python Example | Example using Python | |
| Tutorial | CMake Example | Example using CMake | |
| Tutorial | C Example | Example with C node | |
| Tutorial | CUDA Example | Example using CUDA Zero Copy | |
| Tutorial | C++ Example | Example with C++ node |
- To work on a new node, start by:
cd node-hub
dora new your-node-name --lang python --kind node
cd ./your-node-name
uv venv --seed -p 3.11
uv pip install -e . # Install
uv run ruff check . --fix # Format
uv run ruff check . # Lint
uv run pytest . # Test- To add a python dependency just do:
uv add numpy # for exampleThe package is then added to your
pyproject.toml
-
Modify the code within
main.pyin your liking. -
Create a PR and let the CI/CD run test on it π
The structure of the node hub is as follows (please use the same structure if you need to add a new node):
node-hub/
βββ your-node/
βββ README.md
βββ your-node
β βββ __init__.py
β βββ __main__.py
β βββ main.py
βββ pyproject.toml
βββ tests
βββ test_<your-node>.py
The idea is to make a pyproject.toml file that will install the required dependencies for the node and attach main
function of the node inside a callable script in your environment.
To do so, you will need to add a main function inside the main.py file.
def main():
passAnd then you will need to adapt the following pyproject.toml file:
[project]
name = "[name of the node e.g. video-encoder, with '-' to replace spaces]"
version = "0.1"
authors = [{ name = "[Pseudo/Name]", email = "[email]" }]
description = "Dora Node for []"
readme = "README.md"
license = { text = "MIT" }
dependencies = [
"dora-rs >= 0.3.8",
]
[project.scripts]
[name of the node with '-' to replace spaces] = "[name of the node with '_' to replace spaces].main:main"
[tool.ruff.lint]
extend-select = [
"D", # pydocstyle
"UP", # Ruff's UP rule
"PERF", # Ruff's PERF rule
"RET", # Ruff's RET rule
"RSE", # Ruff's RSE rule
"NPY", # Ruff's NPY rule
"N", # Ruff's N rule
"I", # Ruff's I rule
]Finally, the README.md file should explicit all inputs/outputs of the node and how to configure it in the YAML file.
[project]
name = "opencv-plot"
version = "0.1"
authors = [
"Haixuan Xavier Tao <[email protected]>",
"Enzo Le Van <[email protected]>"
]
description = "Dora Node for plotting data with OpenCV"
readme = "README.md"
license = { text = "MIT" }
requires-python = ">=3.7"
dependencies = [
"dora-rs >= 0.3.8",
]
[dependency-groups]
dev = ["pytest >=8.1.1", "ruff >=0.9.1"]
[project.scripts]
opencv-plot = "opencv_plot.main:main"
[tool.ruff.lint]
extend-select = [
"D", # pydocstyle
"UP", # Ruff's UP rule
"PERF", # Ruff's PERF rule
"RET", # Ruff's RET rule
"RSE", # Ruff's RSE rule
"NPY", # Ruff's NPY rule
"N", # Ruff's N rule
"I", # Ruff's I rule
]- If a git repository is added as submodule. Proper path should be added in
pyproject.tomlinorder to make sure that linting and testing are exempted for that dependency. - A very good example of how this can be done is as follows
Correct approach:
[tool.ruff]
exclude = ["dora_magma/Magma"]
[tool.black]
extend.exclude = "dora_magma/Magma"Incorrect Approach:
[tool.ruff]
exclude = ["dora-magma/dora_magma/Magma"]
[tool.black]
extend.exclude = "dora_magma/Magma"dora-magmais root folder of the node.
cd node-hub
dora new your-node-name --lang rust --kind node
cd ./your-node-name- Before building the node, make sure to add your node to the workspace members list in the root
Cargo.tomlfile:
[workspace]
members = [
...
"node-hub/your-node-name"
]
- Also change the
Cargo.tomlfile in your node to use the workspace version of dora-node-api:
[dependencies]
dora-node-api = { workspace = true }
The structure of the node hub for Rust is as follows (please use the same structure if you need to add a new node):
node-hub/
βββ your-node/
βββ Cargo.toml
βββ README.md
βββ src/
βββ main.rs
The README.md file should explicit all inputs/outputs of the node and how to configure it in the YAML file.
This project is licensed under Apache-2.0. Check out NOTICE.md for more information.