From a6216f4f24693fdd4e178b92db9af223e9771fe1 Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Mon, 25 Jul 2016 11:48:44 -0700 Subject: [PATCH] add robotics learning grasp contact example add wsg50 gripper with modified r2d2 gripper tip expose a fudge factor to scale inertia, to make grasping more stable (until we have better grasping contact model/implementation) --- data/cube_small.urdf | 33 ++ data/gripper/meshes/GUIDE_WSG50_110.stl | Bin 0 -> 23884 bytes data/gripper/meshes/WSG-FMF.stl | Bin 0 -> 108184 bytes data/gripper/meshes/WSG50_110.stl | Bin 0 -> 20684 bytes data/gripper/meshes/l_gripper_tip_scaled.stl | Bin 0 -> 49984 bytes data/gripper/wsg50_with_r2d2_gripper.sdf | 298 ++++++++++++++++++ examples/ExampleBrowser/ExampleEntries.cpp | 1 + .../ExampleBrowser/OpenGLExampleBrowser.cpp | 2 + .../Importers/ImportURDFDemo/URDF2Bullet.cpp | 7 + .../Importers/ImportURDFDemo/URDFJointTypes.h | 5 +- .../Importers/ImportURDFDemo/UrdfParser.cpp | 23 ++ .../RoboticsLearning/R2D2GraspExample.cpp | 235 ++++++++++---- examples/RoboticsLearning/R2D2GraspExample.h | 1 + examples/RoboticsLearning/b3RobotSimAPI.cpp | 2 + examples/RoboticsLearning/b3RobotSimAPI.h | 2 +- .../PhysicsServerCommandProcessor.cpp | 21 +- 16 files changed, 558 insertions(+), 72 deletions(-) create mode 100644 data/cube_small.urdf create mode 100644 data/gripper/meshes/GUIDE_WSG50_110.stl create mode 100644 data/gripper/meshes/WSG-FMF.stl create mode 100644 data/gripper/meshes/WSG50_110.stl create mode 100644 data/gripper/meshes/l_gripper_tip_scaled.stl create mode 100644 data/gripper/wsg50_with_r2d2_gripper.sdf diff --git a/data/cube_small.urdf b/data/cube_small.urdf new file mode 100644 index 000000000..804f7f0b1 --- /dev/null +++ b/data/cube_small.urdf @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/gripper/meshes/GUIDE_WSG50_110.stl b/data/gripper/meshes/GUIDE_WSG50_110.stl new file mode 100644 index 0000000000000000000000000000000000000000..a7b584732a514acba85785903075f20c46da1634 GIT binary patch literal 23884 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�NcfcUWQjQ!2tq1V#%k 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

;6df_Qf9zR25;CCAnY)u8Y%6azY%vvZCL3 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 literal 0 HcmV?d00001 diff --git a/data/gripper/wsg50_with_r2d2_gripper.sdf b/data/gripper/wsg50_with_r2d2_gripper.sdf new file mode 100644 index 000000000..b022faf00 --- /dev/null +++ b/data/gripper/wsg50_with_r2d2_gripper.sdf @@ -0,0 +1,298 @@ + + + + + 0 0 0.27 3.14 0 0 + + + + + + world + base_link + + 0 0 1 + + -0.5 + 10 + 1 + 1 + + + 100 + 100 + 0 + 0 + + + + + + 0 0 0 0 -0 0 + + 0 0 0 0 -0 0 + 1.2 + + 1 + 0 + 0 + 1 + 0 + 1 + + + + 0 0 0 0 -0 0 + + + 0.2 0.05 0.05 + + + + + 0 0 0 0 -0 0 + + + 1 1 1 + meshes/WSG50_110.stl + + + + + + + 1 + + 0 + + + + -0.055 0 0 0 -0 0 + + 0 0 0.0115 0 -0 0 + 0.2 + + 0.1 + 0 + 0 + 0.1 + 0 + 0.1 + + + + + 0 0 0 0 -0 0 + + + 0.001 0.001 0.001 + meshes/GUIDE_WSG50_110.stl + + + + + 0 0 0.023 0 -0 0 + + + 0.001 0.001 0.001 + meshes/WSG-FMF.stl + + + + + + 0 0 0 0 -0 0 + + + 0.001 0.001 0.001 + meshes/GUIDE_WSG50_110.stl + + + + + 0 0 0.023 0 -0 0 + + + 0.001 0.001 0.001 + meshes/WSG-FMF.stl + + + + + + + gripper_left + base_link + + 1 0 0 + + -0.001 + 0.055 + 1 + 1 + + + 100 + 100 + 0 + 0 + + + + + + 0.055 0 0 0 -0 3.14159 + + 0 0 0.0115 0 -0 0 + 0.2 + + 0.1 + 0 + 0 + 0.1 + 0 + 0.1 + + + + + 0 0 0 0 -0 0 + + + 0.001 0.001 0.001 + meshes/GUIDE_WSG50_110.stl + + + + + 0 0 0.023 0 -0 0 + + + 0.001 0.001 0.001 + meshes/WSG-FMF.stl + + + + + + 0 0 0 0 -0 0 + + + 0.001 0.001 0.001 + meshes/GUIDE_WSG50_110.stl + + + + + 0 0 0.023 0 -0 0 + + + 0.001 0.001 0.001 + meshes/WSG-FMF.stl + + + + + + + gripper_right + base_link + + -1 0 0 + + -0.055 + 0.001 + 1 + 1 + + + 100 + 100 + 0 + 0 + + + + + + 0.062 0 0.145 0 0 1.5708 + + 0.2 + + 0.1 + 0 + 0 + 0.1 + 0 + 0.1 + + + + + 0 0 0.042 0 0 0 + + + 0.02 0.02 0.15 + + + + + + + 0 0 0 0 0 0 + + + 1 1 1 + meshes/l_gripper_tip_scaled.stl + + + + + + + gripper_right + finger_right + + + + -0.062 0 0.145 0 0 4.71239 + + 0.2 + + 0.1 + 0 + 0 + 0.1 + 0 + 0.1 + + + + + 0 0 0.042 0 0 0 + + + 0.02 0.02 0.15 + + + + + + + 0 0 0 0 0 0 + + + 1 1 1 + meshes/l_gripper_tip_scaled.stl + + + + + + + gripper_left + finger_left + + + + diff --git a/examples/ExampleBrowser/ExampleEntries.cpp b/examples/ExampleBrowser/ExampleEntries.cpp index c5901ca34..977687da3 100644 --- a/examples/ExampleBrowser/ExampleEntries.cpp +++ b/examples/ExampleBrowser/ExampleEntries.cpp @@ -249,6 +249,7 @@ static ExampleEntry gDefaultExamples[]= ExampleEntry(1,"R2D2 Grasp","Load the R2D2 robot from URDF file and control it to grasp objects", R2D2GraspExampleCreateFunc, eROBOTIC_LEARN_GRASP), ExampleEntry(1,"URDF Compliant Contact","Work-in-progress, experiment/improve compliant rigid contact using parameters from URDF file (contact_cfm, contact_erp, lateral_friction, rolling_friction)", R2D2GraspExampleCreateFunc,eROBOTIC_LEARN_COMPLIANT_CONTACT), + ExampleEntry(1,"Contact for Grasp","Grasp experiment to improve contact model", R2D2GraspExampleCreateFunc,eROBOTIC_LEARN_GRASP_CONTACT), diff --git a/examples/ExampleBrowser/OpenGLExampleBrowser.cpp b/examples/ExampleBrowser/OpenGLExampleBrowser.cpp index e06d5f205..68626554c 100644 --- a/examples/ExampleBrowser/OpenGLExampleBrowser.cpp +++ b/examples/ExampleBrowser/OpenGLExampleBrowser.cpp @@ -519,6 +519,8 @@ void MyStatusBarError(const char* msg) gui2->textOutput(msg); gui2->forceUpdateScrollBars(); } + btAssert(0); + } struct MyMenuItemHander :public Gwen::Event::Handler diff --git a/examples/Importers/ImportURDFDemo/URDF2Bullet.cpp b/examples/Importers/ImportURDFDemo/URDF2Bullet.cpp index a64bf44f5..597f1a4d9 100644 --- a/examples/Importers/ImportURDFDemo/URDF2Bullet.cpp +++ b/examples/Importers/ImportURDFDemo/URDF2Bullet.cpp @@ -232,6 +232,13 @@ void ConvertURDF2BulletInternal(const URDFImporterInterface& u2b, MultiBodyCreat if (mass) { compoundShape->calculateLocalInertia(mass, localInertiaDiagonal); + URDFLinkContactInfo contactInfo; + u2b.getLinkContactInfo(urdfLinkIndex,contactInfo); + //temporary inertia scaling until we load inertia from URDF + if (contactInfo.m_flags & URDF_CONTACT_HAS_INERTIA_SCALING) + { + localInertiaDiagonal*=contactInfo.m_inertiaScaling; + } } btRigidBody* linkRigidBody = 0; diff --git a/examples/Importers/ImportURDFDemo/URDFJointTypes.h b/examples/Importers/ImportURDFDemo/URDFJointTypes.h index 65d615ee3..2a6bdfef4 100644 --- a/examples/Importers/ImportURDFDemo/URDFJointTypes.h +++ b/examples/Importers/ImportURDFDemo/URDFJointTypes.h @@ -17,7 +17,8 @@ enum URDF_LinkContactFlags { URDF_CONTACT_HAS_LATERAL_FRICTION=1, URDF_CONTACT_HAS_ROLLING_FRICTION=2, - URDF_CONTACT_HAS_CONTACT_CFM=4, + URDF_CONTACT_HAS_INERTIA_SCALING=2, + URDF_CONTACT_HAS_CONTACT_CFM=4, URDF_CONTACT_HAS_CONTACT_ERP=8 }; @@ -25,6 +26,7 @@ struct URDFLinkContactInfo { btScalar m_lateralFriction; btScalar m_rollingFriction; + btScalar m_inertiaScaling; btScalar m_contactCfm; btScalar m_contactErp; int m_flags; @@ -32,6 +34,7 @@ struct URDFLinkContactInfo URDFLinkContactInfo() :m_lateralFriction(0.5), m_rollingFriction(0), + m_inertiaScaling(1), m_contactCfm(0), m_contactErp(0) { diff --git a/examples/Importers/ImportURDFDemo/UrdfParser.cpp b/examples/Importers/ImportURDFDemo/UrdfParser.cpp index a6a5e256e..3cccbfd35 100644 --- a/examples/Importers/ImportURDFDemo/UrdfParser.cpp +++ b/examples/Importers/ImportURDFDemo/UrdfParser.cpp @@ -606,6 +606,28 @@ bool UrdfParser::parseLink(UrdfModel& model, UrdfLink& link, TiXmlElement *confi TiXmlElement* ci = config->FirstChildElement("contact"); if (ci) { + + TiXmlElement *damping_xml = ci->FirstChildElement("inertia_scaling"); + if (damping_xml) + { + if (m_parseSDF) + { + link.m_contactInfo.m_inertiaScaling = urdfLexicalCast(damping_xml->GetText()); + link.m_contactInfo.m_flags |= URDF_CONTACT_HAS_INERTIA_SCALING; + } else + { + if (!damping_xml->Attribute("value")) + { + logger->reportError("Link/contact: damping element must have value attribute"); + return false; + } + + link.m_contactInfo.m_inertiaScaling = urdfLexicalCast(damping_xml->Attribute("value")); + link.m_contactInfo.m_flags |= URDF_CONTACT_HAS_INERTIA_SCALING; + + } + } + { TiXmlElement *friction_xml = ci->FirstChildElement("lateral_friction"); if (friction_xml) { @@ -623,6 +645,7 @@ bool UrdfParser::parseLink(UrdfModel& model, UrdfLink& link, TiXmlElement *confi link.m_contactInfo.m_lateralFriction = urdfLexicalCast(friction_xml->Attribute("value")); } } + } } } diff --git a/examples/RoboticsLearning/R2D2GraspExample.cpp b/examples/RoboticsLearning/R2D2GraspExample.cpp index 4da5cc22a..f1fc2cbfd 100644 --- a/examples/RoboticsLearning/R2D2GraspExample.cpp +++ b/examples/RoboticsLearning/R2D2GraspExample.cpp @@ -9,11 +9,15 @@ #include "../CommonInterfaces/CommonGUIHelperInterface.h" #include "../SharedMemory/PhysicsServerSharedMemory.h" #include "../SharedMemory/PhysicsClientC_API.h" +#include "../CommonInterfaces/CommonParameterInterface.h" #include #include "b3RobotSimAPI.h" #include "../Utils/b3Clock.h" +static btScalar sGripperVerticalVelocity = -0.2f; +static btScalar sGripperClosingTargetVelocity = 0.5f; + ///quick demo showing the right-handed coordinate system and positive rotations around each axis class R2D2GraspExample : public CommonExampleInterface { @@ -22,7 +26,8 @@ class R2D2GraspExample : public CommonExampleInterface b3RobotSimAPI m_robotSim; int m_options; int m_r2d2Index; - + int m_gripperIndex; + float m_x; float m_y; float m_z; @@ -39,6 +44,7 @@ public: m_guiHelper(helper), m_options(options), m_r2d2Index(-1), + m_gripperIndex(-1), m_x(0), m_y(0), m_z(0) @@ -61,36 +67,9 @@ public: b3Printf("robotSim connected = %d",connected); - if ((m_options & eROBOTIC_LEARN_GRASP)!=0) + if (m_options == eROBOTIC_LEARN_GRASP) { - { - b3RobotSimLoadFileArgs args(""); - args.m_fileName = "r2d2.urdf"; - args.m_startPosition.setValue(0,0,.5); - b3RobotSimLoadFileResults results; - if (m_robotSim.loadFile(args, results) && results.m_uniqueObjectIds.size()==1) - { - int m_r2d2Index = results.m_uniqueObjectIds[0]; - int numJoints = m_robotSim.getNumJoints(m_r2d2Index); - b3Printf("numJoints = %d",numJoints); - - for (int i=0;igetParameterInterface()->registerSliderFloatParameter(slider); + } + + { + SliderParams slider("Closing velocity",&sGripperClosingTargetVelocity + ); + slider.m_minVal=-1; + slider.m_maxVal=1; + m_guiHelper->getParameterInterface()->registerSliderFloatParameter(slider); + } + + + { + b3RobotSimLoadFileArgs args(""); + args.m_fileName = "gripper/wsg50_with_r2d2_gripper.sdf"; + args.m_fileType = B3_SDF_FILE; + b3RobotSimLoadFileResults results; + + if (m_robotSim.loadFile(args, results) && results.m_uniqueObjectIds.size()==1) + { + + m_gripperIndex = results.m_uniqueObjectIds[0]; + int numJoints = m_robotSim.getNumJoints(m_gripperIndex); + b3Printf("numJoints = %d",numJoints); + + for (int i=0;i=0)) + { + int fingerJointIndices[3]={0,1,3}; + double fingerTargetVelocities[3]={sGripperVerticalVelocity,sGripperClosingTargetVelocity + ,-sGripperClosingTargetVelocity + }; + double maxTorqueValues[3]={40.0,50.0,50.0}; + for (int i=0;i<3;i++) + { + b3JointMotorArgs controlArgs(CONTROL_MODE_VELOCITY); + controlArgs.m_targetVelocity = fingerTargetVelocities[i]; + controlArgs.m_maxTorqueValue = maxTorqueValues[i]; + controlArgs.m_kd = 1.; + m_robotSim.setJointMotorControl(m_gripperIndex,fingerJointIndices[i],controlArgs); + } + } m_robotSim.stepSimulation(); } virtual void renderScene() @@ -179,9 +290,9 @@ public: virtual void resetCamera() { - float dist = 3; - float pitch = -75; - float yaw = 30; + float dist = 1.5; + float pitch = 12; + float yaw = -10; float targetPos[3]={-0.2,0.8,0.3}; if (m_app->m_renderer && m_app->m_renderer->getActiveCamera()) { diff --git a/examples/RoboticsLearning/R2D2GraspExample.h b/examples/RoboticsLearning/R2D2GraspExample.h index 353f684e5..10d419269 100644 --- a/examples/RoboticsLearning/R2D2GraspExample.h +++ b/examples/RoboticsLearning/R2D2GraspExample.h @@ -20,6 +20,7 @@ enum RobotLearningExampleOptions { eROBOTIC_LEARN_GRASP=1, eROBOTIC_LEARN_COMPLIANT_CONTACT=2, + eROBOTIC_LEARN_GRASP_CONTACT=3, }; class CommonExampleInterface* R2D2GraspExampleCreateFunc(struct CommonExampleOptions& options); diff --git a/examples/RoboticsLearning/b3RobotSimAPI.cpp b/examples/RoboticsLearning/b3RobotSimAPI.cpp index b29e0e429..ce9f032b7 100644 --- a/examples/RoboticsLearning/b3RobotSimAPI.cpp +++ b/examples/RoboticsLearning/b3RobotSimAPI.cpp @@ -560,6 +560,7 @@ void b3RobotSimAPI::setJointMotorControl(int bodyUniqueId, int jointIndex, const b3JointInfo jointInfo; b3GetJointInfo(m_data->m_physicsClient, bodyUniqueId, jointIndex, &jointInfo); int uIndex = jointInfo.m_uIndex; + b3JointControlSetKd(command,uIndex,args.m_kd); b3JointControlSetDesiredVelocity(command,uIndex,args.m_targetVelocity); b3JointControlSetMaximumForce(command,uIndex,args.m_maxTorqueValue); statusHandle = b3SubmitClientCommandAndWaitStatus(m_data->m_physicsClient, command); @@ -627,6 +628,7 @@ bool b3RobotSimAPI::loadFile(const struct b3RobotSimLoadFileArgs& args, b3RobotS } statusHandle = submitClientCommandAndWaitStatusMultiThreaded(m_data->m_physicsClient, command); statusType = b3GetStatusType(statusHandle); + b3Assert(statusType==CMD_URDF_LOADING_COMPLETED); robotUniqueId = b3GetStatusBodyIndex(statusHandle); results.m_uniqueObjectIds.push_back(robotUniqueId); diff --git a/examples/RoboticsLearning/b3RobotSimAPI.h b/examples/RoboticsLearning/b3RobotSimAPI.h index 98c7e1fa0..3666700d2 100644 --- a/examples/RoboticsLearning/b3RobotSimAPI.h +++ b/examples/RoboticsLearning/b3RobotSimAPI.h @@ -61,7 +61,7 @@ struct b3JointMotorArgs m_targetPosition(0), m_kp(0.1), m_targetVelocity(0), - m_kd(0.1), + m_kd(0.9), m_maxTorqueValue(1000) { } diff --git a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp index 420fe37b6..469c178f8 100644 --- a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp +++ b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp @@ -1216,16 +1216,21 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm } bool completedOk = loadSdf(sdfArgs.m_sdfFileName,bufferServerToClient, bufferSizeInBytes); - - //serverStatusOut.m_type = CMD_SDF_LOADING_FAILED; - serverStatusOut.m_sdfLoadedArgs.m_numBodies = m_data->m_sdfRecentLoadedBodies.size(); - int maxBodies = btMin(MAX_SDF_BODIES, serverStatusOut.m_sdfLoadedArgs.m_numBodies); - for (int i=0;im_sdfRecentLoadedBodies[i]; - } + //serverStatusOut.m_type = CMD_SDF_LOADING_FAILED; + serverStatusOut.m_sdfLoadedArgs.m_numBodies = m_data->m_sdfRecentLoadedBodies.size(); + int maxBodies = btMin(MAX_SDF_BODIES, serverStatusOut.m_sdfLoadedArgs.m_numBodies); + for (int i=0;im_sdfRecentLoadedBodies[i]; + } - serverStatusOut.m_type = CMD_SDF_LOADING_COMPLETED; + serverStatusOut.m_type = CMD_SDF_LOADING_COMPLETED; + } else + { + serverStatusOut.m_type = CMD_SDF_LOADING_FAILED; + } hasStatus = true; break; }