30 #include <VirtualRobot/CollisionDetection/CollisionChecker.h>
31 #include <VirtualRobot/Nodes/ForceTorqueSensor.h>
32 #include <VirtualRobot/Robot.h>
33 #include <VirtualRobot/RobotFactory.h>
39 #include <SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.h>
42 using namespace SimDynamics;
60 int bulletFixedTimeStepMS,
61 int bulletFixedTimeStepMaxNrLoops,
62 float maxRealTimeSimSpeed,
64 std::string floorTexture)
66 ARMARX_INFO_S <<
"Init BulletPhysicsWorld. Creating bullet engine...";
88 <<
"Could not cast engine to BULLET engine, non-bullet engines not yet supported!";
89 throw UserException(
"Bullet engine missing");
101 const std::map<std::string, float>& angles,
102 const std::map<std::string, float>& velocities)
106 ARMARX_DEBUG_S <<
"actuateRobotJoints: first:" << angles.begin()->first
107 <<
", ang: " << angles.begin()->second <<
", vel:" << velocities.begin()->second;
108 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
115 RobotPtr kinRob = dynamicsRobot->getRobot();
117 if (!kinRob || kinRob->getName() != robotName)
131 for (
const auto&
angle : angles)
134 std::string targetJointName =
angle.first;
135 float targetJointPos =
angle.second;
136 auto velIt = velocities.find(
angle.first);
140 RobotNodePtr rn = kinRob->getRobotNode(targetJointName);
141 BulletRobot* br =
dynamic_cast<BulletRobot*
>(dynamicsRobot.get());
142 if (br && br->hasLink(rn))
144 kinRob->setJointValue(rn, targetJointPos);
145 BulletRobot::LinkInfo link = br->getLink(rn);
146 RobotNodePtr nodeCloneA;
147 RobotNodePtr nodeCloneB;
149 if (link.nodeA && link.dynNode1)
151 nodeCloneA = kinRob->getRobotNode(link.nodeA->getName());
152 link.dynNode1->setPose(nodeCloneA->getGlobalPose());
154 if (link.nodeB && link.dynNode2)
156 nodeCloneB = kinRob->getRobotNode(link.nodeB->getName());
157 link.dynNode1->setPose(nodeCloneB->getGlobalPose());
163 if (kinRob->hasRobotNode(targetJointName) &&
164 dynamicsRobot->getDynamicsRobotNode(targetJointName) && velIt != velocities.end())
166 VR_ASSERT(not kinRob->isPassive());
167 dynamicsRobot->actuateNode(dynamicsRobot->getRobot()->getRobotNode(targetJointName),
168 static_cast<double>(targetJointPos),
169 static_cast<double>(velIt->second));
182 const std::map<std::string, float>& angles)
185 if (angles.size() == 0)
189 ARMARX_DEBUG_S <<
"actuateRobotJointsPos: first:" << angles.begin()->first
190 <<
", ang: " << angles.begin()->second;
194 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
202 RobotPtr kinRob = dynamicsRobot->getRobot();
204 if (!kinRob || kinRob->getName() != robotName)
210 for (
const auto&
angle : angles)
213 std::string targetJointName =
angle.first;
214 float targetJoint =
angle.second;
216 if (kinRob->hasRobotNode(
219 if (isStatic or kinRob->isPassive())
221 RobotNodePtr rn = kinRob->getRobotNode(targetJointName);
222 BulletRobot* br =
dynamic_cast<BulletRobot*
>(dynamicsRobot.get());
223 if (br && br->hasLink(rn))
225 kinRob->setJointValue(rn, targetJoint);
226 BulletRobot::LinkInfo link = br->getLink(rn);
227 RobotNodePtr nodeCloneA;
228 RobotNodePtr nodeCloneB;
230 if (link.nodeA && link.dynNode1)
232 nodeCloneA = kinRob->getRobotNode(link.nodeA->getName());
233 link.dynNode1->setPose(nodeCloneA->getGlobalPose());
235 if (link.nodeB && link.dynNode2)
237 nodeCloneB = kinRob->getRobotNode(link.nodeB->getName());
238 link.dynNode1->setPose(nodeCloneB->getGlobalPose());
244 VR_ASSERT(not kinRob->isPassive());
245 dynamicsRobot->actuateNode(targetJointName,
static_cast<double>(targetJoint));
258 const std::map<std::string, float>& velocities)
261 ARMARX_DEBUG_S <<
"actuateRobotJointsVel: first: vel:" << velocities.begin()->second;
263 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
270 RobotPtr kinRob = dynamicsRobot->getRobot();
272 if (!kinRob || kinRob->getName() != robotName)
283 std::map<std::string, float> res = velocities;
290 for (
const auto& velocitie : velocities)
293 std::string targetJointName = velocitie.first;
294 float targetJointVel = velocitie.second;
296 if (kinRob->hasRobotNode(targetJointName))
298 VR_ASSERT(not kinRob->isPassive());
300 dynamicsRobot->actuateNodeVel(targetJointName,
static_cast<double>(targetJointVel));
312 const std::map<std::string, float>& torques)
315 ARMARX_DEBUG_S <<
"actuateRobotJointsTorque: first:" << torques.begin()->first <<
","
316 << torques.begin()->second;
318 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
325 RobotPtr kinRob = dynamicsRobot->getRobot();
327 if (!kinRob || kinRob->getName() != robotName)
333 for (
const auto& torque : torques)
336 std::string targetJointName = torque.first;
337 float targetJointTorque = torque.second;
339 if (kinRob->hasRobotNode(targetJointName))
341 VR_ASSERT(not kinRob->isPassive());
343 dynamicsRobot->actuateNodeTorque(targetJointName,
344 static_cast<double>(targetJointTorque));
357 ARMARX_DEBUG_S <<
"setRobotPose:" << globalPose(0, 3) <<
"," << globalPose(1, 3) <<
", "
360 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
367 RobotPtr kinRob = dynamicsRobot->getRobot();
369 if (!kinRob || kinRob->getName() != robotName)
377 dynamicsRobot->setGlobalPose(gp);
382 const std::string& robotNodeName,
383 const Eigen::Vector3f& force)
388 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
395 RobotPtr kinRob = dynamicsRobot->getRobot();
397 if (!kinRob || kinRob->getName() != robotName)
403 RobotNodePtr rn = kinRob->getRobotNode(robotNodeName);
411 dynamicsRobot->getDynamicsRobotNode(rn)->applyForce(force);
416 const std::string& robotNodeName,
417 const Eigen::Vector3f& torque)
422 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
430 RobotPtr kinRob = dynamicsRobot->getRobot();
432 if (!kinRob || kinRob->getName() != robotName)
438 RobotNodePtr rn = kinRob->getRobotNode(robotNodeName);
446 dynamicsRobot->getDynamicsRobotNode(rn)->applyTorque(torque);
453 SimDynamics::DynamicsObjectPtr o =
getObject(objectName);
461 o->applyForce(force);
468 SimDynamics::DynamicsObjectPtr o =
getObject(objectName);
476 o->applyTorque(torque);
479 SimDynamics::DynamicsObjectPtr
483 SimDynamics::DynamicsObjectPtr o;
484 std::vector<SimDynamics::DynamicsObjectPtr>::const_iterator it;
488 if ((*it)->getName() == objectName)
508 SimDynamics::DynamicsObjectPtr o =
getObject(objectName);
516 o->setPose(globalPose);
523 SimDynamics::DynamicsObjectPtr o =
getObject(objectName);
543 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
550 RobotPtr kinRob = dynamicsRobot->getRobot();
552 if (!kinRob || kinRob->getName() != robotName)
558 return kinRob->getMass();
561 std::map<std::string, float>
565 std::map<std::string, float> res;
567 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
574 RobotPtr kinRob = dynamicsRobot->getRobot();
576 if (!kinRob || kinRob->getName() != robotName)
582 std::vector<RobotNodePtr> rn = kinRob->getRobotNodes();
588 res[i->getName()] = i->getJointValue();
602 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
609 RobotPtr kinRob = dynamicsRobot->getRobot();
611 if (!kinRob || kinRob->getName() != robotName)
617 if (!kinRob->hasRobotNode(nodeName))
623 float res = kinRob->getRobotNode(nodeName)->getJointValue();
628 std::map<std::string, float>
632 std::map<std::string, float> res;
634 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
641 RobotPtr kinRob = dynamicsRobot->getRobot();
643 if (!kinRob || kinRob->getName() != robotName)
649 std::vector<RobotNodePtr> rn = kinRob->getRobotNodes();
655 float vel = dynamicsRobot->getJointSpeed(i);
656 res[i->getName()] = vel;
660 ARMARX_DEBUG_S <<
"getRobotJointVelocities:" << res.begin()->second;
669 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
676 RobotPtr kinRob = dynamicsRobot->getRobot();
678 if (!kinRob || kinRob->getName() != robotName)
684 if (!kinRob->hasRobotNode(nodeName))
690 double res = dynamicsRobot->getJointSpeed(kinRob->getRobotNode(nodeName));
692 return static_cast<float>(res);
695 std::map<std::string, float>
699 std::map<std::string, float> res;
701 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
710 if (!kinRob || kinRob->getName() != robotName)
716 SimDynamics::BulletRobot* br =
dynamic_cast<BulletRobot*
>(dynamicsRobot.get());
722 std::vector<RobotNodePtr> rn = kinRob->getRobotNodes();
726 if (i->isJoint() && br)
728 if (dynamicsRobot->isNodeActuated(i))
730 res[i->getName()] = br->getJointTorque(i);
743 if (!dynamicsRobot || !virtualRobot)
745 static bool printed =
false;
752 const auto ftsensors = virtualRobot->getSensors<ForceTorqueSensor>();
753 ForceTorqueDataSeq result;
754 result.reserve(ftsensors.size());
755 for (
const VirtualRobot::ForceTorqueSensorPtr& sensor : ftsensors)
757 ForceTorqueData
data;
758 Eigen::Vector3f force = sensor->getForce();
759 Eigen::Vector3f torque = sensor->getTorque();
760 data.nodeName = sensor->getRobotNode()->getName();
761 data.sensorName = sensor->getName();
763 if (!robotName.empty() && !
data.nodeName.empty())
765 RobotNodePtr rn = dynamicsRobot->getRobot()->getRobotNode(
data.nodeName);
766 Eigen::Vector3f forceGlobal = force;
767 Eigen::Vector3f torqueGlobal = torque;
771 force = rotMat.inverse() * forceGlobal;
772 torque = rotMat.inverse() * torqueGlobal;
778 result.emplace_back(std::move(
data));
788 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
795 RobotPtr kinRob = dynamicsRobot->getRobot();
797 if (!kinRob || kinRob->getName() != robotName)
803 if (!kinRob->hasRobotNode(nodeName))
809 return kinRob->getRobotNode(nodeName)->getJointLimitLo();
817 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
824 RobotPtr kinRob = dynamicsRobot->getRobot();
826 if (!kinRob || kinRob->getName() != robotName)
832 if (!kinRob->hasRobotNode(nodeName))
838 return kinRob->getRobotNode(nodeName)->getJointLimitHi();
847 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
854 RobotPtr kinRob = dynamicsRobot->getRobot();
856 if (!kinRob || kinRob->getName() != robotName)
868 return kinRob->getGlobalPose();
877 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
884 RobotPtr kinRob = dynamicsRobot->getRobot();
886 if (!kinRob || kinRob->getName() != robotName)
898 if (!kinRob->hasRobotNode(nodeName))
904 return kinRob->getRobotNode(nodeName)->getMaxTorque();
909 const std::string& nodeName,
915 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
922 RobotPtr kinRob = dynamicsRobot->getRobot();
924 if (!kinRob || kinRob->getName() != robotName)
936 if (!kinRob->hasRobotNode(nodeName))
942 kinRob->getRobotNode(nodeName)->setMaxTorque(maxTorque);
951 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
958 RobotPtr kinRob = dynamicsRobot->getRobot();
960 if (!kinRob || kinRob->getName() != robotName)
966 if (!kinRob->hasRobotNode(robotNodeName))
972 return kinRob->getRobotNode(robotNodeName)->getGlobalPose();
977 const std::string& nodeName)
984 if (!dynamicsRobotNode)
988 return dynamicsRobotNode->getLinearVelocity();
991 SimDynamics::DynamicsObjectPtr
993 const std::string& nodeName)
995 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
1001 robots.push_back(elem.first);
1005 <<
"' - available robots: " <<
robots;
1010 RobotPtr kinRob = dynamicsRobot->getRobot();
1012 if (!kinRob || kinRob->getName() != robotName)
1018 if (!kinRob->hasRobotNode(nodeName))
1025 RobotNodePtr robotNode = kinRob->getRobotNode(nodeName);
1026 DynamicsObjectPtr dynamicsRobotNode = dynamicsRobot->getDynamicsRobotNode(robotNode);
1029 while (!dynamicsRobotNode)
1031 robotNode = std::dynamic_pointer_cast<RobotNode>(robotNode->getParent());
1037 dynamicsRobotNode = dynamicsRobot->getDynamicsRobotNode(robotNode);
1040 return dynamicsRobotNode;
1045 const std::string& nodeName)
1052 if (!dynamicsRobotNode)
1057 return dynamicsRobotNode->getAngularVelocity();
1062 const std::string& robotNodeName,
1063 const Eigen::Vector3f& vel)
1068 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
1075 RobotPtr kinRob = dynamicsRobot->getRobot();
1077 if (!kinRob || kinRob->getName() != robotName)
1083 if (!kinRob->hasRobotNode(robotNodeName))
1089 dynamicsRobot->getDynamicsRobotNode(kinRob->getRobotNode(robotNodeName))
1090 ->setLinearVelocity(vel);
1096 const std::string& robotNodeName,
1097 const Eigen::Vector3f& vel)
1102 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
1109 RobotPtr kinRob = dynamicsRobot->getRobot();
1111 if (!kinRob || kinRob->getName() != robotName)
1117 if (!kinRob->hasRobotNode(robotNodeName))
1123 dynamicsRobot->getDynamicsRobotNode(kinRob->getRobotNode(robotNodeName))
1124 ->setAngularVelocity(vel);
1130 const std::string& robotNodeName,
1131 const Eigen::Vector3f& vel)
1136 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
1143 RobotPtr kinRob = dynamicsRobot->getRobot();
1145 if (!kinRob || kinRob->getName() != robotName)
1151 if (!kinRob->hasRobotNode(robotNodeName))
1153 ARMARX_WARNING_S <<
"No robotNode available with name '" << robotNodeName <<
"'";
1157 if (!dynamicsRobot->hasDynamicsRobotNode(kinRob->getRobotNode(robotNodeName)))
1159 ARMARX_WARNING_S <<
"No dynamic robotNode available with name '" << robotNodeName <<
"'";
1164 newPose.setIdentity();
1165 newPose.block<3, 1>(0, 3) = vel;
1166 auto globalPose = dynamicsRobot->getRobot()->getGlobalPose();
1167 globalPose(0, 3) = 0;
1168 globalPose(1, 3) = 0;
1169 globalPose(2, 3) = 0;
1170 auto globalNewPose = globalPose * newPose;
1171 dynamicsRobot->getDynamicsRobotNode(kinRob->getRobotNode(robotNodeName))
1172 ->setLinearVelocity(globalNewPose.block<3, 1>(0, 3));
1178 const std::string& robotNodeName,
1179 const Eigen::Vector3f& vel)
1184 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
1191 RobotPtr kinRob = dynamicsRobot->getRobot();
1193 if (!kinRob || kinRob->getName() != robotName)
1199 if (!kinRob->hasRobotNode(robotNodeName))
1201 ARMARX_WARNING_S <<
"No robotNode available with name '" << robotNodeName <<
"'";
1205 if (!dynamicsRobot->hasDynamicsRobotNode(kinRob->getRobotNode(robotNodeName)))
1207 ARMARX_WARNING_S <<
"No dynamic robotNode available with name '" << robotNodeName <<
"'";
1212 newPose.setIdentity();
1213 newPose.block<3, 1>(0, 3) = vel;
1214 auto globalPose = dynamicsRobot->getRobot()->getGlobalPose();
1215 globalPose(0, 3) = 0;
1216 globalPose(1, 3) = 0;
1217 globalPose(2, 3) = 0;
1218 auto globalNewPose = globalPose * newPose;
1220 RobotNodePtr robotNode = kinRob->getRobotNode(robotNodeName);
1221 DynamicsObjectPtr dynamicsRobotNode = dynamicsRobot->getDynamicsRobotNode(robotNode);
1222 dynamicsRobotNode->setAngularVelocity(globalNewPose.block<3, 1>(0, 3));
1230 std::map<std::string, DynamicsRobotInfo>::iterator it =
dynamicRobots.begin();
1233 if (it->first == robotName)
1254 return (dynRob->getRobot()->hasRobotNode(robotNodeName));
1267 return r->getRobot();
1270 std::map<std::string, RobotPtr>
1273 std::map<std::string, RobotPtr> result;
1278 result[elem.first] = (info.
robot);
1283 SimDynamics::DynamicsRobotPtr
1290 return SimDynamics::DynamicsRobotPtr();
1296 SimDynamics::DynamicsObjectPtr
1299 SimDynamics::DynamicsObjectPtr o;
1300 std::vector<SimDynamics::DynamicsObjectPtr>::const_iterator it;
1304 if ((*it)->getName() == objectName)
1327 return o->getSceneObject()->getGlobalPose();
1332 const std::string& robotNodeName,
1333 const std::string& objectName)
1336 ARMARX_INFO_S <<
"Object released, robot " << robotName <<
", node:" << robotNodeName
1337 <<
", object:" << objectName;
1338 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
1344 RobotPtr kinRob = dynamicsRobot->getRobot();
1346 if (!kinRob || kinRob->getName() != robotName)
1352 if (!kinRob->hasRobotNode(robotNodeName))
1358 SimDynamics::DynamicsObjectPtr o =
getObject(objectName);
1366 bool res =
dynamicsWorld->getEngine()->detachObjectFromRobot(robotName, o);
1373 const std::string& robotNodeName,
1374 const std::string& objectName,
1378 ARMARX_INFO_S <<
"Object grasped, robot " << robotName <<
", node:" << robotNodeName
1379 <<
", object:" << objectName;
1384 if (ao.robotName == robotName && ao.robotNodeName == robotNodeName &&
1385 ao.objectName == objectName)
1391 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
1392 RobotPtr kinRob = dynamicsRobot->getRobot();
1394 if (!kinRob || kinRob->getName() != robotName)
1400 if (!kinRob->hasRobotNode(robotNodeName))
1406 RobotNodePtr rn = kinRob->getRobotNode(robotNodeName);
1409 SimDynamics::DynamicsObjectPtr o =
getObject(objectName);
1417 bool res =
dynamicsWorld->getEngine()->attachObjectToRobot(robotName, robotNodeName, o);
1418 storeLocalTransform = rn->toLocalCoordinateSystem(o->getSceneObject()->getGlobalPose());
1429 return dynamicsWorld->getEngine()->getFloor()->getSceneObject();
1438 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
1449 if (robotName != dynamicsRobot->getRobot()->getName())
1468 bool selfCollisions)
1486 ARMARX_ERROR_S <<
"More than one robot with identical name is currently not supported!";
1494 std::vector<RobotNodePtr> nodes = robot->getRobotNodes();
1495 for (
auto n : nodes)
1497 n->setSimulationType(SceneObject::Physics::eKinematic);
1501 SimDynamics::DynamicsRobotPtr dynamicsRobot;
1505 ARMARX_DEBUG_S <<
"add dynamicsRobot" << dynamicsRobot->getName();
1507 auto& controllers = dynamicsRobot->getControllers();
1508 std::vector<RobotNodePtr> nodes = robot->getRobotNodes();
1510 if (not robot->isPassive())
1512 ARMARX_INFO_S <<
"Configuring controllers for robot " << dynamicsRobot->getName();
1514 for (
auto node : nodes)
1516 if (node->isRotationalJoint())
1518 if (controllers.find(node) == controllers.end())
1520 controllers[node] = VelocityMotorController(
1521 static_cast<double>(node->getMaxVelocity()),
1522 static_cast<double>(node->getMaxAcceleration()));
1524 controllers[node].reset(pid_p, pid_i, pid_d);
1529 ARMARX_INFO_S <<
"The robot " << dynamicsRobot->getName() <<
" has " << controllers.size()
1532 if (not selfCollisions)
1534 dynamicsRobot->enableSelfCollisions(
1539 ARMARX_DEBUG_S <<
"add dynamicsRobot2 " << dynamicsRobot->getName();
1541 catch (VirtualRobotException& e)
1550 dynamicsRobot->getRobot()->setThreadsafe(
false);
1551 dynamicsRobot->getRobot()->setUpdateVisualization(
false);
1555 robInfo.
robot = robot;
1565 const std::string& robotName,
1566 const std::string& frameName)
1570 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
1572 if (!dynamicsRobot || dynamicsRobot->getRobot()->getName() != robotName)
1578 RobotNodePtr rn = dynamicsRobot->getRobot()->getRobotNode(frameName);
1595 std::map<std::string, armarx::PoseBasePtr>& objMap)
1601 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
1603 if (!dynamicsRobot || robotName != dynamicsRobot->getName())
1625 Eigen::Vector3f& linearVelocity,
1626 Eigen::Vector3f& angularVelocity)
1629 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
1631 if (!dynamicsRobot || robotName != dynamicsRobot->getName())
1636 double simTimeFactor = 1.0;
1644 SimDynamics::BulletRobotPtr br = std::dynamic_pointer_cast<BulletRobot>(dynamicsRobot);
1645 std::vector<RobotNodePtr> rn = kinRob->getRobotNodes();
1655 if (dynamicsRobot->isNodeActuated(i))
1657 jointVelocities[i->getName()] = dynamicsRobot->getJointSpeed(i) * simTimeFactor;
1672 DynamicsObjectPtr rootDyn = dynamicsRobot->getDynamicsRobotNode(kinRob->getRootNode());
1676 linearVelocity = rootDyn->getLinearVelocity();
1677 angularVelocity = rootDyn->getAngularVelocity();
1681 linearVelocity.setZero();
1682 angularVelocity.setZero();
1695 static bool printed =
false;
1715 std::string robotName = ftInfo.
robotName;
1717 if (!robotName.empty() && !nodeName.empty() && dynamicsRobot)
1719 RobotNodePtr rn = dynamicsRobot->getRobot()->getRobotNode(nodeName);
1720 Eigen::Vector3f forceLocal;
1722 Eigen::Vector3f torqueLocal;
1728 forceLocal = rotMat.inverse() * forceGlobal;
1729 torqueLocal = rotMat.inverse() * torqueGlobal;
1750 bool objectFound =
false;
1754 if (
s.name == oEngine->getName())
1766 <<
" not in synchronized list";
1773 std::vector<DynamicsEngine::DynamicsContactInfo>
1782 VirtualRobot::SceneObject::Physics::SimulationType simType)
1789 DynamicsObjectPtr dynamicsObject;
1793 if (simType != VirtualRobot::SceneObject::Physics::eUnknown)
1795 o->setSimulationType(simType);
1801 catch (VirtualRobotException& e)
1803 cout <<
" ERROR while building dynamic object";
1811 dynamicsObject->getSceneObject()->setUpdateVisualization(
false);
1816 std::vector<std::string>
1819 std::vector<std::string>
names;
1822 std::map<std::string, DynamicsRobotInfo>::iterator it =
dynamicRobots.begin();
1825 names.push_back(it->first);
1834 SceneObject::Physics::SimulationType simType)
1837 SimDynamics::DynamicsObjectPtr o =
getObject(objectName);
1843 o->setSimType(simType);
1848 const std::string& robotNodeName,
1849 SceneObject::Physics::SimulationType simType)
1858 DynamicsObjectPtr rn = r->getDynamicsRobotNode(robotNodeName);
1861 ARMARX_WARNING_S <<
"Could not find robot node with name " << robotNodeName;
1864 rn->setSimType(simType);
1867 std::vector<std::string>
1870 std::vector<std::string>
names;
1876 names.push_back(o->getName());
1888 SimDynamics::DynamicsObjectPtr o =
getObject(name);
1895 std::vector<SimDynamics::DynamicsObjectPtr>::iterator it =
1947 auto startTime = IceUtil::Time::now();
1952 float stepSize =
static_cast<float>(
stepSizeMs / 1000.0);
1959 bulletEngine->stepSimulation(
static_cast<double>(stepSize),
1974 auto duration = (IceUtil::Time::now() - startTime).toMilliSecondsDouble();
1976 if (duration < minStepSizeMs)
1978 ARMARX_DEBUG <<
"Sim calculation took " << duration <<
" - Sleeping now for "
1980 usleep(
static_cast<unsigned int>(1000 * (minStepSizeMs - duration)));
1998 std::map<std::string, float> targetPos;
2000 ARMARX_DEBUG <<
"Applying velocities for static robot " << kinRob->getName();
2003 if (!kinRob->hasRobotNode(nv.first))
2005 ARMARX_ERROR <<
"No rn with name " << kinRob->hasRobotNode(nv.first);
2008 double change =
static_cast<double>(nv.second) * deltaInSeconds;
2013 static_cast<double>(kinRob->getRobotNode(nv.first)->getJointValue()) + change;
2014 targetPos[nv.first] =
static_cast<float>(newAngle);
2017 if (not targetPos.empty())
2032 SimDynamics::BulletEnginePtr
2038 std::vector<VirtualRobot::SceneObjectPtr>
2041 std::vector<VirtualRobot::SceneObjectPtr> res;
2044 res.push_back(o->getSceneObject());
2049 std::vector<SimDynamics::DynamicsObjectPtr>
2066 std::string textureFile = floorTexture;
2079 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
2080 BulletRobotPtr br = std::dynamic_pointer_cast<BulletRobot>(dynamicsRobot);
2089 std::vector<RobotNodePtr> rnsBodies;
2090 std::vector<RobotNodePtr> rnsJoints;
2091 std::vector<RobotNodePtr> rnAll = br->getRobot()->getRobotNodes();
2092 std::string nameJoints =
"RNS_Joints_All_logging";
2093 std::string nameBodies =
"RNS_Bodies_All_logging";
2095 for (
auto r : rnAll)
2099 rnsJoints.push_back(r);
2102 if (r->getMass() > 0)
2104 rnsBodies.push_back(r);
2108 RobotNodeSetPtr rnsJ = RobotNodeSet::createRobotNodeSet(br->getRobot(), nameJoints, rnsJoints);
2109 RobotNodeSetPtr rnsB = RobotNodeSet::createRobotNodeSet(br->getRobot(), nameBodies, rnsBodies);
2118 std::map<std::string, armarx::PoseBasePtr>& objMap)
2120 if (!currentObjEngine)
2125 PosePtr p(
new Pose(currentObjEngine->getGlobalPose()));
2126 objMap[currentObjEngine->getName()] = p;
2127 std::vector<SceneObjectPtr> childrenE = currentObjEngine->getChildren();
2129 for (
const auto& i : childrenE)
2150 std::stringstream ss;
2153 ss <<
c.objectAName <<
" < - > " <<
c.objectBName;
2164 btScalar
dt =
static_cast<btScalar
>(
m_clock.getTimeMicroseconds());
2173 return static_cast<int>(
contacts.size());
2178 const std::string& robotNodeName1,
2179 const std::string& robotNodeName2)
2183 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
2186 throw LocalException(
"No robot");
2188 if (dynamicsRobot->getName() != robotName)
2190 throw LocalException(
"Wrong robot name. '")
2191 << robotName <<
"' != '" << dynamicsRobot->getName() <<
"'";
2194 if (!robot->hasRobotNode(robotNodeName1))
2196 throw LocalException(
"Wrong robot node name. '") << robotNodeName1 <<
"'";
2198 if (!robot->hasRobotNode(robotNodeName2))
2200 throw LocalException(
"Wrong robot node name. '") << robotNodeName2 <<
"'";
2204 Eigen::Vector3f p1, p2;
2205 auto model1 = robot->getRobotNode(robotNodeName1)->getCollisionModel();
2206 auto model2 = robot->getRobotNode(robotNodeName2)->getCollisionModel();
2207 float d = robot->getCollisionChecker()->calculateDistance(model1, model2, p1, p2);
2218 const std::string& robotNodeName,
2219 const std::string& worldObjectName)
2223 SimDynamics::DynamicsRobotPtr dynamicsRobot =
getDynamicRobot(robotName);
2226 throw LocalException(
"No robot");
2228 if (dynamicsRobot->getName() != robotName)
2230 throw LocalException(
"Wrong robot name. '")
2231 << robotName <<
"' != '" << dynamicsRobot->getName() <<
"'";
2234 if (!robot->hasRobotNode(robotNodeName))
2236 throw LocalException(
"Wrong robot node name. '") << robotNodeName <<
"'";
2238 SimDynamics::DynamicsObjectPtr
object =
getObject(worldObjectName);
2241 throw LocalException(
"No object with name '") << worldObjectName <<
"'";
2244 Eigen::Vector3f p1, p2;
2246 float d = robot->getCollisionChecker()->calculateDistance(
2247 robot->getRobotNode(robotNodeName)->getCollisionModel(),
so->getCollisionModel(), p1, p2);
2259 return RobotFactory::createFlattenedModel(*robot);