diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletEngine.cpp b/SimDynamics/DynamicsEngine/BulletEngine/BulletEngine.cpp index 603cd8468f2dddecdbaad989f2fe3b75c897e38c..ca7ea1878898a611d009a9c3c51d92bc38cfc104 100644 --- a/SimDynamics/DynamicsEngine/BulletEngine/BulletEngine.cpp +++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletEngine.cpp @@ -395,7 +395,7 @@ void BulletEngine::updateRobots(btScalar timeStep) { for (size_t i=0; i < robots.size();i++) { - robots[i]->actuateJoints(timeStep); + robots[i]->actuateJoints(double(timeStep)); robots[i]->updateSensors(); } } diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletEngine.h b/SimDynamics/DynamicsEngine/BulletEngine/BulletEngine.h index 96e2eb3d8fc0fd208aaa9822b7a6e3ed8d7be520..e30ae00192c1f752888e921f9ddadfbfe268182d 100644 --- a/SimDynamics/DynamicsEngine/BulletEngine/BulletEngine.h +++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletEngine.h @@ -52,9 +52,9 @@ namespace SimDynamics bulletSolverIterations = 100; bulletSolverGlobalContactForceMixing = 0; bulletSolverGlobalErrorReductionParameter = btScalar(0.2);//0.1); - bulletSolverSuccessiveOverRelaxation = 1.3; - bulletSolverContactSurfaceLayer = 0.001; - bulletSolverSplitImpulsePenetrationThreshold = -0.01; + bulletSolverSuccessiveOverRelaxation = btScalar(1.3); + bulletSolverContactSurfaceLayer = btScalar(0.001); + bulletSolverSplitImpulsePenetrationThreshold = btScalar(-0.01); } virtual ~BulletEngineConfig(){} @@ -119,7 +119,6 @@ public: */ virtual void createFloorPlane(const Eigen::Vector3f &pos, const Eigen::Vector3f &up); - virtual void stepSimulation(double dt, int maxSubSteps, double fixedTimeStep); btDynamicsWorld* getBulletWorld(); diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.cpp b/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.cpp index fba48342c213f3f1185ef6d88bc2055e9f109c61..df3fb7eafae6f4e2366f1b66a7056fbbd4d10ddd 100644 --- a/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.cpp +++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.cpp @@ -30,7 +30,7 @@ BulletRobot::BulletRobot(VirtualRobot::RobotPtr rob, bool enableJointMotors) { bulletMaxMotorImulse = 1500.0f; - bulletMotorVelFactor = 10.0f; + bulletMotorVelFactor = 100.0f; buildBulletModels(enableJointMotors); // activate force torque sensors @@ -133,171 +133,16 @@ void BulletRobot::buildBulletModels(bool enableJointMotors) } if (!bodyA) { - // root node - /*if (joint) - { - THROW_VR_EXCEPTION ("Not able to build valid dynamic model: First node of robot with collision model (" << rn->getName() << ") is connected with a joint (" << joint->getName() <<") but no parent collision model found."); - }*/ bodyA = robot->getRootNode(); } - //} else - { - /* Eigen::Matrix4f trafoA2J = Eigen::Matrix4f::Identity(); // bodyA->joint - Eigen::Matrix4f trafoJ2B = Eigen::Matrix4f::Identity(); // joint->bodyB - if (joint) - { - // now we have bodyA->joint->bodyB - // compute trafoA2J - std::vector<Eigen::Matrix4f> trafosA; - // visualization is affected by preJointTransformation - trafosA.push_back(joint->getPreJointTransformation()); - - // go parents up until bodyA is reached - parent = boost::dynamic_pointer_cast<RobotNode>(joint->getParent()); - while (parent && parent!=bodyA) - { - trafosA.push_back(parent->getPostJointTransformation()); - trafosA.push_back(parent->getPreJointTransformation()); - parent = boost::dynamic_pointer_cast<RobotNode>(parent->getParent()); - } - THROW_VR_EXCEPTION_IF(!parent,"internal error, no parent 2"); - trafosA.push_back(bodyA->getPostJointTransformation()); - std::vector<Eigen::Matrix4f>::reverse_iterator rit; - // accumulate transformations from bodyA_post to joint_pre - for (rit=trafosA.rbegin(); rit != trafosA.rend(); rit++) - { - trafoA2J *= *rit; - } - // compute trafoJ2B - std::vector<Eigen::Matrix4f> trafosB; - - // visualization is affected by preJointTransformation - trafosB.push_back(bodyB->getPreJointTransformation()); - if (joint!=bodyB) - { - // go parents up until joint is reached - parent = boost::dynamic_pointer_cast<RobotNode>(bodyB->getParent()); - while (parent && parent!=joint) - { - trafosB.push_back(parent->getPostJointTransformation()); - trafosB.push_back(parent->getPreJointTransformation()); - parent = boost::dynamic_pointer_cast<RobotNode>(parent->getParent()); - } - THROW_VR_EXCEPTION_IF(!parent,"internal error, no parent"); - trafosB.push_back(joint->getPostJointTransformation()); - } - // accumulate transformations from joint_post to bodyB_pre - for (rit=trafosB.rbegin(); rit != trafosB.rend(); rit++) - { - trafoJ2B *= *rit; - } - } else - { - // fixed joint: bodyA -> bodyB - joint = bodyB; - - // compute trafoA2J (which is trafo from A to B) - std::vector<Eigen::Matrix4f> trafosA; - // visualization is affected by preJointTransformation - trafosA.push_back(bodyB->getPreJointTransformation()); - - // go parents up until bodyA is reached - parent = boost::dynamic_pointer_cast<RobotNode>(bodyB->getParent()); - while (parent && parent!=bodyA) - { - trafosA.push_back(parent->getPostJointTransformation()); - trafosA.push_back(parent->getPreJointTransformation()); - parent = boost::dynamic_pointer_cast<RobotNode>(parent->getParent()); - } - THROW_VR_EXCEPTION_IF(!parent,"internal error, no parent 3"); - trafosA.push_back(bodyA->getPostJointTransformation()); - std::vector<Eigen::Matrix4f>::reverse_iterator rit; - // accumulate transformations from bodyA_post to joint_pre - for (rit=trafosA.rbegin(); rit != trafosA.rend(); rit++) - { - trafoA2J *= *rit; - } - - }*/ + // check for fixed joint + if (!joint) + joint = bodyB; - // check for fixed joint - if (!joint) - joint = bodyB; - - createLink(bodyA,joint,joint2,bodyB);//,trafoA2J,trafoJ2B); - } - - } - - /* - RobotNodePtr bodyA; - RobotNodePtr bodyB; - RobotNodePtr joint; - Eigen::Matrix4f trafoA = Eigen::Matrix4f; - Eigen::Matrix4f trafoB = Eigen::Matrix4f; - for (size_t i=0;i<robotNodes.size();i++) - { - - RobotNodePtr rn = robotNodes[i]; - - switch(rn->getType()) - { - case RobotNode::Generic: - THROW_VR_EXCEPTION ("Could not build dynamic model. Only <JointNode> <TransformationNode> and <BodyNode> tags allowed!"); - break; - case RobotNode::Body: - break; - default: - continue; - } - // a body - bodyB = rn; - bodyA.reset(); - joint.reset(); - trafoA = Eigen::Matrix4f; - trafoB = Eigen::Matrix4f; - - // search parent body - RobotNodePtr parent = rn->getParent(); - bool built = false; - while (parent && !built) - { - switch (parent->getType()) - { - case RobotNode::Joint: - if (joint) - { - THROW_VR_EXCEPTION("Need bodies between joints. Two succeeding joints found in kinematic structure"); - } - joint = parent; - break; - case RobotNode::Body: - if (!joint) - { - THROW_VR_EXCEPTION("Need joint between body. Two succeeding bodies found in kinematic structure"); - } - createLink(bodyA,joint,bodyB,trafoA,trafoB); - built = true; - break; - case RobotNode::Transform: - if (!joint) - trafoA *= parent->getPostJointTransformation - built = true; - break; - } + createLink(bodyA,joint,joint2,bodyB);//,trafoA2J,trafoJ2B); } - */ - - /* - std::vector<SceneObjectPtr> children = rn->getChildren(); - for (size_t c=0;c<children.size();c++) - { - RobotNodePtr rn2 = boost::dynamic_pointer_cast<RobotNode>(children[c]); - if (rn2) - createLink(rn,rn2,enableJointMotors); - }*/ } } @@ -892,7 +737,7 @@ void BulletRobot::ensureKinematicConstraints() #endif } -void BulletRobot::actuateJoints(btScalar dt) +void BulletRobot::actuateJoints(double dt) { //cout << "=== === BulletRobot: actuateJoints() 1 === " << endl; @@ -917,7 +762,7 @@ void BulletRobot::actuateJoints(btScalar dt) btScalar posTarget = btScalar(it->second.jointValueTarget + link.jointValueOffset); btScalar posActual = btScalar(getJointAngle(it->first)); - btScalar velocityTarget = it->second.jointVelocityTarget; + btScalar velocityTarget = btScalar(it->second.jointVelocityTarget); #ifdef USE_BULLET_GENERIC_6DOF_CONSTRAINT boost::shared_ptr<btGeneric6DofConstraint> dof = boost::dynamic_pointer_cast<btGeneric6DofConstraint>(link.joint); @@ -957,20 +802,20 @@ void BulletRobot::actuateJoints(btScalar dt) if (actuation.modes.position && actuation.modes.velocity) { hinge->enableAngularMotor(true, - controller.update(posTarget - posActual, velocityTarget, actuation, dt), + controller.update(posTarget - posActual, velocityTarget, actuation, btScalar(dt)), bulletMaxMotorImulse); } else if (actuation.modes.position) { hinge->enableAngularMotor(true, - controller.update(posTarget - posActual, 0.0, actuation, dt), + controller.update(posTarget - posActual, 0.0, actuation, btScalar(dt)), bulletMaxMotorImulse); } else if (actuation.modes.velocity) { hinge->enableAngularMotor(true, - controller.update(0.0, velocityTarget, actuation, dt), + controller.update(0.0, velocityTarget, actuation, btScalar(dt)), bulletMaxMotorImulse); } // FIXME this bypasses the controller (and doesn't work..) @@ -1407,7 +1252,7 @@ Eigen::Vector3f BulletRobot::getComGlobal( VirtualRobot::RobotNodeSetPtr set) { Eigen::Vector3f com = Eigen::Vector3f::Zero(); double totalMass = 0.0; - for (int i = 0; i < set->getSize(); i++) + for (unsigned int i = 0; i < set->getSize(); i++) { VirtualRobot::RobotNodePtr node = (*set)[i]; BulletObjectPtr bo = boost::dynamic_pointer_cast<BulletObject>(getDynamicsRobotNode(node)); @@ -1416,7 +1261,7 @@ Eigen::Vector3f BulletRobot::getComGlobal( VirtualRobot::RobotNodeSetPtr set) totalMass += node->getMass(); } - com *= 1.0f/totalMass; + com *= float(1.0f/totalMass); return com; } @@ -1424,7 +1269,7 @@ Eigen::Vector3f BulletRobot::getComGlobalVelocity( VirtualRobot::RobotNodeSetPtr { Eigen::Vector3f com = Eigen::Vector3f::Zero(); double totalMass = 0.0; - for (int i = 0; i < set->getSize(); i++) + for (unsigned int i = 0; i < set->getSize(); i++) { VirtualRobot::RobotNodePtr node = (*set)[i]; BulletObjectPtr bo = boost::dynamic_pointer_cast<BulletObject>(getDynamicsRobotNode(node)); diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.h b/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.h index e26bc044cf779222ee0a46d993b1963610bd49af..45c441bc4395cf27c4d0711fa56c7c9348d5535b 100644 --- a/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.h +++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.h @@ -105,7 +105,7 @@ public: Usually this method is called by the framework in every tick to perform joint actuation. \param dt Timestep */ - virtual void actuateJoints(btScalar dt); + virtual void actuateJoints(double dt); virtual void updateSensors(); diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletRobotLogger.cpp b/SimDynamics/DynamicsEngine/BulletEngine/BulletRobotLogger.cpp index c14edeef31617d77489a49aa3a5d433ec71f42b7..28e195e030c1f09a3c6b23206eb4d267db11b86d 100644 --- a/SimDynamics/DynamicsEngine/BulletEngine/BulletRobotLogger.cpp +++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletRobotLogger.cpp @@ -73,7 +73,7 @@ void BulletRobotLogger::log(btScalar dt) if (!running) return; - if (actualAngleLog.size() > max_samples) + if (int(actualAngleLog.size()) > max_samples) { std::cout << "Warning: Exceeded max_samples! Stopping logging." << std::endl; running = false; diff --git a/SimDynamics/DynamicsEngine/BulletEngine/SimoxMotionState.cpp b/SimDynamics/DynamicsEngine/BulletEngine/SimoxMotionState.cpp index 8f83f961151586119fde3dd8145e976c1e5b4076..aa0d92a8f47990081474b0198140b950016c9914 100644 --- a/SimDynamics/DynamicsEngine/BulletEngine/SimoxMotionState.cpp +++ b/SimDynamics/DynamicsEngine/BulletEngine/SimoxMotionState.cpp @@ -122,7 +122,7 @@ void SimoxMotionState::setGlobalPoseSimox( const Eigen::Matrix4f& worldPose ) { if (links[i].nodeJoint) { - float ja = bdr->getJointAngle(links[i].nodeJoint); + float ja = float(bdr->getJointAngle(links[i].nodeJoint)); // we can update the joint value via an RobotNodeActuator RobotNodeActuatorPtr rna (new RobotNodeActuator(links[i].nodeJoint)); rna->updateJointAngle(ja); diff --git a/VirtualRobot/CollisionDetection/CollisionChecker.h b/VirtualRobot/CollisionDetection/CollisionChecker.h index 5a39820908cf75ae462dfe90a20a9e28fa811894..c5a1e2d8bb35db4c01d4f91f1cab15dd9caecc25 100644 --- a/VirtualRobot/CollisionDetection/CollisionChecker.h +++ b/VirtualRobot/CollisionDetection/CollisionChecker.h @@ -63,9 +63,9 @@ public: virtual float calculateDistance (SceneObjectSetPtr model1, SceneObjectSetPtr model2); virtual float calculateDistance (CollisionModelPtr model1, SceneObjectSetPtr model2); virtual float calculateDistance (CollisionModelPtr model1, CollisionModelPtr model2); - virtual float calculateDistance (SceneObjectSetPtr model1, SceneObjectSetPtr model2, Eigen::Vector3f &P1, Eigen::Vector3f &P2, int* trID1, int* trID2); - virtual float calculateDistance (CollisionModelPtr model1, SceneObjectSetPtr model2, Eigen::Vector3f &P1, Eigen::Vector3f &P2, int* trID1, int* trID2); - virtual float calculateDistance (CollisionModelPtr model1, CollisionModelPtr model2, Eigen::Vector3f &P1, Eigen::Vector3f &P2, int* trID1, int* trID2); + virtual float calculateDistance(SceneObjectSetPtr model1, SceneObjectSetPtr model2, Eigen::Vector3f &P1, Eigen::Vector3f &P2, int* trID1 = NULL, int* trID2 = NULL); + virtual float calculateDistance(CollisionModelPtr model1, SceneObjectSetPtr model2, Eigen::Vector3f &P1, Eigen::Vector3f &P2, int* trID1 = NULL, int* trID2 = NULL); + virtual float calculateDistance(CollisionModelPtr model1, CollisionModelPtr model2, Eigen::Vector3f &P1, Eigen::Vector3f &P2, int* trID1 = NULL, int* trID2 = NULL); /*! Test if the two models are colliding. @@ -124,8 +124,8 @@ public: */ virtual float calculateDistance (SceneObjectPtr model1, SceneObjectSetPtr model2); virtual float calculateDistance (SceneObjectPtr model1, SceneObjectPtr model2); - virtual float calculateDistance (SceneObjectPtr model1, SceneObjectSetPtr model2, Eigen::Vector3f &P1, Eigen::Vector3f &P2, int* trID1, int* trID2); - virtual float calculateDistance (SceneObjectPtr model1, SceneObjectPtr model2, Eigen::Vector3f &P1, Eigen::Vector3f &P2, int* trID1, int* trID2); + virtual float calculateDistance(SceneObjectPtr model1, SceneObjectSetPtr model2, Eigen::Vector3f &P1, Eigen::Vector3f &P2, int* trID1 = NULL, int* trID2 = NULL); + virtual float calculateDistance(SceneObjectPtr model1, SceneObjectPtr model2, Eigen::Vector3f &P1, Eigen::Vector3f &P2, int* trID1 = NULL, int* trID2 = NULL); /*! Test if the two models are colliding. diff --git a/VirtualRobot/CollisionDetection/CollisionCheckerImplementation.h b/VirtualRobot/CollisionDetection/CollisionCheckerImplementation.h index 318794c6e99a97d1e02114fae533fdc6c1398742..7caf88ea48ebe03a14dd5194e37ad8f9861d86f6 100644 --- a/VirtualRobot/CollisionDetection/CollisionCheckerImplementation.h +++ b/VirtualRobot/CollisionDetection/CollisionCheckerImplementation.h @@ -41,7 +41,7 @@ public: CollisionCheckerImplementation(){automaticSizeCheck = true; debugOutput=false;} virtual ~CollisionCheckerImplementation(){} - virtual float calculateDistance (CollisionModelPtr model1, CollisionModelPtr model2, Eigen::Vector3f &P1, Eigen::Vector3f &P2, int* trID1, int* trID2) = 0; + virtual float calculateDistance(CollisionModelPtr model1, CollisionModelPtr model2, Eigen::Vector3f &P1, Eigen::Vector3f &P2, int* trID1 = NULL, int* trID2 = NULL) = 0; virtual bool checkCollision (CollisionModelPtr model1, CollisionModelPtr model2) = 0;//, Eigen::Vector3f *storeContact = NULL) = 0; virtual void setAutomaticSizeCheck(bool checkSizeOnColModelCreation){automaticSizeCheck = checkSizeOnColModelCreation;} diff --git a/VirtualRobot/CollisionDetection/PQP/CollisionCheckerPQP.h b/VirtualRobot/CollisionDetection/PQP/CollisionCheckerPQP.h index 937733eb99d3c57e9cf4db9293b3789b8f3bd111..528e807795b73bc4f921c5a01a63e16e1a6ccbe7 100644 --- a/VirtualRobot/CollisionDetection/PQP/CollisionCheckerPQP.h +++ b/VirtualRobot/CollisionDetection/PQP/CollisionCheckerPQP.h @@ -50,7 +50,7 @@ public: CollisionCheckerPQP(); virtual ~CollisionCheckerPQP(); - virtual float calculateDistance (CollisionModelPtr model1, CollisionModelPtr model2, Eigen::Vector3f &P1, Eigen::Vector3f &P2, int* trID1, int* trID2); + virtual float calculateDistance(CollisionModelPtr model1, CollisionModelPtr model2, Eigen::Vector3f &P1, Eigen::Vector3f &P2, int* trID1 = NULL, int* trID2 = NULL); virtual bool checkCollision (CollisionModelPtr model1, CollisionModelPtr model2);//, Eigen::Vector3f *storeContact = NULL); /*! diff --git a/VirtualRobot/Import/COLLADA-light/ColladaSimox.h b/VirtualRobot/Import/COLLADA-light/ColladaSimox.h index 5e063001cdf0b606e31e2871b17b18066651af15..11885c6f6fd1196095a9ce60e2413601c8e6802d 100644 --- a/VirtualRobot/Import/COLLADA-light/ColladaSimox.h +++ b/VirtualRobot/Import/COLLADA-light/ColladaSimox.h @@ -1,3 +1,6 @@ +#ifndef __COLLADA_SIMOX_H__ +#define __COLLADA_SIMOX_H__ + #include <Eigen/Dense> #include <Eigen/Geometry> #include "inventor.h" @@ -52,5 +55,7 @@ public: }; - } //namespace + + +#endif diff --git a/VirtualRobot/Import/COLLADA-light/collada.h b/VirtualRobot/Import/COLLADA-light/collada.h index 8be1d44a248c548e2cafeb053f0c780e5612593c..8b7deb8134dfcba0276cb42b7226ad97304ff5da 100644 --- a/VirtualRobot/Import/COLLADA-light/collada.h +++ b/VirtualRobot/Import/COLLADA-light/collada.h @@ -1,5 +1,5 @@ -#ifndef __COLLADA_H__ -#define __COLLADA_H__ +#ifndef __COLLADA_SIMOX_IMPORT_H__ +#define __COLLADA_SIMOX_IMPORT_H__ #include "pugixml/pugixml.hpp"