NJointBimanualObjLevelController.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 boxPose;
33 Eigen::VectorXf boxTwist;
34 };
35
37 public NJointControllerWithTripleBuffer<NJointBimanualObjLevelControlData>,
39 {
40 public:
41 // using ConfigPtrT = BimanualForceControllerConfigPtr;
43 const NJointControllerConfigPtr& config,
45
46 // NJointControllerInterface interface
47 std::string getClassName(const Ice::Current&) const;
48
49 // NJointController interface
50
51 void rtRun(const IceUtil::Time& sensorValuesTimestamp,
52 const IceUtil::Time& timeSinceLastIteration);
53
54 // NJointCCDMPControllerInterface interface
55 void learnDMPFromFiles(const Ice::StringSeq& fileNames, const Ice::Current&);
56
57 bool
58 isFinished(const Ice::Current&)
59 {
60 return finished;
61 }
62
63 Eigen::Matrix3f
64 skew(Eigen::Vector3f vec)
65 {
66 Eigen::Matrix3f mat = Eigen::MatrixXf::Zero(3, 3);
67 mat(1, 2) = -vec(0);
68 mat(0, 2) = vec(1);
69 mat(0, 1) = -vec(2);
70 mat(2, 1) = vec(0);
71 mat(2, 0) = -vec(1);
72 mat(1, 0) = vec(2);
73 return mat;
74 }
75
76 // void runDMP(const Ice::DoubleSeq& goals, Ice::Double tau, const Ice::Current&);
77 void runDMP(const Ice::DoubleSeq& goals, Ice::Double timeDuration, const Ice::Current&);
78 void runDMPWithVirtualStart(const Ice::DoubleSeq& starts,
79 const Ice::DoubleSeq& goals,
80 Ice::Double timeDuration,
81 const Ice::Current&);
82
83 void setGoals(const Ice::DoubleSeq& goals, const Ice::Current&);
84 void setViaPoints(Ice::Double u, const Ice::DoubleSeq& viapoint, const Ice::Current&);
85 void removeAllViaPoints(const Ice::Current&);
86
87 double
88 getVirtualTime(const Ice::Current&)
89 {
90 return virtualtimer;
91 }
92
93 void setKpImpedance(const Ice::FloatSeq& value, const Ice::Current&);
94 void setKdImpedance(const Ice::FloatSeq& value, const Ice::Current&);
95 void setKmAdmittance(const Ice::FloatSeq& value, const Ice::Current&);
96 void setKpAdmittance(const Ice::FloatSeq& value, const Ice::Current&);
97 void setKdAdmittance(const Ice::FloatSeq& value, const Ice::Current&);
98
99 std::vector<float> getCurrentObjVel(const Ice::Current&);
100 std::vector<float> getCurrentObjForce(const Ice::Current&);
101
102 void setMPWeights(const DoubleSeqSeq& weights, const Ice::Current&);
103 DoubleSeqSeq getMPWeights(const Ice::Current&);
104
105 void setMPRotWeights(const DoubleSeqSeq& weights, const Ice::Current&);
106 DoubleSeqSeq getMPRotWeights(const Ice::Current&);
107
108 protected:
109 virtual void onPublish(const SensorAndControl&,
112
115 void controllerRun();
116
117 private:
118 Eigen::VectorXf targetWrench;
119
120 struct DebugBufferData
121 {
122 StringFloatDictionary desired_torques;
123
124 float virtualPose_x;
125 float virtualPose_y;
126 float virtualPose_z;
127
128 float objPose_x;
129 float objPose_y;
130 float objPose_z;
131
132 float objForce_x;
133 float objForce_y;
134 float objForce_z;
135 float objTorque_x;
136 float objTorque_y;
137 float objTorque_z;
138
139 float deltaPose_x;
140 float deltaPose_y;
141 float deltaPose_z;
142 float deltaPose_rx;
143 float deltaPose_ry;
144 float deltaPose_rz;
145
146 float objVel_x;
147 float objVel_y;
148 float objVel_z;
149 float objVel_rx;
150 float objVel_ry;
151 float objVel_rz;
152
153 float modifiedPoseRight_x;
154 float modifiedPoseRight_y;
155 float modifiedPoseRight_z;
156 float currentPoseLeft_x;
157 float currentPoseLeft_y;
158 float currentPoseLeft_z;
159 float leftQuat_w;
160 float leftQuat_x;
161 float leftQuat_y;
162 float leftQuat_z;
163 float rightQuat_w;
164 float rightQuat_x;
165 float rightQuat_y;
166 float rightQuat_z;
167
168 float modifiedPoseLeft_x;
169 float modifiedPoseLeft_y;
170 float modifiedPoseLeft_z;
171 float currentPoseRight_x;
172 float currentPoseRight_y;
173 float currentPoseRight_z;
174
175 float dmpBoxPose_x;
176 float dmpBoxPose_y;
177 float dmpBoxPose_z;
178
179 float dmpTwist_x;
180 float dmpTwist_y;
181 float dmpTwist_z;
182
183 float modifiedTwist_lx;
184 float modifiedTwist_ly;
185 float modifiedTwist_lz;
186 float modifiedTwist_rx;
187 float modifiedTwist_ry;
188 float modifiedTwist_rz;
189
190 float rx;
191 float ry;
192 float rz;
193
194 Eigen::VectorXf wrenchDMP;
195 Eigen::VectorXf computedBoxWrench;
196
197 Eigen::VectorXf forceImpedance;
198 Eigen::VectorXf forcePID;
199 Eigen::VectorXf forcePIDControlValue;
200 Eigen::VectorXf poseError;
201 Eigen::VectorXf wrenchesConstrained;
202 Eigen::VectorXf wrenchesMeasuredInRoot;
203 };
204
205 TripleBuffer<DebugBufferData> debugOutputData;
206
207 struct rt2ControlData
208 {
209 double currentTime;
210 double deltaT;
211 Eigen::Matrix4f currentPose;
212 Eigen::VectorXf currentTwist;
213 };
214
215 TripleBuffer<rt2ControlData> rt2ControlBuffer;
216
217 struct ControlInterfaceData
218 {
219 Eigen::Matrix4f currentLeftPose;
220 Eigen::Matrix4f currentRightPose;
221 Eigen::Matrix4f currentObjPose;
222 Eigen::Vector3f currentObjVel;
223 Eigen::Vector3f currentObjForce;
224 };
225
226 TripleBuffer<ControlInterfaceData> controlInterfaceBuffer;
227
228 struct Inferface2rtData
229 {
230 Eigen::VectorXf KpImpedance;
231 Eigen::VectorXf KdImpedance;
232 Eigen::VectorXf KmAdmittance;
233 Eigen::VectorXf KpAdmittance;
234 Eigen::VectorXf KdAdmittance;
235 };
236
237 TripleBuffer<Inferface2rtData> interface2rtBuffer;
238
239
240 std::vector<ControlTarget1DoFActuatorTorque*> leftTargets;
241 std::vector<const SensorValue1DoFActuatorAcceleration*> leftAccelerationSensors;
242 std::vector<const SensorValue1DoFActuatorVelocity*> leftVelocitySensors;
243 std::vector<const SensorValue1DoFActuatorPosition*> leftPositionSensors;
244
245 std::vector<ControlTarget1DoFActuatorTorque*> rightTargets;
246 std::vector<const SensorValue1DoFActuatorAcceleration*> rightAccelerationSensors;
247 std::vector<const SensorValue1DoFActuatorVelocity*> rightVelocitySensors;
248 std::vector<const SensorValue1DoFActuatorPosition*> rightPositionSensors;
249
250 const SensorValueForceTorque* rightForceTorque;
251 const SensorValueForceTorque* leftForceTorque;
252
253 NJointBimanualObjLevelControllerConfigPtr cfg;
254 VirtualRobot::DifferentialIKPtr leftIK;
255 VirtualRobot::DifferentialIKPtr rightIK;
256
258
259 double virtualtimer;
260
261 mutable MutexType controllerMutex;
262 mutable MutexType interfaceDataMutex;
263 Eigen::VectorXf leftDesiredJointValues;
264 Eigen::VectorXf rightDesiredJointValues;
265
266 Eigen::Matrix4f leftInitialPose;
267 Eigen::Matrix4f rightInitialPose;
268 Eigen::Matrix4f boxInitialPose;
269
270 Eigen::VectorXf KpImpedance;
271 Eigen::VectorXf KdImpedance;
272 Eigen::VectorXf KpAdmittance;
273 Eigen::VectorXf KdAdmittance;
274 Eigen::VectorXf KmAdmittance;
275 Eigen::VectorXf KmPID;
276
277 Eigen::VectorXf virtualAcc;
278 Eigen::VectorXf virtualVel;
279 Eigen::Matrix4f virtualPose;
280
281 Eigen::Matrix4f sensorFrame2TcpFrameLeft;
282 Eigen::Matrix4f sensorFrame2TcpFrameRight;
283
284 //static compensation
285 float massLeft;
286 Eigen::Vector3f CoMVecLeft;
287 Eigen::Vector3f forceOffsetLeft;
288 Eigen::Vector3f torqueOffsetLeft;
289
290 float massRight;
291 Eigen::Vector3f CoMVecRight;
292 Eigen::Vector3f forceOffsetRight;
293 Eigen::Vector3f torqueOffsetRight;
294
295 // float knull;
296 // float dnull;
297
298 std::vector<std::string> leftJointNames;
299 std::vector<std::string> rightJointNames;
300
301 // float torqueLimit;
302 VirtualRobot::RobotNodeSetPtr leftRNS;
303 VirtualRobot::RobotNodeSetPtr rightRNS;
304 VirtualRobot::RobotNodePtr tcpLeft;
305 VirtualRobot::RobotNodePtr tcpRight;
306
307 std::vector<PIDControllerPtr> forcePIDControllers;
308
309 // filter parameters
310 float filterCoeff;
311 Eigen::VectorXf filteredOldValue;
312 bool finished;
313 bool dmpStarted;
314 double ftcalibrationTimer;
315 Eigen::VectorXf ftOffset;
316
317 Eigen::Matrix3f fixedLeftRightRotOffset;
318 Eigen::Vector3f objCom2TCPLeftInObjFrame, objCom2TCPRightInObjFrame;
319
320 protected:
323 };
324
325} // namespace armarx::control::deprecated_njoint_mp_controller::bimanual
#define TYPEDEF_PTRS_HANDLE(T)
NJointControllerWithTripleBuffer(const NJointBimanualObjLevelControlData &initialCommands=NJointBimanualObjLevelControlData())
A simple triple buffer for lockfree comunication between a single writer and a single reader.
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.
NJointBimanualObjLevelController(const RobotUnitPtr &, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &)
void runDMP(const Ice::DoubleSeq &goals, Ice::Double timeDuration, 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
IceUtil::Handle< class RobotUnit > RobotUnitPtr
Definition FTSensor.h:34
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugDrawerInterface > DebugDrawerInterfacePrx
detail::ControlThreadOutputBufferEntry SensorAndControl