Skip to content

Control

Add the following to your config.yaml:

control:
enabled: true

That’s it. The adamo binary receives control messages over the Adamo network and relays them to ROS topics on the robot.

The web interface supports gamepad input out of the box. Inputs are serialized, sent over the Adamo network, and relayed to ROS topics on the robot.

Gamepad — Plug in a USB or Bluetooth gamepad (Xbox, PlayStation, or similar). The web app detects it automatically. Published to /joy as sensor_msgs/msg/Joy.

When viewing a stereo video stream in immersive VR mode, head pose and VR controller tracking data are captured and forwarded to the robot. This is only active while in the VR view. The following ROS topics are published:

TopicTypeDescription
/head_posegeometry_msgs/msg/PoseStampedVR headset position and orientation
/controller/leftgeometry_msgs/msg/PoseStampedLeft controller pose
/controller/rightgeometry_msgs/msg/PoseStampedRight controller pose

For programmatic control beyond the web interface, use the Python SDK:

import adamo
session = adamo.connect(api_key="ak_your_key")
# Send a JointState command
from adamo import JointState
js = JointState(
names=["joint1", "joint2", "joint3"],
positions=[0.1, 0.5, -0.3],
)
pub = session.control_publisher("my-robot", "joint_states")
pub.put(js.to_json())

control_publisher() uses real-time priority and drop-on-congestion. This is the correct behavior for control loops — you want the latest command delivered fast, not old commands queued up.