25 #include <VirtualRobot/MathTools.h>
31 #include <armarx/control/common/control_law/aron/TaskspaceImpedanceControllerConfig.aron.generated.h>
37 NJointControllerRegistration<NJointTaskspaceBimanualImpedanceController>
39 "NJointTaskspaceBimanualImpedanceController");
41 NJointTaskspaceBimanualImpedanceController::NJointTaskspaceBimanualImpedanceController(
42 const RobotUnitPtr& robotUnit,
43 const NJointControllerConfigPtr& config,
47 ConfigPtrT cfg = ConfigPtrT::dynamicCast(config);
54 VirtualRobot::RobotNodeSetPtr rtRns =
rtGetRobot()->getRobotNodeSet(cfg->nodeSetName);
57 VirtualRobot::RobotNodeSetPtr nonRtRns =
nonRtRobot->getRobotNodeSet(cfg->nodeSetName);
66 for (
size_t i = 0; i < rtRns->getSize(); ++i)
68 std::string jointName = rtRns->getNode(i)->getName();
70 ControlTargetBase* ct =
useControlTarget(jointName, ControlModes::Torque1DoF);
74 auto* casted_ct = ct->asA<ControlTarget1DoFActuatorTorque>();
78 const auto* torqueSensor = sv->asA<SensorValue1DoFActuatorTorque>();
79 const auto* velocitySensor = sv->asA<SensorValue1DoFActuatorVelocity>();
80 const auto* positionSensor = sv->asA<SensorValue1DoFActuatorPosition>();
82 if (torqueSensor ==
nullptr)
86 if (velocitySensor ==
nullptr)
88 ARMARX_WARNING <<
"No velocity sensor available for " << jointName;
90 if (positionSensor ==
nullptr)
92 ARMARX_WARNING <<
"No position sensor available for " << jointName;
101 auto configData = ::armarx::fromAron<AronDTO, BO>(cfg->config);
111 if (configData.desiredNullspaceJointAngles.has_value())
126 return "NJointTaskspaceBimanualImpedanceController";
137 runTask(
"NJointTaskspaceAdmittanceAdditionalTask",
143 <<
"Create a new thread alone NJointTaskspaceAdmittanceController";
144 while (
getState() == eManagedIceObjectStarted)
150 c.waitForCycleDuration();
170 double deltaT = timeSinceLastIteration.toSecondsDouble();
180 size_t nDoF = sensorDevices.positionSensors.size();
181 for (
size_t i = 0; i < nDoF; ++i)
183 s.jointPosition[i] = sensorDevices.positionSensors[i]->position;
184 s.jointVelocity[i] = sensorDevices.velocitySensors[i]->velocity;
185 s.jointTorque[i] = sensorDevices.torqueSensors[i]->torque;
192 for (
unsigned int i = 0; i < controlTargets.targets.size(); i++)
194 targets.at(i)->torque = controlTargets.targets.at(i);
195 if (!targets.at(i)->isValid())
197 targets.at(i)->torque = 0;
204 const Ice::Current& iceCurrent)
206 auto configData = ::armarx::fromAron<AronDTO, BO>(dto);
220 const auto nDoF = jointNames.size();
223 const auto checkNonNegative = [](
const auto&
v) {
ARMARX_CHECK((
v.array() >= 0).all()); };
227 ARMARX_INFO <<
"No user defined nullspace target, reset to zero with " <<
VAROUT(nDoF);
228 configData.desiredNullspaceJointAngles = Eigen::VectorXf::Zero(nDoF);
229 reInitPreActivate.store(
true);
231 checkSize(configData.desiredNullspaceJointAngles.value());
232 checkSize(configData.kdNullspace);
233 checkSize(configData.kpNullspace);
235 checkNonNegative(configData.kdNullspace);
236 checkNonNegative(configData.kpNullspace);
237 checkNonNegative(configData.kdImpedance);
238 checkNonNegative(configData.kpImpedance);
248 auto nonRtData =
controller.bufferNonRtToOnPublish.getUpToDateReadBuffer();
249 auto rtData =
controller.bufferRtToOnPublish.getUpToDateReadBuffer();
260 debugObs->setDebugChannel(
"NJointTaskspaceBimanualImpedanceController", datafields);
267 VirtualRobot::RobotNodeSetPtr rns =
rtGetRobot()->getRobotNodeSet(kinematicChainName);
269 ARMARX_IMPORTANT <<
"rt preactivate controller with target pose\n\n" << currentPose;
271 if (reInitPreActivate.load())
274 c.desiredNullspaceJointAngles.value() = rns->getJointValuesEigen();
275 c.desiredPose = currentPose;
280 reInitPreActivate.store(
false);
283 const auto nDoF = rns->getSize();
290 for (
size_t i = 0; i < nDoF; ++i)
292 rtToNonRtStatus.
jointPosition[i] = sensorDevices.positionSensors[i]->position;
293 rtToNonRtStatus.
jointVelocity[i] = sensorDevices.velocitySensors[i]->velocity;
294 rtToNonRtStatus.
jointTorque[i] = sensorDevices.torqueSensors[i]->torque;