DeprecatedNJointTaskSpaceImpedanceDMPController.h
Go to the documentation of this file.
1
2#pragma once
3
4#include <VirtualRobot/VirtualRobot.h>
5
8
10
12#include <armarx/control/deprecated_njoint_mp_controller/task_space/ControllerInterface.h>
13
14#include <dmp/representation/dmp/umidmp.h>
15
16namespace armarx
17{
18 class SensorValue1DoFActuatorTorque;
19 class SensorValue1DoFActuatorVelocity;
20 class SensorValue1DoFActuatorPosition;
21 class ControlTarget1DoFActuatorTorque;
23} // namespace armarx
24
26{
27 namespace tsvmp = armarx::control::deprecated_njoint_mp_controller::tsvmp;
28
31
33 {
34 public:
35 Eigen::VectorXf targetVel;
36 Eigen::Matrix4f targetPose;
38 double canVal;
39 double mpcFactor;
40 };
41
42 /**
43 * @brief The DeprecatedNJointTaskSpaceImpedanceDMPController class
44 * @ingroup Library-RobotUnit-NJointControllers
45 */
48 DeprecatedNJointTaskSpaceImpedanceDMPControllerControlData>,
50 {
51 public:
52 using ConfigPtrT = DeprecatedNJointTaskSpaceImpedanceDMPControllerConfigPtr;
54 const NJointControllerConfigPtr& config,
56
57 // NJointControllerInterface interface
58 std::string getClassName(const Ice::Current&) const override;
59
60 // NJointController interface
61
62 void rtRun(const IceUtil::Time& sensorValuesTimestamp,
63 const IceUtil::Time& timeSinceLastIteration) override;
64
65 // DeprecatedNJointTaskSpaceImpedanceDMPControllerInterface interface
66 void learnDMPFromFiles(const Ice::StringSeq& fileNames, const Ice::Current&) override;
67
68 bool
69 isFinished(const Ice::Current&) override
70 {
71 return finished;
72 }
73
74 bool
75 isDMPRunning(const Ice::Current&) override
76 {
77 return started;
78 }
79
80 void
81 setViaPoints(Ice::Double u, const Ice::DoubleSeq& viapoint, const Ice::Current&) override;
82 void setGoals(const Ice::DoubleSeq& goals, const Ice::Current&) override;
83
84 void learnJointDMPFromFiles(const std::string& fileName,
85 const Ice::FloatSeq& currentJVS,
86 const Ice::Current&) override;
87 void runDMP(const Ice::DoubleSeq& goals,
88 const Ice::Current& iceCurrent = Ice::emptyCurrent) override;
89 void runDMPWithTime(const Ice::DoubleSeq& goals,
90 Ice::Double timeDuration,
91 const Ice::Current&) override;
92
93 Ice::Double
94 getVirtualTime(const Ice::Current&) override
95 {
96 return dmpCtrl->canVal;
97 }
98
99 void stopDMP(const Ice::Current&) override;
100 void resumeDMP(const Ice::Current&) override;
101 void resetDMP(const Ice::Current&) override;
102
103 void setMPWeights(const DoubleSeqSeq& weights, const Ice::Current&) override;
104 DoubleSeqSeq getMPWeights(const Ice::Current&) override;
105
106 void removeAllViaPoints(const Ice::Current&) override;
107
108 void setLinearVelocityKd(const Eigen::Vector3f& kd, const Ice::Current&) override;
109 void setLinearVelocityKp(const Eigen::Vector3f& kp, const Ice::Current&) override;
110 void setAngularVelocityKd(const Eigen::Vector3f& kd, const Ice::Current&) override;
111 void setAngularVelocityKp(const Eigen::Vector3f& kp, const Ice::Current&) override;
112 void setNullspaceVelocityKd(const Eigen::VectorXf& kd, const Ice::Current&) override;
113 void setNullspaceVelocityKp(const Eigen::VectorXf& kp, const Ice::Current&) override;
114 void setUseNullSpaceJointDMP(bool enable, const Ice::Current&) override;
115 void setDefaultNullSpaceJointValues(const Eigen::VectorXf& jointValues,
116 const Ice::Current&) override;
117
118 void
119 enableForceStop(const Ice::Current&) override
120 {
121 useForceStop = true;
122 }
123
124 void
125 disableForceStop(const Ice::Current&) override
126 {
127 useForceStop = false;
128 }
129
130 void
131 setForceThreshold(const Eigen::Vector3f& f, const Ice::Current& current) override
132 {
133 forceThreshold.getWriteBuffer() = f;
134 forceThreshold.commitWrite();
135 }
136
137 std::string getDMPAsString(const Ice::Current&) override;
138 Ice::DoubleSeq createDMPFromString(const std::string&, const Ice::Current&) override;
139 Ice::Double getCanVal(const Ice::Current&);
140
141 protected:
142 virtual void onPublish(const SensorAndControl&,
144 const DebugObserverInterfacePrx&) override;
145
146 void onInitNJointController() override;
147 void onDisconnectNJointController() override;
148 void controllerRun();
149
150 private:
151 struct DebugBufferData
152 {
153 double currentCanVal;
154 double mpcfactor;
155 float targetPose_x;
156 float targetPose_y;
157 float targetPose_z;
158 float targetPose_qw;
159 float targetPose_qx;
160 float targetPose_qy;
161 float targetPose_qz;
162
163 float currentPose_x;
164 float currentPose_y;
165 float currentPose_z;
166 float currentPose_qw;
167 float currentPose_qx;
168 float currentPose_qy;
169 float currentPose_qz;
170
171 float currentKpos_x;
172 float currentKpos_y;
173 float currentKpos_z;
174 float currentKori_x;
175 float currentKori_y;
176 float currentKori_z;
177 float currentKnull_x;
178 float currentKnull_y;
179 float currentKnull_z;
180
181 float currentDpos_x;
182 float currentDpos_y;
183 float currentDpos_z;
184 float currentDori_x;
185 float currentDori_y;
186 float currentDori_z;
187 float currentDnull_x;
188 float currentDnull_y;
189 float currentDnull_z;
190
191 StringFloatDictionary desired_torques;
192 StringFloatDictionary desired_nullspaceJoint;
193 float forceDesired_x;
194 float forceDesired_y;
195 float forceDesired_z;
196 float forceDesired_rx;
197 float forceDesired_ry;
198 float forceDesired_rz;
199
200 Eigen::Vector3f filteredForceInRoot;
201
202 float deltaT;
203 };
204
206
207 struct DeprecatedNJointTaskSpaceImpedanceDMPControllerSensorData
208 {
209 double currentTime;
210 double deltaT;
211 Eigen::Matrix4f currentPose;
212 Eigen::VectorXf currentTwist;
213 };
214
216 controllerSensorData;
217
218 struct DeprecatedNJointTaskSpaceImpedanceDMPControllerInterfaceData
219 {
220 Eigen::Matrix4f currentTcpPose;
221 };
222
224 interfaceData;
225
226 struct CtrlParams
227 {
228 Eigen::Vector3f kpos;
229 Eigen::Vector3f dpos;
230 Eigen::Vector3f kori;
231 Eigen::Vector3f dori;
232 Eigen::VectorXf knull;
233 Eigen::VectorXf dnull;
234 };
235
236 WriteBufferedTripleBuffer<CtrlParams> ctrlParams;
237
238
239 DMP::Vec<DMP::DMPState> currentJointState;
240 DMP::UMIDMPPtr nullSpaceJointDMPPtr;
241
243
244 std::vector<const SensorValue1DoFActuatorTorque*> torqueSensors;
245 std::vector<const SensorValue1DoFActuatorVelocity*> velocitySensors;
246 std::vector<const SensorValue1DoFActuatorPosition*> positionSensors;
247 std::vector<ControlTarget1DoFActuatorTorque*> targets;
248
249 // velocity ik controller parameters
250 // dmp parameters
251 double timeDuration;
252 bool finished;
253 VirtualRobot::RobotNodeSetPtr rns;
254
255 // phaseStop parameters
256 double phaseL;
257 double phaseK;
258 double phaseDist0;
259 double phaseDist1;
260 double posToOriRatio;
261
262
263 DeprecatedNJointTaskSpaceImpedanceDMPControllerConfigPtr cfg;
264 VirtualRobot::DifferentialIKPtr ik;
265 VirtualRobot::RobotNodePtr tcp;
266
267 float torqueLimit;
268
269 // Eigen::Vector3f kpos;
270 // Eigen::Vector3f kori;
271 // Eigen::Vector3f dpos;
272 // Eigen::Vector3f dori;
273 // Eigen::VectorXf knull;
274 // Eigen::VectorXf dnull;
275 int numOfJoints;
276
277 std::atomic_bool useNullSpaceJointDMP;
278 bool isNullSpaceJointDMPLearned;
279
280
281 WriteBufferedTripleBuffer<Eigen::VectorXf> defaultNullSpaceJointValues;
282 std::vector<std::string> jointNames;
283 mutable MutexType controllerMutex;
285 bool firstRun;
286 bool started = false;
287 bool stopped = false;
288
289 Eigen::Matrix4f stopPose;
290
291 Eigen::Vector3f filteredForce;
292 Eigen::Vector3f forceOffset;
293 Eigen::Vector3f filteredForceInRoot;
294 WriteBufferedTripleBuffer<Eigen::Vector3f> forceThreshold;
295 std::atomic<bool> useForceStop;
296 std::atomic<float> timeForCalibration;
297 const SensorValueForceTorque* forceSensor;
298
299 // Eigen::Matrix4f oldPose;
300 // NJointController interface
301 protected:
303 };
304
305} // namespace armarx::control::deprecated_njoint_mp_controller::task_space
#define TYPEDEF_PTRS_HANDLE(T)
NJointControllerWithTripleBuffer(const DeprecatedNJointTaskSpaceImpedanceDMPControllerControlData &initialCommands=DeprecatedNJointTaskSpaceImpedanceDMPControllerControlData())
IceUtil::Handle< PeriodicTask< T > > pointer_type
Shared pointer type for convenience.
Same as the TripleBuffer, but partial writes of the data structure are ok. The write operation may be...
virtual void onPublish(const SensorAndControl &, const DebugDrawerInterfacePrx &, const DebugObserverInterfacePrx &) override
void learnJointDMPFromFiles(const std::string &fileName, const Ice::FloatSeq &currentJVS, const Ice::Current &) override
DeprecatedNJointTaskSpaceImpedanceDMPController(const RobotUnitPtr &robotUnit, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &)
void rtRun(const IceUtil::Time &sensorValuesTimestamp, const IceUtil::Time &timeSinceLastIteration) override
TODO make protected and use attorneys.
boost::shared_ptr< class UMIDMP > UMIDMPPtr
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