From dora-skills
Configures Rerun and OpenCV visualization nodes for dora dataflows, supporting images, 3D data, bounding boxes, depth maps, and telemetry.
How this skill is triggered — by the user, by Claude, or both
Slash command
/dora-skills:hub-visualizationThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> Rerun and OpenCV visualization for images, 3D data, and telemetry
Rerun and OpenCV visualization for images, 3D data, and telemetry
| Node | Install | Description |
|---|---|---|
| dora-rerun | pip install dora-rerun | Comprehensive visualization with Rerun |
| opencv-plot | pip install opencv-plot | Simple OpenCV image + bbox display |
Powerful visualization using Rerun with 12 supported primitives.
pip install dora-rerun
- id: rerun
build: pip install dora-rerun
path: dora-rerun
inputs:
camera_feed: camera/image
detections: yolo/bbox
depth_sensor: realsense/depth
env:
IMAGE_WIDTH: 640
IMAGE_HEIGHT: 480
RERUN_MEMORY_LIMIT: 25%
README: |
# My Visualization
Description shown in Rerun
All inputs require a primitive metadata field to specify visualization type.
inputs:
front_camera:
source: camera/image
metadata:
primitive: "image"
depth_sensor:
source: realsense/depth
metadata:
primitive: "depth"
focal: [600, 600]
camera_position: [0, 0, 0]
# Sender node includes primitive in metadata
node.send_output("image", image_data, {
"width": 640,
"height": 480,
"encoding": "bgr8",
"primitive": "image"
})
| Primitive | Data Type | Required Metadata |
|---|---|---|
| image | UInt8Array | width, height, encoding |
| depth | Float32Array | width, height |
| text | StringArray | - |
| boxes2d | StructArray/Float32Array | format: "xyxy" or "xywh" |
| boxes3d | Float32Array | format, solid, color |
| masks | UInt8Array | width, height |
| jointstate | Float32Array | (requires URDF config) |
| pose | Float32Array [x,y,z,qx,qy,qz,qw] | - |
| series | Float32Array | - |
| points3d | Float32Array | color, radii |
| points2d | Float32Array | - |
| lines3d | Float32Array | color, radius |
metadata = {
"primitive": "image",
"width": 640,
"height": 480,
"encoding": "bgr8" # bgr8, rgb8, jpeg, png, avif
}
metadata = {
"primitive": "depth",
"width": 640,
"height": 480,
"camera_position": [0, 0, 0], # [x, y, z]
"camera_orientation": [0, 0, 0, 1], # [qx, qy, qz, qw]
"focal": [600, 600], # [fx, fy]
"principal_point": [320, 240] # [cx, cy] optional
}
bbox = {
"bbox": np.array([x1,y1,x2,y2,...]).flatten(),
"conf": np.array([0.95,...]),
"labels": np.array(["person",...])
}
metadata = {"primitive": "boxes2d", "format": "xyxy"}
# center_half_size format (default)
boxes = np.array([cx,cy,cz, hx,hy,hz, ...])
metadata = {
"primitive": "boxes3d",
"format": "center_half_size", # or "center_size", "min_max"
"solid": False, # wireframe (default) or solid
"color": [255, 0, 0] # RGB
}
points = np.array([x1,y1,z1, x2,y2,z2, ...], dtype=np.float32)
metadata = {
"primitive": "points3d",
"color": [0, 255, 0],
"radii": [0.01, 0.01, ...]
}
# Line segments: pairs of xyz points
lines = np.array([x1,y1,z1, x2,y2,z2, ...], dtype=np.float32)
metadata = {
"primitive": "lines3d",
"color": [0, 0, 255],
"radius": 0.005
}
# 7 values: position + quaternion
pose = np.array([x, y, z, qx, qy, qz, qw], dtype=np.float32)
metadata = {"primitive": "pose"}
- id: rerun
path: dora-rerun
inputs:
jointstate_robot: arm/joint_state
env:
robot_urdf: /path/to/robot.urdf
robot_transform: "0 0.3 0" # x y z offset
nodes:
- id: camera
build: pip install opencv-video-capture
path: opencv-video-capture
inputs:
tick: dora/timer/millis/33
outputs:
- image
- id: yolo
build: pip install dora-yolo
path: dora-yolo
inputs:
image: camera/image
outputs:
- bbox
- id: vlm
build: pip install dora-qwen2-5-vl
path: dora-qwen2-5-vl
inputs:
image:
source: camera/image
queue_size: 1
outputs:
- text
env:
DEFAULT_QUESTION: "Describe the scene."
- id: rerun
build: pip install dora-rerun
path: dora-rerun
inputs:
camera:
source: camera/image
metadata:
primitive: "image"
detections:
source: yolo/bbox
metadata:
primitive: "boxes2d"
description:
source: vlm/text
metadata:
primitive: "text"
env:
IMAGE_WIDTH: 640
IMAGE_HEIGHT: 480
RERUN_MEMORY_LIMIT: 25%
Simple OpenCV visualization with image, bounding boxes, and text overlay.
- id: plot
build: pip install opencv-plot
path: opencv-plot
inputs:
image: camera/image
bbox: yolo/bbox
text: vlm/text
env:
PLOT_WIDTH: 640 # Optional, defaults to image width
PLOT_HEIGHT: 480 # Optional, defaults to image height
image: UInt8Array
metadata = {"width": 640, "height": 480, "encoding": "bgr8"}
bbox: StructArray
bbox = {
"bbox": np.array([x1,y1,x2,y2,...]),
"conf": np.array([0.95,...]),
"labels": np.array(["person",...])
}
metadata = {"format": "xyxy"}
text: StringArray
text = pa.array(["Detection: person 95%"])
nodes:
- id: camera
build: pip install opencv-video-capture
path: opencv-video-capture
inputs:
tick: dora/timer/millis/33
outputs:
- image
- id: yolo
build: pip install dora-yolo
path: dora-yolo
inputs:
image: camera/image
outputs:
- bbox
- id: plot
build: pip install opencv-plot
path: opencv-plot
inputs:
image: camera/image
bbox: yolo/bbox
inputs:
image: camera/image # Primitive inferred from "image" in name
inputs:
front_camera:
source: camera/image
metadata:
primitive: "image"
| Variable | Description |
|---|---|
| IMAGE_WIDTH | Default image width |
| IMAGE_HEIGHT | Default image height |
| RERUN_MEMORY_LIMIT | Memory limit (e.g., "25%", "1GB") |
| README | Markdown text shown in Rerun |
| *_urdf | Path to URDF file for joint visualization |
| *_transform | Position offset "x y z" for URDF |
npx claudepluginhub zhanghandong/dora-skills --plugin dora-skillsProvides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.