py::class_<Quadruped_DOF>(m, "Quadruped_DOF")
    .def(py::init<const gafro::System<double>&, const std::array<std::string, 4>&>())
    .def_property_readonly_static("dof", [](py::object) { return DOF; })
    .def("getSystem", &Quadruped_DOF::getSystem, py::return_value_policy::reference)
    .def("getFootMotor", &Quadruped_DOF::getFootMotor)
    .def("getFootMotors", &Quadruped_DOF::getFootMotors)
    .def("getFootPoints", &Quadruped_DOF::getFootPoints)
    .def("getFootSphere", &Quadruped_DOF::getFootSphere)
    // .def("getFootSphereJacobian", &Quadruped_DOF::getFootSphereJacobian)
    .def("getFootAnalyticJacobian", &Quadruped_DOF::getFootAnalyticJacobian)
    .def("getFootGeometricJacobian", py::overload_cast<const unsigned&, const Eigen::Vector<double, DOF>&>(&Quadruped_DOF::getFootGeometricJacobian, py::const_))
    .def("getFootGeometricJacobian", py::overload_cast<const unsigned&, const Eigen::Vector<double, DOF>&, const Motor&>(&Quadruped_DOF::getFootGeometricJacobian, py::const_))
    .def("getAnalyticJacobian", &Quadruped_DOF::getAnalyticJacobian)
    .def("getGeometricJacobian", py::overload_cast<const Eigen::Vector<double, 4 * DOF>&>(&Quadruped_DOF::getGeometricJacobian, py::const_))
    .def("getGeometricJacobian", py::overload_cast<const Eigen::Vector<double, 4 * DOF>&, const Motor&>(&Quadruped_DOF::getGeometricJacobian, py::const_))
    .def("getMeanMotor", &Quadruped_DOF::getMeanMotor)
    .def("getMeanMotorAnalyticJacobian", &Quadruped_DOF::getMeanMotorAnalyticJacobian)
    .def("getMeanMotorGeometricJacobian", &Quadruped_DOF::getMeanMotorGeometricJacobian);
