29#include <VirtualRobot/CollisionDetection/CollisionChecker.h>
30#include <VirtualRobot/IK/DifferentialIK.h>
31#include <VirtualRobot/IK/IKSolver.h>
32#include <VirtualRobot/Nodes/ForceTorqueSensor.h>
33#include <VirtualRobot/Nodes/RobotNode.h>
34#include <VirtualRobot/Obstacle.h>
35#include <VirtualRobot/Robot.h>
36#include <VirtualRobot/RobotFactory.h>
37#include <VirtualRobot/RobotNodeSet.h>
38#include <VirtualRobot/Visualization/VisualizationFactory.h>
64 std::string floorTexture)
93 if (up(1) == 0 && up(2) == 0)
99 else if (up(0) == 0 && up(2) == 0)
107 w, h, d, VirtualRobot::VisualizationFactory::Color::Gray());
108 std::string name(
"Floor");
112 gp(2, 3) = -sizeSmall * 0.5f;
116 groundObject->setSimulationType(VirtualRobot::SceneObject::Physics::eStatic);
123 const std::map<std::string, float>& angles,
124 const std::map<std::string, float>& velocities)
128 ARMARX_DEBUG_S <<
"actuateRobotJoints: first:" << angles.begin()->first
129 <<
", ang: " << angles.begin()->second <<
", vel:" << velocities.begin()->second;
136 kinRobot->setJointValues(angles);
140 for (
auto& entry : angles)
148 const std::map<std::string, float>& angles)
151 if (angles.size() == 0)
155 ARMARX_DEBUG_S <<
"actuateRobotJointsPos: first:" << angles.begin()->first
156 <<
", ang: " << angles.begin()->second;
164 kinRobot->setJointValues(angles);
168 for (
auto& entry : angles)
176 const std::map<std::string, float>& velocities)
179 ARMARX_DEBUG_S <<
"actuateRobotJointsVel: first: vel:" << velocities.begin()->second;
191 std::map<std::string, float> res = velocities;
198 const std::map<std::string, float>& torques)
201 ARMARX_DEBUG_S <<
"actuateRobotJointsTorque: first:" << torques.begin()->first <<
","
202 << torques.begin()->second;
211 ARMARX_DEBUG <<
"setRobotPose:" << globalPose(0, 3) <<
"," << globalPose(1, 3) <<
", "
221 kinRobot->setGlobalPose(globalPose);
226 const std::string& robotNodeName,
227 const Eigen::Vector3f& force)
235 const std::string& robotNodeName,
236 const Eigen::Vector3f& torque)
266 VirtualRobot::SceneObjectPtr o =
getObject(objectName);
274 o->setGlobalPose(globalPose);
289 return kinRobot->getMass();
292std::map<std::string, float>
296 std::map<std::string, float> res;
302 return std::map<std::string, float>();
305 std::vector<RobotNodePtr> rn = kinRob->getRobotNodes();
311 res[i->getName()] = i->getJointValue();
332 if (!kinRob->hasRobotNode(nodeName))
338 float res = kinRob->getRobotNode(nodeName)->getJointValue();
343std::map<std::string, float>
347 std::map<std::string, float> res;
359 ARMARX_DEBUG_S <<
"getRobotJointVelocities:" << res.begin()->second;
375 if (!kinRobot->hasRobotNode(nodeName))
392std::map<std::string, float>
395 return std::map<std::string, float>();
416 if (!kinRobot->hasRobotNode(nodeName))
422 return kinRobot->getRobotNode(nodeName)->getJointLimitLo();
437 if (!kinRobot->hasRobotNode(nodeName))
443 return kinRobot->getRobotNode(nodeName)->getJointLimitHi();
456 return Eigen::Matrix4f::Identity();
459 return kinRobot->getGlobalPose();
475 if (!kinRobot->hasRobotNode(nodeName))
481 return kinRobot->getRobotNode(nodeName)->getMaxTorque();
486 const std::string& nodeName,
499 if (!kinRobot->hasRobotNode(nodeName))
505 kinRobot->getRobotNode(nodeName)->setMaxTorque(maxTorque);
518 return Eigen::Matrix4f::Identity();
521 if (!kinRobot->hasRobotNode(robotNodeName))
524 return Eigen::Matrix4f::Identity();
527 return kinRobot->getRobotNode(robotNodeName)->getGlobalPose();
540 return Eigen::Vector3f::Identity();
557 return Eigen::Vector3f::Identity();
561 RobotNodePtr rn = kinRobot->getRobotNode(nodeName);
565 return Eigen::Vector3f::Identity();
569 RobotNodeSetPtr rns =
570 RobotNodeSet::createRobotNodeSet(kinRobot,
"All_Nodes", kinRobot->getRobotNodes());
571 DifferentialIKPtr j(
new DifferentialIK(rns));
572 Eigen::MatrixXf jac = j->getJacobianMatrix(rn, IKSolver::Orientation);
575 std::vector<std::string> nodeNames = rns->getNodeNames();
576 Eigen::VectorXf joint_vel(nodeNames.size());
578 for (std::vector<std::string>::iterator it = nodeNames.begin(); it != nodeNames.end();
584 Eigen::Vector3f omega;
585 omega = jac * joint_vel;
592 const std::string& robotNodeName,
593 const Eigen::Vector3f& vel)
612 const std::string& robotNodeName,
613 const Eigen::Vector3f& vel)
634 const std::string& robotNodeName,
635 const Eigen::Vector3f& vel)
648 Eigen::Matrix4f newPose;
649 newPose.setIdentity();
650 newPose.block<3, 1>(0, 3) = vel;
651 auto globalPose = kinRobot->getGlobalPose();
652 globalPose(0, 3) = 0;
653 globalPose(1, 3) = 0;
654 globalPose(2, 3) = 0;
655 Eigen::Matrix4f globalNewPose = globalPose * newPose;
662 const std::string& robotNodeName,
663 const Eigen::Vector3f& vel)
676 Eigen::Matrix4f newPose;
677 newPose.setIdentity();
678 newPose.block<3, 1>(0, 3) = vel;
679 Eigen::Matrix4f globalPose = kinRobot->getGlobalPose();
680 globalPose(0, 3) = 0;
681 globalPose(1, 3) = 0;
682 globalPose(2, 3) = 0;
683 Eigen::Matrix4f globalNewPose = globalPose * newPose;
692 std::map<std::string, KinematicRobotInfo>::iterator it =
kinematicRobots.begin();
695 if (it->first == robotName)
717 return (kinRobot->hasRobotNode(robotNodeName));
734std::map<std::string, RobotPtr>
737 std::map<std::string, RobotPtr> result;
742 result[elem.first] = (info.
robot);
747VirtualRobot::SceneObjectPtr
750 VirtualRobot::SceneObjectPtr o;
751 std::vector<VirtualRobot::SceneObjectPtr>::const_iterator it;
755 if ((*it)->getName() == objectName)
771 VirtualRobot::SceneObjectPtr o =
getObject(objectName);
775 return Eigen::Matrix4f::Identity();
778 return o->getGlobalPose();
783 const std::string& robotNodeName,
784 const std::string& objectName)
787 ARMARX_INFO_S <<
"Object released, robot " << robotName <<
", node:" << robotNodeName
788 <<
", object:" << objectName;
796 if (!kinRobot->hasRobotNode(robotNodeName))
809 RobotNodePtr rn = kinRobot->getRobotNode(objectName);
816 bool res = RobotFactory::detach(kinRobot, rn);
822 const std::string& robotNodeName,
823 const std::string& objectName,
824 Eigen::Matrix4f& storeLocalTransform)
827 ARMARX_INFO_S <<
"Object grasped, robot " << robotName <<
", node:" << robotNodeName
828 <<
", object:" << objectName;
833 if (ao.robotName == robotName && ao.robotNodeName == robotNodeName &&
834 ao.objectName == objectName)
847 if (!kinRobot->hasRobotNode(robotNodeName))
853 RobotNodePtr rn = kinRobot->getRobotNode(robotNodeName);
855 VirtualRobot::SceneObjectPtr o =
getObject(objectName);
863 storeLocalTransform = rn->toLocalCoordinateSystem(o->getGlobalPose());
864 bool res = RobotFactory::attach(kinRobot, o, rn, storeLocalTransform);
899 const std::string& filename,
903 ARMARX_VERBOSE_S <<
"Adding robot " << robot->getName() <<
", file:" << filename;
913 ARMARX_ERROR_S <<
"More than robot with identical name is currently not supported!";
926 RobotPtr r = robot->clone(robot->getName());
929 r->setThreadsafe(
false);
930 r->setUpdateVisualization(
false);
931 r->setPropagatingJointValuesEnabled(
false);
942 const std::string& robotName,
943 const std::string& frameName)
954 RobotNodePtr rn = kinRobot->getRobotNode(frameName);
962 Eigen::Matrix4f localPose = rn->toLocalCoordinateSystem(globalPose);
971 std::map<std::string, armarx::PoseBasePtr>& objMap)
984 VirtualRobot::SceneObjectPtr currentObjEngine = kinRobot->getRootNode();
1002 auto robotName =
data.first;
1009 NameValueMap jointAngles;
1010 std::vector<RobotNodePtr> rn = kinRobot->getRobotNodes();
1018 std::string n = i->getName();
1020 jointAngles[n] = i->getJointValue();
1027 .insert(std::make_pair(
1028 i, std::make_pair(
timestamp, i->getJointValue())))
1034 jointVelocities[n] = (i->getJointValue() - filterIt->second.second) /
1035 (
timestamp - filterIt->second.first).toSecondsDouble();
1036 filterIt->second.second = i->getJointValue();
1053 Eigen::Vector3f linearVelocity;
1055 Eigen::Vector3f pos = kinRobot->getGlobalPose().block<3, 1>(0, 3);
1059 .insert(std::make_pair(kinRobot, std::make_pair(
timestamp, pos)))
1062 linearVelocity = (pos - filterIt->second.second) /
1063 (
timestamp - filterIt->second.first).toSecondsDouble();
1064 filterIt->second.second = pos;
1071 Eigen::Vector3f angularVelocity;
1072 angularVelocity.setZero();
1081 .insert(std::make_pair(
1082 kinRobot, std::make_pair(
timestamp, kinRobot->getGlobalPose())))
1086 double deltaTimestamp = (
timestamp - filterVelIt->second.first).toSecondsDouble();
1099 Eigen::Matrix3f Rot_prev, Rot_new,
A, Omega_mat;
1101 Rot_prev = filterVelIt->second.second.block(0, 0, 3, 3);
1102 Rot_new = kinRobot->getGlobalPose().block(0, 0, 3, 3);
1103 A = Rot_new * Rot_prev.transpose();
1104 theta = acos((
A.trace() - 1) / 2.);
1112 Omega_mat = theta * (
A -
A.transpose()) / (2 * deltaTimestamp * sin(theta));
1117 if (deltaTimestamp > 0.1)
1128 NameValueMap& jointAngles,
1129 NameValueMap& jointVelocities,
1130 NameValueMap& jointTorques,
1131 Eigen::Vector3f& linearVelocity,
1132 Eigen::Vector3f& angularVelocity)
1142 std::vector<RobotNodePtr> rn = kinRobot->getRobotNodes();
1157 std::string n = i->getName();
1159 jointAngles[n] = i->getJointValue();
1176 jointTorques[n] = 0;
1214 bool objectFound =
false;
1218 if (s.name == oEngine->getName())
1230 <<
" not in synchronized list";
1239 VirtualRobot::SceneObject::Physics::SimulationType simType)
1244 VirtualRobot::SceneObjectPtr clonedObj = o->clone(o->getName());
1249 clonedObj->setUpdateVisualization(
false);
1254std::vector<std::string>
1257 std::vector<std::string> names;
1260 std::map<std::string, KinematicRobotInfo>::iterator it =
kinematicRobots.begin();
1263 names.push_back(it->first);
1272 SceneObject::Physics::SimulationType simType)
1275 SceneObjectPtr o =
getObject(objectName);
1286 const std::string& robotNodeName,
1287 SceneObject::Physics::SimulationType simType)
1296 RobotNodePtr rn = r->getRobotNode(robotNodeName);
1299 ARMARX_WARNING_S <<
"Could not find robot node with name " << robotNodeName;
1305std::vector<std::string>
1308 std::vector<std::string> names;
1314 names.push_back(o->getName());
1333 std::vector<SceneObjectPtr>::iterator it =
1378 auto startTime = IceUtil::Time::now();
1398 auto duration = (IceUtil::Time::now() - startTime).toMilliSecondsDouble();
1400 if (duration < minStepSizeMs)
1402 ARMARX_DEBUG <<
"Sim calculation took " << duration <<
" - Sleeping now for "
1404 usleep(1000 * (minStepSizeMs - duration));
1408 IceUtil::Time duration = IceUtil::Time::now() - startTime;
1420 std::map<std::string, float> targetPos;
1422 ARMARX_DEBUG <<
"Applying velocities for static robot " << kinRob->getName();
1425 if (!kinRob->hasRobotNode(nv.first))
1430 double change = (nv.second * deltaInSeconds);
1434 double newAngle = kinRob->getRobotNode(nv.first)->getJointValue() + change;
1435 targetPos[nv.first] = (
float)newAngle;
1437 if (targetPos.size() > 0)
1440 kinRob->setJointValues(targetPos);
1444 Eigen::Matrix4f gp = kinRob->getGlobalPose();
1447 m3 = Eigen::AngleAxisf(ri.
velRotTarget(0) * deltaInSeconds, Eigen::Vector3f::UnitX()) *
1448 Eigen::AngleAxisf(ri.
velRotTarget(1) * deltaInSeconds, Eigen::Vector3f::UnitY()) *
1449 Eigen::AngleAxisf(ri.
velRotTarget(2) * deltaInSeconds, Eigen::Vector3f::UnitZ());
1450 gp.block(0, 0, 3, 3) *= m3;
1470 if (!kinRob->hasRobotNode(o.objectName))
1476 Eigen::Matrix4f pose = kinRob->getRobotNode(o.objectName)->getGlobalPose();
1480 if (kino->getName() == o.objectName)
1482 kino->setGlobalPose(pose);
1495std::vector<SimDynamics::DynamicsEngine::DynamicsContactInfo>
1499 return std::vector<SimDynamics::DynamicsEngine::DynamicsContactInfo>();
1502std::vector<SceneObjectPtr>
1514 std::string textureFile = floorTexture;
1519 Eigen::Vector3f pos;
1521 Eigen::Vector3f up = Eigen::Vector3f::UnitZ();
1534 std::map<std::string, armarx::PoseBasePtr>& objMap)
1536 if (!currentObjEngine)
1541 PosePtr p(
new Pose(currentObjEngine->getGlobalPose()));
1542 objMap[currentObjEngine->getName()] = p;
1543 std::vector<SceneObjectPtr> childrenE = currentObjEngine->getChildren();
1545 for (
const auto& i : childrenE)
1581 auto newEndTime = IceUtil::Time::now();
1582 auto frameTime = newEndTime -
lastTime;
1585 return (
float)(frameTime).toMilliSecondsDouble();
1598 const std::string& robotNodeName1,
1599 const std::string& robotNodeName2)
1606 throw LocalException(
"Wrong robot name. '") << robotName <<
"'";
1609 if (!robot->hasRobotNode(robotNodeName1))
1611 throw LocalException(
"Wrong robot node name. '") << robotNodeName1 <<
"'";
1613 if (!robot->hasRobotNode(robotNodeName2))
1615 throw LocalException(
"Wrong robot node name. '") << robotNodeName2 <<
"'";
1619 Eigen::Vector3f p1, p2;
1620 auto model1 = robot->getRobotNode(robotNodeName1)->getCollisionModel();
1621 auto model2 = robot->getRobotNode(robotNodeName2)->getCollisionModel();
1622 float d = robot->getCollisionChecker()->calculateDistance(model1, model2, p1, p2);
1633 const std::string& robotNodeName,
1634 const std::string& worldObjectName)
1641 throw LocalException(
"Wrong robot name. '") << robotName <<
"'";
1644 if (!robot->hasRobotNode(robotNodeName))
1646 throw LocalException(
"Wrong robot node name. '") << robotNodeName <<
"'";
1648 VirtualRobot::SceneObjectPtr so =
getObject(worldObjectName);
1651 throw LocalException(
"No object with name '") << worldObjectName <<
"'";
1653 Eigen::Vector3f p1, p2;
1655 float d = robot->getCollisionChecker()->calculateDistance(
1656 robot->getRobotNode(robotNodeName)->getCollisionModel(), so->getCollisionModel(), p1, p2);
class A(deque< T, A >)) ARMARX_OVERLOAD_STD_HASH_FOR_ITERABLE((class T
Enables hashing of std::list.
void setRobotAngularVelocity(const std::string &robotName, const std::string &robotNodeName, const Eigen::Vector3f &vel) override
void actuateRobotJoints(const std::string &robotName, const std::map< std::string, float > &angles, const std::map< std::string, float > &velocities) override
ignoring velocity target
std::vector< VirtualRobot::SceneObjectPtr > kinematicObjects
~KinematicsWorld() override
bool removeRobotEngine(const std::string &robotName) override
void setRobotLinearVelocity(const std::string &robotName, const std::string &robotNodeName, const Eigen::Vector3f &vel) override
float getRobotJointLimitLo(const std::string &robotName, const std::string &nodeName) override
float getRobotMass(const std::string &robotName) override
bool hasRobot(const std::string &robotName) override
std::map< std::string, float > getRobotJointAngles(const std::string &robotName) override
float getRobotJointAngle(const std::string &robotName, const std::string &nodeName) override
VirtualRobot::SceneObjectPtr getFloor() override
void applyForceObject(const std::string &objectName, const Eigen::Vector3f &force) override
std::vector< std::string > getRobotNames() override
std::map< VirtualRobot::RobotNodePtr, std::pair< IceUtil::Time, float > > jointAngleDerivationFilters
Eigen::Vector3f getRobotLinearVelocity(const std::string &robotName, const std::string &nodeName) override
armarx::DistanceInfo getRobotNodeDistance(const std::string &robotName, const std::string &robotNodeName1, const std::string &robotNodeName2) override
std::map< VirtualRobot::RobotPtr, std::pair< IceUtil::Time, Eigen::Matrix4f > > angularVelocityFilters
armarx::DistanceInfo getDistance(const std::string &robotName, const std::string &robotNodeName, const std::string &worldObjectName) override
std::vector< SimDynamics::DynamicsEngine::DynamicsContactInfo > copyContacts() override
int getFixedTimeStepMS() override
void applyForceRobotNode(const std::string &robotName, const std::string &robotNodeName, const Eigen::Vector3f &force) override
std::vector< std::string > getObstacleNames() override
void stepStaticRobots(double deltaInSeconds)
Eigen::Vector3f getRobotAngularVelocity(const std::string &robotName, const std::string &nodeName) override
float getRobotMaxTorque(const std::string &robotName, const std::string &nodeName) override
void actuateRobotJointsPos(const std::string &robotName, const std::map< std::string, float > &angles) override
VirtualRobot::RobotPtr getRobot(const std::string &robotName) override
Eigen::Matrix4f getRobotNodePose(const std::string &robotName, const std::string &robotNodeName) override
void stepPhysicsRealTime() override
Perform one simulation step.
float getRobotJointVelocity(const std::string &robotName, const std::string &nodeName) override
std::map< std::string, float > getRobotJointVelocities(const std::string &robotName) override
bool getRobotStatus(const std::string &robotName, NameValueMap &jointAngles, NameValueMap &jointVelocities, NameValueMap &jointTorques, Eigen::Vector3f &linearVelocity, Eigen::Vector3f &angularVelocity) override
bool synchronizeRobotNodePoses(const std::string &robotName, std::map< std::string, armarx::PoseBasePtr > &objMap) override
bool objectGraspedEngine(const std::string &robotName, const std::string &robotNodeName, const std::string &objectName, Eigen::Matrix4f &storeLocalTransform) override
create a joint
void setRobotLinearVelocityRobotRootFrame(const std::string &robotName, const std::string &robotNodeName, const Eigen::Vector3f &vel) override
void stepStaticObjects(double deltaInSeconds)
std::map< std::string, KinematicRobotInfo > kinematicRobots
bool objectReleasedEngine(const std::string &robotName, const std::string &robotNodeName, const std::string &objectName) override
remove a joint
bool removeObstacleEngine(const std::string &name) override
bool hasRobotNode(const std::string &robotName, const std::string &robotNodeName) override
bool synchronizeObjects() override
Eigen::Matrix4f getObjectPose(const std::string &objectName) override
Eigen::Matrix4f getRobotPose(const std::string &robotName) override
void enableLogging(const std::string &robotName, const std::string &logFile) override
std::map< std::string, float > getRobotJointTorques(const std::string &) override
bool synchronizeSimulationDataEngine() override
void applyTorqueObject(const std::string &objectName, const Eigen::Vector3f &torque) override
std::map< std::string, VirtualRobot::RobotPtr > getRobots() override
void applyTorqueRobotNode(const std::string &robotName, const std::string &robotNodeName, const Eigen::Vector3f &torque) override
bool addObstacleEngine(VirtualRobot::SceneObjectPtr o, VirtualRobot::SceneObject::Physics::SimulationType simType) override
void setRobotMaxTorque(const std::string &robotName, const std::string &nodeName, float maxTorque) override
void setObjectSimType(const std::string &objectName, VirtualRobot::SceneObject::Physics::SimulationType simType) override
virtual void initialize(int stepSizeMS, float maxRealTimeSimSpeed=1, bool floorPlane=false, std::string floorTexture=std::string())
void setRobotNodeSimType(const std::string &robotName, const std::string &robotNodeName, VirtualRobot::SceneObject::Physics::SimulationType simType) override
bool addRobotEngine(VirtualRobot::RobotPtr robot, double pid_p, double pid_i, double pid_d, const std::string &filename, bool staticRobot, bool selfCollisions) override
float getRobotJointLimitHi(const std::string &robotName, const std::string &nodeName) override
void setRobotAngularVelocityRobotRootFrame(const std::string &robotName, const std::string &robotNodeName, const Eigen::Vector3f &vel) override
void setRobotPose(const std::string &robotName, const Eigen::Matrix4f &globalPose) override
VirtualRobot::ObstaclePtr groundObject
virtual VirtualRobot::SceneObjectPtr getObject(const std::string &objectName)
void setObjectPose(const std::string &objectName, const Eigen::Matrix4f &globalPose) override
std::vector< VirtualRobot::SceneObjectPtr > getObjects() override
void stepPhysicsFixedTimeStep() override
Perform one simulation step.
float getDeltaTimeMilli()
FramedPosePtr toFramedPose(const Eigen::Matrix4f &globalPose, const std::string &robotName, const std::string &frameName) override
toFramedPose Constructs a framed pose
virtual void createFloorPlane(const Eigen::Vector3f &pos, const Eigen::Vector3f &up)
ForceTorqueDataSeq getRobotForceTorqueSensors(const std::string &) override
void setupFloorEngine(bool enable, const std::string &floorTexture) override
void calculateActualVelocities()
bool hasObject(const std::string &instanceName) override
void actuateRobotJointsVel(const std::string &robotName, const std::map< std::string, float > &velocities) override
bool updateForceTorqueSensor(ForceTorqueInfo &ftInfo) override
std::map< VirtualRobot::RobotPtr, std::pair< IceUtil::Time, Eigen::Vector3f > > linearVelocityFilters
bool synchronizeSceneObjectPoses(VirtualRobot::SceneObjectPtr currentObjEngine, std::map< std::string, armarx::PoseBasePtr > &objMap) override
void actuateRobotJointsTorque(const std::string &robotName, const std::map< std::string, float > &torques) override
SpamFilterDataPtr deactivateSpam(float deactivationDurationSec=10.0f, const std::string &identifier="", bool deactivate=true) const
disables the logging for the current line for the given amount of seconds.
SimulatedWorldData simReportData
std::vector< GraspingInfo > attachedObjects
SceneVisuData simVisuData
virtual ScopedRecursiveLockPtr getScopedSyncLock(const std::string &callStr)
virtual ScopedRecursiveLockPtr getScopedEngineLock(const std::string &callStr)
float synchronizeDurationMS
float maxRealTimeSimSpeed
virtual void setupFloor(bool enable, const std::string &floorTexture)
float simStepExecutionDurationMS
std::shared_ptr< ScopedRecursiveLock > ScopedRecursiveLockPtr
#define ARMARX_DEBUG_S
The logging level for output that is only interesting while debugging.
#define ARMARX_INFO
The normal logging level.
#define ARMARX_ERROR_S
The logging level for unexpected behaviour, that must be fixed.
#define ARMARX_ERROR
The logging level for unexpected behaviour, that must be fixed.
#define ARMARX_DEBUG
The logging level for output that is only interesting while debugging.
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
#define ARMARX_WARNING_S
The logging level for unexpected behaviour, but not a serious problem.
std::shared_ptr< class Robot > RobotPtr
This file offers overloads of toIce() and fromIce() functions for STL container types.
IceInternal::Handle< Pose > PosePtr
IceInternal::Handle< FramedPose > FramedPosePtr
Eigen::Vector3f velTransActual
Eigen::Vector3f velRotActual
VirtualRobot::RobotPtr robot
Eigen::Vector3f velTransTarget
Eigen::Vector3f velRotTarget
std::map< std::string, float > actualVelocities
std::map< std::string, float > targetVelocities