28#include <VirtualRobot/ManipulationObject.h>
29#include <VirtualRobot/Scene.h>
30#define MAX_SIM_TIME_WARNING 25
31#define FORCE_TORQUE_TOPIC_NAME "ForceTorqueDynamicSimulationValues"
36#include <VirtualRobot/CollisionDetection/CollisionChecker.h>
37#include <VirtualRobot/Nodes/ForceTorqueSensor.h>
38#include <VirtualRobot/XML/ObjectIO.h>
39#include <VirtualRobot/XML/RobotIO.h>
40#include <VirtualRobot/XML/SceneIO.h>
78 return resetRobots && resetObstacles;
131 const std::string& filename,
137 ARMARX_VERBOSE_S <<
"Adding robot " << robot->getName() <<
", file:" << filename;
147 robot = robot->clone(robot->getName(), robot->getCollisionChecker(), scaling);
151 bool ok =
addRobotEngine(robot, pid_p, pid_i, pid_d, filename, staticRobot, selfCollisions);
157 RobotVisuData robData;
159 robData.name = robot->getName();
160 robData.robotFile = filename;
161 robData.updated =
true;
162 robData.scaling = scaling;
163 robData.colModel = colModel;
176 std::vector<SensorPtr> sensors = robot->getSensors();
178 for (
const auto& sensor : sensors)
180 ForceTorqueSensorPtr ft = std::dynamic_pointer_cast<ForceTorqueSensor>(sensor);
209 const std::string& robotNodeName,
210 const std::string& objectName)
213 ARMARX_INFO_S <<
"Object released, robot " << robotName <<
", node:" << robotNodeName
214 <<
", object:" << objectName;
220 bool objectFound =
false;
224 if (aoIt->robotName == robotName && aoIt->robotNodeName == robotNodeName &&
225 aoIt->objectName == objectName)
240 ARMARX_INFO_S <<
"Successfully detached object " << objectName;
246 const std::string& robotNodeName,
247 const std::string& objectName)
250 ARMARX_INFO_S <<
"Object grasped, robot " << robotName <<
", node:" << robotNodeName
251 <<
", object:" << objectName;
256 if (ao.robotName == robotName && ao.robotNodeName == robotNodeName &&
257 ao.objectName == objectName)
264 Eigen::Matrix4f localTransform;
267 ARMARX_INFO_S <<
"Successfully attached object " << objectName;
288 for (
auto& n : names)
314 bool objectFound =
false;
329 <<
" not in synchronized list, cannot remove";
338 const std::string& filename,
339 Eigen::Matrix4f pose,
340 const std::string& filenameLocal,
347 const std::map<std::string, float>& initConfig,
358 VirtualRobot::RobotIO::RobotDescription loadMode = VirtualRobot::RobotIO::eFull;
361 loadMode = VirtualRobot::RobotIO::eCollisionModel;
364 robot = RobotIO::loadRobot(filename, loadMode);
369 if (robotInstanceName.empty())
371 robotInstanceName = robot->getType();
373 const std::string baseName = robotInstanceName;
374 for (std::size_t i = 2;
hasRobot(robotInstanceName); ++i)
376 robotInstanceName = baseName +
"_" + std::to_string(i);
378 robot->setName(robotInstanceName);
380 catch (VirtualRobotException& e)
383 <<
" ERROR while creating robot (file:" << filename <<
")\n"
390 ARMARX_ERROR_S <<
" ERROR while creating robot (file:" << filename <<
")";
394 ARMARX_INFO_S <<
"Loaded robot with name " << robot->getName();
402 if (pose.isIdentity() &&
getFloor())
405 VirtualRobot::BoundingBox bbox = robot->getBoundingBox();
409 std::vector<CollisionModelPtr> colModels = robot->getCollisionModels();
410 CollisionModelPtr floorCol =
getFloor()->getCollisionModel();
413 std::size_t loop = 0;
414 float z = -bbox.getMin()(2) + 20.0f;
416 robot->setGlobalPose(pose);
417 found = (robot->getCollisionChecker()->checkCollision(colModels, floorCol));
419 while (loop < 1000 && !found)
423 robot->setGlobalPose(pose);
424 found = (robot->getCollisionChecker()->checkCollision(colModels, floorCol));
433 robot->setGlobalPose(pose);
438 robot->setGlobalPose(pose);
439 std::string fn = filename;
441 if (!filenameLocal.empty())
448 addRobot(robot, pid_p, pid_i, pid_d, fn, staticRobot, scaling, colModel, selfCollisions);
451 if (
success && initConfig.size() > 0)
487 ::armarx::RobotVisuList robots;
490 if (robot.name != robotName)
492 robots.push_back(robot);
496 std::vector<RobotInfo> robotInfos;
499 if (robot.robotName != robotName)
501 robotInfos.push_back(robot);
517 if (aoIt->robotName == robotName)
519 ARMARX_DEBUG_S <<
"Removing attached object " << aoIt->objectName;
533 VirtualRobot::SceneObject::Physics::SimulationType simType)
540 scene = SceneIO::loadScene(filename);
542 catch (VirtualRobotException& e)
544 ARMARX_ERROR_S <<
" ERROR while creating scene (file:" << filename <<
")\n" << e.what();
550 ARMARX_ERROR_S <<
" ERROR while creating scene (file:" << filename <<
")";
567 std::vector<ManipulationObjectPtr> mo = scene->getManipulationObjects();
576 std::vector<ObstaclePtr> o = scene->getObstacles();
586 std::vector<RobotPtr> ro = scene->getRobots();
591 i->setName(i->getType());
592 ARMARX_VERBOSE_S <<
"Scene: Robot " << i->getName() <<
", type:" << i->getType();
593 addRobot(i, 10.0, 0.0, 0.0, i->getFilename());
597 ARMARX_INFO_S <<
" Added " << countrobot <<
" robots and " << count <<
" objects";
604 const Eigen::Matrix4f& pose,
605 VirtualRobot::SceneObject::Physics::SimulationType simType,
606 const std::string& localFilename)
608 ARMARX_INFO_S <<
"Loading obstacle from " << filename <<
", (local file:" << localFilename
614 o = ObjectIO::loadObstacle(filename);
616 catch (VirtualRobotException& e)
618 ARMARX_ERROR_S <<
" ERROR while creating obstacle (file:" << filename <<
")\n" << e.what();
624 ARMARX_ERROR_S <<
" ERROR while creating (file:" << filename <<
")";
628 o->setGlobalPose(pose);
629 std::string fn = filename;
631 if (!localFilename.empty())
633 std::string absoluteFilename;
646 <<
" -> usign " << fn;
655 VirtualRobot::SceneObject::Physics::SimulationType simType,
656 const std::string& filename,
657 const std::string& objectClassName,
658 ObjectVisuPrimitivePtr primitiveData,
659 const std::string& project)
676 <<
" already present! Choose a different instance name";
689 if (primitiveData && (!filename.empty() || !objectClassName.empty()))
691 ARMARX_WARNING_S <<
"Internal error, either filename or classname or primitive";
695 armarx::ObjectVisuData ovd;
696 ovd.name = o->getName();
697 ovd.filename = filename;
698 ovd.project = project;
699 ovd.objectPoses[o->getName()] =
new Pose(o->getGlobalPose());
700 ovd.objectClassName = objectClassName;
705 ovd.objectPrimitiveData = primitiveData;
719#ifdef PERFORMANCE_EVALUATION_LOCKS
734 ARMARX_INFO <<
"engine mutex performance [" << callStr
752#ifdef PERFORMANCE_EVALUATION_LOCKS
767 ARMARX_INFO <<
"snyc mutex performance [" << callStr
808 (void)robotName, (
void)logFile;
835 std::map<std::string, RobotVisuData*> visuRobotPtr;
838 std::string name = robot.name;
848 robot.updated =
true;
849 visuRobotPtr[robot.name] = &robot;
856 std::string name = robot.robotName;
862 robot.jointVelocities,
864 robot.linearVelocity,
865 robot.angularVelocity);
866 if (visuRobotPtr.count(robot.robotName))
868 visuRobotPtr.at(robot.robotName)->jointValues = robot.jointAngles;
872 for (
size_t i = 0; i < robot.forceTorqueSensors.size(); i++)
884 IceUtil::Time startTime = IceUtil::Time::now();
890 IceUtil::Time durationlock = IceUtil::Time::now() - startTime;
892 if (durationlock.toMilliSecondsDouble() > 4)
895 <<
"Engine/Sync locking took long :" << durationlock.toMilliSecondsDouble()
902 IceUtil::Time startTimeR = IceUtil::Time::now();
905 IceUtil::Time durationR = IceUtil::Time::now() - startTimeR;
906 if (durationR.toMilliSecondsDouble() > 4)
909 <<
"Robot sync took long:" << durationR.toMilliSecondsDouble() <<
" ms";
912 IceUtil::Time startTimeO = IceUtil::Time::now();
915 IceUtil::Time durationO = IceUtil::Time::now() - startTimeO;
916 if (durationO.toMilliSecondsDouble() > 4)
919 <<
"Object sync took long:" << durationO.toMilliSecondsDouble() <<
" ms";
925 IceUtil::Time duration = IceUtil::Time::now() - startTime;
956 return static_cast<int>(
simVisuData.robots.at(0).robotNodePoses.size());
970 return static_cast<int>(
simVisuData.objects.size());
#define FORCE_TORQUE_TOPIC_NAME
static bool getAbsolutePath(const std::string &relativeFilename, std::string &storeAbsoluteFilename, const std::vector< std::string > &additionalSearchPaths={}, bool verbose=true)
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.
The SimulatedWorldData class This data is queried by the simulated in order to offer it via topics.
SimulatedWorldData simReportData
virtual bool removeObstacle(const std::string &name)
std::map< std::string, float > engineMtxAccTime
virtual int getObjectCount()
virtual SimulatedWorldData copyReportData()
virtual bool objectGraspedEngine(const std::string &robotName, const std::string &robotNodeName, const std::string &objectName, Eigen::Matrix4f &storeLocalTransform)=0
create a joint
virtual bool synchronizeSimulationData()
synchronizeSimulationData Update the sim data according to the internal physics models.
virtual float getSimulationStepDuration()
getSimulationStepDuration
virtual int getContactCount()
virtual bool objectReleasedEngine(const std::string &robotName, const std::string &robotNodeName, const std::string &objectName)=0
remove a joint
std::map< std::string, IceUtil::Time > engineMtxLastTime
virtual SceneVisuData copySceneVisuData()
copySceneVisuData Creates a copy of the visualization data
virtual bool synchronizeRobotNodePoses(const std::string &robotName, std::map< std::string, armarx::PoseBasePtr > &objMap)=0
std::vector< GraspingInfo > attachedObjects
virtual bool synchronizeSimulationDataEngine()=0
SceneVisuData simVisuData
virtual void objectReleased(const std::string &robotName, const std::string &robotNodeName, const std::string &objectName)
remove a joint
virtual SimulatedWorldData & getReportData()
virtual bool hasObject(const std::string &instanceName)=0
virtual ScopedRecursiveLockPtr getScopedSyncLock(const std::string &callStr)
MutexPtrType::element_type MutexType
virtual bool removeRobots()
virtual bool resetData()
resetData Clears all data
virtual bool removeRobotEngine(const std::string &robotName)=0
virtual ScopedRecursiveLockPtr getScopedEngineLock(const std::string &callStr)
virtual Eigen::Matrix4f getRobotPose(const std::string &robotName)=0
virtual bool addScene(const std::string &filename, VirtualRobot::SceneObject::Physics::SimulationType simType=VirtualRobot::SceneObject::Physics::eUnknown)
Load and add an Scene (VirtualRobot xml file).
virtual void resetSimTime()
std::map< std::string, IceUtil::Time > syncMtxLastTime
virtual float getSyncEngineTime()
float synchronizeDurationMS
std::map< std::string, int > syncMtxAccCalls
virtual bool synchronizeObjects()=0
virtual bool addObstacleEngine(VirtualRobot::SceneObjectPtr o, VirtualRobot::SceneObject::Physics::SimulationType simType)=0
double currentSyncTimeSec
virtual bool removeObstacles()
virtual void setupFloorEngine(bool enable, const std::string &floorTexture)=0
virtual bool addRobotEngine(VirtualRobot::RobotPtr robot, double pid_p, double pid_i, double pid_d, const std::string &filename, bool staticRobot, bool selfCollisions)=0
virtual bool addRobot(std::string &robotInstanceName, const std::string &filename, Eigen::Matrix4f pose=Eigen::Matrix4f::Identity(), const std::string &filenameLocal="", double pid_p=10.0, double pid_i=0, double pid_d=0, bool staticRobot=false, float scaling=1.0f, bool colModel=false, const std::map< std::string, float > &initConfig={}, bool selfCollisions=false)
Load and add a robot.
virtual void setupFloor(bool enable, const std::string &floorTexture)
virtual bool hasRobot(const std::string &robotName)=0
std::map< std::string, int > engineMtxAccCalls
virtual double getCurrentSimTime()
virtual bool synchronizeRobots()
virtual void actuateRobotJointsPos(const std::string &robotName, const std::map< std::string, float > &angles)=0
virtual VirtualRobot::RobotPtr adaptRobotToWorld(VirtualRobot::RobotPtr)
virtual bool getRobotStatus(const std::string &robotName, NameValueMap &jointAngles, NameValueMap &jointVelocities, NameValueMap &jointTorques, Eigen::Vector3f &linearVelocity, Eigen::Vector3f &angularVelocity)=0
std::map< std::string, float > syncMtxAccTime
virtual bool removeRobot(const std::string &robotName)
virtual std::vector< std::string > getRobotNames()=0
virtual void objectGrasped(const std::string &robotName, const std::string &robotNodeName, const std::string &objectName)
create a joint
float simStepExecutionDurationMS
virtual bool updateForceTorqueSensor(ForceTorqueInfo &ftInfo)=0
virtual VirtualRobot::SceneObjectPtr getFloor()=0
virtual float getSimulationStepTimeMeasured()
getSimulationStepTimeMeasured
virtual int getRobotJointAngleCount()
virtual float getSimTime()
virtual bool addObstacle(const std::string &filename, const Eigen::Matrix4f &pose=Eigen::Matrix4f::Identity(), VirtualRobot::SceneObject::Physics::SimulationType simType=VirtualRobot::SceneObject::Physics::eUnknown, const std::string &localFilename="")
Load and add an Obstacle (VirtualRobot xml file).
virtual bool removeObstacleEngine(const std::string &name)=0
virtual void updateContacts(bool enable)
virtual void enableLogging(const std::string &robotName, const std::string &logFile)
MutexPtrType synchronizeMutex
virtual std::vector< std::string > getObstacleNames()=0
virtual void activateObject(const std::string &objectName)
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_IMPORTANT_S
The logging level for always important information, but expected behaviour (in contrast to ARMARX_WAR...
#define ARMARX_WARNING_S
The logging level for unexpected behaviour, but not a serious problem.
RecursiveMutex::scoped_lock ScopedRecursiveLock
std::shared_ptr< class Robot > RobotPtr
This file offers overloads of toIce() and fromIce() functions for STL container types.
std::string GetHandledExceptionString()
IceInternal::Handle< Pose > PosePtr
VirtualRobot::ForceTorqueSensorPtr ftSensor
std::string robotNodeName
std::vector< ForceTorqueInfo > forceTorqueSensors
std::string robotTopicName
Eigen::Matrix4f node2objectTransformation
std::string robotNodeName