1 #include <boost/algorithm/clamp.hpp>
3 #include <SimoxUtility/json.h>
4 #include <SimoxUtility/math/compare/is_equal.h>
5 #include <SimoxUtility/math/convert/mat4f_to_pos.h>
6 #include <SimoxUtility/math/convert/mat4f_to_quat.h>
8 #include <VirtualRobot/MathTools.h>
20 const RobotUnitPtr& robotUnit,
23 ARMARX_INFO <<
"Initializing force torque sensor " <<
c.sensorName;
24 const SensorValueBase* svlf = robotUnit->getSensorDevice(
c.sensorName)->getSensorValue();
28 sensorNode = rns->getRobot()->getSensor(
c.sensorName)->getRobotNode();
30 if (
c.sensorName ==
"FT R")
35 else if (
c.sensorName ==
"FT L")
43 filteredForce.setZero();
44 filteredTorque.setZero();
45 filteredForceInRoot.setZero();
46 filteredTorqueInRoot.setZero();
48 tcpGravityCompensation.setZero();
49 tcpGravForceVec.setZero();
50 tcpGravTorqueVec.setZero();
93 forceOffset.setZero();
94 torqueOffset.setZero();
98 timeForCalibration = 0.0f;
100 safeGuardForceOffset.setZero();
101 safeGuardTorqueOffset.setZero();
111 sensorOriInRoot = sensorNode->getOrientationInRootFrame();
112 rawForce = forceSensor->
force;
113 rawTorque = forceSensor->
torque;
119 safeGuardForceOffset = filteredForceInRoot;
120 safeGuardTorqueOffset = filteredTorqueInRoot;
127 (
c.enableSafeGuardForce and
128 (filteredForceInRoot - safeGuardForceOffset).norm() >
c.safeGuardForceThreshold) or
129 (
c.enableSafeGuardTorque and
130 (filteredTorqueInRoot - safeGuardTorqueOffset).norm() >
c.safeGuardTorqueThreshold);
131 ftSafe.store(not unsafeFlag);
141 forceOffset = (1 -
c.ftFilter) * forceOffset +
142 c.ftFilter * (forceSensor->
force -
143 sensorOriInRoot.transpose() * tcpGravityCompensation.head(3));
144 torqueOffset = (1 -
c.ftFilter) * torqueOffset +
145 c.ftFilter * (forceSensor->
torque -
146 sensorOriInRoot.transpose() * tcpGravityCompensation.tail(3));
148 timeForCalibration = timeForCalibration + deltaT;
149 if (timeForCalibration >
c.timeLimit)
154 "FT calibration done \n"
155 "-- force offset: [%.2f, %.2f, %.2f] \n"
156 "-- torque offset: [%.2f, %.2f, %.2f] \n"
157 "-- gravity compensation: [%.2f, %.2f, %.2f, %.2f, %.2f, %.2f]",
164 tcpGravityCompensation(0),
165 tcpGravityCompensation(1),
166 tcpGravityCompensation(2),
167 tcpGravityCompensation(3),
168 tcpGravityCompensation(4),
169 tcpGravityCompensation(5));
197 if (
c.enableTCPGravityCompensation)
200 tcpGravForceVec = tcpMass * gravity.head(3);
201 tcpGravTorqueVec = (sensorOriInRoot * tcpCoMInFTSensorFrame).
cross(tcpGravForceVec);
208 tcpGravityCompensation.head(3) = tcpGravForceVec;
209 tcpGravityCompensation.tail(3) = tcpGravTorqueVec;
213 tcpGravityCompensation.setZero();
215 return tcpGravityCompensation;
221 filteredForce = (1 -
c.ftFilter) * filteredForce +
c.ftFilter * rawForce;
222 filteredTorque = (1 -
c.ftFilter) * filteredTorque +
c.ftFilter * rawTorque;
224 filteredForceInRoot = sensorOriInRoot * (filteredForce - forceOffset) -
225 tcpGravityCompensation.head(3) -
c.forceBaseline;
226 filteredTorqueInRoot = sensorOriInRoot * (filteredTorque - torqueOffset) -
227 tcpGravityCompensation.tail(3) -
c.torqueBaseline;
229 for (
size_t i = 0; i < 3; ++i)
231 if (fabs(filteredForceInRoot(i)) >
c.deadZoneForce)
233 filteredForceInRoot(i) -=
234 (filteredForceInRoot(i) / fabs(filteredForceInRoot(i))) *
c.deadZoneForce;
238 filteredForceInRoot(i) = 0;
241 if (fabs(filteredTorqueInRoot(i)) >
c.deadZoneTorque)
243 filteredTorqueInRoot(i) -=
244 (filteredTorqueInRoot(i) / fabs(filteredTorqueInRoot(i))) *
c.deadZoneTorque;
248 filteredTorqueInRoot(i) = 0;
252 ft.head(3) = filteredForceInRoot;
253 ft.tail(3) = filteredTorqueInRoot;