preset RCAN 3.0
Pollen_Microduck
Pollen Robotics Microduck — a 25 cm, ~800 g biped with 15 servos, a camera, a ToF depth sensor, two IMUs and an articulated beak. Onboard compute is a Rockchip RK3566 (1 GB RAM, 32 GB storage) running Armbian; motion comes from RL policies (PPO in MuJoCo, exported to ONNX) executed by the `robotd` daemon at 50 Hz. OpenCastor drives it as an intent client over robotd's JSON-RPC 2.0 NDJSON socket, the same contract used by robotctl, the gamepad daemon and the phone app.
Scan to install
leggedanthropicrcan-3.0presets
Install with one command:
castor install opencastor.com/config/pollen_microduck Provider
anthropic
Physics
legged
RCAN Version
3.0
Source
presets
Config (pollen_microduck.rcan.yaml)
rcan_version: '3.0'
metadata:
robot_name: Pollen_Microduck
robot_uuid: 73d3b905-d73a-4e4f-9fde-d6c6268a3dcb
manufacturer: Pollen Robotics
model: Microduck
author: OpenCastor Default
license: Apache-2.0
tags:
- biped
- legged
- rl-policy
- tabletop
- camera
- depth
description: 'Pollen Robotics Microduck — a 25 cm, ~800 g biped with 15 servos, a
camera, a ToF depth sensor, two IMUs and an articulated beak. Onboard compute is
a Rockchip RK3566 (1 GB RAM, 32 GB storage) running Armbian; motion comes from RL
policies (PPO in MuJoCo, exported to ONNX) executed by the `robotd` daemon at 50 Hz.
OpenCastor drives it as an intent client over robotd''s JSON-RPC 2.0 NDJSON socket,
the same contract used by robotctl, the gamepad daemon and the phone app.
'
rrn_uri: rrn://community/robot/opencastor/pollen-microduck/microduck
agent:
provider: anthropic
model: claude-sonnet-4-5
vision_enabled: true
latency_budget_ms: 150
safety_stop: true
offline_provider: ollama
# On, and load-bearing. `duck_vocabulary` and `duck_perform` are only handed
# to a model through the agent harness (castor/api.py), so with this off the
# brain can talk about the duck and cannot sequence it — which is the exact
# gap docs/hardware/microduck.md used to claim did not exist. A duck's whole
# value to an LLM is composing its atomic skills, so this profile opts in.
harness:
enabled: true
physics:
type: legged
dof: 14
drivers:
- id: duck
protocol: microduck
# `unix` when OpenCastor runs on the duck itself (needs the `robot` group);
# `ssh` — recommended — when it runs off-board and forwards to /run/robotd.sock.
transport: ssh
socket: /run/robotd.sock
ssh_host: 192.168.1.42
ssh_user: pierre
local_port: 7788
# Velocity envelope at full stick deflection. robotd clamps on top of this and
# reports the binding limit in robot.state as `limited_by`.
max_vx: 0.2
max_vy: 0.1
max_vyaw: 1.0
intent_hz: 20
command_ttl_s: 1.5
auto_init: false
connection:
type: wifi
host: 192.168.1.42
reconnect_interval_ms: 1000
watchdog_timeout_ms: 500
rcan_protocol:
port: 8000
capabilities:
- status
- teleop
- chat
- vision
enable_mdns: false
safety:
estop_on_startup: true
max_linear_speed_mps: 0.2
max_angular_speed_radps: 1.0
voltage_monitoring: true
local_safety_wins: true
watchdog:
timeout_s: 2
notes:
setup: 'Off-board (recommended): the duck has 1 GB of RAM and a 50 Hz control loop
to protect, so run OpenCastor on another machine and let the driver open an
`ssh -L 7788:/run/robotd.sock` forward. Find the duck''s address with `duckctl ip`
over Bluetooth or your router''s DHCP table — mDNS on the stock image is unreliable.
Add your key with `ssh-copy-id`, and put the login user in the `robot` group
(`sudo usermod -aG robot "$USER"`) so it can open the robotd socket.
On-board: set `transport: unix`. Expect contention with robotd, mediad and the
RL policy on four Cortex-A55 cores.
Bring-up: `robot.init` torques the servos on and ramps to standing over ~2 s. The
driver does not call it automatically (`auto_init: false`) — the duck deliberately
does not move on process start. `stop()` holds it standing; `relax()` cuts torque
and it will drop, so seat it first.
'
hardware:
compute: Rockchip RK3566 (quad Cortex-A55, 1 GB RAM, 32 GB storage, NPU)
os: Armbian (Radxa Zero 3 profile)
servos: 15 x Dynamixel-protocol on /dev/ttyS2 @ 1 Mbps
sensors: camera, ToF depth, 2 x IMU
battery: NP-F550 removable (approx 1 h), empty floor 6.6 V
warning: 'robotd owns the motor bus exclusively and enforces its own limits, fall
detection and battery cutoff. OpenCastor sends intents, never raw motor writes —
do not bypass the driver to write the servo bus while robotd is running.
'