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;
37 Eigen::VectorXf boxTwist;
38 // Eigen::VectorXf leftTargetTwist;
39 // Eigen::VectorXf rightTargetTwist;
40
41 // Eigen::Matrix4f leftTargetPose;
42 // Eigen::Matrix4f rightTargetPose;
43
44 // std::vector<float> nullspaceJointVelocities;
45 // double virtualTime;
46 };
47
49 public NJointControllerWithTripleBuffer<NJointBimanualForceControlData>,
51 {
52 public:
53 // using ConfigPtrT = BimanualForceControllerConfigPtr;
55 const NJointControllerConfigPtr& config,
57
58 // NJointControllerInterface interface
59 std::string getClassName(const Ice::Current&) const;
60
61 // NJointController interface
62
63 void rtRun(const IceUtil::Time& sensorValuesTimestamp,
64 const IceUtil::Time& timeSinceLastIteration);
65
66 // NJointCCDMPControllerInterface interface
67 void learnDMPFromFiles(const Ice::StringSeq& fileNames, const Ice::Current&);
68
69 bool
70 isFinished(const Ice::Current&)
71 {
72 return finished;
73 }
74
75 // void runDMP(const Ice::DoubleSeq& goals, Ice::Double tau, const Ice::Current&);
76 void runDMP(const Ice::DoubleSeq& goals, const Ice::Current&);
77 void setGoals(const Ice::DoubleSeq& goals, const Ice::Current&);
78 void setViaPoints(Ice::Double u, const Ice::DoubleSeq& viapoint, const Ice::Current&);
79
80 double
81 getVirtualTime(const Ice::Current&)
82 {
83 return virtualtimer;
84 }
85
86 protected:
87 virtual void onPublish(const SensorAndControl&,
90
93 void controllerRun();
94
95 private:
96 Eigen::VectorXf targetWrench;
97
98 struct DebugBufferData
99 {
100 StringFloatDictionary desired_torques;
101
102 float modifiedPoseRight_x;
103 float modifiedPoseRight_y;
104 float modifiedPoseRight_z;
105 float currentPoseLeft_x;
106 float currentPoseLeft_y;
107 float currentPoseLeft_z;
108
109 float modifiedPoseLeft_x;
110 float modifiedPoseLeft_y;
111 float modifiedPoseLeft_z;
112 float currentPoseRight_x;
113 float currentPoseRight_y;
114 float currentPoseRight_z;
115
116 float dmpBoxPose_x;
117 float dmpBoxPose_y;
118 float dmpBoxPose_z;
119
120 float dmpTwist_x;
121 float dmpTwist_y;
122 float dmpTwist_z;
123
124 float modifiedTwist_lx;
125 float modifiedTwist_ly;
126 float modifiedTwist_lz;
127 float modifiedTwist_rx;
128 float modifiedTwist_ry;
129 float modifiedTwist_rz;
130
131 float rx;
132 float ry;
133 float rz;
134
135 Eigen::VectorXf wrenchDMP;
136 Eigen::VectorXf computedBoxWrench;
137
138 Eigen::VectorXf forceImpedance;
139 Eigen::VectorXf forcePID;
140 Eigen::VectorXf forcePIDControlValue;
141 Eigen::VectorXf poseError;
142 Eigen::VectorXf wrenchesConstrained;
143 Eigen::VectorXf wrenchesMeasuredInRoot;
144 };
145
146 TripleBuffer<DebugBufferData> debugOutputData;
147
148 struct NJointBimanualForceControllerSensorData
149 {
150 double currentTime;
151 double deltaT;
152 Eigen::Matrix4f currentPose;
153 Eigen::VectorXf currentTwist;
154 };
155
157
158 struct NJointBimanualForceControllerInterfaceData
159 {
160 Eigen::Matrix4f currentLeftPose;
161 Eigen::Matrix4f currentRightPose;
162 };
163
165
166 std::vector<ControlTarget1DoFActuatorTorque*> leftTargets;
167 std::vector<const SensorValue1DoFActuatorAcceleration*> leftAccelerationSensors;
168 std::vector<const SensorValue1DoFActuatorVelocity*> leftVelocitySensors;
169 std::vector<const SensorValue1DoFActuatorPosition*> leftPositionSensors;
170
171 std::vector<ControlTarget1DoFActuatorTorque*> rightTargets;
172 std::vector<const SensorValue1DoFActuatorAcceleration*> rightAccelerationSensors;
173 std::vector<const SensorValue1DoFActuatorVelocity*> rightVelocitySensors;
174 std::vector<const SensorValue1DoFActuatorPosition*> rightPositionSensors;
175
176 const SensorValueForceTorque* rightForceTorque;
177 const SensorValueForceTorque* leftForceTorque;
178
179 NJointBimanualForceControllerConfigPtr cfg;
180 VirtualRobot::DifferentialIKPtr leftIK;
181 VirtualRobot::DifferentialIKPtr rightIK;
182
184
185
186 double virtualtimer;
187
188 mutable MutexType controllerMutex;
189 Eigen::VectorXf leftDesiredJointValues;
190 Eigen::VectorXf rightDesiredJointValues;
191
192 Eigen::Matrix4f leftInitialPose;
193 Eigen::Matrix4f rightInitialPose;
194 Eigen::Matrix4f boxInitialPose;
195
196 Eigen::VectorXf KpImpedance;
197 Eigen::VectorXf KdImpedance;
198 Eigen::VectorXf KpAdmittance;
199 Eigen::VectorXf KdAdmittance;
200 Eigen::VectorXf KmAdmittance;
201 Eigen::VectorXf KmPID;
202
203 Eigen::VectorXf modifiedAcc;
204 Eigen::VectorXf modifiedTwist;
205 Eigen::Matrix4f modifiedLeftPose;
206 Eigen::Matrix4f modifiedRightPose;
207
208 Eigen::Matrix4f sensorFrame2TcpFrameLeft;
209 Eigen::Matrix4f sensorFrame2TcpFrameRight;
210
211 //static compensation
212 float massLeft;
213 Eigen::Vector3f CoMVecLeft;
214 Eigen::Vector3f forceOffsetLeft;
215 Eigen::Vector3f torqueOffsetLeft;
216
217 float massRight;
218 Eigen::Vector3f CoMVecRight;
219 Eigen::Vector3f forceOffsetRight;
220 Eigen::Vector3f torqueOffsetRight;
221
222
223 // float knull;
224 // float dnull;
225
226 std::vector<std::string> leftJointNames;
227 std::vector<std::string> rightJointNames;
228
229 // float torqueLimit;
230 VirtualRobot::RobotNodeSetPtr leftRNS;
231 VirtualRobot::RobotNodeSetPtr rightRNS;
232 VirtualRobot::RobotNodePtr tcpLeft;
233 VirtualRobot::RobotNodePtr tcpRight;
234
235 std::vector<PIDControllerPtr> forcePIDControllers;
236
237 // filter parameters
238 float filterCoeff;
239 Eigen::VectorXf filteredOldValue;
240 bool finished;
241 bool dmpStarted;
242
243 protected:
244 // void rtPreActivateController();
246 };
247
248} // 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