* I add `x_lb` and `x_ub` in Constraint for two reasons
 * Some constraints naturally encode a lower and upper bound for the decision variables. For example, the `QuasiStaticConstraint` encodes the bounds that all the weights are between [0,1]. And `PostureConstraint` is a bounding box constraint on the decision variables directly. I think adding `x_lb` and `x_ub` would be a consistent approach to encode all these constraints.
 * We only need to call `addNonlinearConstraint` or `addLinearConstraint` functions to specify all the constraints in the NLP. If not, we need to have a separate function `setBounds` to set the lower and upper bound for each of the decision variables. 
* I agree that we can enforce the nonlinear equality constraints to be equal to zero
* I feel that writing bin_lb<=Ain*x <=bin_ub would be simpler than writing Ain*x <= bin_ub and -Ain*x <=-bin_lb.