25#include <SimoxUtility/math/convert/mat4f_to_pos.h>
26#include <SimoxUtility/math/convert/mat4f_to_quat.h>
27#include <VirtualRobot/IK/DifferentialIK.h>
28#include <VirtualRobot/Robot.h>
29#include <VirtualRobot/RobotNodeSet.h>
40 const NJointControllerConfigPtr& config,
44 NJointTaskSpaceImpedanceControlConfigPtr cfg =
45 NJointTaskSpaceImpedanceControlConfigPtr::dynamicCast(config);
51 VirtualRobot::RobotNodeSetPtr rns =
rtGetRobot()->getRobotNodeSet(cfg->nodeSetName);
55 for (
size_t i = 0; i < rns->getSize(); ++i)
57 std::string jointName = rns->getNode(i)->getName();
58 jointNames.push_back(jointName);
63 auto casted_ct = ct->
asA<ControlTarget1DoFActuatorTorque>();
65 targets.push_back(casted_ct);
67 const SensorValue1DoFActuatorTorque* torqueSensor =
68 sv->
asA<SensorValue1DoFActuatorTorque>();
69 const SensorValue1DoFActuatorVelocity* velocitySensor =
70 sv->
asA<SensorValue1DoFActuatorVelocity>();
71 const SensorValue1DoFActuatorPosition* positionSensor =
72 sv->
asA<SensorValue1DoFActuatorPosition>();
79 torqueSensors.push_back(torqueSensor);
80 velocitySensors.push_back(velocitySensor);
81 positionSensors.push_back(positionSensor);
90 initData.
Kpos = cfg->Kpos;
91 initData.
Dpos = cfg->Dpos;
92 initData.
Kori = cfg->Kori;
93 initData.
Dori = cfg->Dori;
95 initData.
Knull = cfg->Knull;
96 initData.
Dnull = cfg->Dnull;
105 const IceUtil::Time& )
108 const auto& jointDesiredTorques =
112 for (
size_t i = 0; i < targets.size(); ++i)
114 targets.at(i)->torque = jointDesiredTorques(i);
115 if (!targets.at(i)->isValid())
117 targets.at(i)->torque = 0;
121 debugDataInfo.getWriteBuffer().desiredForce_x =
controller.dbg.tcpDesiredForce(0);
122 debugDataInfo.getWriteBuffer().desiredForce_y =
controller.dbg.tcpDesiredForce(1);
123 debugDataInfo.getWriteBuffer().desiredForce_z =
controller.dbg.tcpDesiredForce(2);
124 debugDataInfo.getWriteBuffer().tcpDesiredTorque_x =
controller.dbg.tcpDesiredTorque(0);
125 debugDataInfo.getWriteBuffer().tcpDesiredTorque_y =
controller.dbg.tcpDesiredTorque(1);
126 debugDataInfo.getWriteBuffer().tcpDesiredTorque_z =
controller.dbg.tcpDesiredTorque(2);
127 debugDataInfo.getWriteBuffer().quatError =
controller.dbg.errorAngle;
128 debugDataInfo.getWriteBuffer().posiError =
controller.dbg.posiError;
129 debugDataInfo.commitWrite();
138 auto values = debugDataInfo.getUpToDateReadBuffer().desired_torques;
139 for (
auto& pair : values)
141 datafields[pair.first] =
new Variant(pair.second);
144 datafields[
"desiredForce_x"] =
145 new Variant(debugDataInfo.getUpToDateReadBuffer().desiredForce_x);
146 datafields[
"desiredForce_y"] =
147 new Variant(debugDataInfo.getUpToDateReadBuffer().desiredForce_y);
148 datafields[
"desiredForce_z"] =
149 new Variant(debugDataInfo.getUpToDateReadBuffer().desiredForce_z);
151 datafields[
"tcpDesiredTorque_x"] =
152 new Variant(debugDataInfo.getUpToDateReadBuffer().tcpDesiredTorque_x);
153 datafields[
"tcpDesiredTorque_y"] =
154 new Variant(debugDataInfo.getUpToDateReadBuffer().tcpDesiredTorque_y);
155 datafields[
"tcpDesiredTorque_z"] =
156 new Variant(debugDataInfo.getUpToDateReadBuffer().tcpDesiredTorque_z);
158 datafields[
"quatError"] =
new Variant(debugDataInfo.getUpToDateReadBuffer().quatError);
159 datafields[
"posiError"] =
new Variant(debugDataInfo.getUpToDateReadBuffer().posiError);
161 debugObs->setDebugChannel(
"DSControllerOutput", datafields);
203 const Ice::FloatSeq& vals,
212 for (
size_t i = 0; i < 3; ++i)
218 else if (name ==
"Kori")
223 for (
size_t i = 0; i < 3; ++i)
229 else if (name ==
"Dpos")
234 for (
size_t i = 0; i < 3; ++i)
240 else if (name ==
"Dori")
245 for (
size_t i = 0; i < 3; ++i)
251 else if (name ==
"Knull")
257 for (
size_t i = 0; i < 8; ++i)
263 else if (name ==
"Dnull")
269 for (
size_t i = 0; i < 8; ++i)
280 const Eigen::VectorXf& knull,
281 const Eigen::VectorXf& dnull,
296 const NJointTaskSpaceImpedanceControlRuntimeConfig& cfg,
302 ARMARX_CHECK_EQUAL(
static_cast<std::size_t
>(cfg.desiredJointPositions.size()), targets.size());
NJointControllerRegistration< NJointTaskSpaceImpedanceController > registrationControllerDSRTController("NJointTaskSpaceImpedanceController")
Brief description of class JointControlTargetBase.
const SensorValueBase * useSensorValue(const std::string &sensorDeviceName) const
Get a const ptr to the given SensorDevice's SensorValue.
const VirtualRobot::RobotPtr & useSynchronizedRtRobot(bool updateCollisionModel=false)
Requests a VirtualRobot for use in rtRun *.
const VirtualRobot::RobotPtr & rtGetRobot()
TODO make protected and use attorneys.
ControlTargetBase * useControlTarget(const std::string &deviceName, const std::string &controlMode)
Declares to calculate the ControlTarget for the given ControlDevice in the given ControlMode when rtR...
const CartesianImpedanceController::Config & rtGetControlStruct() const
MutexType controlDataMutex
std::lock_guard< std::recursive_mutex > LockGuardType
void writeControlStruct()
bool rtUpdateControlStruct()
CartesianImpedanceController::Config & getWriterControlStruct()
void reinitTripleBuffer(const CartesianImpedanceController::Config &initial)
void onPublish(const SensorAndControl &, const DebugDrawerInterfacePrx &, const DebugObserverInterfacePrx &) override
void setPose(const Eigen::Matrix4f &mat, const Ice::Current &) override
void setConfig(const NJointTaskSpaceImpedanceControlRuntimeConfig &cfg, const Ice::Current &) override
void setPositionOrientation(const Eigen::Vector3f &pos, const Eigen::Quaternionf &ori, const Ice::Current &) override
void setImpedanceParameters(const std::string &, const Ice::FloatSeq &, const Ice::Current &) override
NJointTaskSpaceImpedanceController(const RobotUnitPtr &robotUnit, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &)
void setOrientation(const Eigen::Quaternionf &, const Ice::Current &) override
void setPosition(const Eigen::Vector3f &, const Ice::Current &) override
void rtRun(const IceUtil::Time &sensorValuesTimestamp, const IceUtil::Time &timeSinceLastIteration) override
TODO make protected and use attorneys.
void setNullspaceConfig(const Eigen::VectorXf &joint, const Eigen::VectorXf &knull, const Eigen::VectorXf &dnull, const Ice::Current &) override
void rtPreActivateController() override
This function is called before the controller is activated.
The SensorValueBase class.
The Variant class is described here: Variants.
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
#define ARMARX_CHECK_EQUAL(lhs, rhs)
This macro evaluates whether lhs is equal (==) rhs and if it turns out to be false it will throw an E...
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
Quaternion< float, 0 > Quaternionf
std::shared_ptr< class Robot > RobotPtr
This file offers overloads of toIce() and fromIce() functions for STL container types.
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugObserverInterface > DebugObserverInterfacePrx
std::map< std::string, VariantBasePtr > StringVariantBaseMap
IceUtil::Handle< class RobotUnit > RobotUnitPtr
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugDrawerInterface > DebugDrawerInterfacePrx
detail::ControlThreadOutputBufferEntry SensorAndControl
Eigen::VectorXf desiredJointPosition
Eigen::Quaternionf desiredOrientation
Eigen::Vector3f desiredPosition