2017-08-01 14:30:58 +02:00
|
|
|
#include "MultiBodyTreeInitCache.hpp"
|
|
|
|
|
2019-01-03 14:26:51 +01:00
|
|
|
namespace btInverseDynamics
|
|
|
|
{
|
|
|
|
MultiBodyTree::InitCache::InitCache()
|
|
|
|
{
|
2017-08-01 14:30:58 +02:00
|
|
|
m_inertias.resize(0);
|
|
|
|
m_joints.resize(0);
|
|
|
|
m_num_dofs = 0;
|
2019-01-03 14:26:51 +01:00
|
|
|
m_root_index = -1;
|
2017-08-01 14:30:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
int MultiBodyTree::InitCache::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, const idScalar mass,
|
|
|
|
const vec3& body_r_body_com, const mat33& body_I_body,
|
2019-01-03 14:26:51 +01:00
|
|
|
const int user_int, void* user_ptr)
|
|
|
|
{
|
|
|
|
switch (joint_type)
|
|
|
|
{
|
2017-08-01 14:30:58 +02:00
|
|
|
case REVOLUTE:
|
|
|
|
case PRISMATIC:
|
|
|
|
m_num_dofs += 1;
|
|
|
|
break;
|
|
|
|
case FIXED:
|
|
|
|
// does not add a degree of freedom
|
|
|
|
// m_num_dofs+=0;
|
|
|
|
break;
|
2019-01-03 14:26:51 +01:00
|
|
|
case SPHERICAL:
|
|
|
|
m_num_dofs += 3;
|
|
|
|
break;
|
2017-08-01 14:30:58 +02:00
|
|
|
case FLOATING:
|
|
|
|
m_num_dofs += 6;
|
|
|
|
break;
|
|
|
|
default:
|
2018-09-07 16:11:04 +02:00
|
|
|
bt_id_error_message("unknown joint type %d\n", joint_type);
|
2017-08-01 14:30:58 +02:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2019-01-03 14:26:51 +01:00
|
|
|
if (-1 == parent_index)
|
|
|
|
{
|
|
|
|
if (m_root_index >= 0)
|
|
|
|
{
|
2018-09-07 16:11:04 +02:00
|
|
|
bt_id_error_message("trying to add body %d as root, but already added %d as root body\n",
|
2019-01-03 14:26:51 +01:00
|
|
|
body_index, m_root_index);
|
2017-08-01 14:30:58 +02:00
|
|
|
return -1;
|
|
|
|
}
|
2019-01-03 14:26:51 +01:00
|
|
|
m_root_index = body_index;
|
2017-08-01 14:30:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
JointData joint;
|
|
|
|
joint.m_child = body_index;
|
|
|
|
joint.m_parent = parent_index;
|
|
|
|
joint.m_type = joint_type;
|
|
|
|
joint.m_parent_pos_parent_child_ref = parent_r_parent_body_ref;
|
|
|
|
joint.m_child_T_parent_ref = body_T_parent_ref;
|
|
|
|
joint.m_child_axis_of_motion = body_axis_of_motion;
|
|
|
|
|
|
|
|
InertiaData body;
|
|
|
|
body.m_mass = mass;
|
|
|
|
body.m_body_pos_body_com = body_r_body_com;
|
|
|
|
body.m_body_I_body = body_I_body;
|
|
|
|
|
|
|
|
m_inertias.push_back(body);
|
|
|
|
m_joints.push_back(joint);
|
|
|
|
m_user_int.push_back(user_int);
|
|
|
|
m_user_ptr.push_back(user_ptr);
|
|
|
|
return 0;
|
|
|
|
}
|
2019-01-03 14:26:51 +01:00
|
|
|
int MultiBodyTree::InitCache::getInertiaData(const int index, InertiaData* inertia) const
|
|
|
|
{
|
|
|
|
if (index < 0 || index > static_cast<int>(m_inertias.size()))
|
|
|
|
{
|
2018-09-07 16:11:04 +02:00
|
|
|
bt_id_error_message("index out of range\n");
|
2017-08-01 14:30:58 +02:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
*inertia = m_inertias[index];
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2019-01-03 14:26:51 +01:00
|
|
|
int MultiBodyTree::InitCache::getUserInt(const int index, int* user_int) const
|
|
|
|
{
|
|
|
|
if (index < 0 || index > static_cast<int>(m_user_int.size()))
|
|
|
|
{
|
2018-09-07 16:11:04 +02:00
|
|
|
bt_id_error_message("index out of range\n");
|
2017-08-01 14:30:58 +02:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
*user_int = m_user_int[index];
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2019-01-03 14:26:51 +01:00
|
|
|
int MultiBodyTree::InitCache::getUserPtr(const int index, void** user_ptr) const
|
|
|
|
{
|
|
|
|
if (index < 0 || index > static_cast<int>(m_user_ptr.size()))
|
|
|
|
{
|
2018-09-07 16:11:04 +02:00
|
|
|
bt_id_error_message("index out of range\n");
|
2017-08-01 14:30:58 +02:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
*user_ptr = m_user_ptr[index];
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2019-01-03 14:26:51 +01:00
|
|
|
int MultiBodyTree::InitCache::getJointData(const int index, JointData* joint) const
|
|
|
|
{
|
|
|
|
if (index < 0 || index > static_cast<int>(m_joints.size()))
|
|
|
|
{
|
2018-09-07 16:11:04 +02:00
|
|
|
bt_id_error_message("index out of range\n");
|
2017-08-01 14:30:58 +02:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
*joint = m_joints[index];
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2019-01-03 14:26:51 +01:00
|
|
|
int MultiBodyTree::InitCache::buildIndexSets()
|
|
|
|
{
|
2017-08-01 14:30:58 +02:00
|
|
|
// NOTE: This function assumes that proper indices were provided
|
|
|
|
// User2InternalIndex from utils can be used to facilitate this.
|
|
|
|
|
|
|
|
m_parent_index.resize(numBodies());
|
2019-01-03 14:26:51 +01:00
|
|
|
for (idArrayIdx j = 0; j < m_joints.size(); j++)
|
|
|
|
{
|
2017-08-01 14:30:58 +02:00
|
|
|
const JointData& joint = m_joints[j];
|
|
|
|
m_parent_index[joint.m_child] = joint.m_parent;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2019-01-03 14:26:51 +01:00
|
|
|
} // namespace btInverseDynamics
|