wbc
RobotModel.hpp
Go to the documentation of this file.
1#ifndef WBC_CORE_ROBOTMODEL_HPP
2#define WBC_CORE_ROBOTMODEL_HPP
3
4#include <memory>
5#include <map>
9#include "../types/Wrench.hpp"
10#include "RobotModelConfig.hpp"
11#include <urdf_world/world.h>
12#include "../tools/filter.hpp"
13
14namespace wbc{
15
28protected:
29 void clear();
30 void resetData();
31 void updateData();
32
48 struct Matrix{
51 Eigen::MatrixXd data;
52 };
53 struct Vector{
56 Eigen::VectorXd data;
57 };
63
64 std::vector<types::Contact> contacts;
65 Eigen::Vector3d gravity;
68 std::string world_frame, base_frame;
70 std::vector<std::string> actuated_joint_names;
71 std::vector<std::string> independent_joint_names;
72 std::vector<std::string> joint_names;
73 urdf::ModelInterfaceSharedPtr robot_urdf;
76 Eigen::MatrixXd selection_matrix;
77 Eigen::VectorXd q, qd, qdd, tau, zero_jnt;
78
79 std::vector<Matrix> com_jac;
80 std::vector<Matrix> joint_space_inertia_mat;
81 std::vector<Vector> bias_forces;
82 std::vector<RigidBodyState> com_rbs;
83 std::map<std::string,Matrix> space_jac_map;
84 std::map<std::string,Matrix> body_jac_map;
85 std::map<std::string,Pose> pose_map;
86 std::map<std::string,Twist> twist_map;
87 std::map<std::string,SpatialAcceleration> acc_map;
88 std::map<std::string,SpatialAcceleration> spatial_acc_bias_map;
90 Eigen::VectorXd joint_weights;
91
94
96 std::unique_ptr<LowPassFilter> joint_vel_filter;
97 std::unique_ptr<LowPassFilter> fb_vel_filter;
98
99public:
100 RobotModel();
101 virtual ~RobotModel(){}
102
108 virtual bool configure(const RobotModelConfig& cfg) = 0;
109
114 void update(const Eigen::VectorXd& joint_positions,
115 const Eigen::VectorXd& joint_velocities);
116
122 virtual void update(const Eigen::VectorXd& joint_positions,
123 const Eigen::VectorXd& joint_velocities,
124 const Eigen::VectorXd& joint_accelerations);
125
133 void update(const Eigen::VectorXd& joint_positions,
134 const Eigen::VectorXd& joint_velocities,
135 const types::Pose& fb_pose,
136 const types::Twist& fb_twist);
137
148 virtual void update(const Eigen::VectorXd& joint_positions,
149 const Eigen::VectorXd& joint_velocities,
150 const Eigen::VectorXd& joint_accelerations,
151 const types::Pose& fb_pose,
152 const types::Twist& fb_twist,
153 const types::SpatialAcceleration& fb_acc) = 0;
154
157
160 virtual const types::Pose &pose(const std::string &frame_id) = 0;
161
164 virtual const types::Twist &twist(const std::string &frame_id) = 0;
165
168 virtual const types::SpatialAcceleration &acceleration(const std::string &frame_id) = 0;
169
170
177 virtual const Eigen::MatrixXd &spaceJacobian(const std::string &frame_id) = 0;
178
183 virtual const Eigen::MatrixXd &bodyJacobian(const std::string &frame_id) = 0;
184
189 virtual const Eigen::MatrixXd &comJacobian() = 0;
190
196 virtual const types::SpatialAcceleration &spatialAccelerationBias(const std::string &frame_id) = 0;
197
199 virtual const Eigen::MatrixXd &jointSpaceInertiaMatrix() = 0;
200
202 virtual const Eigen::VectorXd &biasForces() = 0;
203
208 const std::vector<std::string>& jointNames(){return joint_names;}
209
211 const std::vector<std::string>& actuatedJointNames(){return actuated_joint_names;}
212
214 const std::vector<std::string>& independentJointNames(){return independent_joint_names;}
215
217 uint jointIndex(const std::string &joint_name);
218
220 const std::string& baseFrame(){return base_frame;}
221
223 const std::string& worldFrame(){return world_frame;}
224
227
229 const Eigen::MatrixXd &selectionMatrix(){return selection_matrix;}
230
232 bool hasLink(const std::string& link_name);
233
235 bool hasJoint(const std::string& joint_name);
236
238 bool hasActuatedJoint(const std::string& joint_name);
239
242
244 void setContacts(const std::vector<types::Contact> &contacts);
245
247 const std::vector<types::Contact>& getContacts(){return contacts;}
248
250 uint nj(){return jointNames().size() + (has_floating_base ? 6 : 0);}
251
253 uint na(){return actuatedJointNames().size();}
254
256 uint nfb(){return has_floating_base ? 6 : 0;}
257
259 uint nac();
260
262 uint nc(){return contacts.size();}
263
269 const Eigen::VectorXd &getQ(){return q;}
270
276 const Eigen::VectorXd &getQd(){return qd;}
277
283 const Eigen::VectorXd &getQdd(){return qdd;}
284
286 void setGravityVector(const Eigen::Vector3d& g){gravity=g;}
287
290
293
296
298 urdf::ModelInterfaceSharedPtr loadRobotURDF(const std::string& file_or_string);
299
301 urdf::ModelInterfaceSharedPtr getURDFModel(){return robot_urdf;}
302
304 void setJointWeights(const Eigen::VectorXd& weights);
305
309 const Eigen::VectorXd& getJointWeights() const { return joint_weights; }
310
314 virtual const Eigen::VectorXd& inverseDynamics(const Eigen::VectorXd& qdd_ref = Eigen::VectorXd(),
315 const std::vector<types::Wrench>& f_ext = std::vector<types::Wrench>()) = 0;
316
317};
318typedef std::shared_ptr<RobotModel> RobotModelPtr;
319
320template<typename T> RobotModel* createT(){return new T;}
321
323 typedef std::map<std::string, RobotModel*(*)()> RobotModelMap;
324
325 static RobotModel *createInstance(const std::string& name) {
326 RobotModelMap::iterator it = getRobotModelMap()->find(name);
327 if(it == getRobotModelMap()->end())
328 throw std::runtime_error("Failed to create instance of plugin " + name + ". Is the plugin registered?");
329 return it->second();
330 }
331
332 template<typename T>
333 static T* createInstance(const std::string& name){
334 RobotModel* tmp = createInstance(name);
335 T* ret = dynamic_cast<T*>(tmp);
336 return ret;
337 }
338
340 if(!robot_model_map)
341 robot_model_map = new RobotModelMap;
342 return robot_model_map;
343 }
344
345 static void clear(){
346 robot_model_map->clear();
347 }
348private:
349 static RobotModelMap *robot_model_map;
350};
351
352template<typename T>
354 RobotModelRegistry(const std::string& name) {
355 RobotModelMap::iterator it = getRobotModelMap()->find(name);
356 if(it != getRobotModelMap()->end())
357 throw std::runtime_error("Failed to register plugin with name " + name + ". A plugin with the same name is already registered");
358 getRobotModelMap()->insert(std::make_pair(name, &createT<T>));
359 }
360};
361
362}
363
364#endif // WBC_CORE_ROBOTMODEL_HPP
Interface for all robot models. This has to provide all kinematics and dynamics information that is r...
Definition RobotModel.hpp:27
std::vector< Vector > bias_forces
Definition RobotModel.hpp:81
const RobotModelConfig & getRobotModelConfig()
Get current robot model config.
Definition RobotModel.hpp:292
bool has_floating_base
Definition RobotModel.hpp:74
bool hasActuatedJoint(const std::string &joint_name)
Return True if given joint name is an actuated joint in robot model, false otherwise.
Definition RobotModel.cpp:136
std::string world_frame
Definition RobotModel.hpp:68
types::JointLimits joint_limits
Definition RobotModel.hpp:69
virtual ~RobotModel()
Definition RobotModel.hpp:101
const types::RigidBodyState & floatingBaseState()
Get current status of floating base.
Definition RobotModel.hpp:289
virtual const Eigen::MatrixXd & bodyJacobian(const std::string &frame_id)=0
Returns the Body Jacobian for the given frame. The order of the Jacobian's columns will be the same a...
virtual const types::RigidBodyState & centerOfMass()=0
Return centers of mass expressed in world frame.
RobotModelConfig robot_model_config
Definition RobotModel.hpp:67
std::vector< std::string > actuated_joint_names
Definition RobotModel.hpp:70
std::vector< std::string > independent_joint_names
Definition RobotModel.hpp:71
void resetData()
Definition RobotModel.cpp:60
const Eigen::VectorXd & getQd()
Return full system velocity vector, incl. floating base. Convention [floating_base_vel,...
Definition RobotModel.hpp:276
std::vector< types::Contact > contacts
Definition RobotModel.hpp:64
bool hasFloatingBase()
Is is a floating base robot?
Definition RobotModel.hpp:295
urdf::ModelInterfaceSharedPtr loadRobotURDF(const std::string &file_or_string)
Load URDF model from either file or string.
Definition RobotModel.cpp:141
virtual const types::Pose & pose(const std::string &frame_id)=0
virtual const Eigen::VectorXd & biasForces()=0
Returns the bias force vector, which is nj x 1, where nj is the number of joints + number of floating...
void setGravityVector(const Eigen::Vector3d &g)
Set the current gravity vector. Default is (0,0,-9.81).
Definition RobotModel.hpp:286
void setJointWeights(const Eigen::VectorXd &weights)
set Joint weights by given name
Definition RobotModel.cpp:160
const std::vector< std::string > & independentJointNames()
Return only independent joint names.
Definition RobotModel.hpp:214
std::map< std::string, SpatialAcceleration > spatial_acc_bias_map
Definition RobotModel.hpp:88
std::vector< RigidBodyState > com_rbs
Definition RobotModel.hpp:82
bool fk_needs_recompute
Definition RobotModel.hpp:89
const std::vector< types::Contact > & getContacts()
get current contact points
Definition RobotModel.hpp:247
Eigen::VectorXd joint_weights
Definition RobotModel.hpp:90
virtual const Eigen::MatrixXd & jointSpaceInertiaMatrix()=0
Returns the joint space mass-inertia matrix, which is nj x nj, where nj is the number of joints + num...
Eigen::VectorXd tau
Definition RobotModel.hpp:77
void update(const Eigen::VectorXd &joint_positions, const Eigen::VectorXd &joint_velocities)
Update kinematics/dynamics for fixed base robots. Joint acceleration will be assumed zero.
Definition RobotModel.cpp:13
types::SpatialAcceleration zero_acc
Definition RobotModel.hpp:92
virtual void update(const Eigen::VectorXd &joint_positions, const Eigen::VectorXd &joint_velocities, const Eigen::VectorXd &joint_accelerations, const types::Pose &fb_pose, const types::Twist &fb_twist, const types::SpatialAcceleration &fb_acc)=0
Update kinematics/dynamics.
const Eigen::VectorXd & getQdd()
Return full system acceleration vector, incl. floating base. Convention [floating_base_acc,...
Definition RobotModel.hpp:283
void updateData()
Definition RobotModel.cpp:84
virtual const types::SpatialAcceleration & spatialAccelerationBias(const std::string &frame_id)=0
Returns the spatial acceleration bias, i.e. the term Jdot*qdot. The linear part of the acceleration w...
virtual const Eigen::VectorXd & inverseDynamics(const Eigen::VectorXd &qdd_ref=Eigen::VectorXd(), const std::vector< types::Wrench > &f_ext=std::vector< types::Wrench >())=0
Compute tau from internal state.
uint nac()
Definition RobotModel.cpp:150
const Eigen::VectorXd & getJointWeights() const
Get Joint weights as Named vector.
Definition RobotModel.hpp:309
const std::vector< std::string > & jointNames()
Return all joint names excluding the floating base. This will be.
Definition RobotModel.hpp:208
const std::string & worldFrame()
Get the world frame id. Will be "world" in case of floating base robot and equal to base_frame in cas...
Definition RobotModel.hpp:223
const Eigen::MatrixXd & selectionMatrix()
Return current selection matrix, mapping actuated to all dof.
Definition RobotModel.hpp:229
std::map< std::string, Twist > twist_map
Definition RobotModel.hpp:86
std::unique_ptr< LowPassFilter > joint_vel_filter
Definition RobotModel.hpp:96
Eigen::VectorXd qdd
Definition RobotModel.hpp:77
const std::string & baseFrame()
Get the base frame of the robot, i.e. the root of the URDF model.
Definition RobotModel.hpp:220
RobotModel()
Definition RobotModel.cpp:7
void setContacts(const std::vector< types::Contact > &contacts)
Set new contact points.
Definition RobotModel.cpp:107
virtual const Eigen::MatrixXd & spaceJacobian(const std::string &frame_id)=0
Returns the Space Jacobian for the given frame. The order of the Jacobian's columns will be the same ...
Eigen::Vector3d gravity
Definition RobotModel.hpp:65
virtual const types::SpatialAcceleration & acceleration(const std::string &frame_id)=0
std::map< std::string, Matrix > space_jac_map
Definition RobotModel.hpp:83
uint nfb()
Return dof of the floating base, will be either 0 (floating_base == false) or 6 (floating_base = = fa...
Definition RobotModel.hpp:256
types::RigidBodyState floating_base_state
Definition RobotModel.hpp:66
const types::JointLimits jointLimits()
Return current joint limits.
Definition RobotModel.hpp:226
std::string base_frame
Definition RobotModel.hpp:68
std::unique_ptr< LowPassFilter > fb_vel_filter
Definition RobotModel.hpp:97
Eigen::MatrixXd selection_matrix
Definition RobotModel.hpp:76
uint nc()
Return total number of contact points.
Definition RobotModel.hpp:262
urdf::ModelInterfaceSharedPtr getURDFModel()
Return current URDF model.
Definition RobotModel.hpp:301
uint na()
Return number of actuated joints.
Definition RobotModel.hpp:253
bool fk_with_zero_acc_needs_recompute
Definition RobotModel.hpp:89
bool hasJoint(const std::string &joint_name)
Return True if given joint name is available in robot model, false otherwise.
Definition RobotModel.cpp:131
virtual const types::Twist & twist(const std::string &frame_id)=0
virtual bool configure(const RobotModelConfig &cfg)=0
This will read the robot model from the given URDF file and initialize all members accordingly.
uint nj()
Return number of joints.
Definition RobotModel.hpp:250
const types::JointState & jointState()
Definition RobotModel.hpp:156
uint jointIndex(const std::string &joint_name)
Get the internal index for a joint name.
Definition RobotModel.cpp:112
urdf::ModelInterfaceSharedPtr robot_urdf
Definition RobotModel.hpp:73
types::JointState joint_state
Definition RobotModel.hpp:75
Eigen::VectorXd qd
Definition RobotModel.hpp:77
std::map< std::string, Pose > pose_map
Definition RobotModel.hpp:85
const Eigen::VectorXd & getQ()
Return full system position vector, incl. floating base. Convention [floating_base_pos,...
Definition RobotModel.hpp:269
const std::vector< std::string > & actuatedJointNames()
Return only actuated joint names.
Definition RobotModel.hpp:211
std::vector< Matrix > com_jac
Definition RobotModel.hpp:79
bool hasLink(const std::string &link_name)
Return True if given link name is available in robot model, false otherwise.
Definition RobotModel.cpp:121
bool updated
Definition RobotModel.hpp:93
std::vector< std::string > joint_names
Definition RobotModel.hpp:72
Eigen::VectorXd zero_jnt
Definition RobotModel.hpp:77
virtual const Eigen::MatrixXd & comJacobian()=0
Returns the CoM Jacobian for the robot, which maps the robot joint velocities to linear spatial veloc...
bool configured
Definition RobotModel.hpp:93
std::map< std::string, SpatialAcceleration > acc_map
Definition RobotModel.hpp:87
Eigen::VectorXd q
Definition RobotModel.hpp:77
std::map< std::string, Matrix > body_jac_map
Definition RobotModel.hpp:84
void clear()
Definition RobotModel.cpp:35
std::vector< Matrix > joint_space_inertia_mat
Definition RobotModel.hpp:80
Definition JointLimits.hpp:29
The JointState class describes either the state or the command for a set of joints,...
Definition JointState.hpp:13
Definition Pose.hpp:9
Definition RigidBodyState.hpp:10
Definition SpatialAcceleration.hpp:8
Definition Twist.hpp:8
Definition ContactsAccelerationConstraint.cpp:3
QPSolver * createT()
Definition QPSolver.hpp:35
std::shared_ptr< RobotModel > RobotModelPtr
Definition RobotModel.hpp:318
Robot Model configuration class, containts information like urdf file, type of robot model to be load...
Definition RobotModelConfig.hpp:13
Definition RobotModel.hpp:322
static T * createInstance(const std::string &name)
Definition RobotModel.hpp:333
static RobotModel * createInstance(const std::string &name)
Definition RobotModel.hpp:325
std::map< std::string, RobotModel *(*)()> RobotModelMap
Definition RobotModel.hpp:323
static RobotModelMap * getRobotModelMap()
Definition RobotModel.hpp:339
static void clear()
Definition RobotModel.hpp:345
RobotModelRegistry(const std::string &name)
Definition RobotModel.hpp:354
Matrix()
Definition RobotModel.hpp:49
Eigen::MatrixXd data
Definition RobotModel.hpp:51
bool needs_recompute
Definition RobotModel.hpp:50
bool needs_recompute
Definition RobotModel.hpp:35
Pose()
Definition RobotModel.hpp:34
types::Pose data
Definition RobotModel.hpp:36
bool needs_recompute
Definition RobotModel.hpp:60
types::RigidBodyState data
Definition RobotModel.hpp:61
RigidBodyState()
Definition RobotModel.hpp:59
types::SpatialAcceleration data
Definition RobotModel.hpp:46
SpatialAcceleration()
Definition RobotModel.hpp:44
bool needs_recompute
Definition RobotModel.hpp:45
Twist()
Definition RobotModel.hpp:39
bool needs_recompute
Definition RobotModel.hpp:40
types::Twist data
Definition RobotModel.hpp:41
bool needs_recompute
Definition RobotModel.hpp:55
Eigen::VectorXd data
Definition RobotModel.hpp:56
Vector()
Definition RobotModel.hpp:54