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);
92 json->getArray<
double>(
"Priors",
gmmParas.Priors_);
93 json->getArray<
double>(
"Mu",
gmmParas.Mu_);
94 json->getArray<
double>(
"attractor",
gmmParas.attractor_);
95 json->getArray<
double>(
"Sigma",
gmmParas.Sigma_);
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();
131 MathLib::Vector position_error;
132 position_error.Resize(3);
134 for (
int i = 0; i < 3; ++i)
136 position_error(i) = PositionError(i);
139 MathLib::Vector desired_vel;
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";
398 void rtRun(
const IceUtil::Time& sensorValuesTimestamp,
399 const IceUtil::Time& timeSinceLastIteration);
404 struct DSRTControllerSensorData
406 Eigen::Matrix4f tcpPose;
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;
462 Eigen::Matrix3f oldOrientation;
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;
boost::shared_ptr< GMRDynamics > GMMPtr
The JSONObject class is used to represent and (de)serialize JSON objects.
NJointControllerWithTripleBuffer(const DSRTControllerControlData &initialCommands=DSRTControllerControlData())
A simple triple buffer for lockfree comunication between a single writer and a single reader.
DSAdaptor(std::vector< GMMMotionGenPtr > gmmMotionGenList, float epsilon)
void updateBelief(const Eigen::Vector3f &realVelocity)
std::vector< GMMMotionGenPtr > gmmMotionGenList
Eigen::Vector3f totalDesiredVelocity
void updateDesiredVelocity(const Eigen::Vector3f ¤tPositionInMeter, float positionErrorToleranceInMeter)
Eigen::Vector3f tcpDesiredAngularError
Eigen::Vector3f tcpDesiredLinearVelocity
void onDisconnectNJointController()
void rtPreActivateController()
This function is called before the controller is activated.
void rtRun(const IceUtil::Time &sensorValuesTimestamp, const IceUtil::Time &timeSinceLastIteration)
TODO make protected and use attorneys.
void rtPostDeactivateController()
This function is called after the controller is deactivated.
std::string getClassName(const Ice::Current &) const
DSControllerConfigPtr ConfigPtrT
DSRTController(const RobotUnitPtr &robotUnit, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &)
void onInitNJointController()
void onPublish(const SensorAndControl &, const DebugDrawerInterfacePrx &, const DebugObserverInterfacePrx &)
Eigen::Vector3f currentDesiredVelocity
GMMMotionGen(const std::string &fileName)
void getGMMParamsFromJsonFile(const std::string &fileName)
void updateDesiredVelocity(const Eigen::Vector3f ¤tPositionInMeter, float positionErrorToleranceInMeter)
Eigen::Vector3f desiredDefaultTarget
Brief description of class targets.
#define ARMARX_INFO
The normal logging level.
#define ARMARX_ERROR
The logging level for unexpected behaviour, that must be fixed.
Quaternion< float, 0 > Quaternionf
std::shared_ptr< class Robot > RobotPtr
boost::shared_ptr< GMMMotionGen > GMMMotionGenPtr
boost::shared_ptr< DSAdaptor > DSAdaptorPtr
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugObserverInterface > DebugObserverInterfacePrx
IceInternal::Handle< JSONObject > JSONObjectPtr
IceUtil::Handle< class RobotUnit > RobotUnitPtr
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugDrawerInterface > DebugDrawerInterfacePrx
detail::ControlThreadOutputBufferEntry SensorAndControl
std::vector< double > Priors_
std::vector< double > attractor_
std::vector< double > Mu_
std::vector< double > Sigma_