-
Notifications
You must be signed in to change notification settings - Fork 36
DistanceConstr #131
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
DistanceConstr #131
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -309,7 +309,7 @@ double DamperJointLimitsConstr::computeDamper(double dist, double iDist, double | |
| { return damping * ((dist - sDist) / (iDist - sDist)); } | ||
|
|
||
| /** | ||
| * CollisionConstr | ||
| * DistanceConstr | ||
| */ | ||
|
|
||
| sch::Matrix4x4 tosch(const sva::PTransformd & t) | ||
|
|
@@ -330,54 +330,54 @@ sch::Matrix4x4 tosch(const sva::PTransformd & t) | |
| return m; | ||
| } | ||
|
|
||
| CollisionConstr::BodyCollData::BodyCollData(const rbd::MultiBody & mb, | ||
| int rI, | ||
| const std::string & bName, | ||
| sch::S_Object * h, | ||
| const sva::PTransformd & X, | ||
| const Eigen::VectorXd & selector) | ||
| DistanceConstr::BodyCollData::BodyCollData(const rbd::MultiBody & mb, | ||
| int rI, | ||
| const std::string & bName, | ||
| sch::S_Object * h, | ||
| const sva::PTransformd & X, | ||
| const Eigen::VectorXd & selector) | ||
| : hull(h), jac(mb, bName), X_op_o(X), rIndex(rI), bIndex(mb.bodyIndexByName(bName)), bodyName(bName), selector(selector) | ||
| { | ||
| } | ||
|
|
||
| CollisionConstr::CollData::CollData(std::vector<BodyCollData> bcds, | ||
| int collId, | ||
| sch::S_Object * body1, | ||
| sch::S_Object * body2, | ||
| double di, | ||
| double ds, | ||
| double damp, | ||
| double dampOff) | ||
| DistanceConstr::CollData::CollData(std::vector<BodyCollData> bcds, | ||
| int collId, | ||
| sch::S_Object * body1, | ||
| sch::S_Object * body2, | ||
| double di, | ||
| double ds, | ||
| double damp, | ||
| double dampOff) | ||
| : pair(new sch::CD_Pair(body1, body2)), distance(2 * di), normVecDist(Eigen::Vector3d::Zero()), di(di), ds(ds), | ||
| damping(damp), bodies(std::move(bcds)), dampingType(damping > 0. ? DampingType::Hard : DampingType::Free), | ||
| dampingOff(dampOff), collId(collId) | ||
| { | ||
| } | ||
|
|
||
| CollisionConstr::CollisionConstr(const std::vector<rbd::MultiBody> & mbs, double step) | ||
| DistanceConstr::DistanceConstr(const std::vector<rbd::MultiBody> & mbs, double step) | ||
| : dataVec_(), step_(step), nrActivated_(0), totalAlphaD_(-1), AInEq_(), bInEq_(), fullJac_(), distJac_() | ||
| { | ||
| int maxDof = std::max_element(mbs.begin(), mbs.end(), compareDof)->nrDof(); | ||
| fullJac_.resize(1, maxDof); | ||
| distJac_.resize(1, maxDof); | ||
| } | ||
|
|
||
| void CollisionConstr::addCollision(const std::vector<rbd::MultiBody> & mbs, | ||
| int collId, | ||
| int r1Index, | ||
| const std::string & r1BodyName, | ||
| sch::S_Object * body1, | ||
| const sva::PTransformd & X_op1_o1, | ||
| int r2Index, | ||
| const std::string & r2BodyName, | ||
| sch::S_Object * body2, | ||
| const sva::PTransformd & X_op2_o2, | ||
| double di, | ||
| double ds, | ||
| double damping, | ||
| double dampingOff, | ||
| const Eigen::VectorXd & r1Selector, | ||
| const Eigen::VectorXd & r2Selector) | ||
| void DistanceConstr::addCollision(const std::vector<rbd::MultiBody> & mbs, | ||
| int collId, | ||
| int r1Index, | ||
| const std::string & r1BodyName, | ||
| sch::S_Object * body1, | ||
| const sva::PTransformd & X_op1_o1, | ||
| int r2Index, | ||
| const std::string & r2BodyName, | ||
| sch::S_Object * body2, | ||
| const sva::PTransformd & X_op2_o2, | ||
| double di, | ||
| double ds, | ||
| double damping, | ||
| double dampingOff, | ||
| const Eigen::VectorXd & r1Selector, | ||
| const Eigen::VectorXd & r2Selector) | ||
| { | ||
| const rbd::MultiBody mb1 = mbs[static_cast<size_t>(r1Index)]; | ||
| const rbd::MultiBody mb2 = mbs[static_cast<size_t>(r2Index)]; | ||
|
|
@@ -395,7 +395,7 @@ void CollisionConstr::addCollision(const std::vector<rbd::MultiBody> & mbs, | |
| dataVec_.emplace_back(std::move(bodies), collId, body1, body2, di, ds, damping, dampingOff); | ||
| } | ||
|
|
||
| bool CollisionConstr::rmCollision(int collId) | ||
| bool DistanceConstr::rmCollision(int collId) | ||
| { | ||
| auto it = | ||
| std::find_if(dataVec_.begin(), dataVec_.end(), [collId](const CollData & data) { return data.collId == collId; }); | ||
|
|
@@ -408,36 +408,36 @@ bool CollisionConstr::rmCollision(int collId) | |
| return false; | ||
| } | ||
|
|
||
| auto CollisionConstr::getCollisionData(int collId) const -> const CollData & | ||
| auto DistanceConstr::getCollisionData(int collId) const -> const CollData & | ||
| { | ||
| auto it = | ||
| std::find_if(dataVec_.begin(), dataVec_.end(), [&](const CollData & data) { return data.collId == collId; }); | ||
| if(it != dataVec_.end()) { return *it; } | ||
| throw std::runtime_error("No collision with the requested id"); | ||
| } | ||
|
|
||
| std::size_t CollisionConstr::nrCollisions() const | ||
| std::size_t DistanceConstr::nrCollisions() const | ||
| { return dataVec_.size(); } | ||
|
|
||
| void CollisionConstr::reset() | ||
| void DistanceConstr::reset() | ||
| { dataVec_.clear(); } | ||
|
|
||
| void CollisionConstr::updateNrCollisions() | ||
| void DistanceConstr::updateNrCollisions() | ||
| { | ||
| AInEq_.setZero(static_cast<Eigen::DenseIndex>(dataVec_.size()), nrVars_); | ||
| bInEq_.setZero(static_cast<Eigen::DenseIndex>(dataVec_.size())); | ||
| } | ||
|
|
||
| void CollisionConstr::updateNrVars(const std::vector<rbd::MultiBody> & /* mb */, const SolverData & data) | ||
| void DistanceConstr::updateNrVars(const std::vector<rbd::MultiBody> & /* mb */, const SolverData & data) | ||
| { | ||
| totalAlphaD_ = data.totalAlphaD(); | ||
| nrVars_ = data.nrVars(); | ||
| updateNrCollisions(); | ||
| } | ||
|
|
||
| void CollisionConstr::update(const std::vector<rbd::MultiBody> & mbs, | ||
| const std::vector<rbd::MultiBodyConfig> & mbcs, | ||
| const SolverData & data) | ||
| void DistanceConstr::update(const std::vector<rbd::MultiBody> & mbs, | ||
| const std::vector<rbd::MultiBodyConfig> & mbcs, | ||
| const SolverData & data) | ||
| { | ||
| using namespace Eigen; | ||
|
|
||
|
|
@@ -476,7 +476,7 @@ void CollisionConstr::update(const std::vector<rbd::MultiBody> & mbs, | |
| nearestPoint = d.p2; | ||
| } | ||
|
|
||
| if(d.distance < d.di) | ||
| if((d.distance < d.di && d.di > d.ds) || (d.distance > d.di && d.di < d.ds)) | ||
| { | ||
| // automatic damping computation if needed | ||
| if(d.dampingType == CollData::DampingType::Free) | ||
|
|
@@ -491,7 +491,7 @@ void CollisionConstr::update(const std::vector<rbd::MultiBody> & mbs, | |
| Vector3d onf = d.normVecDist; | ||
| Vector3d dnf = (nf - onf) / step_; | ||
|
|
||
| double sign = 1.; | ||
| double sign = (d.di > d.ds) ? 1.0 : -1.0; | ||
| bInEq_(nrActivated_) = dampers; | ||
| AInEq_.block(nrActivated_, 0, 1, totalAlphaD_).setZero(); | ||
| for(std::size_t i = 0; i < d.bodies.size(); ++i) | ||
|
|
@@ -527,8 +527,8 @@ void CollisionConstr::update(const std::vector<rbd::MultiBody> & mbs, | |
| bInEq_(nrActivated_) += sign * (jqdn + jqdnd + jdqdn); | ||
| // little hack | ||
| // the max iteration number is two, so at the second iteration | ||
| // sign will be -1 | ||
| sign = -1.; | ||
| // sign will be -sign | ||
| sign = -sign; | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. So it's a loop on |
||
| } | ||
| ++nrActivated_; | ||
| } | ||
|
|
@@ -541,10 +541,10 @@ void CollisionConstr::update(const std::vector<rbd::MultiBody> & mbs, | |
| } | ||
| } | ||
|
|
||
| std::string CollisionConstr::nameInEq() const | ||
| { return "SelfCollisionConstr"; } | ||
| std::string DistanceConstr::nameInEq() const | ||
| { return "DistanceConstr"; } | ||
|
|
||
| std::string CollisionConstr::descInEq(const std::vector<rbd::MultiBody> & mbs, int line) | ||
| std::string DistanceConstr::descInEq(const std::vector<rbd::MultiBody> & mbs, int line) | ||
| { | ||
| int curLine = 0; | ||
| for(CollData & d : dataVec_) | ||
|
|
@@ -575,23 +575,23 @@ std::string CollisionConstr::descInEq(const std::vector<rbd::MultiBody> & mbs, i | |
| return ""; | ||
| } | ||
|
|
||
| int CollisionConstr::nrInEq() const | ||
| int DistanceConstr::nrInEq() const | ||
| { return nrActivated_; } | ||
|
|
||
| int CollisionConstr::maxInEq() const | ||
| int DistanceConstr::maxInEq() const | ||
| { return int(dataVec_.size()); } | ||
|
|
||
| const Eigen::MatrixXd & CollisionConstr::AInEq() const | ||
| const Eigen::MatrixXd & DistanceConstr::AInEq() const | ||
| { return AInEq_; } | ||
|
|
||
| const Eigen::VectorXd & CollisionConstr::bInEq() const | ||
| const Eigen::VectorXd & DistanceConstr::bInEq() const | ||
| { return bInEq_; } | ||
|
|
||
| double CollisionConstr::computeDamping(const std::vector<rbd::MultiBody> & mbs, | ||
| const std::vector<rbd::MultiBodyConfig> & mbcs, | ||
| const CollData & cd, | ||
| const Eigen::Vector3d & normVecDist, | ||
| double dist) const | ||
| double DistanceConstr::computeDamping(const std::vector<rbd::MultiBody> & mbs, | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We should maybe ensure that the damping heuristics here behave well for unusual cases, e.g large distances. This has AFAIK only been used in contexts where we wish to avoid collisions on rather small distances, with an interaction distance rather close to the safety distance. |
||
| const std::vector<rbd::MultiBodyConfig> & mbcs, | ||
| const CollData & cd, | ||
| const Eigen::Vector3d & normVecDist, | ||
| double dist) const | ||
| { | ||
| Eigen::Vector3d diffVel(Eigen::Vector3d::Zero()); | ||
| double sign = 1.; | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -285,14 +285,14 @@ class TASKS_DLLAPI DamperJointLimitsConstr : public ConstraintFunction<Bound> | |
| * the following formula: | ||
| * \f[ \xi = -\frac{d_i - d_s}{d - d_s}\alpha + \xi_{\text{off}} \f] | ||
| */ | ||
| class TASKS_DLLAPI CollisionConstr : public ConstraintFunction<Inequality> | ||
| class TASKS_DLLAPI DistanceConstr : public ConstraintFunction<Inequality> | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You can add using CollisionConstr [[deprecated("Use DistanceConstr instead.")]] = DistanceConstr;after the class to keep the old name around for backwards compatibility. Note: with this, this PR can be merged independently of mc_rtc |
||
| { | ||
| public: | ||
| /** | ||
| * @param mbs Multi-robot system. | ||
| * @param step Time step in second. | ||
| */ | ||
| CollisionConstr(const std::vector<rbd::MultiBody> & mbs, double step); | ||
| DistanceConstr(const std::vector<rbd::MultiBody> & mbs, double step); | ||
|
|
||
| /** | ||
| * Add a collision avoidance constraint. | ||
|
|
@@ -448,8 +448,8 @@ class TASKS_DLLAPI CollisionConstr : public ConstraintFunction<Inequality> | |
|
|
||
| int nrVars_; | ||
|
|
||
| CollisionConstr(const CollisionConstr &) = delete; | ||
| CollisionConstr & operator=(const CollisionConstr &) = delete; | ||
| DistanceConstr(const DistanceConstr &) = delete; | ||
| DistanceConstr & operator=(const DistanceConstr &) = delete; | ||
| }; | ||
|
|
||
| /** | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you document this behavior?
If I understand correctly:
This is correct here, but if
di == dsthe constraint makes no sense and we risk dividing by 0.I haven't checked if we have unit tests for that, if we don't it'd be a good idea to add one.