Docs›Getting Started

Getting Started

Every robot or device you operate through CTRL+R runs a small piece of software called the CTRL+R agent. It lives on the device, connects out to the platform, and translates between our interface and whatever that hardware already speaks. Until the agent is installed and enrolled, a device cannot be seen or controlled from the webapp.

This is what makes a mixed fleet workable. A quadruped, a camera on a loading dock, and an arm from a third manufacturer all run the same agent and surface the same way, so your operators learn one interface instead of one per vendor, and every device reports into one fleet view rather than three separate dashboards.

You do not write the install command yourself. Start from the webapp and it generates one carrying the device's identity and its enrollment token:

  • Individual accounts: click Add Robot from the Dashboard or Robots page. Both open the same flow.
  • Organizations: open Command HQ, go to the Devices tab, and click Add Device. Choose Robot, or one of the other device types (Edge Device, IP Camera, IoT Sensor) for hardware that is not a robot.

Either path ends on the Robot Setup page, which hands you the command to run on the device. Connect to the robot over SSH and run it there, not on your own machine. The rest of this page covers what needs to be in place before you do.

Running a fleet rather than a single robot? Command HQ covers the wider picture: adding robots and other device types, team members and permissions, sites, notifications, and monitoring everything from one view.

Recommendation

We recommend using Google Chrome with the CTRL+R webapp.

Installing the Agent

The agent installs one of two ways. Both enroll the device and both keep it running across reboots; the difference is whether the agent lives on the host or in a container. The Robot Setup page generates the exact command for whichever you choose, already filled in with your enrollment token.

Option 1: apt (recommended)

The default. Adds the CTRL+R package repository, installs the ctrlr-agent package, enrolls the device, and registers a systemd service.

  • Requires a Debian or Ubuntu system with apt, and root (run it with sudo).
  • Runs as a systemd service, so it starts on boot and restarts if it exits.
  • Updates through apt along with the rest of the system.
  • Check it with systemctl status ctrlr-agent.

Choose this unless you have a reason not to. It is the least moving parts: no container runtime, and the agent is managed the same way as everything else on the machine.

Option 2: Docker

Add --method docker to the install command. Pulls the agent image and runs it as a container with --restart=unless-stopped. Use this if you would rather not install packages onto the host, or you are not on a Debian-based system.

  • Requires Docker installed via apt. Docker from the Snap Store is not supported: its filesystem and permission restrictions break the bind mounts the agent needs, and the installer will stop if it finds one. See the official Docker install guide.
  • Uses host networking (--network=host), which is required so the agent can reach rosbridge on loopback. See below.
  • Updates by pulling a new image tag rather than through apt.
  • Check it with docker ps and docker logs ctrlr-agent.

On NVIDIA boards running JetPack 6 or newer, use --method docker-jetson instead. It runs the same agent on an NVIDIA base image with the GPU runtime attached, which enables hardware video encoding.

ROS (recommended)

We recommend your robot is running ROS. The agent is compatible with both ROS 1 (Noetic) and ROS 2 (Foxy or newer)—for smoother operations we recommend ROS 2 Kilted. See Supported Platforms for more information.

Decide this before you install: pose tracking, GPS position, and custom commands are available on ROS 2 only. If your robot needs any of the three, run it on ROS 2.

rosbridge_server

If you plan to use ROS to control your robot, you must have rosbridge_server installed on your robot.

sudo apt install ros-$ROS_DISTRO-rosbridge-suite

Start it with:

ros2 launch rosbridge_server rosbridge_websocket_launch.xml

The agent expects rosbridge at ws://127.0.0.1:9090, on the same machine. That address is fixed, which is why the Docker install uses host networking. Do not expose port 9090 off the robot: rosbridge has no authentication, so anything that can reach it can drive the robot.

Run rosbridge as a systemd service

If you start rosbridge by hand in a terminal, it dies when you close that session and does not come back after a reboot. The agent has nothing to talk to, so video, movement, and navigation all stop until someone logs in and starts it again.

Create a systemd unit that runs the launch command above so it starts at boot and restarts on failure. The unit has to source your ROS setup script first (/opt/ros/<distro>/setup.bash), since systemd does not load your shell profile.

Zenoh (optional)

Zenoh can be used as an alternative video source to ROS. See the Zenoh installation guide for setup instructions.