py::class_<Manipulator_DOF>(m, "Manipulator_DOF")
    .def(py::init<const gafro::System<double>&, const std::string&>())
    .def_property_readonly_static("dof", [](py::object) { return DOF; })
    .def("getSystem", &Manipulator_DOF::getSystem, py::return_value_policy::reference)
    .def("getLink", &Manipulator_DOF::getLink)
    .def("getJoint", &Manipulator_DOF::getJoint)
    .def("getRandomConfiguration", &Manipulator_DOF::getRandomConfiguration)
    .def("getJointLimitsMin", &Manipulator_DOF::getJointLimitsMin)
    .def("getJointLimitsMax", &Manipulator_DOF::getJointLimitsMax)
    .def("getEEKinematicChain", &Manipulator_DOF::getEEKinematicChain)
    .def("getEEMotor", &Manipulator_DOF::getEEMotor)
    .def("getEEAnalyticJacobian", &Manipulator_DOF::getEEAnalyticJacobian)
    .def("getEEGeometricJacobian", &Manipulator_DOF::getEEGeometricJacobian)
    .def("getGeometricJacobian", &Manipulator_DOF::getGeometricJacobian)
    .def("getGeometricJacobianTimeDerivative", &Manipulator_DOF::getGeometricJacobianTimeDerivative)
    .def("getEEFrameJacobian", &Manipulator_DOF::getEEFrameJacobian)
    .def("getEEVelocityManipulability", &Manipulator_DOF::getEEVelocityManipulability)
    .def("getEEForceManipulability", &Manipulator_DOF::getEEForceManipulability)
    .def("getEEDynamicManipulability", &Manipulator_DOF::getEEDynamicManipulability)
    .def("getEEKinematicNullspaceProjector", &Manipulator_DOF::getEEKinematicNullspaceProjector)
    .def("getJointTorques", &Manipulator_DOF::getJointTorques, py::arg("position"), py::arg("velocity"), py::arg("acceleration"), py::arg("gravity") = 9.81, py::arg("ee_wrench") = Wrench::Zero())
    .def("getJointAccelerations", &Manipulator_DOF::getJointAccelerations)
    .def("getMassMatrix", &Manipulator_DOF::getMassMatrix);
