diff --git a/VirtualRobot/IK/constraints/BalanceConstraint.cpp b/VirtualRobot/IK/constraints/BalanceConstraint.cpp index a6440abcb43f31536b33bd1cf2e6dd44507051b3..737ef28e62e432c5321e1ed43f5ec60e91c90680 100644 --- a/VirtualRobot/IK/constraints/BalanceConstraint.cpp +++ b/VirtualRobot/IK/constraints/BalanceConstraint.cpp @@ -16,20 +16,21 @@ using namespace VirtualRobot; BalanceConstraint::BalanceConstraint(const RobotPtr &robot, const RobotNodeSetPtr &joints, const RobotNodeSetPtr &bodies, const SceneObjectSetPtr &contactNodes, - float tolerance, float minimumStability, float maxSupportDistance, bool supportPolygonUpdates, bool consderCoMHeight) : + float tolerance, float minimumStability, float maxSupportDistance, bool supportPolygonUpdates, bool considerCoMHeight) : Constraint(joints) { - initialize(robot, joints, bodies, contactNodes, tolerance, minimumStability, maxSupportDistance, supportPolygonUpdates); + initialize(robot, joints, bodies, contactNodes, tolerance, minimumStability, maxSupportDistance, supportPolygonUpdates, considerCoMHeight); } BalanceConstraint::BalanceConstraint(const RobotPtr &robot, const RobotNodeSetPtr &joints, const RobotNodeSetPtr &bodies, const SupportPolygonPtr &supportPolygon, - float tolerance, float minimumStability, float maxSupportDistance, bool supportPolygonUpdates, bool consderCoMHeight) : + float tolerance, float minimumStability, float maxSupportDistance, bool supportPolygonUpdates, bool considerCoMHeight) : Constraint(joints) { - initialize(robot, joints, bodies, supportPolygon->getContactModels(), tolerance, minimumStability, maxSupportDistance, supportPolygonUpdates); + initialize(robot, joints, bodies, supportPolygon->getContactModels(), tolerance, minimumStability, maxSupportDistance, supportPolygonUpdates, considerCoMHeight); } -void BalanceConstraint::initialize(const RobotPtr &robot, const RobotNodeSetPtr &joints, const RobotNodeSetPtr &bodies, const SceneObjectSetPtr &contactNodes, float tolerance, float minimumStability, float maxSupportDistance, bool supportPolygonUpdates) +void BalanceConstraint::initialize(const RobotPtr &robot, const RobotNodeSetPtr &joints, const RobotNodeSetPtr &bodies, const SceneObjectSetPtr &contactNodes, + float tolerance, float minimumStability, float maxSupportDistance, bool supportPolygonUpdates, bool considerCoMHeight) { this->joints = joints; this->bodies = bodies; @@ -48,11 +49,12 @@ void BalanceConstraint::initialize(const RobotPtr &robot, const RobotNodeSetPtr dim = 3; setCoMHeight(height); } - else{ + else + { height = robot->getCoMGlobal()(2); setCoMHeight(height); } - comIK.reset(new CoMIK(joints, bodies,RobotNodePtr(),dim)); + comIK.reset(new CoMIK(joints, bodies, RobotNodePtr(), dim)); updateSupportPolygon(); @@ -87,7 +89,7 @@ void BalanceConstraint::setCoMHeight(float currentheight) Eigen::MatrixXf BalanceConstraint::getJacobianMatrix() { Eigen::MatrixXf J = comIK->getJacobianMatrix(); - if(supportPolygon->getStabilityIndex(bodies, false) >= minimumStability) + if(supportPolygon->getStabilityIndex(bodies, supportPolygonUpdates) >= minimumStability) { // Set jacobian to zero in order to allow any type of motion within the stability zone J.setZero(); @@ -103,31 +105,25 @@ Eigen::MatrixXf BalanceConstraint::getJacobianMatrix(SceneObjectPtr tcp) Eigen::VectorXf BalanceConstraint::getError(float stepSize) { - if(supportPolygonUpdates) - { - updateSupportPolygon(); - } + float stability = supportPolygon->getStabilityIndex(bodies, supportPolygonUpdates); - float stability = supportPolygon->getStabilityIndex(bodies, false); - - Eigen::VectorXf e; if(stability < minimumStability) { - e = comIK->getError(stepSize); + return comIK->getError(stepSize); + } + else if(considerCoMHeight) + { + return Eigen::Vector3f(0,0,0); } else { - if (considerCoMHeight) - e = Eigen::Vector3f(0,0,0); - else - e = Eigen::Vector2f(0,0); + return Eigen::Vector2f(0,0); } - - return e; } bool BalanceConstraint::checkTolerances() { + VR_INFO << "Stability: " << supportPolygon->getStabilityIndex(bodies, supportPolygonUpdates) << std::endl; return (supportPolygon->getStabilityIndex(bodies, supportPolygonUpdates) >= minimumStability); } diff --git a/VirtualRobot/IK/constraints/BalanceConstraint.h b/VirtualRobot/IK/constraints/BalanceConstraint.h index 56d8741e4035906ab7906ce7928c1991122cbe15..3f9589770abc149d40000a4a745b85ecbb4fc163 100644 --- a/VirtualRobot/IK/constraints/BalanceConstraint.h +++ b/VirtualRobot/IK/constraints/BalanceConstraint.h @@ -39,9 +39,9 @@ namespace VirtualRobot { public: BalanceConstraint(const RobotPtr &robot, const RobotNodeSetPtr &joints, const RobotNodeSetPtr &bodies, const SceneObjectSetPtr &contactNodes, - float tolerance=0.1f, float minimumStability=0.5f, float maxSupportDistance=10.0f, bool supportPolygonUpdates=true, bool consderCoMHeight = false); + float tolerance=0.1f, float minimumStability=0.5f, float maxSupportDistance=10.0f, bool supportPolygonUpdates=true, bool considerCoMHeight = false); BalanceConstraint(const RobotPtr &robot, const RobotNodeSetPtr &joints, const RobotNodeSetPtr &bodies, const SupportPolygonPtr &supportPolygon, - float tolerance=0.1f, float minimumStability=0.5f, float maxSupportDistance=10.0f, bool supportPolygonUpdates=true, bool consderCoMHeight = false); + float tolerance=0.1f, float minimumStability=0.5f, float maxSupportDistance=10.0f, bool supportPolygonUpdates=true, bool considerCoMHeight = false); Eigen::MatrixXf getJacobianMatrix(); Eigen::MatrixXf getJacobianMatrix(SceneObjectPtr tcp); @@ -53,10 +53,10 @@ namespace VirtualRobot SupportPolygonPtr getSupportPolygon(); std::string getConstraintType(); -void setCoMHeight(float height); + void setCoMHeight(float height); protected: void initialize(const RobotPtr &robot, const RobotNodeSetPtr &joints, const RobotNodeSetPtr &bodies, const SceneObjectSetPtr &contactNodes, - float tolerance, float minimumStability, float maxSupportDistance, bool supportPolygonUpdates); + float tolerance, float minimumStability, float maxSupportDistance, bool supportPolygonUpdates, bool considerCoMHeight); void updateSupportPolygon();