diff --git a/build/.gitkeep b/build/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointAdaptiveWipingController.cpp b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointAdaptiveWipingController.cpp index d19f4e5856fd718aae44d98650d787c8d7efead8..a58e3ae3d5c744361586df189993a26c5ee3d3ad 100644 --- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointAdaptiveWipingController.cpp +++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointAdaptiveWipingController.cpp @@ -267,6 +267,8 @@ namespace armarx Eigen::VectorXf currentTwist = jacobi * qvel_filtered; Eigen::VectorXf targetVel(6); + Eigen::Vector3f axis; + axis.setZero(); targetVel.setZero(); if (firstRun || !dmpRunning) { @@ -340,20 +342,40 @@ namespace armarx if (filteredForceInRoot.norm() > fabs(cfg->minimumReactForce)) { - Eigen::Vector3f desiredToolDir = filteredForceInRoot.normalized();// / filteredForceInRoot.norm(); + Eigen::Vector3f toolYDir; + toolYDir << 0, 1.0, 0; + Eigen::Vector3f toolYDirInRoot = currentToolOri * toolYDir; + Eigen::Vector3f projectedFilteredForceInRoot = filteredForceInRoot - filteredForceInRoot.dot(toolYDirInRoot) * toolYDirInRoot; + Eigen::Vector3f desiredToolDir = projectedFilteredForceInRoot.normalized();// / projectedFilteredForceInRoot.norm(); currentToolDir.normalize(); - Eigen::Vector3f axis = currentToolDir.cross(desiredToolDir); + axis = currentToolDir.cross(desiredToolDir); + axis = axis.normalized(); float angle = acosf(currentToolDir.dot(desiredToolDir)); + if (fabs(angle) < M_PI / 2) { - Eigen::AngleAxisf desiredToolRot(angle, axis); + // sigmoid function + float adaptedAngularKp = 1 / (1 + exp(0.2 * (angle - M_PI / 4))); + float angularKp = fmin(adaptedAngularKp, cfg->angularKp); + + // test axis + Eigen::Vector3f fixedAxis; + if (axis(1) > 0) + { + fixedAxis << 0.0, 1.0, 0.0; + } + else + { + fixedAxis << 0.0, -1.0, 0.0; + } + Eigen::AngleAxisf desiredToolRot(angle, fixedAxis); Eigen::Matrix3f desiredRotMat = desiredToolRot * Eigen::Matrix3f::Identity(); Eigen::Vector3f angularDiff = VirtualRobot::MathTools::eigen3f2rpy(desiredRotMat); - targetVel.tail(3) = cfg->angularKp * angularDiff; + targetVel.tail(3) = angularKp * angularDiff; Eigen::Vector3f desiredRPY = VirtualRobot::MathTools::eigen3f2rpy(desiredRotMat); Eigen::Vector3f checkedToolDir = desiredRotMat * currentToolDir; @@ -443,6 +465,7 @@ namespace armarx debugRT.getWriteBuffer().globalPose = tcp->getRobot()->getRootNode()->toGlobalCoordinateSystem(targetPose); debugRT.getWriteBuffer().currentPose = currentPose; debugRT.getWriteBuffer().filteredForceInRoot = filteredForceInRoot; + debugRT.getWriteBuffer().rotationAxis = axis; debugRT.getWriteBuffer().filteredForce = filteredForce; debugRT.getWriteBuffer().globalFilteredForce = tcp->getRobot()->getRootNode()->toGlobalCoordinateSystemVec(filteredForceInRoot); debugRT.getWriteBuffer().targetVel = targetVel; @@ -623,6 +646,11 @@ namespace armarx datafields["filteredForceInRoot_y"] = new Variant(filteredForceInRoot(1)); datafields["filteredForceInRoot_z"] = new Variant(filteredForceInRoot(2)); + Eigen::Vector3f rotationAxis = debugRT.getUpToDateReadBuffer().rotationAxis; + datafields["rotationAxis_x"] = new Variant(rotationAxis(0)); + datafields["rotationAxis_y"] = new Variant(rotationAxis(1)); + datafields["rotationAxis_z"] = new Variant(rotationAxis(2)); + Eigen::Vector3f reactForce = debugRT.getUpToDateReadBuffer().reactForce; datafields["reactForce_x"] = new Variant(reactForce(0)); datafields["reactForce_y"] = new Variant(reactForce(1)); @@ -632,6 +660,9 @@ namespace armarx datafields["targetVel_x"] = new Variant(targetVel(0)); datafields["targetVel_y"] = new Variant(targetVel(1)); datafields["targetVel_z"] = new Variant(targetVel(2)); + datafields["targetVel_ro"] = new Variant(targetVel(3)); + datafields["targetVel_pi"] = new Variant(targetVel(4)); + datafields["targetVel_ya"] = new Variant(targetVel(5)); Eigen::Vector3f adaptK = debugRT.getUpToDateReadBuffer().adaptK; datafields["adaptK_x"] = new Variant(adaptK(0)); diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointAdaptiveWipingController.h b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointAdaptiveWipingController.h index 9bfd26e64ad5551f5997634189034bd158e9b43e..9c2b8d01dba640034c979eeba24d98a9e3292106 100644 --- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointAdaptiveWipingController.h +++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointAdaptiveWipingController.h @@ -109,6 +109,7 @@ namespace armarx Eigen::Matrix4f targetPose; Eigen::Vector3f filteredForce; Eigen::Vector3f filteredForceInRoot; + Eigen::Vector3f rotationAxis; Eigen::Vector3f reactForce; Eigen::Vector3f adaptK;