2017-08-01 12:30:58 +00:00
|
|
|
#ifndef MULTIBODYTREEINITCACHE_HPP_
|
|
|
|
#define MULTIBODYTREEINITCACHE_HPP_
|
|
|
|
|
|
|
|
#include "../IDConfig.hpp"
|
|
|
|
#include "../IDMath.hpp"
|
|
|
|
#include "../MultiBodyTree.hpp"
|
|
|
|
|
2019-01-03 13:26:51 +00:00
|
|
|
namespace btInverseDynamics
|
|
|
|
{
|
2017-08-01 12:30:58 +00:00
|
|
|
/// Mass properties of a rigid body
|
2019-01-03 13:26:51 +00:00
|
|
|
struct InertiaData
|
|
|
|
{
|
2017-08-01 12:30:58 +00:00
|
|
|
ID_DECLARE_ALIGNED_ALLOCATOR();
|
|
|
|
|
|
|
|
/// mass
|
|
|
|
idScalar m_mass;
|
|
|
|
/// vector from body-fixed frame to center of mass,
|
|
|
|
/// in body-fixed frame, multiplied by the mass
|
|
|
|
vec3 m_body_pos_body_com;
|
|
|
|
/// moment of inertia w.r.t. the origin of the body-fixed
|
|
|
|
/// frame, represented in that frame
|
|
|
|
mat33 m_body_I_body;
|
|
|
|
};
|
|
|
|
|
|
|
|
/// Joint properties
|
2019-01-03 13:26:51 +00:00
|
|
|
struct JointData
|
|
|
|
{
|
2017-08-01 12:30:58 +00:00
|
|
|
ID_DECLARE_ALIGNED_ALLOCATOR();
|
|
|
|
|
|
|
|
/// type of joint
|
|
|
|
JointType m_type;
|
|
|
|
/// index of parent body
|
|
|
|
int m_parent;
|
|
|
|
/// index of child body
|
|
|
|
int m_child;
|
|
|
|
/// vector from parent's body-fixed frame to child's body-fixed
|
|
|
|
/// frame for q=0, written in the parent's body fixed frame
|
|
|
|
vec3 m_parent_pos_parent_child_ref;
|
|
|
|
/// Transform matrix converting vectors written in the parent's frame
|
|
|
|
/// into vectors written in the child's frame for q=0
|
|
|
|
/// ie, child_vector = child_T_parent_ref * parent_vector;
|
|
|
|
mat33 m_child_T_parent_ref;
|
|
|
|
/// Axis of motion for 1 degree-of-freedom joints,
|
|
|
|
/// written in the child's frame
|
|
|
|
/// For revolute joints, the q-value is positive for a positive
|
|
|
|
/// rotation about this axis.
|
|
|
|
/// For prismatic joints, the q-value is positive for a positive
|
|
|
|
/// translation is this direction.
|
|
|
|
vec3 m_child_axis_of_motion;
|
|
|
|
};
|
|
|
|
|
|
|
|
/// Data structure to store data passed by the user.
|
|
|
|
/// This is used in MultiBodyTree::finalize to build internal data structures.
|
2019-01-03 13:26:51 +00:00
|
|
|
class MultiBodyTree::InitCache
|
|
|
|
{
|
2017-08-01 12:30:58 +00:00
|
|
|
public:
|
|
|
|
ID_DECLARE_ALIGNED_ALLOCATOR();
|
|
|
|
/// constructor
|
|
|
|
InitCache();
|
|
|
|
///\copydoc MultiBodyTree::addBody
|
|
|
|
int addBody(const int body_index, const int parent_index, const JointType joint_type,
|
|
|
|
const vec3 &parent_r_parent_body_ref, const mat33 &body_T_parent_ref,
|
|
|
|
const vec3 &body_axis_of_motion, idScalar mass, const vec3 &body_r_body_com,
|
|
|
|
const mat33 &body_I_body, const int user_int, void *user_ptr);
|
|
|
|
/// build index arrays
|
|
|
|
/// @return 0 on success, -1 on failure
|
|
|
|
int buildIndexSets();
|
|
|
|
/// @return number of degrees of freedom
|
|
|
|
int numDoFs() const { return m_num_dofs; }
|
|
|
|
/// @return number of bodies
|
|
|
|
int numBodies() const { return m_inertias.size(); }
|
|
|
|
/// get inertia data for index
|
|
|
|
/// @param index of the body
|
|
|
|
/// @param inertia pointer for return data
|
|
|
|
/// @return 0 on success, -1 on failure
|
|
|
|
int getInertiaData(const int index, InertiaData *inertia) const;
|
|
|
|
/// get joint data for index
|
|
|
|
/// @param index of the body
|
|
|
|
/// @param joint pointer for return data
|
|
|
|
/// @return 0 on success, -1 on failure
|
|
|
|
int getJointData(const int index, JointData *joint) const;
|
|
|
|
/// get parent index array (paren_index[i] is the index of the parent of i)
|
|
|
|
/// @param parent_index pointer for return data
|
|
|
|
void getParentIndexArray(idArray<int>::type *parent_index) { *parent_index = m_parent_index; }
|
|
|
|
/// get user integer
|
|
|
|
/// @param index body index
|
|
|
|
/// @param user_int user integer
|
|
|
|
/// @return 0 on success, -1 on failure
|
|
|
|
int getUserInt(const int index, int *user_int) const;
|
|
|
|
/// get user pointer
|
|
|
|
/// @param index body index
|
|
|
|
/// @param user_int user pointer
|
|
|
|
/// @return 0 on success, -1 on failure
|
|
|
|
int getUserPtr(const int index, void **user_ptr) const;
|
|
|
|
|
|
|
|
private:
|
|
|
|
// vector of bodies
|
|
|
|
idArray<InertiaData>::type m_inertias;
|
|
|
|
// vector of joints
|
|
|
|
idArray<JointData>::type m_joints;
|
|
|
|
// number of mechanical degrees of freedom
|
|
|
|
int m_num_dofs;
|
|
|
|
// parent index array
|
|
|
|
idArray<int>::type m_parent_index;
|
|
|
|
// user integers
|
|
|
|
idArray<int>::type m_user_int;
|
|
|
|
// user pointers
|
|
|
|
idArray<void *>::type m_user_ptr;
|
|
|
|
// index of root body (or -1 if not set)
|
|
|
|
int m_root_index;
|
|
|
|
};
|
2019-01-03 13:26:51 +00:00
|
|
|
} // namespace btInverseDynamics
|
2017-08-01 12:30:58 +00:00
|
|
|
#endif // MULTIBODYTREEINITCACHE_HPP_
|