10 #include <Eigen/StdVector>
13 #include <RBDyn/CoM.h>
14 #include <RBDyn/Jacobian.h>
17 #include <sch/Matrix/SCH_Types.h>
44 TASKS_DLLAPI sch::Matrix4x4
tosch(
const sva::PTransformd & t);
96 virtual void updateNrVars(
const std::vector<rbd::MultiBody> & mbs,
const SolverData & data)
override;
98 virtual void update(
const std::vector<rbd::MultiBody> & mbs,
99 const std::vector<rbd::MultiBodyConfig> & mbcs,
102 virtual std::string nameBound()
const override;
103 virtual std::string descBound(
const std::vector<rbd::MultiBody> & mbs,
int line)
override;
106 virtual int beginVar()
const override;
108 virtual const Eigen::VectorXd & Lower()
const override;
109 virtual const Eigen::VectorXd & Upper()
const override;
112 int robotIndex_, alphaDBegin_, alphaDOffset_;
114 Eigen::VectorXd qMin_, qMax_;
115 Eigen::VectorXd qVec_, alphaVec_;
116 Eigen::VectorXd lower_, upper_;
117 Eigen::VectorXd alphaDLower_, alphaDUpper_;
118 Eigen::VectorXd alphaDDLower_, alphaDDUpper_;
119 Eigen::VectorXd prevAlphaD_;
169 double securityPercent,
189 double securityPercent,
212 double securityPercent,
217 virtual void updateNrVars(
const std::vector<rbd::MultiBody> & mbs,
const SolverData & data)
override;
219 virtual void update(
const std::vector<rbd::MultiBody> & mbs,
220 const std::vector<rbd::MultiBodyConfig> & mbcs,
223 virtual std::string nameBound()
const override;
224 virtual std::string descBound(
const std::vector<rbd::MultiBody> & mbs,
int line)
override;
227 virtual int beginVar()
const override;
229 virtual const Eigen::VectorXd & Lower()
const override;
230 virtual const Eigen::VectorXd & Upper()
const override;
233 double computeDamping(
double alpha,
double dist,
double iDist,
double sDist);
234 double computeDamper(
double dist,
double iDist,
double sDist,
double damping);
246 DampData(
double mi,
double ma,
double miV,
double maV,
double idi,
double sdi,
int aDB,
int i)
247 : min(mi), max(ma), minVel(miV), maxVel(maV), iDist(idi), sDist(sdi), jointIndex(i), alphaDBegin(aDB), damping(0.),
253 double minVel, maxVel;
262 int robotIndex_, alphaDBegin_;
263 std::vector<DampData> data_;
265 Eigen::VectorXd lower_, upper_;
266 Eigen::VectorXd alphaDLower_, alphaDUpper_;
267 Eigen::VectorXd alphaDDLower_, alphaDDUpper_;
268 Eigen::VectorXd prevAlphaD_;
324 void addCollision(
const std::vector<rbd::MultiBody> & mbs,
327 const std::string & r1BodyName,
328 sch::S_Object * body1,
329 const sva::PTransformd & X_op1_o1,
331 const std::string & r2BodyName,
332 sch::S_Object * body2,
333 const sva::PTransformd & X_op2_o2,
337 double dampingOff = 0.,
338 const Eigen::VectorXd & r1Selector = Eigen::VectorXd::Zero(0),
339 const Eigen::VectorXd & r2Selector = Eigen::VectorXd::Zero(0));
347 bool rmCollision(
int collId);
350 std::size_t nrCollisions()
const;
356 void updateNrCollisions();
359 virtual void updateNrVars(
const std::vector<rbd::MultiBody> & mbs,
const SolverData & data)
override;
361 virtual void update(
const std::vector<rbd::MultiBody> & mbs,
362 const std::vector<rbd::MultiBodyConfig> & mbcs,
365 virtual std::string nameInEq()
const override;
366 virtual std::string descInEq(
const std::vector<rbd::MultiBody> & mbs,
int line)
override;
369 virtual int nrInEq()
const override;
370 virtual int maxInEq()
const override;
372 virtual const Eigen::MatrixXd & AInEq()
const override;
373 virtual const Eigen::VectorXd & bInEq()
const override;
378 BodyCollData(
const rbd::MultiBody & mb,
380 const std::string & bodyName,
381 sch::S_Object * hull,
382 const sva::PTransformd & X_op_o,
383 const Eigen::VectorXd & selector);
385 sch::S_Object * hull;
387 sva::PTransformd X_op_o;
389 std::string bodyName;
390 Eigen::VectorXd selector;
395 enum class DampingType
401 CollData(std::vector<BodyCollData> bcds,
403 sch::S_Object * body1,
404 sch::S_Object * body2,
409 CollData(CollData &&) =
default;
410 CollData(
const CollData &) =
delete;
411 CollData & operator=(
const CollData &) =
delete;
412 CollData & operator=(CollData &&) =
default;
414 std::unique_ptr<sch::CD_Pair> pair;
418 Eigen::Vector3d normVecDist;
421 std::vector<BodyCollData> bodies;
423 DampingType dampingType;
430 const CollData & getCollisionData(
int collId)
const;
433 double computeDamping(
const std::vector<rbd::MultiBody> & mbs,
434 const std::vector<rbd::MultiBodyConfig> & mbcs,
436 const Eigen::Vector3d & normalVecDist,
440 std::vector<CollData> dataVec_;
442 int nrActivated_, totalAlphaD_;
444 Eigen::MatrixXd AInEq_;
445 Eigen::VectorXd bInEq_;
447 Eigen::MatrixXd fullJac_, distJac_;
478 CoMIncPlaneConstr(
const std::vector<rbd::MultiBody> & mbs,
int robotIndex,
double step);
495 void addPlane(
int planeId,
496 const Eigen::Vector3d & normal,
501 double dampingOff = 0.);
503 void addPlane(
int planeId,
504 const Eigen::Vector3d & normal,
509 const Eigen::Vector3d & speed,
510 const Eigen::Vector3d & normalDot,
511 double dampingOff = 0.);
519 bool rmPlane(
int planeId);
522 std::size_t nrPlanes()
const;
531 inline Eigen::VectorXd &
selector() noexcept {
return selector_; }
537 inline const Eigen::VectorXd &
selector() const noexcept {
return selector_; }
540 void updateNrPlanes();
543 virtual void updateNrVars(
const std::vector<rbd::MultiBody> & mbs,
const SolverData & data)
override;
545 virtual void update(
const std::vector<rbd::MultiBody> & mbs,
546 const std::vector<rbd::MultiBodyConfig> & mbcs,
549 virtual std::string nameInEq()
const override;
550 virtual std::string descInEq(
const std::vector<rbd::MultiBody> & mbs,
int line)
override;
553 virtual int nrInEq()
const override;
554 virtual int maxInEq()
const override;
556 virtual const Eigen::MatrixXd & AInEq()
const override;
557 virtual const Eigen::VectorXd & bInEq()
const override;
562 enum class DampingType
568 PlaneData(
int planeId,
569 const Eigen::Vector3d & normal,
575 const Eigen::Vector3d & speed,
576 const Eigen::Vector3d & normalDot);
577 Eigen::Vector3d normal;
578 Eigen::Vector3d normalDot;
584 DampingType dampingType;
586 Eigen::Vector3d speed;
590 int robotIndex_, alphaDBegin_;
591 std::vector<PlaneData> dataVec_;
595 std::vector<std::size_t> activated_;
597 rbd::CoMJacobian jacCoM_;
598 Eigen::VectorXd selector_;
599 Eigen::MatrixXd AInEq_;
600 Eigen::VectorXd bInEq_;
610 const Eigen::Vector3d & origin,
611 const Eigen::Vector3d & axis);
616 virtual void updateNrVars(
const std::vector<rbd::MultiBody> & mb,
const SolverData & data)
override;
618 virtual void update(
const std::vector<rbd::MultiBody> & mb,
619 const std::vector<rbd::MultiBodyConfig> & mbc,
622 virtual std::string nameInEq()
const override;
623 virtual std::string descInEq(
const std::vector<rbd::MultiBody> & mb,
int line)
override;
626 virtual int maxInEq()
const override;
628 virtual const Eigen::MatrixXd & AInEq()
const override;
629 virtual const Eigen::VectorXd & bInEq()
const override;
634 GripperData(
const ContactId & cId,
double tl,
const Eigen::Vector3d & o,
const Eigen::Vector3d & a);
638 Eigen::Vector3d origin;
639 Eigen::Vector3d axis;
643 std::vector<GripperData> dataVec_;
645 Eigen::MatrixXd AInEq_;
646 Eigen::VectorXd bInEq_;
669 BoundedSpeedConstr(
const std::vector<rbd::MultiBody> & mbs,
int robotIndex,
double timeStep);
685 void addBoundedSpeed(
const std::vector<rbd::MultiBody> & mbs,
686 const std::string & bodyName,
687 const Eigen::Vector3d & bodyPoint,
688 const Eigen::MatrixXd & dof,
689 const Eigen::VectorXd & speed);
704 void addBoundedSpeed(
const std::vector<rbd::MultiBody> & mbs,
705 const std::string & bodyName,
706 const Eigen::Vector3d & bodyPoint,
707 const Eigen::MatrixXd & dof,
708 const Eigen::VectorXd & lowerSpeed,
709 const Eigen::VectorXd & upperSpeed);
717 bool removeBoundedSpeed(
const std::string & bodyName);
720 void resetBoundedSpeeds();
723 std::size_t nrBoundedSpeeds()
const;
726 void updateBoundedSpeeds();
729 virtual void updateNrVars(
const std::vector<rbd::MultiBody> & mbs,
const SolverData & data)
override;
731 virtual void update(
const std::vector<rbd::MultiBody> & mbs,
732 const std::vector<rbd::MultiBodyConfig> & mbc,
735 virtual std::string nameGenInEq()
const override;
736 virtual std::string descGenInEq(
const std::vector<rbd::MultiBody> & mb,
int line)
override;
739 virtual int maxGenInEq()
const override;
741 virtual const Eigen::MatrixXd & AGenInEq()
const override;
742 virtual const Eigen::VectorXd & LowerGenInEq()
const override;
743 virtual const Eigen::VectorXd & UpperGenInEq()
const override;
746 struct BoundedSpeedData
748 BoundedSpeedData(rbd::Jacobian j,
749 const Eigen::MatrixXd & d,
750 const Eigen::VectorXd & ls,
751 const Eigen::VectorXd & us,
752 const std::string & bName)
753 : jac(j), bodyPoint(j.point()), dof(d), lSpeed(ls), uSpeed(us), body(j.jointsPath().back()), bodyName(bName)
758 sva::PTransformd bodyPoint;
760 Eigen::VectorXd lSpeed, uSpeed;
762 std::string bodyName;
769 int robotIndex_, alphaDBegin_;
770 std::vector<BoundedSpeedData> cont_;
772 Eigen::MatrixXd fullJac_;
775 Eigen::VectorXd lower_, upper_;
800 ImageConstr(
const std::vector<rbd::MultiBody> & mbs,
802 const std::string & bName,
803 const sva::PTransformd & X_b_gaze,
805 double constrDirection = 1.);
827 void setLimits(
const Eigen::Vector2d & min,
828 const Eigen::Vector2d & max,
829 const double iPercent,
830 const double sPercent,
831 const double damping,
832 const double dampingOffsetPercent);
840 int addPoint(
const Eigen::Vector2d & point2d,
const double depthEstimate);
841 int addPoint(
const Eigen::Vector3d & point3d);
849 void addPoint(
const std::vector<rbd::MultiBody> & mbs,
850 const std::string & bName,
851 const sva::PTransformd & X_b_p = sva::PTransformd::Identity());
853 void updatePoint(
const int pointId,
const Eigen::Vector2d & point2d);
854 void updatePoint(
const int pointId,
const Eigen::Vector2d & point2d,
const double depthEstimate);
855 void updatePoint(
const int pointId,
const Eigen::Vector3d & point3d);
857 void computeComponents(
const rbd::MultiBody & mb,
858 const rbd::MultiBodyConfig & mbc,
860 const Eigen::Vector2d & point2d,
864 const sva::PTransformd & X_b_p,
865 Eigen::MatrixXd & fullJacobian,
866 Eigen::Vector2d & bCommonTerm);
869 virtual void updateNrVars(
const std::vector<rbd::MultiBody> & mbs,
const SolverData & data)
override;
871 virtual void update(
const std::vector<rbd::MultiBody> & mbs,
872 const std::vector<rbd::MultiBodyConfig> & mbcs,
876 virtual std::string nameInEq()
const override;
877 virtual std::string descInEq(
const std::vector<rbd::MultiBody> & mbs,
int line)
override;
878 virtual int nrInEq()
const override;
879 virtual int maxInEq()
const override;
881 virtual const Eigen::MatrixXd & AInEq()
const override;
882 virtual const Eigen::VectorXd & bInEq()
const override;
887 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
888 PointData(
const Eigen::Vector2d & pt,
const double d);
889 Eigen::Vector2d point2d;
890 double depthEstimate;
892 struct RobotPointData
894 RobotPointData(
const std::string & bName,
const sva::PTransformd & X,
const rbd::Jacobian & j);
896 sva::PTransformd X_b_p;
901 std::vector<PointData, Eigen::aligned_allocator<PointData>> dataVec_;
902 std::vector<RobotPointData> dataVecRob_;
903 int robotIndex_, bodyIndex_, alphaDBegin_;
905 double step_, accelFactor_;
909 sva::PTransformd X_b_gaze_;
910 std::unique_ptr<Eigen::Matrix<double, 2, 6>> L_img_;
911 std::unique_ptr<Eigen::Matrix<double, 6, 1>> surfaceVelocity_;
912 std::unique_ptr<Eigen::Matrix<double, 1, 6>> L_Z_dot_;
913 std::unique_ptr<Eigen::Matrix<double, 2, 6>> L_img_dot_;
914 std::unique_ptr<Eigen::Vector2d> speed_;
915 std::unique_ptr<Eigen::Vector2d> normalAcc_;
916 Eigen::MatrixXd jacMat_;
917 std::unique_ptr<Eigen::Vector2d> iDistMin_, iDistMax_, sDistMin_, sDistMax_;
918 double damping_, dampingOffset_, ineqInversion_, constrDirection_;
919 Eigen::MatrixXd AInEq_;
920 Eigen::VectorXd bInEq_;