Drake
controlUtil.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <math.h>
4 #include <set>
5 #include <vector>
6 #include <Eigen/Dense>
7 #include <Eigen/StdVector>
8 
11 #include "drake/drakeControlUtil_export.h"
12 
13 const int m_surface_tangents =
14  2; // number of faces in the friction cone approx
15 
16 #define EPSILON 10e-8
17 
18 typedef Eigen::Matrix<double, 6, 1> Vector6d;
19 typedef Eigen::Matrix<double, 7, 1> Vector7d;
20 
21 typedef struct _support_state_element {
22  int body_idx;
23  std::vector<Eigen::Vector3d, Eigen::aligned_allocator<Eigen::Vector3d>>
25  bool support_logic_map[4];
26  Eigen::Vector4d support_surface; // 4-vector describing a support surface:
27  // [v; b] such that v' * [x;y;z] + b == 0
30 
32  // drake-ordered position and velocity vectors, with timestamp (in s)
33  double t;
34  Eigen::VectorXd q;
35  Eigen::VectorXd qd;
36 };
37 
38 DRAKECONTROLUTIL_EXPORT bool isSupportElementActive(
39  SupportStateElement *se, bool contact_force_detected,
40  bool kinematic_contact_detected);
41 
42 DRAKECONTROLUTIL_EXPORT Eigen::Matrix<bool, Eigen::Dynamic, 1>
44  RigidBodyTree *r, Eigen::VectorXd q, Eigen::VectorXd qd,
45  std::vector<SupportStateElement,
46  Eigen::aligned_allocator<SupportStateElement>> &
47  available_supports,
48  const Eigen::Ref<const Eigen::Matrix<bool, Eigen::Dynamic, 1>> &
49  contact_force_detected,
50  double contact_threshold);
51 
52 DRAKECONTROLUTIL_EXPORT std::vector<
53  SupportStateElement, Eigen::aligned_allocator<SupportStateElement>>
55  const RigidBodyTree &r, const Eigen::VectorXd &q, const Eigen::VectorXd &qd,
56  std::vector<SupportStateElement,
57  Eigen::aligned_allocator<SupportStateElement>> &
58  available_supports,
59  const Eigen::Ref<const Eigen::Matrix<bool, Eigen::Dynamic, 1>> &
60  contact_force_detected,
61  double contact_threshold);
62 
63 template <typename DerivedA, typename DerivedB>
64 DRAKECONTROLUTIL_EXPORT void getRows(std::set<int> &rows,
65  Eigen::MatrixBase<DerivedA> const &M,
66  Eigen::MatrixBase<DerivedB> &Msub);
67 
68 template <typename DerivedA, typename DerivedB>
69 DRAKECONTROLUTIL_EXPORT void getCols(std::set<int> &cols,
70  Eigen::MatrixBase<DerivedA> const &M,
71  Eigen::MatrixBase<DerivedB> &Msub);
72 
73 template <typename DerivedPhi1, typename DerivedPhi2, typename DerivedD>
74 DRAKECONTROLUTIL_EXPORT void angleDiff(
75  Eigen::MatrixBase<DerivedPhi1> const &phi1,
76  Eigen::MatrixBase<DerivedPhi2> const &phi2, Eigen::MatrixBase<DerivedD> &d);
77 
78 DRAKECONTROLUTIL_EXPORT bool inSupport(
79  const std::vector<SupportStateElement,
80  Eigen::aligned_allocator<SupportStateElement>> &supports,
81  int body_idx);
82 DRAKECONTROLUTIL_EXPORT void surfaceTangents(
83  const Eigen::Vector3d &normal,
84  Eigen::Matrix<double, 3, m_surface_tangents> &d);
85 DRAKECONTROLUTIL_EXPORT int contactPhi(const RigidBodyTree &r,
86  const KinematicsCache<double> &cache,
87  SupportStateElement &supp,
88  Eigen::VectorXd &phi);
89 DRAKECONTROLUTIL_EXPORT int contactConstraintsBV(
90  const RigidBodyTree &r, const KinematicsCache<double> &cache, int nc,
91  std::vector<double> support_mus,
92  std::vector<SupportStateElement,
93  Eigen::aligned_allocator<SupportStateElement>> &supp,
94  Eigen::MatrixXd &B, Eigen::MatrixXd &JB, Eigen::MatrixXd &Jp,
95  Eigen::VectorXd &Jpdotv, Eigen::MatrixXd &normals);
96 DRAKECONTROLUTIL_EXPORT Eigen::MatrixXd individualSupportCOPs(
97  const RigidBodyTree &r, const KinematicsCache<double> &cache,
98  const std::vector<SupportStateElement,
99  Eigen::aligned_allocator<SupportStateElement>> &
100  active_supports,
101  const Eigen::MatrixXd &normals, const Eigen::MatrixXd &B,
102  const Eigen::VectorXd &beta);
103 DRAKECONTROLUTIL_EXPORT Vector6d bodySpatialMotionPD(
104  const RigidBodyTree &r, const DrakeRobotState &robot_state,
105  const int body_index, const Eigen::Isometry3d &body_pose_des,
106  const Eigen::Ref<const Vector6d> &body_v_des,
107  const Eigen::Ref<const Vector6d> &body_vdot_des,
108  const Eigen::Ref<const Vector6d> &Kp, const Eigen::Ref<const Vector6d> &Kd,
109  const Eigen::Isometry3d &T_task_to_world = Eigen::Isometry3d::Identity());
110 
111 DRAKECONTROLUTIL_EXPORT void evaluateXYZExpmapCubicSpline(
112  double t, const PiecewisePolynomial<double> &spline,
113  Eigen::Isometry3d &body_pose_des, Vector6d &xyzdot_angular_vel,
114  Vector6d &xyzddot_angular_accel);
115 
117  Eigen::VectorXi drake_to_robot;
118  Eigen::VectorXi robot_to_drake;
120 };
121 
122 struct JointNames {
123  std::vector<std::string> robot;
124  std::vector<std::string> drake;
125 };
126 
127 DRAKECONTROLUTIL_EXPORT void getRobotJointIndexMap(
128  JointNames *joint_names, RobotJointIndexMap *joint_map);
129 
DRAKECONTROLUTIL_EXPORT bool inSupport(const std::vector< SupportStateElement, Eigen::aligned_allocator< SupportStateElement >> &supports, int body_idx)
Definition: controlUtil.cpp:55
std::vector< Eigen::Vector3d, Eigen::aligned_allocator< Eigen::Vector3d > > contact_pts
Definition: controlUtil.h:24
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
Definition: controlUtil.h:28
DRAKECONTROLUTIL_EXPORT void getRobotJointIndexMap(JointNames *joint_names, RobotJointIndexMap *joint_map)
Definition: controlUtil.cpp:475
DRAKECONTROLUTIL_EXPORT void getRows(std::set< int > &rows, Eigen::MatrixBase< DerivedA > const &M, Eigen::MatrixBase< DerivedB > &Msub)
Eigen::Matrix< double, 7, 1 > Vector7d
Definition: controlUtil.h:19
Definition: controlUtil.h:122
DRAKECONTROLUTIL_EXPORT void surfaceTangents(const Eigen::Vector3d &normal, Eigen::Matrix< double, 3, m_surface_tangents > &d)
Eigen::VectorXi drake_to_robot
Definition: controlUtil.h:117
Eigen::VectorXd qd
Definition: controlUtil.h:35
DRAKECONTROLUTIL_EXPORT int contactConstraintsBV(const RigidBodyTree &r, const KinematicsCache< double > &cache, int nc, std::vector< double > support_mus, std::vector< SupportStateElement, Eigen::aligned_allocator< SupportStateElement >> &supp, Eigen::MatrixXd &B, Eigen::MatrixXd &JB, Eigen::MatrixXd &Jp, Eigen::VectorXd &Jpdotv, Eigen::MatrixXd &normals)
DRAKECONTROLUTIL_EXPORT Vector6d bodySpatialMotionPD(const RigidBodyTree &r, const DrakeRobotState &robot_state, const int body_index, const Eigen::Isometry3d &body_pose_des, const Eigen::Ref< const Vector6d > &body_v_des, const Eigen::Ref< const Vector6d > &body_vdot_des, const Eigen::Ref< const Vector6d > &Kp, const Eigen::Ref< const Vector6d > &Kd, const Eigen::Isometry3d &T_task_to_world=Eigen::Isometry3d::Identity())
std::vector< std::string > drake
Definition: controlUtil.h:124
Definition: controlUtil.h:31
DRAKECONTROLUTIL_EXPORT void getCols(std::set< int > &cols, Eigen::MatrixBase< DerivedA > const &M, Eigen::MatrixBase< DerivedB > &Msub)
static double * t
Definition: inverseKinSnoptBackend.cpp:62
DRAKECONTROLUTIL_EXPORT bool isSupportElementActive(SupportStateElement *se, bool contact_force_detected, bool kinematic_contact_detected)
Definition: controlUtil.cpp:234
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
Definition: controlUtil.h:119
DRAKECONTROLUTIL_EXPORT Eigen::MatrixXd individualSupportCOPs(const RigidBodyTree &r, const KinematicsCache< double > &cache, const std::vector< SupportStateElement, Eigen::aligned_allocator< SupportStateElement >> &active_supports, const Eigen::MatrixXd &normals, const Eigen::MatrixXd &B, const Eigen::VectorXd &beta)
const int m_surface_tangents
Definition: controlUtil.h:13
Eigen::Matrix< FunctionalForm, 2, 3 > B
Definition: functional_form_test.cc:620
DRAKECONTROLUTIL_EXPORT void evaluateXYZExpmapCubicSpline(double t, const PiecewisePolynomial< double > &spline, Eigen::Isometry3d &body_pose_des, Vector6d &xyzdot_angular_vel, Vector6d &xyzddot_angular_accel)
Eigen::VectorXi robot_to_drake
Definition: controlUtil.h:118
double t
Definition: controlUtil.h:33
Eigen::VectorXd q
Definition: controlUtil.h:34
Eigen::Matrix< double, 6, 1 > Vector6d
Definition: controlUtil.h:18
Definition: controlUtil.h:21
DRAKECONTROLUTIL_EXPORT void angleDiff(Eigen::MatrixBase< DerivedPhi1 > const &phi1, Eigen::MatrixBase< DerivedPhi2 > const &phi2, Eigen::MatrixBase< DerivedD > &d)
DRAKECONTROLUTIL_EXPORT int contactPhi(const RigidBodyTree &r, const KinematicsCache< double > &cache, SupportStateElement &supp, Eigen::VectorXd &phi)
Definition: controlUtil.h:116
DRAKECONTROLUTIL_EXPORT Eigen::Matrix< bool, Eigen::Dynamic, 1 > getActiveSupportMask(RigidBodyTree *r, Eigen::VectorXd q, Eigen::VectorXd qd, std::vector< SupportStateElement, Eigen::aligned_allocator< SupportStateElement >> &available_supports, const Eigen::Ref< const Eigen::Matrix< bool, Eigen::Dynamic, 1 >> &contact_force_detected, double contact_threshold)
std::vector< std::string > robot
Definition: controlUtil.h:123
Definition: RigidBodyTree.h:72
DRAKECONTROLUTIL_EXPORT std::vector< SupportStateElement, Eigen::aligned_allocator< SupportStateElement > > getActiveSupports(const RigidBodyTree &r, const Eigen::VectorXd &q, const Eigen::VectorXd &qd, std::vector< SupportStateElement, Eigen::aligned_allocator< SupportStateElement >> &available_supports, const Eigen::Ref< const Eigen::Matrix< bool, Eigen::Dynamic, 1 >> &contact_force_detected, double contact_threshold)
Eigen::Vector4d support_surface
Definition: controlUtil.h:26
int body_idx
Definition: controlUtil.h:22