NJointBimanualDMPForceController.h
Go to the documentation of this file.
1 
2 #pragma once
3 
4 #include <VirtualRobot/VirtualRobot.h>
5 
8 
11 
13 #include <armarx/control/deprecated_njoint_mp_controller/adaptive/ControllerInterface.h>
14 #include <armarx/control/deprecated_njoint_mp_controller/bimanual/ControllerInterface.h>
15 
16 namespace armarx
17 {
18  class SensorValue1DoFActuatorTorque;
19  class SensorValue1DoFActuatorVelocity;
20  class SensorValue1DoFActuatorPosition;
21  class SensorValue1DoFActuatorAcceleration;
22  class ControlTarget1DoFActuatorTorque;
23  class SensorValueForceTorque;
24 } // namespace armarx
25 
26 namespace armarx
27 {
28  TYPEDEF_PTRS_HANDLE(NJointBimanualCCDMPController);
29  TYPEDEF_PTRS_HANDLE(NJointBimanualCCDMPControllerControlData);
30 
31  using ViaPoint = std::pair<double, DMP::DVec>;
32  using ViaPointsSet = std::vector<ViaPoint>;
33 
35  {
36  public:
37  Eigen::VectorXf leftTargetVel;
38  Eigen::VectorXf rightTargetVel;
39 
42  };
43 
45  public NJointControllerWithTripleBuffer<NJointBimanualCCDMPControllerControlData>,
47  {
48  public:
49  using ConfigPtrT = NJointBimanualCCDMPControllerConfigPtr;
50  NJointBimanualCCDMPController(NJointControllerDescriptionProviderInterfacePtr prov,
51  const NJointControllerConfigPtr& config,
52  const VirtualRobot::RobotPtr&);
53 
54  // NJointControllerInterface interface
55  std::string getClassName(const Ice::Current&) const;
56 
57  // NJointController interface
58 
59  void rtRun(const IceUtil::Time& sensorValuesTimestamp,
60  const IceUtil::Time& timeSinceLastIteration);
61 
62  // NJointBimanualCCDMPControllerInterface interface
63  void learnDMPFromFiles(const std::string&, const Ice::StringSeq&, const Ice::Current&);
64 
65  bool
66  isFinished(const Ice::Current&)
67  {
68  return false;
69  }
70 
71  void runDMP(const Ice::DoubleSeq& leftGoals,
72  const Ice::DoubleSeq& rightGoals,
73  const Ice::Current&);
74  void setViaPoints(Ice::Double u, const Ice::DoubleSeq& viapoint, const Ice::Current&);
75  void setGoals(const Ice::DoubleSeq& goals, const Ice::Current&);
76 
77  void changeLeader(const Ice::Current&);
78 
79  double
80  getVirtualTime(const Ice::Current&)
81  {
82  return virtualtimer;
83  }
84 
85  std::string
86  getLeaderName(const Ice::Current&)
87  {
88  return leaderName;
89  }
90 
91  protected:
92  virtual void onPublish(const SensorAndControl&,
95 
96  void onInitComponent();
97  void onDisconnectComponent();
98  void controllerRun();
99 
100  private:
101  Eigen::VectorXf getControlWrench(const Eigen::VectorXf& twist,
102  const Eigen::Matrix4f& currentPose,
103  const Eigen::Matrix4f& targetPose);
104 
105  Eigen::Matrix4f getLocalPose(const Eigen::Matrix4f& newCoordinate,
106  const Eigen::Matrix4f& globalTargetPose);
107 
109  getLocalPose(const std::vector<double>& newCoordinateVec,
110  const std::vector<double>& globalTargetPoseVec)
111  {
112  Eigen::Matrix4f newCoordinate =
113  VirtualRobot::MathTools::quat2eigen4f(newCoordinateVec.at(4),
114  newCoordinateVec.at(5),
115  newCoordinateVec.at(6),
116  newCoordinateVec.at(3));
117  newCoordinate(0, 3) = newCoordinateVec.at(0);
118  newCoordinate(1, 3) = newCoordinateVec.at(1);
119  newCoordinate(2, 3) = newCoordinateVec.at(2);
120 
121  Eigen::Matrix4f globalTargetPose =
122  VirtualRobot::MathTools::quat2eigen4f(globalTargetPoseVec.at(4),
123  globalTargetPoseVec.at(5),
124  globalTargetPoseVec.at(6),
125  globalTargetPoseVec.at(3));
126  globalTargetPose(0, 3) = globalTargetPoseVec.at(0);
127  globalTargetPose(1, 3) = globalTargetPoseVec.at(1);
128  globalTargetPose(2, 3) = globalTargetPoseVec.at(2);
129 
130  return getLocalPose(newCoordinate, globalTargetPose);
131  }
132 
133  struct DebugBufferData
134  {
135  StringFloatDictionary desired_torques;
136  StringFloatDictionary constrained_force;
137  float leftTargetPose_x;
138  float leftTargetPose_y;
139  float leftTargetPose_z;
140  float rightTargetPose_x;
141  float rightTargetPose_y;
142  float rightTargetPose_z;
143 
144  float leftCurrentPose_x;
145  float leftCurrentPose_y;
146  float leftCurrentPose_z;
147  float rightCurrentPose_x;
148  float rightCurrentPose_y;
149  float rightCurrentPose_z;
150 
151  // StringFloatDictionary latestTargetVelocities;
152  // StringFloatDictionary dmpTargets;
153  // StringFloatDictionary currentPose;
154 
155  // double leadermpcFactor;
156  // double leadererror;
157  // double leaderposError;
158  // double leaderoriError;
159  // double leaderCanVal;
160 
161  // double followermpcFactor;
162  // double followererror;
163  // double followerposError;
164  // double followeroriError;
165  // double followerCanVal;
166  };
167 
168  TripleBuffer<DebugBufferData> debugDataInfo;
169 
170  struct NJointBimanualCCDMPControllerSensorData
171  {
172  double currentTime;
173  double deltaT;
174  Eigen::Matrix4f currentLeftPose;
175  Eigen::Matrix4f currentRightPose;
176  Eigen::VectorXf currentLeftTwist;
177  Eigen::VectorXf currentRightTwist;
178  };
179 
180  TripleBuffer<NJointBimanualCCDMPControllerSensorData> controllerSensorData;
181 
182 
183  std::vector<ControlTarget1DoFActuatorTorque*> leftTargets;
184  std::vector<const SensorValue1DoFActuatorAcceleration*> leftAccelerationSensors;
185  std::vector<const SensorValue1DoFActuatorVelocity*> leftVelocitySensors;
186  std::vector<const SensorValue1DoFActuatorPosition*> leftPositionSensors;
187 
188  std::vector<ControlTarget1DoFActuatorTorque*> rightTargets;
189  std::vector<const SensorValue1DoFActuatorAcceleration*> rightAccelerationSensors;
190  std::vector<const SensorValue1DoFActuatorVelocity*> rightVelocitySensors;
191  std::vector<const SensorValue1DoFActuatorPosition*> rightPositionSensors;
192 
193  const SensorValueForceTorque* rightForceTorque;
194  const SensorValueForceTorque* leftForceTorque;
195 
196  NJointBimanualCCDMPControllerConfigPtr cfg;
197  VirtualRobot::DifferentialIKPtr leftIK;
198  VirtualRobot::DifferentialIKPtr rightIK;
199 
200  std::vector<TaskSpaceDMPControllerPtr> leftGroup;
201  std::vector<TaskSpaceDMPControllerPtr> rightGroup;
202  std::vector<TaskSpaceDMPControllerPtr> bothLeaderGroup;
203 
204 
205  std::string leaderName;
206 
207  VirtualRobot::RobotNodePtr tcpLeft;
208  VirtualRobot::RobotNodePtr tcpRight;
209 
210  double virtualtimer;
211 
212  mutable MutexType controllerMutex;
214 
215  Eigen::VectorXf leftDesiredJointValues;
216  Eigen::VectorXf rightDesiredJointValues;
217 
218  float KoriFollower;
219  float KposFollower;
220  float DposFollower;
221  float DoriFollower;
222 
223  Eigen::VectorXf forceC_des;
224  float boxWidth;
225 
226  Eigen::Vector3f kpos;
227  Eigen::Vector3f kori;
228  Eigen::Vector3f dpos;
229  Eigen::Vector3f dori;
230  Eigen::VectorXf kpf;
231  Eigen::VectorXf kif;
232 
233  float knull;
234  float dnull;
235 
236  std::vector<std::string> leftJointNames;
237  std::vector<std::string> rightJointNames;
238 
239  float torqueLimit;
240  VirtualRobot::RobotNodeSetPtr leftRNS;
241  VirtualRobot::RobotNodeSetPtr rightRNS;
242  VirtualRobot::RobotNodeSetPtr rnsLeftBody;
243  VirtualRobot::RobotNodeSetPtr rnsRightBody;
244 
245  Eigen::Vector3f filtered_leftForce;
246  Eigen::Vector3f filtered_leftTorque;
247  Eigen::Vector3f filtered_rightForce;
248  Eigen::Vector3f filtered_rightTorque;
249  float filterTimeConstant;
250 
251  std::vector<PIDControllerPtr> ftPIDController;
252 
253  Eigen::Vector3f offset_leftForce;
254  Eigen::Vector3f offset_leftTorque;
255  Eigen::Vector3f offset_rightForce;
256  Eigen::Vector3f offset_rightTorque;
257 
258  bool isForceCompensateDone;
259 
260  // NJointBimanualCCDMPControllerInterface interface
261  };
262 
263 } // namespace armarx
armarx::NJointBimanualCCDMPController::learnDMPFromFiles
void learnDMPFromFiles(const std::string &, const Ice::StringSeq &, const Ice::Current &)
Definition: NJointBimanualDMPForceController.cpp:997
NJointControllerWithTripleBuffer.h
armarx::NJointBimanualCCDMPControllerControlData
Definition: NJointBimanualDMPForceController.h:34
armarx::TYPEDEF_PTRS_HANDLE
TYPEDEF_PTRS_HANDLE(NJointCartesianNaturalPositionController)
armarx::NJointControllerWithTripleBuffer
Definition: NJointControllerWithTripleBuffer.h:10
GfxTL::Matrix4f
MatrixXX< 4, 4, float > Matrix4f
Definition: MatrixXX.h:650
armarx::NJointBimanualCCDMPControllerControlData::leftTargetPose
Eigen::Matrix4f leftTargetPose
Definition: NJointBimanualDMPForceController.h:40
armarx::NJointBimanualCCDMPController::setViaPoints
void setViaPoints(Ice::Double u, const Ice::DoubleSeq &viapoint, const Ice::Current &)
Definition: NJointBimanualDMPForceController.cpp:1020
armarx::NJointBimanualCCDMPControllerControlData::leftTargetVel
Eigen::VectorXf leftTargetVel
Definition: NJointBimanualDMPForceController.h:37
armarx::NJointBimanualCCDMPControllerInterface::changeLeader
void changeLeader()
PeriodicTask.h
armarx::NJointControllerBase::ConfigPtrT
NJointControllerConfigPtr ConfigPtrT
Definition: NJointControllerBase.h:587
armarx::NJointBimanualCCDMPController::rtRun
void rtRun(const IceUtil::Time &sensorValuesTimestamp, const IceUtil::Time &timeSinceLastIteration)
TODO make protected and use attorneys.
Definition: NJointBimanualDMPForceController.cpp:513
armarx::NJointBimanualCCDMPController::runDMP
void runDMP(const Ice::DoubleSeq &leftGoals, const Ice::DoubleSeq &rightGoals, const Ice::Current &)
Definition: NJointBimanualDMPForceController.cpp:1069
armarx::NJointBimanualCCDMPController::getVirtualTime
double getVirtualTime(const Ice::Current &)
Definition: NJointBimanualDMPForceController.h:80
armarx::NJointBimanualCCDMPController::isFinished
bool isFinished(const Ice::Current &)
Definition: NJointBimanualDMPForceController.h:66
armarx::NJointBimanualCCDMPController::NJointBimanualCCDMPController
NJointBimanualCCDMPController(NJointControllerDescriptionProviderInterfacePtr prov, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &)
armarx::NJointBimanualCCDMPController
Definition: NJointBimanualDMPForceController.h:44
armarx::PeriodicTask::pointer_type
IceUtil::Handle< PeriodicTask< T > > pointer_type
Shared pointer type for convenience.
Definition: PeriodicTask.h:68
armarx::NJointBimanualCCDMPController::getLeaderName
std::string getLeaderName(const Ice::Current &)
Definition: NJointBimanualDMPForceController.h:86
armarx::NJointBimanualCCDMPController::onDisconnectComponent
void onDisconnectComponent()
Definition: NJointBimanualDMPForceController.cpp:1196
armarx::detail::ControlThreadOutputBufferEntry
Definition: ControlThreadOutputBuffer.h:182
armarx::VariantType::Double
const VariantTypeId Double
Definition: Variant.h:920
armarx::NJointBimanualCCDMPController::onInitComponent
void onInitComponent()
Definition: NJointBimanualDMPForceController.cpp:1188
armarx::NJointBimanualCCDMPController::setGoals
void setGoals(const Ice::DoubleSeq &goals, const Ice::Current &)
Definition: NJointBimanualDMPForceController.cpp:1036
armarx::NJointBimanualCCDMPController::getClassName
std::string getClassName(const Ice::Current &) const
Definition: NJointBimanualDMPForceController.cpp:261
armarx::NJointBimanualCCDMPControllerInterface
Definition: ControllerInterface.ice:85
armarx::armem::Time
armarx::core::time::DateTime Time
Definition: forward_declarations.h:13
TaskSpaceVMP.h
CycleUtil.h
armarx::NJointBimanualCCDMPController::controllerRun
void controllerRun()
Definition: NJointBimanualDMPForceController.cpp:267
PIDController.h
armarx::ViaPointsSet
std::vector< ViaPoint > ViaPointsSet
Definition: NJointBimanualDMPForceController.h:32
armarx::NJointControllerWithTripleBuffer< NJointBimanualCCDMPControllerControlData >::MutexType
std::recursive_mutex MutexType
Definition: NJointControllerWithTripleBuffer.h:13
armarx::ViaPoint
std::pair< double, DMP::DVec > ViaPoint
Definition: NJointBimanualDMPForceController.h:31
IceInternal::ProxyHandle<::IceProxy::armarx::DebugDrawerInterface >
armarx::NJointBimanualCCDMPController::onPublish
virtual void onPublish(const SensorAndControl &, const DebugDrawerInterfacePrx &, const DebugObserverInterfacePrx &)
Definition: NJointBimanualDMPForceController.cpp:1107
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27
armarx::NJointBimanualCCDMPControllerControlData::rightTargetPose
Eigen::Matrix4f rightTargetPose
Definition: NJointBimanualDMPForceController.h:41
VirtualRobot::RobotPtr
std::shared_ptr< class Robot > RobotPtr
Definition: Bus.h:19
armarx::NJointBimanualCCDMPControllerControlData::rightTargetVel
Eigen::VectorXf rightTargetVel
Definition: NJointBimanualDMPForceController.h:38