Skip to content

Commit

Permalink
[featherstone] Publish joint feedback forces.
Browse files Browse the repository at this point in the history
  • Loading branch information
Fixit-Davide committed Apr 19, 2024
1 parent d0a6e50 commit 1632c9c
Showing 1 changed file with 32 additions and 6 deletions.
38 changes: 32 additions & 6 deletions bullet-featherstone/src/JointFeatures.cc
Original file line number Diff line number Diff line change
Expand Up @@ -80,16 +80,42 @@ double JointFeatures::GetJointAcceleration(
double JointFeatures::GetJointForce(
const Identity &_id, const std::size_t _dof) const
{
double results = gz::math::NAN_D;
const auto *joint = this->ReferenceInterface<JointInfo>(_id);
const auto *identifier = std::get_if<InternalJoint>(&joint->identifier);
if (identifier)
{

if (identifier) {
const auto *model = this->ReferenceInterface<ModelInfo>(joint->model);
return model->body->getJointTorqueMultiDof(
identifier->indexInBtModel)[_dof];
auto feedback = model->body->getLink(identifier->indexInBtModel).m_jointFeedback;
const auto &link = model->body->getLink(identifier->indexInBtModel);
results = 0.0;
if (link.m_jointType == btMultibodyLink::eRevolute) {
// According to the documentation in btMultibodyLink.h, m_axesTop[0] is the
// joint axis for revolute joints.
Eigen::Vector3d axis = convert(link.getAxisTop(0));
math::Vector3 axis_converted(axis[0], axis[1], axis[2]);
btVector3 angular = feedback->m_reactionForces.getAngular();
math::Vector3<double> angularTorque(
angular.getX(),
angular.getY(),
angular.getZ());
// BUG: The total force is 2 times the cmd one see:
// https://github.com/bulletphysics/bullet3/discussions/3713
results += axis_converted.Dot(angularTorque);
return results / 2.0;
} else if (link.m_jointType == btMultibodyLink::ePrismatic) {
auto axis = convert(link.getAxisBottom(0));
math::Vector3 axis_converted(axis[0], axis[1], axis[2]);
btVector3 linear = feedback->m_reactionForces.getLinear();
math::Vector3<double> linearForce(
linear.getX(),
linear.getY(),
linear.getZ());
results += axis_converted.Dot(linearForce);
return results / 2.0;
}
}

return gz::math::NAN_D;
return results;
}

/////////////////////////////////////////////////
Expand Down

0 comments on commit 1632c9c

Please sign in to comment.