NJointBimanualObjLevelMultiMPController.h
Go to the documentation of this file.
1#pragma once
2
3#include <VirtualRobot/VirtualRobot.h>
4
7
9#include <armarx/control/deprecated_njoint_mp_controller/bimanual/ObjLevelControllerInterface.h>
10
11namespace armarx
12{
13 class SensorValue1DoFActuatorTorque;
14 class SensorValue1DoFActuatorVelocity;
15 class SensorValue1DoFActuatorPosition;
16 class SensorValue1DoFActuatorAcceleration;
17 class ControlTarget1DoFActuatorTorque;
19} // namespace armarx
20
22{
23 namespace tsvmp = armarx::control::deprecated_njoint_mp_controller::tsvmp;
24
27
29 {
30 public:
31 // control target from Movement Primitives
32 Eigen::Matrix4f objTargetPose;
33 Eigen::VectorXf objTargetTwist;
34
35 Eigen::Matrix4f leftTargetPoseInObj;
36 Eigen::VectorXf leftTargetTwistInObj;
37
38 Eigen::Matrix4f rightTargetPoseInObj;
39 Eigen::VectorXf rightTargetTwistInObj;
40 };
41
43 public NJointControllerWithTripleBuffer<NJointBimanualObjLevelMultiMPControlData>,
45 {
46 public:
47 // using ConfigPtrT = BimanualForceControllerConfigPtr;
49 const NJointControllerConfigPtr& config,
51
52 // NJointControllerInterface interface
53 std::string getClassName(const Ice::Current&) const;
54
55 // NJointController interface
56
57 void rtRun(const IceUtil::Time& sensorValuesTimestamp,
58 const IceUtil::Time& timeSinceLastIteration);
59
60 // NJointCCDMPControllerInterface interface
61 void learnDMPFromFiles(const Ice::StringSeq& fileNames, const Ice::Current&);
62 void learnMultiDMPFromFiles(const Ice::StringSeq& objFileNames,
63 const Ice::StringSeq& leftFileNames,
64 const Ice::StringSeq& rightFileNames,
65 const Ice::Current&);
66
67 bool
68 isFinished(const Ice::Current&)
69 {
70 return finished;
71 }
72
73 Eigen::Matrix3f
74 skew(Eigen::Vector3f vec)
75 {
76 Eigen::Matrix3f mat = Eigen::MatrixXf::Zero(3, 3);
77 mat(1, 2) = -vec(0);
78 mat(0, 2) = vec(1);
79 mat(0, 1) = -vec(2);
80 mat(2, 1) = vec(0);
81 mat(2, 0) = -vec(1);
82 mat(1, 0) = vec(2);
83 return mat;
84 }
85
86 // void runDMP(const Ice::DoubleSeq& goals, Ice::Double tau, const Ice::Current&);
87 void runDMP(const Ice::DoubleSeq& goalObj,
88 const Ice::DoubleSeq& goalLeft,
89 const Ice::DoubleSeq& goalRight,
90 Ice::Double timeDuration,
91 const Ice::Current&);
92 void runDMPWithVirtualStart(const Ice::DoubleSeq& starts,
93 const Ice::DoubleSeq& goals,
94 Ice::Double timeDuration,
95 const Ice::Current&);
96
97 void setGoals(const Ice::DoubleSeq& goals, const Ice::Current&);
98 void setMultiMPGoals(const Ice::DoubleSeq& goalObj,
99 const Ice::DoubleSeq& goalLeft,
100 const Ice::DoubleSeq& goalRight,
101 const Ice::Current& ice);
102
103 void setViaPoints(Ice::Double u, const Ice::DoubleSeq& viapoint, const Ice::Current&);
104 void removeAllViaPoints(const Ice::Current&);
105
106 double
107 getVirtualTime(const Ice::Current&)
108 {
109 return virtualtimer;
110 }
111
112 void setKpImpedance(const Ice::FloatSeq& value, const Ice::Current&);
113 void setKdImpedance(const Ice::FloatSeq& value, const Ice::Current&);
114 void setKmAdmittance(const Ice::FloatSeq& value, const Ice::Current&);
115 void setKpAdmittance(const Ice::FloatSeq& value, const Ice::Current&);
116 void setKdAdmittance(const Ice::FloatSeq& value, const Ice::Current&);
117
118 std::vector<float> getCurrentObjVel(const Ice::Current&);
119 std::vector<float> getCurrentObjForce(const Ice::Current&);
120
121 void getObjStatus(Eigen::Matrix4f& pose, Eigen::VectorXf& twist);
122 std::vector<double> eigenPose2Vec(const Eigen::Matrix4f& pose);
123 Eigen::VectorXf eigenPose2EigenVec(const Eigen::Matrix4f& pose);
124 Eigen::Matrix4f getLocalPose(const Eigen::Matrix4f& newCoordinate,
125 const Eigen::Matrix4f& globalTargetPose);
126 Eigen::Matrix4f getLocalPose(const std::vector<double>& newCoordinateVec,
127 const std::vector<double>& globalTargetPoseVec);
128 void integrateVel2Pose(const double deltaT, Eigen::VectorXf& vel, Eigen::Matrix4f& pose);
129 void publishVec(const Eigen::VectorXf& bufferVec,
130 const std::string name,
131 StringVariantBaseMap& datafields);
132 void setAmplitude(Ice::Double amp, const Ice::Current&);
133
134 protected:
135 virtual void onPublish(const SensorAndControl&,
138
141 void controllerRun();
142
143 private:
144 Eigen::VectorXf targetWrench;
145
146 struct RT2DebugData
147 {
148 StringFloatDictionary desired_torques;
149
150 // dmp targets
151 Eigen::VectorXf objTargetPoseVec;
152 Eigen::VectorXf leftPoseVecInObj;
153 Eigen::VectorXf rightPoseVecInObj;
154 Eigen::VectorXf objTargetTwist;
155
156 // hand poses
157 Eigen::VectorXf targetHandPoseInRootLeft;
158 Eigen::VectorXf targetHandPoseInRootRight;
159 Eigen::VectorXf currentHandPoseInRootLeft;
160 Eigen::VectorXf currentHandPoseInRootRight;
161
162 // object pose, vel and force torque
163 Eigen::VectorXf objForceTorque;
164 Eigen::VectorXf objPoseVec;
165 Eigen::VectorXf objCurrentTwist;
166
167 // virtual pose, vel, acc
168 Eigen::VectorXf virtualPoseVec;
169 Eigen::VectorXf virtualVel;
170 Eigen::VectorXf virtualAcc;
171
172 // integrated pose
173 Eigen::VectorXf integratedPoseObjVec;
174 Eigen::VectorXf integratedPoseLeftVec;
175 Eigen::VectorXf integratedPoseRightVec;
176
177 Eigen::VectorXf poseError;
178
179 // force
180 Eigen::VectorXf forceImpedance;
181 Eigen::VectorXf forcePID;
182 Eigen::VectorXf forcePIDControlValue;
183 Eigen::VectorXf forceTorqueMeasurementInRoot;
184
185 // parameters
186 Eigen::VectorXf KpImpedance;
187 Eigen::VectorXf KdImpedance;
188 Eigen::VectorXf KpAdmittance;
189 Eigen::VectorXf KdAdmittance;
190 Eigen::VectorXf KmAdmittance;
191 Eigen::VectorXf KmPID;
192 };
193
194 TripleBuffer<RT2DebugData> rt2DebugBuffer;
195
196 struct RT2ControlData
197 {
198 double currentTime;
199 double deltaT;
200 Eigen::Matrix4f currentPoseObj;
201 Eigen::VectorXf currentTwistObj;
202
203 Eigen::Matrix4f currentPoseLeftInObj;
204 Eigen::VectorXf currentTwistLeftInObj;
205
206 Eigen::Matrix4f currentPoseRightInObj;
207 Eigen::VectorXf currentTwistRightInObj;
208 };
209
210 TripleBuffer<RT2ControlData> rt2ControlBuffer;
211
212 struct RT2InterfaceData
213 {
214 Eigen::Matrix4f currentLeftPoseInObjFrame;
215 Eigen::Matrix4f currentRightPoseInObjFrame;
216 Eigen::Matrix4f currentObjPose;
217 Eigen::Vector3f currentObjVel;
218 Eigen::Vector3f currentObjForce;
219 };
220
221 TripleBuffer<RT2InterfaceData> rt2InterfaceBuffer;
222
223 struct Inferface2rtData
224 {
225 Eigen::VectorXf KpImpedance;
226 Eigen::VectorXf KdImpedance;
227 Eigen::VectorXf KmAdmittance;
228 Eigen::VectorXf KpAdmittance;
229 Eigen::VectorXf KdAdmittance;
230 };
231
232 TripleBuffer<Inferface2rtData> interface2rtBuffer;
233
234
235 std::vector<ControlTarget1DoFActuatorTorque*> leftTargets;
236 std::vector<const SensorValue1DoFActuatorAcceleration*> leftAccelerationSensors;
237 std::vector<const SensorValue1DoFActuatorVelocity*> leftVelocitySensors;
238 std::vector<const SensorValue1DoFActuatorPosition*> leftPositionSensors;
239
240 std::vector<ControlTarget1DoFActuatorTorque*> rightTargets;
241 std::vector<const SensorValue1DoFActuatorAcceleration*> rightAccelerationSensors;
242 std::vector<const SensorValue1DoFActuatorVelocity*> rightVelocitySensors;
243 std::vector<const SensorValue1DoFActuatorPosition*> rightPositionSensors;
244
245 const SensorValueForceTorque* rightForceTorque;
246 const SensorValueForceTorque* leftForceTorque;
247
248 NJointBimanualObjLevelMultiMPControllerConfigPtr cfg;
249 VirtualRobot::DifferentialIKPtr leftIK;
250 VirtualRobot::DifferentialIKPtr rightIK;
251
253 tsvmp::TaskSpaceDMPControllerPtr leftTCPInObjDMP;
254 tsvmp::TaskSpaceDMPControllerPtr rightTCPInObjDMP;
255
256 Eigen::Matrix4f objInitialPose; // in root frame
257 Eigen::Matrix4f leftInitialPose; // in obj frame
258 Eigen::Matrix4f rightInitialPose; // in obj frame
259
260 // add integrated pose by accumulating dmp target velocity to initial pose
261 Eigen::Matrix4f integratedPoseObj;
262 Eigen::Matrix4f integratedPoseLeft;
263 Eigen::Matrix4f integratedPoseRight;
264
265 Eigen::Matrix4f objTransMatrixInAnchor;
266
267 double virtualtimer;
268
269 mutable MutexType controllerMutex;
270 mutable MutexType interfaceDataMutex;
271 Eigen::VectorXf leftDesiredJointValues;
272 Eigen::VectorXf rightDesiredJointValues;
273
274 Eigen::VectorXf KpImpedance;
275 Eigen::VectorXf KdImpedance;
276 Eigen::VectorXf KpAdmittance;
277 Eigen::VectorXf KdAdmittance;
278 Eigen::VectorXf KmAdmittance;
279 Eigen::VectorXf KmPID;
280
281 Eigen::VectorXf virtualAcc;
282 Eigen::VectorXf virtualVel;
283 Eigen::Matrix4f virtualPose;
284
285 Eigen::Matrix4f sensorFrame2TcpFrameLeft;
286 Eigen::Matrix4f sensorFrame2TcpFrameRight;
287
288 //static compensation
289 float massLeft;
290 Eigen::Vector3f CoMVecLeft;
291 Eigen::Vector3f forceOffsetLeft;
292 Eigen::Vector3f torqueOffsetLeft;
293
294 float massRight;
295 Eigen::Vector3f CoMVecRight;
296 Eigen::Vector3f forceOffsetRight;
297 Eigen::Vector3f torqueOffsetRight;
298
299 // float knull;
300 // float dnull;
301
302 std::vector<std::string> leftJointNames;
303 std::vector<std::string> rightJointNames;
304
305 // float torqueLimit;
306 VirtualRobot::RobotNodeSetPtr leftRNS;
307 VirtualRobot::RobotNodeSetPtr rightRNS;
308 VirtualRobot::RobotNodePtr tcpLeft;
309 VirtualRobot::RobotNodePtr tcpRight;
310
311 std::vector<PIDControllerPtr> forcePIDControllers;
312
313 // filter parameters
314 float filterCoeff;
315 Eigen::VectorXf filteredOldValue;
316 bool finished;
317 bool dmpStarted;
318 double ftcalibrationTimer;
319 Eigen::VectorXf ftOffset;
320
321 Eigen::Matrix3f fixedLeftRightRotOffset;
322 Eigen::Vector3f objCom2TCPLeftInObjFrame, objCom2TCPRightInObjFrame;
323
324 protected:
327 };
328
329} // namespace armarx::control::deprecated_njoint_mp_controller::bimanual
#define TYPEDEF_PTRS_HANDLE(T)
NJointControllerWithTripleBuffer(const NJointBimanualObjLevelMultiMPControlData &initialCommands=NJointBimanualObjLevelMultiMPControlData())
A simple triple buffer for lockfree comunication between a single writer and a single reader.
Eigen::Matrix4f getLocalPose(const Eigen::Matrix4f &newCoordinate, const Eigen::Matrix4f &globalTargetPose)
void runDMP(const Ice::DoubleSeq &goalObj, const Ice::DoubleSeq &goalLeft, const Ice::DoubleSeq &goalRight, Ice::Double timeDuration, const Ice::Current &)
NJointBimanualObjLevelMultiMPController(const RobotUnitPtr &, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &)
void runDMPWithVirtualStart(const Ice::DoubleSeq &starts, const Ice::DoubleSeq &goals, Ice::Double timeDuration, const Ice::Current &)
void rtRun(const IceUtil::Time &sensorValuesTimestamp, const IceUtil::Time &timeSinceLastIteration)
TODO make protected and use attorneys.
void setMultiMPGoals(const Ice::DoubleSeq &goalObj, const Ice::DoubleSeq &goalLeft, const Ice::DoubleSeq &goalRight, const Ice::Current &ice)
void publishVec(const Eigen::VectorXf &bufferVec, const std::string name, StringVariantBaseMap &datafields)
void learnMultiDMPFromFiles(const Ice::StringSeq &objFileNames, const Ice::StringSeq &leftFileNames, const Ice::StringSeq &rightFileNames, const Ice::Current &)
virtual void onPublish(const SensorAndControl &, const DebugDrawerInterfacePrx &, const DebugObserverInterfacePrx &)
std::shared_ptr< class Robot > RobotPtr
Definition Bus.h:19
This file offers overloads of toIce() and fromIce() functions for STL container types.
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugObserverInterface > DebugObserverInterfacePrx
std::map< std::string, VariantBasePtr > StringVariantBaseMap
IceUtil::Handle< class RobotUnit > RobotUnitPtr
Definition FTSensor.h:34
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugDrawerInterface > DebugDrawerInterfacePrx
detail::ControlThreadOutputBufferEntry SensorAndControl