NJointBimanualForceController.h
Go to the documentation of this file.
1#pragma once
2
3
4#include <VirtualRobot/VirtualRobot.h>
5
7
11
13#include <armarx/control/deprecated_njoint_mp_controller/bimanual/ForceMPControllerInterface.h>
14
15namespace armarx
16{
17 class SensorValue1DoFActuatorTorque;
18 class SensorValue1DoFActuatorVelocity;
19 class SensorValue1DoFActuatorPosition;
20 class SensorValue1DoFActuatorAcceleration;
21 class ControlTarget1DoFActuatorTorque;
23} // namespace armarx
24
26{
27 namespace tsvmp = armarx::control::deprecated_njoint_mp_controller::tsvmp;
28
31
33 {
34 public:
35 // from dmp
36 Eigen::Matrix4f boxPose = Eigen::Matrix4f::Identity();
37
38 Eigen::VectorXf boxTwist;
39 // Eigen::VectorXf leftTargetTwist;
40 // Eigen::VectorXf rightTargetTwist;
41
42 // Eigen::Matrix4f leftTargetPose;
43 // Eigen::Matrix4f rightTargetPose;
44
45 // std::vector<float> nullspaceJointVelocities;
46 // double virtualTime;
47 };
48
50 public NJointControllerWithTripleBuffer<NJointBimanualForceControlData>,
52 {
53 public:
54 // using ConfigPtrT = BimanualForceControllerConfigPtr;
56 const NJointControllerConfigPtr& config,
58
59 // NJointControllerInterface interface
60 std::string getClassName(const Ice::Current&) const;
61
62 // NJointController interface
63
64 void rtRun(const IceUtil::Time& sensorValuesTimestamp,
65 const IceUtil::Time& timeSinceLastIteration);
66
67 // NJointCCDMPControllerInterface interface
68 void learnDMPFromFiles(const Ice::StringSeq& fileNames, const Ice::Current&);
69
70 bool
71 isFinished(const Ice::Current&)
72 {
73 return finished;
74 }
75
76 // void runDMP(const Ice::DoubleSeq& goals, Ice::Double tau, const Ice::Current&);
77 void runDMP(const Ice::DoubleSeq& goals, const Ice::Current&);
78 void setGoals(const Ice::DoubleSeq& goals, const Ice::Current&);
79 void setViaPoints(Ice::Double u, const Ice::DoubleSeq& viapoint, const Ice::Current&);
80
81 double
82 getVirtualTime(const Ice::Current&)
83 {
84 return virtualtimer;
85 }
86
87 protected:
88 virtual void onPublish(const SensorAndControl&,
91
94 void controllerRun();
95
96 private:
97 Eigen::VectorXf targetWrench;
98
99 struct DebugBufferData
100 {
101 StringFloatDictionary desired_torques;
102
103 float modifiedPoseRight_x;
104 float modifiedPoseRight_y;
105 float modifiedPoseRight_z;
106 float currentPoseLeft_x;
107 float currentPoseLeft_y;
108 float currentPoseLeft_z;
109
110 float modifiedPoseLeft_x;
111 float modifiedPoseLeft_y;
112 float modifiedPoseLeft_z;
113 float currentPoseRight_x;
114 float currentPoseRight_y;
115 float currentPoseRight_z;
116
117 float dmpBoxPose_x;
118 float dmpBoxPose_y;
119 float dmpBoxPose_z;
120
121 float dmpTwist_x;
122 float dmpTwist_y;
123 float dmpTwist_z;
124
125 float modifiedTwist_lx;
126 float modifiedTwist_ly;
127 float modifiedTwist_lz;
128 float modifiedTwist_rx;
129 float modifiedTwist_ry;
130 float modifiedTwist_rz;
131
132 float rx;
133 float ry;
134 float rz;
135
136 Eigen::VectorXf wrenchDMP;
137 Eigen::VectorXf computedBoxWrench;
138
139 Eigen::VectorXf forceImpedance;
140 Eigen::VectorXf forcePID;
141 Eigen::VectorXf forcePIDControlValue;
142 Eigen::VectorXf poseError;
143 Eigen::VectorXf wrenchesConstrained;
144 Eigen::VectorXf wrenchesMeasuredInRoot;
145 };
146
147 TripleBuffer<DebugBufferData> debugOutputData;
148
149 struct NJointBimanualForceControllerSensorData
150 {
151 double currentTime;
152 double deltaT;
153 Eigen::Matrix4f currentPose;
154 Eigen::VectorXf currentTwist;
155 };
156
158
159 struct NJointBimanualForceControllerInterfaceData
160 {
161 Eigen::Matrix4f currentLeftPose;
162 Eigen::Matrix4f currentRightPose;
163 };
164
166
167 std::vector<ControlTarget1DoFActuatorTorque*> leftTargets;
168 std::vector<const SensorValue1DoFActuatorAcceleration*> leftAccelerationSensors;
169 std::vector<const SensorValue1DoFActuatorVelocity*> leftVelocitySensors;
170 std::vector<const SensorValue1DoFActuatorPosition*> leftPositionSensors;
171
172 std::vector<ControlTarget1DoFActuatorTorque*> rightTargets;
173 std::vector<const SensorValue1DoFActuatorAcceleration*> rightAccelerationSensors;
174 std::vector<const SensorValue1DoFActuatorVelocity*> rightVelocitySensors;
175 std::vector<const SensorValue1DoFActuatorPosition*> rightPositionSensors;
176
177 const SensorValueForceTorque* rightForceTorque;
178 const SensorValueForceTorque* leftForceTorque;
179
180 NJointBimanualForceControllerConfigPtr cfg;
181 VirtualRobot::DifferentialIKPtr leftIK;
182 VirtualRobot::DifferentialIKPtr rightIK;
183
185
186
187 double virtualtimer;
188
189 mutable MutexType controllerMutex;
190 Eigen::VectorXf leftDesiredJointValues;
191 Eigen::VectorXf rightDesiredJointValues;
192
193 Eigen::Matrix4f leftInitialPose;
194 Eigen::Matrix4f rightInitialPose;
195 Eigen::Matrix4f boxInitialPose;
196
197 Eigen::VectorXf KpImpedance;
198 Eigen::VectorXf KdImpedance;
199 Eigen::VectorXf KpAdmittance;
200 Eigen::VectorXf KdAdmittance;
201 Eigen::VectorXf KmAdmittance;
202 Eigen::VectorXf KmPID;
203
204 Eigen::VectorXf modifiedAcc;
205 Eigen::VectorXf modifiedTwist;
206 Eigen::Matrix4f modifiedLeftPose;
207 Eigen::Matrix4f modifiedRightPose;
208
209 Eigen::Matrix4f sensorFrame2TcpFrameLeft;
210 Eigen::Matrix4f sensorFrame2TcpFrameRight;
211
212 //static compensation
213 float massLeft;
214 Eigen::Vector3f CoMVecLeft;
215 Eigen::Vector3f forceOffsetLeft;
216 Eigen::Vector3f torqueOffsetLeft;
217
218 float massRight;
219 Eigen::Vector3f CoMVecRight;
220 Eigen::Vector3f forceOffsetRight;
221 Eigen::Vector3f torqueOffsetRight;
222
223
224 // float knull;
225 // float dnull;
226
227 std::vector<std::string> leftJointNames;
228 std::vector<std::string> rightJointNames;
229
230 // float torqueLimit;
231 VirtualRobot::RobotNodeSetPtr leftRNS;
232 VirtualRobot::RobotNodeSetPtr rightRNS;
233 VirtualRobot::RobotNodePtr tcpLeft;
234 VirtualRobot::RobotNodePtr tcpRight;
235
236 std::vector<PIDControllerPtr> forcePIDControllers;
237
238 // filter parameters
239 float filterCoeff;
240 Eigen::VectorXf filteredOldValue;
241 bool finished;
242 bool dmpStarted;
243
244 protected:
245 // void rtPreActivateController();
247 };
248
249} // namespace armarx::control::deprecated_njoint_mp_controller::bimanual
#define TYPEDEF_PTRS_HANDLE(T)
NJointControllerWithTripleBuffer(const NJointBimanualForceControlData &initialCommands=NJointBimanualForceControlData())
A simple triple buffer for lockfree comunication between a single writer and a single reader.
void rtRun(const IceUtil::Time &sensorValuesTimestamp, const IceUtil::Time &timeSinceLastIteration)
TODO make protected and use attorneys.
virtual void onPublish(const SensorAndControl &, const DebugDrawerInterfacePrx &, const DebugObserverInterfacePrx &)
NJointBimanualForceController(const RobotUnitPtr &, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &)
void setViaPoints(Ice::Double u, const Ice::DoubleSeq &viapoint, const Ice::Current &)
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