Biorbd
Contacts.cpp
1 #define BIORBD_API_EXPORTS
2 #include "RigidBody/Contacts.h"
3 
4 #include <rbdl/Kinematics.h>
5 #include "Utils/String.h"
6 #include "Utils/Error.h"
7 #include "RigidBody/GeneralizedCoordinates.h"
8 #include "Utils/Vector3d.h"
9 #include "Utils/RotoTrans.h"
10 #include "Utils/Rotation.h"
11 #include "Utils/SpatialVector.h"
12 #include "RigidBody/Joints.h"
13 
15  RigidBodyDynamics::ConstraintSet (),
16  m_nbreConstraint(std::make_shared<unsigned int>(0)),
17  m_isBinded(std::make_shared<bool>(false))
18 {
19 
20 }
21 
23 {
25  copy.DeepCopy(*this);
26  return copy;
27 }
28 
30 {
31  static_cast<RigidBodyDynamics::ConstraintSet&>(*this) = other;
32  *m_nbreConstraint = *other.m_nbreConstraint;
33  *m_isBinded = *other.m_isBinded;
34 
35 }
36 
38  unsigned int body_id,
39  const biorbd::utils::Vector3d& body_point,
40  const biorbd::utils::Vector3d& world_normal,
41  const biorbd::utils::String& name,
42  double acc){
43  ++*m_nbreConstraint;
44  return RigidBodyDynamics::ConstraintSet::AddContactConstraint(body_id, body_point, world_normal, name.c_str(), acc);
45 }
47  unsigned int body_id,
48  const biorbd::utils::Vector3d& body_point,
49  const biorbd::utils::String& axis,
50  const biorbd::utils::String& name,
51  double acc)
52 {
53  unsigned int ret(0);
54  for (unsigned int i=0; i<axis.length(); ++i){
55  ++*m_nbreConstraint;
56  if (axis.tolower()[i] == 'x')
57  ret += RigidBodyDynamics::ConstraintSet::AddContactConstraint(
58  body_id, body_point, biorbd::utils::Vector3d(1,0,0), (name + "_X").c_str(), acc);
59  else if (axis.tolower()[i] == 'y')
60  ret += RigidBodyDynamics::ConstraintSet::AddContactConstraint(
61  body_id, body_point, biorbd::utils::Vector3d(0,1,0), (name + "_Y").c_str(), acc);
62  else if (axis.tolower()[i] == 'z')
63  ret += RigidBodyDynamics::ConstraintSet::AddContactConstraint(
64  body_id, body_point, biorbd::utils::Vector3d(0,0,1), (name + "_Z").c_str(), acc);
65  else
66  biorbd::utils::Error::raise("Wrong axis!");
67  }
68  return ret;
69 }
70 
72  unsigned int body_id_predecessor,
73  unsigned int body_id_successor,
74  const biorbd::utils::RotoTrans &X_predecessor,
75  const biorbd::utils::RotoTrans &X_successor,
76  const biorbd::utils::SpatialVector &axis,
77  const biorbd::utils::String &name,
78  bool enableStabilization,
79  double stabilizationParam)
80 {
81  ++*m_nbreConstraint;
82  return RigidBodyDynamics::ConstraintSet::AddLoopConstraint(
83  body_id_predecessor, body_id_successor,
84  RigidBodyDynamics::Math::SpatialTransform(X_predecessor.rot(), X_predecessor.trans()),
85  RigidBodyDynamics::Math::SpatialTransform(X_successor.rot(), X_successor.trans()),
87  enableStabilization, stabilizationParam, name.c_str());
88 }
89 
91 {
92 
93 }
94 
96 {
97  if (!*m_isBinded){
98  // Assuming that this is also a Joints type (via BiorbdModel)
99  const biorbd::rigidbody::Joints &model = dynamic_cast<biorbd::rigidbody::Joints &>(*this);
100  Bind(model);
101  *m_isBinded = true;
102  }
103  return *this;
104 }
105 
107 {
108  if (*m_nbreConstraint>0) return
109  true;
110  else
111  return false;
112 }
113 
115 {
116  return *m_nbreConstraint;
117 }
118 
119 std::vector<biorbd::utils::String> biorbd::rigidbody::Contacts::contactNames()
120 {
121  std::vector<biorbd::utils::String> names;
122  for (auto name : RigidBodyDynamics::ConstraintSet::name){
123  names.push_back(name);
124  }
125  return names;
126 }
127 
129 {
130  biorbd::utils::Error::check(i<*m_nbreConstraint, "Idx for contact names is too high..");
131  return RigidBodyDynamics::ConstraintSet::name[i];
132 }
133 
134 
135 std::vector<biorbd::utils::Vector3d> biorbd::rigidbody::Contacts::constraintsInGlobal(
137  bool updateKin)
138 {
139  // Assuming that this is also a Joints type (via BiorbdModel)
140  biorbd::rigidbody::Joints &model = dynamic_cast<biorbd::rigidbody::Joints &>(*this);
141  if (updateKin) {
142  model.UpdateKinematicsCustom (&Q);
143  }
144 
145  // Output variable
146  std::vector<biorbd::utils::Vector3d> tp;
147 
148 
149  // On each control, apply the rotation and save the position
150  for (unsigned int i=0; i<size(); ++i)
151  tp.push_back(RigidBodyDynamics::CalcBodyToBaseCoordinates(
152  model, Q, body[i], point[i], false));
153 
154  return tp;
155 }
156 
158 {
159  return static_cast<biorbd::utils::Vector>(this->force);
160 }
biorbd::rigidbody::Contacts::getForce
biorbd::utils::Vector getForce() const
Return the force acting on the contraint.
Definition: Contacts.cpp:157
biorbd::rigidbody::Contacts::AddLoopConstraint
unsigned int AddLoopConstraint(unsigned int body_id_predecessor, unsigned int body_id_successor, const biorbd::utils::RotoTrans &X_predecessor, const biorbd::utils::RotoTrans &X_successor, const biorbd::utils::SpatialVector &axis, const biorbd::utils::String &name, bool enableStabilization=false, double stabilizationParam=0.1)
Add a loop constraint to the constraint set.
Definition: Contacts.cpp:71
biorbd::rigidbody::Contacts::hasContacts
bool hasContacts() const
Check if there are contacts.
Definition: Contacts.cpp:106
biorbd::utils::SpatialVector
Wrapper of the Eigen::Matrix<double, 6, 1> or Casadi::MX(6, 1)
Definition: SpatialVector.h:19
biorbd::utils::Vector
Wrapper of the Eigen VectorXd.
Definition: Vector.h:20
biorbd::utils::Vector3d
Wrapper around Eigen Vector3d and attach it to a parent.
Definition: Vector3d.h:24
biorbd::rigidbody::Contacts::constraintsInGlobal
std::vector< biorbd::utils::Vector3d > constraintsInGlobal(const biorbd::rigidbody::GeneralizedCoordinates &Q, bool updateKin)
Return the contraints position in the global reference.
Definition: Contacts.cpp:135
biorbd::rigidbody::GeneralizedCoordinates
Class GeneralizedCoordinates.
Definition: GeneralizedCoordinates.h:15
biorbd::rigidbody::Contacts::m_nbreConstraint
std::shared_ptr< unsigned int > m_nbreConstraint
Number of constraints.
Definition: Contacts.h:155
biorbd::utils::Error::raise
static void raise(const biorbd::utils::String &message)
Throw an error message.
Definition: Error.cpp:4
biorbd::utils::RotoTrans::trans
biorbd::utils::Vector3d trans() const
Return the translation vector.
Definition: RotoTrans.cpp:92
biorbd::rigidbody::Contacts::nbContacts
unsigned int nbContacts() const
Return the number of contacts.
Definition: Contacts.cpp:114
biorbd::rigidbody::Joints
This is the core of the musculoskeletal model in biorbd.
Definition: Joints.h:40
biorbd::utils::RotoTrans
Homogenous matrix to describe translations and rotations simultaneously.
Definition: RotoTrans.h:34
biorbd::utils::String::tolower
static biorbd::utils::String tolower(const biorbd::utils::String &str)
Convert a string to a lower case string.
Definition: String.cpp:97
biorbd::rigidbody::Contacts::DeepCopy
biorbd::rigidbody::Contacts DeepCopy() const
Deep copy of contacts.
Definition: Contacts.cpp:22
biorbd::utils::String
Wrapper around the std::string class with augmented functionality.
Definition: String.h:17
biorbd::rigidbody::Contacts::contactNames
std::vector< biorbd::utils::String > contactNames()
Return the name of the all contacts.
Definition: Contacts.cpp:119
biorbd::rigidbody::Contacts::AddConstraint
unsigned int AddConstraint(unsigned int body_id, const biorbd::utils::Vector3d &body_point, const biorbd::utils::Vector3d &world_normal, const biorbd::utils::String &name, double acc=0)
Add a constraint to the constraint set.
Definition: Contacts.cpp:37
biorbd::rigidbody::Contacts::m_isBinded
std::shared_ptr< bool > m_isBinded
If the model is ready.
Definition: Contacts.h:156
biorbd::rigidbody::Contacts::Contacts
Contacts()
Construct contacts.
Definition: Contacts.cpp:14
biorbd::rigidbody::Contacts
Class Contacts.
Definition: Contacts.h:30
biorbd::rigidbody::Contacts::~Contacts
virtual ~Contacts()
Destroy the class properly.
Definition: Contacts.cpp:90
biorbd::rigidbody::Joints::UpdateKinematicsCustom
void UpdateKinematicsCustom(const biorbd::rigidbody::GeneralizedCoordinates *Q=nullptr, const biorbd::rigidbody::GeneralizedVelocity *Qdot=nullptr, const biorbd::rigidbody::GeneralizedAcceleration *Qddot=nullptr)
Update the kinematic variables such as body velocities and accelerations in the model to reflect the ...
Definition: Joints.cpp:1063
biorbd::rigidbody::Contacts::contactName
biorbd::utils::String contactName(unsigned int i)
Return the name of the contact of a specified axis.
Definition: Contacts.cpp:128
biorbd::utils::Error::check
static void check(bool cond, const biorbd::utils::String &message)
Assert that raises the error message if false.
Definition: Error.cpp:10
biorbd::utils::RotoTrans::rot
biorbd::utils::Rotation rot() const
Return the rotation matrix.
Definition: RotoTrans.cpp:97
biorbd::rigidbody::Contacts::getConstraints
Contacts & getConstraints()
Get constraints.
Definition: Contacts.cpp:95