Robot Plugins

EMOS is built to be robot-agnostic — recipes run against standard, hardware-independent interfaces. But robot manufacturers often expose their hardware through custom interfaces (bespoke ROS messages and services, or non-ROS protocols like UDP, HTTP, or a vendor SDK). A robot plugin bridges that gap: it adapts one robot’s custom interface to EMOS’s standard one, so connecting a new robot is trivial and your recipes never change. A plugin can also bundle the robot’s preconfigured actions — a gait change on a quadruped, a docking routine, an arm stow — ready to call by name.

This page covers installing and managing a plugin on a robot. For what plugins are and how to write one, see Robot Plugins (concept).

Important

A robot runs one plugin at a time — it represents this robot. Installing a new plugin replaces the active one.

Browse the catalog

Plugins are published in the Automatika catalog. List what’s available:

emos plugin list
PLUGIN                NAME                          VENDOR
emos-plugin-example   Example Robot (reference …)   Automatika        ● active
emos-plugin-lite3     DeepRobotics Lite3            Deep Robotics

The active plugin (if any) is marked. You can browse the same catalog from the dashboard’s Plugins page.

Install a plugin

emos plugin install emos-plugin-example

EMOS fetches the plugin, builds it for your install mode, and activates it. If a different plugin is already active, you’ll be asked to confirm the replacement.

When it finishes, the CLI prints how to reference the plugin from a recipe — for example:

✓ Plugin 'Example Robot (reference plugin)' installed and activated.
  In a recipe: from myrobot_plugin import MyRobotPlugin; Launcher(robot_plugin=MyRobotPlugin())

Note

EMOS must be installed first (emos install). The plugin is built against your active install mode (Native / Pixi / Container).

Inspect the active plugin

See exactly what the robot exposes — its feedback streams, commands, actions, and events:

emos plugin inspect

This prints the plugin’s introspection tree (the same data the dashboard’s System page shows for the active robot).

Remove the active plugin

emos plugin remove

Removes the plugin from the robot. You can install another from the catalog at any time.

Using a plugin in a recipe

Installing a plugin makes it importable; a recipe opts in by handing an instance to the Launcher:

from ros_sugar.launch import Launcher
from myrobot_plugin import MyRobotPlugin

launcher = Launcher(robot_plugin=MyRobotPlugin())
launcher.add_pkg(components=[...])
launcher.bringup()

From there, every component’s standard I/O is translated through the plugin, and the plugin’s actions and events are available to your recipe (and to Cortex, which registers them as tools automatically). See Robot Plugins (concept) for the details.

From the dashboard

Everything above is also available without a terminal — see the dashboard’s Plugins page: browse the catalog, install with one click, and watch the active robot (name, vendor, and picture) appear on the System page.

See also