Skip to content

Dyros Robot Controller

Dyros Robot Controller is a ROS 2 C++ library for mobile robots, manipulators, and mobile manipulators. It provides a unified controller API backed by Pinocchio for kinematics/dynamics and OSQP for quadratic-programming solvers, along with Python bindings and MuJoCo simulation examples.

  • :material-robot-arm: Manipulator control

    Joint-space PD, CLIK, OSF, QP-based inverse kinematics and inverse dynamics, and hierarchical QP — all with CBF safety constraints.

    → Joint-space control · → Task-space control · → QP / HQP

  • :material-car: Mobile robot control

    Kinematic support for differential-drive, mecanum-wheel, and caster-wheel mobile bases.

  • :material-robot: Mobile manipulator control

    Whole-body QP / HQP interfaces that split optimized velocity or torque commands into a mobile-base vector and a manipulator vector.

  • :material-code-braces: Python and C++ examples

    Minimal MuJoCo simulation loops for the Franka FR3, Summit XLS, and FR3-on-XLS robots.

Franka FR3
Franka FR3 — manipulator
Summit XLS
Summit XLS — mobile base
FR3 on Summit XLS
FR3 on Summit XLS — mobile manipulator

Package Layout

Path Purpose
include/dyros_robot_controller/ Public C++ headers
src/ C++ controller, solver, and binding implementations
drc/ Python wrapper package
examples/C++ C++ MuJoCo examples
examples/python Python MuJoCo examples
examples/robots Example robot URDF/SRDF models and assets

Controller Classes

C++ class Python module Purpose
drc::Manipulator::RobotData drc.manipulator.RobotData State storage and kinematics/dynamics (manipulator)
drc::Manipulator::RobotController drc.manipulator.RobotController Control computations (manipulator)
drc::Mobile::RobotData drc.mobile.RobotData State storage (mobile base)
drc::Mobile::RobotController drc.mobile.RobotController Control computations (mobile base)
drc::MobileManipulator::RobotData drc.mobile_manipulator.RobotData State storage (whole-body)
drc::MobileManipulator::RobotController drc.mobile_manipulator.RobotController Control computations (whole-body)

Quick Start

from drc.manipulator import RobotData, RobotController
from drc.type_define import TaskSpaceData
import numpy as np

robot_data = RobotData(dt=0.001, urdf_path="path/to/robot.urdf")
robot_ctrl = RobotController(robot_data)

# Set QP-IK weights
dof = robot_data.get_dof()
robot_ctrl.set_QPIK_gain(
    w_tracking   = np.array([100]*6, dtype=float),
    w_vel_damping = np.ones(dof) * 0.01,
    w_acc_damping = np.ones(dof) * 0.1,
)

# Control loop
while True:
    robot_data.update_state(q, qdot)                          # update from simulator

    task = TaskSpaceData()
    task.x_desired         = T_desired                        # target SE(3) pose
    task.xdot_desired      = np.zeros(6)
    task.x_init            = T_init
    task.xdot_init         = np.zeros(6)
    task.control_start_time = t_start
    task.current_time       = t_now

    ok, qdot_cmd = robot_ctrl.QPIK_cubic({"end_effector": task}, duration=3.0)

See Installation for build instructions and Examples for complete simulation loops.