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