NJointCCDMPController.h
Go to the documentation of this file.
1#pragma once
2
3
4// Simox
5#include <VirtualRobot/IK/IKSolver.h>
6#include <VirtualRobot/VirtualRobot.h>
7
9
10// DMP
11#include <dmp/representation/dmp/umitsmp.h>
12
13// armarx
16
17// control
18#include <armarx/control/deprecated_njoint_mp_controller/task_space/ControllerInterface.h>
19
20namespace armarx
21{
22 class SensorValue1DoFActuatorTorque;
23 class SensorValue1DoFActuatorVelocity;
24 class SensorValue1DoFActuatorPosition;
25 class SensorValue1DoFGravityTorque;
26 class ControlTarget1DoFActuatorTorque;
27 class ControlTarget1DoFActuatorVelocity;
29} // namespace armarx
30
32{
33
36
37 using ViaPoint = std::pair<double, DMP::DVec>;
38 using ViaPointsSet = std::vector<ViaPoint>;
39
41 {
42 public:
43 Eigen::VectorXf targetTSVel;
44 // cartesian velocity control data
45 std::vector<float> nullspaceJointVelocities;
47 std::vector<float> torqueKp;
48 std::vector<float> torqueKd;
49 VirtualRobot::IKSolver::CartesianSelection mode = VirtualRobot::IKSolver::All;
50 };
51
52 /**
53 * @brief The NJointCCDMPController class
54 * @ingroup Library-RobotUnit-NJointControllers
55 */
57 public NJointControllerWithTripleBuffer<NJointCCDMPControllerControlData>,
59 {
60 class pidController
61 {
62 public:
63 float Kp = 0, Kd = 0;
64 float lastError = 0;
65
66 float
67 update(float dt, float error)
68 {
69 float derivative = (error - lastError) / dt;
70 float retVal = Kp * error + Kd * derivative;
71 lastError = error;
72 return retVal;
73 }
74 };
75
76 public:
77 using ConfigPtrT = NJointCCDMPControllerConfigPtr;
78 NJointCCDMPController(const RobotUnitPtr& robotUnit,
79 const NJointControllerConfigPtr& config,
81
82 // NJointControllerInterface interface
83 std::string getClassName(const Ice::Current&) const override;
84
85 // NJointController interface
86
87 void rtRun(const IceUtil::Time& sensorValuesTimestamp,
88 const IceUtil::Time& timeSinceLastIteration) override;
89
90 // NJointCCDMPControllerInterface interface
91 void
92 learnDMPFromFiles(int dmpId, const Ice::StringSeq& fileNames, const Ice::Current&) override;
93
94 bool
95 isFinished(const Ice::Current&) override
96 {
97 return finished;
98 }
99
100 void runDMP(const Ice::Current&) override;
101 void setTemporalFactor(int dmpId, Ice::Double tau, const Ice::Current&) override;
102 void setViaPoints(int dmpId,
103 Ice::Double u,
104 const Ice::DoubleSeq& viapoint,
105 const Ice::Current&) override;
106 void setGoals(int dmpId, const Ice::DoubleSeq& goals, const Ice::Current&) override;
107
108 void setControllerTarget(Ice::Float avoidJointLimitsKp,
110 const Ice::Current&) override;
111 void setTorqueKp(const StringFloatDictionary& torqueKp, const Ice::Current&) override;
112 void setNullspaceJointVelocities(const StringFloatDictionary& nullspaceJointVelocities,
113 const Ice::Current&) override;
114
115 protected:
116 void rtPreActivateController() override;
117 void rtPostDeactivateController() override;
118 VirtualRobot::IKSolver::CartesianSelection
120 virtual void onPublish(const SensorAndControl&,
122 const DebugObserverInterfacePrx&) override;
123
124 void onInitNJointController() override;
125 void onDisconnectNJointController() override;
126 void controllerRun();
127
128 private:
129 struct DebugBufferData
130 {
131 StringFloatDictionary latestTargetVelocities;
132 StringFloatDictionary dmpTargets;
133 StringFloatDictionary realTCP;
134
135 double mpcFactor;
136 double error;
137 double phaseStop;
138 double posError;
139 double oriError;
140 double deltaT;
141 double canVal0;
142 };
143
144 TripleBuffer<DebugBufferData> debugOutputData;
145
146 struct NJointCCDMPControllerSensorData
147 {
148 double currentTime;
149 double deltaT;
150 Eigen::Matrix4f currentPose;
151 };
152
154
155 std::vector<const SensorValue1DoFActuatorTorque*> torqueSensors;
156 std::vector<const SensorValue1DoFGravityTorque*> gravityTorqueSensors;
157 std::vector<ControlTarget1DoFActuatorVelocity*> targets;
158
159 // velocity ik controller parameters
160 std::vector<pidController> torquePIDs;
161 CartesianVelocityControllerPtr tcpController;
162 std::string nodeSetName;
163
164 // dmp parameters
165 std::vector<DMP::UMITSMPPtr> dmpPtrList;
166 std::vector<double> canVals;
167 std::vector<double> timeDurations;
168 std::vector<std::string> dmpTypes;
169 std::vector<double> amplitudes;
170
171 std::vector<DMP::Vec<DMP::DMPState>> currentStates;
172 std::vector<DMP::DVec> targetSubStates;
173
174 bool finished;
175 double tau;
176 ViaPointsSet viaPoints;
177 bool isDisturbance;
178
179
180 // phaseStop parameters
181 double phaseL;
182 double phaseK;
183 double phaseDist0;
184 double phaseDist1;
185 double phaseKpPos;
186 double phaseKpOri;
187
188 double posToOriRatio;
189
190 Eigen::VectorXf targetVels;
191
192 std::vector<int> learnedDMP;
193
194
195 NJointCCDMPControllerConfigPtr cfg;
196 VirtualRobot::RobotNodePtr tcp;
197 Eigen::Vector3f tcpPosition;
198 Eigen::Quaterniond tcpOrientation;
199
200 Eigen::Matrix4f oldPose;
201 VirtualRobot::DifferentialIKPtr ik;
202
203 DMP::DVec targetState;
204 mutable MutexType controllerMutex;
206 };
207
208} // namespace armarx::control::deprecated_njoint_mp_controller::task_space
#define TYPEDEF_PTRS_HANDLE(T)
constexpr T dt
NJointControllerWithTripleBuffer(const NJointCCDMPControllerControlData &initialCommands=NJointCCDMPControllerControlData())
IceUtil::Handle< PeriodicTask< T > > pointer_type
Shared pointer type for convenience.
A simple triple buffer for lockfree comunication between a single writer and a single reader.
void setTorqueKp(const StringFloatDictionary &torqueKp, const Ice::Current &) override
virtual void onPublish(const SensorAndControl &, const DebugDrawerInterfacePrx &, const DebugObserverInterfacePrx &) override
void setNullspaceJointVelocities(const StringFloatDictionary &nullspaceJointVelocities, const Ice::Current &) override
void learnDMPFromFiles(int dmpId, const Ice::StringSeq &fileNames, const Ice::Current &) override
void setGoals(int dmpId, const Ice::DoubleSeq &goals, const Ice::Current &) override
void setTemporalFactor(int dmpId, Ice::Double tau, const Ice::Current &) override
void setControllerTarget(Ice::Float avoidJointLimitsKp, NJointTaskSpaceDMPControllerMode::CartesianSelection mode, const Ice::Current &) override
void setViaPoints(int dmpId, Ice::Double u, const Ice::DoubleSeq &viapoint, const Ice::Current &) override
void rtPostDeactivateController() override
This function is called after the controller is deactivated.
NJointCCDMPController(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.
VirtualRobot::IKSolver::CartesianSelection ModeFromIce(const NJointTaskSpaceDMPControllerMode::CartesianSelection mode)
void rtPreActivateController() override
This function is called before the controller is activated.
Brief description of class targets.
Definition targets.h:39
Quaternion< double, 0 > Quaterniond
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::shared_ptr< CartesianVelocityController > CartesianVelocityControllerPtr
std::vector< ViaPoint > ViaPointsSet
IceUtil::Handle< class RobotUnit > RobotUnitPtr
Definition FTSensor.h:34
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugDrawerInterface > DebugDrawerInterfacePrx
detail::ControlThreadOutputBufferEntry SensorAndControl