23 #ifndef _ARMARX_LIB_DSController_DSRTController_H
24 #define _ARMARX_LIB_DSController_DSRTController_H
26 #include <VirtualRobot/VirtualRobot.h>
35 #include <armarx/control/ds_controller/DSControllerInterface.h>
54 std::vector<double>
Mu_;
83 std::ifstream infile{fileName};
84 std::string objDefs = {std::istreambuf_iterator<char>(infile),
85 std::istreambuf_iterator<char>()};
87 json->fromString(objDefs);
97 scaling = json->getDouble(
"Scaling");
98 belief = json->getDouble(
"InitBelief");
100 v_max = json->getDouble(
"MaxVelocity");
108 gmm->initGMR(0, 2, 3, 5);
112 ARMARX_ERROR <<
"attractor in json file should be 6 dimension vector ... ";
115 for (
int i = 0; i < 3; ++i)
123 float positionErrorToleranceInMeter)
126 if (PositionError.norm() < positionErrorToleranceInMeter)
128 PositionError.setZero();
132 position_error.Resize(3);
134 for (
int i = 0; i < 3; ++i)
136 position_error(i) = PositionError(i);
140 desired_vel.Resize(3);
141 desired_vel =
gmm->getVelocity(position_error);
143 Eigen::Vector3f tcpDesiredLinearVelocity;
144 tcpDesiredLinearVelocity << desired_vel(0), desired_vel(1), desired_vel(2);
149 float lenVec = tcpDesiredLinearVelocity.norm();
150 if (std::isnan(lenVec))
152 tcpDesiredLinearVelocity.setZero();
157 tcpDesiredLinearVelocity = (
v_max / lenVec) * tcpDesiredLinearVelocity;
192 float positionErrorToleranceInMeter)
198 positionErrorToleranceInMeter);
207 std::vector<float> beliefUpdate;
210 float nullInnerSimilarity = 0;
216 float belief = currentGMM->belief;
217 Eigen::Vector3f OtherTasks =
219 float innerSimilarity = 2 * OtherTasks.dot(currentGMM->currentDesiredVelocity);
220 float outerDisSimilarity =
221 (realVelocity - currentGMM->currentDesiredVelocity).squaredNorm();
223 if (innerSimilarity > nullInnerSimilarity)
225 nullInnerSimilarity = innerSimilarity;
228 beliefUpdate[i] = -outerDisSimilarity - innerSimilarity;
232 float nullOuterSimilarity = realVelocity.squaredNorm();
233 float zeroTaskRawBeliefUpdate = -nullInnerSimilarity - nullOuterSimilarity;
235 if (zeroTaskRawBeliefUpdate < 0.2)
237 zeroTaskRawBeliefUpdate -= 1000;
241 beliefUpdate.insert(beliefUpdate.begin(), zeroTaskRawBeliefUpdate);
243 WinnerTakeAll(beliefUpdate);
283 WinnerTakeAll(std::vector<float>& UpdateBeliefs_)
287 size_t winner_index = 0;
289 for (
size_t i = 1; i < UpdateBeliefs_.size(); i++)
291 if (UpdateBeliefs_[i] > UpdateBeliefs_[winner_index])
299 if (winner_index != 0)
304 if (winner_belief == 1)
309 int runnerUp_index = 0;
311 if (winner_index == 0)
316 for (
size_t i = 0; i < UpdateBeliefs_.size(); i++)
318 if (i == winner_index)
323 if (UpdateBeliefs_[i] > UpdateBeliefs_[runnerUp_index])
329 float offset = 0.5 * (UpdateBeliefs_[winner_index] + UpdateBeliefs_[runnerUp_index]);
331 for (
size_t i = 0; i < UpdateBeliefs_.size(); i++)
333 UpdateBeliefs_[i] -= offset;
338 for (
size_t i = 0; i < UpdateBeliefs_.size(); i++)
346 if (belief != 0 || UpdateBeliefs_[i] > 0)
348 UpdateSum += UpdateBeliefs_[i];
352 UpdateBeliefs_[winner_index] -= UpdateSum;
388 const NJointControllerConfigPtr& config,
394 return "DSRTController";
404 struct DSRTControllerSensorData
409 Eigen::Vector3f linearVelocity;
416 StringFloatDictionary desired_torques;
417 float desiredForce_x;
418 float desiredForce_y;
419 float desiredForce_z;
420 float tcpDesiredTorque_x;
421 float tcpDesiredTorque_y;
422 float tcpDesiredTorque_z;
424 float tcpDesiredAngularError_x;
425 float tcpDesiredAngularError_y;
426 float tcpDesiredAngularError_z;
428 float currentTCPAngularVelocity_x;
429 float currentTCPAngularVelocity_y;
430 float currentTCPAngularVelocity_z;
432 float currentTCPLinearVelocity_x;
433 float currentTCPLinearVelocity_y;
434 float currentTCPLinearVelocity_z;
443 std::vector<const SensorValue1DoFActuatorTorque*> torqueSensors;
444 std::vector<const SensorValue1DoFGravityTorque*> gravityTorqueSensors;
445 std::vector<const SensorValue1DoFActuatorVelocity*> velocitySensors;
446 std::vector<const SensorValue1DoFActuatorPosition*> positionSensors;
448 std::vector<ControlTarget1DoFActuatorTorque*> targets;
451 VirtualRobot::RobotNodePtr tcp;
453 VirtualRobot::DifferentialIKPtr ik;
454 Eigen::MatrixXf jacobip;
455 Eigen::MatrixXf jacobio;
457 Eigen::Vector3f desiredPosition;
460 Eigen::Vector3f oldPosition;
464 Eigen::Vector3f currentTCPLinearVelocity_filtered;
465 Eigen::Vector3f currentTCPAngularVelocity_filtered;
467 float filterTimeConstant;
469 std::vector<std::string> jointNames;
480 float nullspaceDamping;
482 Eigen::VectorXf qnullspace;
484 std::vector<GMMMotionGenPtr> gmmMotionGenList;
488 float positionErrorTolerance;