26 #include <VirtualRobot/Dynamics/Dynamics.h>
27 #include <VirtualRobot/RobotNodeSet.h>
45 VirtualRobot::RobotNodeSetPtr rnsBodies,
50 for (
size_t i = 0; i < rnsJoints->getSize(); i++)
58 ARMARX_DEBUG <<
"will calculate inverse dynamics for robot node "
59 << rnsJoints->getNode(i)->getName();
60 data.nodeSensorVec.push_back(std::make_pair(rnsJoints->getNode(i), sensorValue));
64 ARMARX_INFO <<
"Joint " << rnsJoints->getNode(i)->getName() <<
" not found";
65 data.nodeSensorVec.push_back(std::make_pair(rnsJoints->getNode(i),
nullptr));
69 data.velocityFilter.push_back(velocityFilter->clone());
71 if (accelerationFilter)
73 data.accelerationFilter.push_back(accelerationFilter->clone());
86 auto&
data = pair.second;
87 auto& dynamics =
data.dynamics;
90 for (
auto& node :
data.nodeSensorVec)
93 data.q(i) = node.second->position;
94 if (i <
data.velocityFilter.size() &&
data.velocityFilter.at(i) &&
95 !std::isnan(node.second->velocity))
97 data.qDot(i) =
data.velocityFilter.at(i)->update(sensorValuesTimestamp,
98 node.second->velocity);
102 data.qDot(i) = node.second->velocity;
104 if (i <
data.accelerationFilter.size() &&
data.accelerationFilter.at(i) &&
105 !std::isnan(node.second->acceleration))
107 data.qDDot(i) =
data.accelerationFilter.at(i)->update(
108 sensorValuesTimestamp, node.second->acceleration);
112 data.qDDot(i) = node.second->acceleration;
118 dynamics.getGravityMatrix(
data.q,
data.tauGravity);
122 for (
auto& node :
data.nodeSensorVec)
124 auto torque =
data.tau(i);
125 auto gravityTorque =
data.tauGravity(i);
128 node.second->inverseDynamicsTorque = -torque;
129 node.second->gravityTorque = -gravityTorque;
130 node.second->inertiaTorque = -(torque - gravityTorque);
138 VirtualRobot::RobotNodeSetPtr rnsBodies) :
139 rnsJoints(rnsJoints), rnsBodies(rnsBodies), dynamics(rnsJoints, rnsBodies)