25#include <VirtualRobot/MathTools.h>
26#include <VirtualRobot/RobotNodeSet.h>
28#include <simox/control/geodesics/util.h>
29#include <simox/control/robot/NodeInterface.h>
48 NJointControllerRegistration<NJointTaskspaceCollisionAvoidanceImpedanceController>
50 "NJointTaskspaceCollisionAvoidanceImpedanceController");
55 const NJointControllerConfigPtr& config,
59 ConfigPtrT cfg = ConfigPtrT::dynamicCast(config);
61 userCfgWithColl = CollisionCtrlCfg::FromAron(cfg->config);
63 std::map<std::string, std::vector<size_t>> velCtrlIndices;
65 coll = std::make_shared<core::CollisionAvoidanceBase>(
66 rtGetRobot(), userCfgWithColl.coll, velCtrlIndices);
67 collReady.store(
true);
74 return "NJointTaskspaceCollisionAvoidanceImpedanceController";
80 double time_measure = IceUtil::Time::now().toMicroSecondsDouble();
82 double time_update_status = IceUtil::Time::now().toMicroSecondsDouble() - time_measure;
84 arm->controller.run(arm->rtConfig, arm->rtStatus);
85 double time_run_rt = IceUtil::Time::now().toMicroSecondsDouble() - time_measure;
90 coll->rtLimbControllerRun(arm->kinematicChainName,
91 arm->rtStatus.jointPosition,
92 arm->rtStatus.qvelFiltered,
93 arm->rtConfig.torqueLimit,
94 arm->rtStatus.desiredJointTorque,
97 double time_coll_run = IceUtil::Time::now().toMicroSecondsDouble() - time_measure;
102 coll->collLimb.at(arm->kinematicChainName).rts.desiredJointTorques);
108 double time_set_target = IceUtil::Time::now().toMicroSecondsDouble() - time_measure;
110 time_measure = IceUtil::Time::now().toMicroSecondsDouble() - time_measure;
112 if (time_measure > 200)
115 "time_update_status: %.2f\n"
116 "run_rt_limb: %.2f\n"
117 "run_coll_rt_limb: %.2f\n"
118 "set_target_limb: %.2f\n"
121 time_run_rt - time_update_status,
122 time_coll_run - time_run_rt,
123 time_set_target - time_coll_run,
125 .deactivateSpam(1.0f);
131 const IceUtil::Time& sensorValuesTimestamp,
132 const IceUtil::Time& timeSinceLastIteration)
134 double deltaT = timeSinceLastIteration.toSecondsDouble();
136 if (collReady.load())
139 coll->updateRtConfigFromUser();
140 coll->rtCollisionChecking();
142 for (
auto& pair :
limb)
149 for (
auto& pair :
limb)
151 limbRT(pair.second, deltaT);
155 hands->updateRTStatus(deltaT);
161 const ::armarx::aron::data::dto::DictPtr& dto,
162 const Ice::Current& iceCurrent)
165 auto cfg = common::control_law::arondto::CollisionAvoidanceConfigDict::FromAron(dto);
166 coll->setUserCfg(cfg);
171 const Ice::Current& iceCurrent)
173 if (not collReady.load())
177 return coll->userCfg.toAronDTO();
182 const ::armarx::aron::data::dto::DictPtr& dto,
183 const Ice::Current& iceCurrent)
186 userCfgWithColl = CollisionCtrlCfg::FromAron(dto);
188 coll->setUserCfg(userCfgWithColl.coll);
197 return userCfgWithColl.toAronDTO();
210 datafields[
"trackingError"] =
new Variant(rtStatus.trackingError);
216 datafields,
"projectedImpedanceTorque", rtStatus.projImpedanceJointTorque);
222 Eigen::VectorXf selfCollNullspace = rtStatus.selfCollNullSpace.diagonal();
223 Eigen::VectorXf jointLimNullspace = rtStatus.jointLimNullSpace.diagonal();
582 debugObs->setDebugChannel(
"CollAvoid_ImpCtrl_" + arm.
nodeSetName, datafields);
594 for (
auto& pair : coll->collLimb)
605 "rt Preactivate controller NJointTaskspaceCollisionAvoidanceImpedanceController");
608 if (collReady.load())
611 coll->rtPreActivate();
619 if (collReady.load())
622 coll->rtPostDeactivate();
625 "post deactivate: NJointTaskspaceCollisionAvoidanceImpedanceController");
631 const std::map<std::string, ConstControlDevicePtr>& controlDevices,
632 const std::map<std::string, ConstSensorDevicePtr>&)
638 ::armarx::WidgetDescription::WidgetSeq widgets;
641 LabelPtr label =
new Label;
642 label->text =
"select a controller config";
644 StringComboBoxPtr cfgBox =
new StringComboBox;
645 cfgBox->name =
"config_box";
646 cfgBox->defaultIndex = 0;
647 cfgBox->multiSelect =
false;
650 std::vector<std::string>{
"default",
"default_a7_right",
"default_a7_right_zero_torque"};
653 layout->children.emplace_back(label);
654 layout->children.emplace_back(cfgBox);
657 layout->children.insert(layout->children.end(), widgets.begin(), widgets.end());
666 auto cfgName = values.at(
"config_box")->getString();
669 "controller_config/NJointTaskspaceCollisionAvoidanceImpedanceController/" + cfgName +
677 return new ConfigurableNJointControllerConfig{cfgDTO.toAronDTO()};
#define ARMARX_RT_LOGF_WARN(...)
#define ARMARX_RT_LOGF_INFO(...)
const VirtualRobot::RobotPtr & rtGetRobot()
TODO make protected and use attorneys.
static std::filesystem::path toSystemPath(const data::PackagePath &pp)
const T & getUpToDateReadBuffer() const
The Variant class is described here: Variants.
std::string getClassName(const Ice::Current &=Ice::emptyCurrent) const override
static WidgetDescription::WidgetPtr GenerateConfigDescription(const VirtualRobot::RobotPtr &, const std::map< std::string, ConstControlDevicePtr > &, const std::map< std::string, ConstSensorDevicePtr > &)
ConfigurableNJointControllerConfigPtr ConfigPtrT
void limbRT(ArmPtr &arm, const double deltaT)
NJointTaskspaceCollisionAvoidanceImpedanceController(const RobotUnitPtr &robotUnit, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &robot)
static ConfigPtrT GenerateConfigFromVariants(const StringVariantBaseMap &values)
void rtPostDeactivateController() override
This function is called after the controller is deactivated.
void updateCollisionAvoidanceConfig(const ::armarx::aron::data::dto::DictPtr &dto, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
NJointController interface for collision avoidance.
void rtRun(const IceUtil::Time &sensorValuesTimestamp, const IceUtil::Time &timeSinceLastIteration) override
TODO make protected and use attorneys.
void collLimbPublish(core::CollisionAvoidanceBase::NodeSetData &arm, const DebugObserverInterfacePrx &debugObs)
void onPublish(const SensorAndControl &sc, const DebugDrawerInterfacePrx &drawer, const DebugObserverInterfacePrx &) override
::armarx::aron::data::dto::DictPtr getConfig(const Ice::Current &iceCurrent) override
void rtPreActivateController() override
NJointControllerBase interface.
void updateConfig(const ::armarx::aron::data::dto::DictPtr &dto, const Ice::Current &iceCurrent) override
void onPublish(const SensorAndControl &, const DebugDrawerInterfacePrx &, const DebugObserverInterfacePrx &) override
::armarx::aron::data::dto::DictPtr getConfig(const Ice::Current &iceCurrent=Ice::emptyCurrent) override
std::map< std::string, ArmPtr > limb
void limbRTSetTarget(ArmPtr &arm, const Eigen::VectorXf &targetTorque)
NJointTaskspaceImpedanceController(const RobotUnitPtr &robotUnit, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &)
core::HandControlPtr hands
void rtPostDeactivateController() override
This function is called after the controller is deactivated.
void rtRunCoordinator(double deltaT)
coordinator
std::unique_ptr< ArmData > ArmPtr
void updateConfig(const ::armarx::aron::data::dto::DictPtr &dto, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
NJointController interface.
void rtPreActivateController() override
This function is called before the controller is activated.
void limbRTUpdateStatus(ArmPtr &arm, const double deltaT)
-----------------------------— Real time cotnrol --------------------------------------—
#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(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
#define ARMARX_INFO
The normal logging level.
armarx::aron::data::dto::Dict getCollisionAvoidanceConfig()
std::shared_ptr< class Robot > RobotPtr
::IceInternal::Handle< Dict > DictPtr
void debugEigenVec(StringVariantBaseMap &datafields, const std::string &name, Eigen::VectorXf vec)
NJointControllerRegistration< NJointTaskspaceCollisionAvoidanceImpedanceController > registrationControllerNJointTaskspaceCollisionAvoidanceImpedanceController("NJointTaskspaceCollisionAvoidanceImpedanceController")
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugObserverInterface > DebugObserverInterfacePrx
std::map< std::string, VariantBasePtr > StringVariantBaseMap
AronDTO readFromJson(const std::filesystem::path &filename)
IceUtil::Handle< class RobotUnit > RobotUnitPtr
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugDrawerInterface > DebugDrawerInterfacePrx
detail::ControlThreadOutputBufferEntry SensorAndControl
armarx::TripleBuffer< RtStatus > bufferRTtoPublish