17#include <yarp/os/Bottle.h>
18#include <yarp/os/Time.h>
21#include <FeatureInterface.h>
22#include <yarp/conf/environment.h>
24#include <yarp/os/LogStream.h>
26#include <yarp/os/NetType.h>
27#include <yarp/dev/ControlBoardHelper.h>
32#include "EoProtocol.h"
33#include "EoProtocolMN.h"
34#include "EoProtocolMC.h"
35#include "EoProtocolAS.h"
41using namespace yarp::os;
42using namespace yarp::os::impl;
50#define ASK_REFERENCE_TO_FIRMWARE 1
52#define PARSER_MOTION_CONTROL_VERSION 6
57 yErrorOnce() << txt <<
" is not yet implemented for embObjMotionControl";
63 yErrorOnce() << txt <<
" has been deprecated for embObjMotionControl";
67#define NV_NOT_FOUND return nv_not_found();
71 yError () <<
" nv_not_found!! This may mean that this variable is not handled by this EMS\n";
77std::string embObjMotionControl::getBoardInfo(
void)
81 return " BOARD name_unknown (IP unknown) ";
90bool embObjMotionControl::alloc(
int nj)
92 _axisMap = allocAndCheck<int>(nj);
94 _encodersStamp = allocAndCheck<double>(nj);
95 _gearbox_M2J = allocAndCheck<double>(nj);
96 _gearbox_E2J = allocAndCheck<double>(nj);
97 _deadzone = allocAndCheck<double>(nj);
98 _foc_based_info= allocAndCheck<eomc::focBasedSpecificInfo_t>(nj);
104 _impedance_limits=allocAndCheck<eomc::impedanceLimits_t>(nj);
105 checking_motiondone=allocAndCheck<bool>(nj);
106 _last_position_move_time=allocAndCheck<double>(nj);
109 _ref_command_positions = allocAndCheck<double>(nj);
110 _ref_positions = allocAndCheck<double>(nj);
111 _ref_command_speeds = allocAndCheck<double>(nj);
112 _ref_speeds = allocAndCheck<double>(nj);
113 _ref_accs = allocAndCheck<double>(nj);
115 _enabledAmp = allocAndCheck<bool>(nj);
116 _enabledPid = allocAndCheck<bool>(nj);
117 _calibrated = allocAndCheck<bool>(nj);
118 _cacheImpedance = allocAndCheck<eOmc_impedance_t>(nj);
120 _rotorsLimits.resize(nj);
121 _jointsLimits.resize(nj);
122 _currentLimits.resize(nj);
123 _temperatureLimits.resize(nj);
125 _joint2set.resize(nj);
126 _timeouts.resize(nj);
127 _impedance_params.resize(nj);
128 _lugre_params.resize(nj);
129 _axesInfo.resize(nj);
130 _jointEncs.resize(nj);
131 _motorEncs.resize(nj);
132 _kalman_params.resize(nj);
133 _temperatureSensorsVector.resize(nj);
134 _temperatureExceededLimitWatchdog.resize(nj);
135 _temperatureSensorErrorWatchdog.resize(nj);
136 _temperatureSpikesFilter.resize(nj);
140 for(
int i = 0; i < nj; ++i)
142 _temperatureExceededLimitWatchdog.at(i).setThreshold(txrate);
143 _temperatureSensorErrorWatchdog.at(i).setThreshold(txrate);
149bool embObjMotionControl::dealloc()
151 checkAndDestroy(_axisMap);
152 checkAndDestroy(_encodersStamp);
153 checkAndDestroy(_gearbox_M2J);
154 checkAndDestroy(_gearbox_E2J);
155 checkAndDestroy(_deadzone);
156 checkAndDestroy(_impedance_limits);
157 checkAndDestroy(checking_motiondone);
158 checkAndDestroy(_ref_command_positions);
159 checkAndDestroy(_ref_positions);
160 checkAndDestroy(_ref_command_speeds);
161 checkAndDestroy(_ref_speeds);
162 checkAndDestroy(_ref_accs);
164 checkAndDestroy(_enabledAmp);
165 checkAndDestroy(_enabledPid);
166 checkAndDestroy(_calibrated);
167 checkAndDestroy(_foc_based_info);
189 ImplementControlCalibration(this),
190 ImplementAmplifierControl(this),
191 ImplementPidControl(this),
192 ImplementEncodersTimed(this),
193 ImplementPositionControl(this),
194 ImplementVelocityControl(this),
195 ImplementControlMode(this),
196 ImplementImpedanceControl(this),
197 ImplementMotorEncoders(this),
198#ifdef IMPLEMENT_DEBUG_INTERFACE
201 ImplementTorqueControl(this),
202 ImplementControlLimits(this),
203 ImplementPositionDirect(this),
204 ImplementInteractionMode(this),
205 ImplementMotor(this),
206 ImplementRemoteVariables(this),
207 ImplementAxisInfo(this),
208 ImplementPWMControl(this),
209 ImplementCurrentControl(this),
210 ImplementJointFault(this),
211 SAFETY_THRESHOLD(2.0),
215 _temperatureLimits(0),
219 _impedance_params(0),
225 _temperatureSensorsVector(0),
226 _temperatureExceededLimitWatchdog(0),
227 _temperatureSensorErrorWatchdog(0),
228 _temperatureSpikesFilter(0),
229 _rawDataAuxVector(0),
230 _rawValuesMetadataMap({})
244 _encodersStamp = NULL;
245 _foc_based_info = NULL;
246 _cacheImpedance = NULL;
247 _impedance_limits = NULL;
249 _ref_command_speeds = NULL;
250 _ref_command_positions= NULL;
251 _ref_positions = NULL;
253 _measureConverter = NULL;
255 checking_motiondone = NULL;
266 _last_position_move_time = NULL;
268 behFlags.useRawEncoderData =
false;
269 behFlags.pwmIsLimited =
false;
271 _maintenanceModeCfg.enableSkipRecalibration =
false;
273 std::string tmp = yarp::conf::environment::get_string(
"ETH_VERBOSEWHENOK");
276 behFlags.verbosewhenok = (bool)yarp::conf::numeric::from_string(tmp, 0U);
280 behFlags.verbosewhenok =
false;
285#ifdef NETWORK_PERFORMANCE_BENCHMARK
289 m_responseTimingVerifier.init(0.003, 0.00025, 0.001, 0.01, 0.0005, 30);
297 yTrace() <<
"embObjMotionControl::~embObjMotionControl()";
305 if(NULL != _mcparser)
323 ImplementControlCalibration::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL);
324 ImplementAmplifierControl::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL,
f.ampsToSensor);
325 ImplementEncodersTimed::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL);
326 ImplementMotorEncoders::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL);
327 ImplementPositionControl::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL);
328 ImplementPidControl::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL,
f.newtonsToSensor,
f.ampsToSensor,
f.dutycycleToPWM);
329 ImplementControlMode::initialize(_njoints, _axisMap);
330 ImplementVelocityControl::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL);
331 ImplementControlLimits::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL);
332 ImplementImpedanceControl::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL,
f.newtonsToSensor);
333 ImplementTorqueControl::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL,
f.newtonsToSensor,
f.ampsToSensor,
f.dutycycleToPWM,
f.bemf2raw,
f.ktau2raw);
334 ImplementPositionDirect::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL);
335 ImplementInteractionMode::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL);
336 ImplementMotor::initialize(_njoints, _axisMap);
337 ImplementRemoteVariables::initialize(_njoints, _axisMap);
338 ImplementAxisInfo::initialize(_njoints, _axisMap);
339 ImplementCurrentControl::initialize(_njoints, _axisMap,
f.ampsToSensor);
340 ImplementPWMControl::initialize(_njoints, _axisMap,
f.dutycycleToPWM);
341 ImplementJointFault::initialize(_njoints, _axisMap);
352 if(NULL == ethManager)
354 yFatal() <<
"embObjMotionControl::open() fails to instantiate ethManager";
358 eOipv4addr_t ipv4addr;
359 string boardIPstring;
361 if(
false == ethManager->
verifyEthBoardInfo(config, ipv4addr, boardIPstring, boardName))
363 yError() <<
"embObjMotionControl::open(): object TheEthManager fails in parsing ETH propertiex from xml file";
370 yError() << getBoardInfo() <<
"embObjMotionControl::open(): eth::parser fails to read board configuration data from xml file";
387 yError() <<
"embObjMotionControl::open() fails because could not instantiate the ethResource for " << getBoardInfo() <<
" ... unable to continue";
391 if(!fromConfig(config))
393 yError() << getBoardInfo() <<
"Missing motion control parameters in config file";
399 yError() <<
"embObjMotionControl: failed verifyEPprotocol. Cannot continue!";
405 const eOmn_serv_parameter_t* servparam = &serviceConfig.
ethservice;
406 if(eomn_serv_MC_generic == serviceConfig.
ethservice.configuration.type)
412 mcdiagnostics.
config.mode = serviceConfig.
ethservice.configuration.diagnosticsmode;
413 mcdiagnostics.
config.par16 = serviceConfig.
ethservice.configuration.diagnosticsparam;
414 if(eomn_serv_diagn_mode_MC_AMOyarp == mcdiagnostics.
config.mode)
417 mcdiagnostics.
ports.resize(2);
418 for(
size_t i=0; i<mcdiagnostics.
ports.size(); i++)
420 mcdiagnostics.
ports[i] =
new BufferedPort<Bottle>;
431 event_downsampler->
config.
info = getBoardInfo();
432 event_downsampler->
start();
436 yError() <<
"embObjMotionControl::open() has an error in call of ethResources::serviceVerifyActivate() for" << getBoardInfo();
441 yDebug() <<
"embObjMotionControl:serviceVerifyActivate OK!";
446 yError() <<
"embObjMotionControl::open() has an error in call of embObjMotionControl::init() for" << getBoardInfo();
453 yDebug() <<
"embObjMotionControl::init() has succesfully initted" << getBoardInfo();
460 yError() <<
"embObjMotionControl::open() fails to start mc service for" << getBoardInfo() <<
": cannot continue";
468 yDebug() <<
"embObjMotionControl::open() correctly starts mc service of" << getBoardInfo();
476 if(eomn_serv_diagn_mode_MC_AMOyarp == mcdiagnostics.
config.mode)
507 SystemClock::delaySystem(0.001*mcdiagnostics.
config.par16);
514int embObjMotionControl::fromConfig_NumOfJoints(yarp::os::Searchable &config)
519 int jn = config.findGroup(
"GENERAL").check(
"Joints", Value(1),
"Number of degrees of freedom").asInt32();
526void embObjMotionControl::debugUtil_printJointsetInfo(
void)
529 yError() <<
"****** DEBUG PRINTS **********";
530 yError() <<
"joint to set:";
531 for(
int x=0;
x< _njoints;
x++)
532 yError() <<
" /t j " <<
x <<
": set " <<_joint2set[
x];
533 yError() <<
"jointmap:";
535 yError() <<
" number of sets" << _jsets.size();
536 for(
size_t x=0;
x< _jsets.size();
x++)
538 yError() <<
"set " <<
x<<
"has size " <<_jsets[
x].getNumberofJoints();
539 for(
int y=0;
y<_jsets[
x].getNumberofJoints();
y++)
540 yError() <<
"set " <<
x <<
": " << _jsets[
x].joints[
y];
542 yError() <<
"********* END ****************";
549bool embObjMotionControl::verifyUserControlLawConsistencyInJointSet(
eomc::PidInfo *pidInfo)
552 for(
size_t s=0; s<_jsets.size(); s++)
554 int numofjoints = _jsets[s].getNumberofJoints();
558 yError() <<
"embObjMC" << getBoardInfo() <<
"Jointsset " << s <<
"hasn't joints!!! I should be never stay here!!!";
561 int firstjoint = _jsets[s].joints[0];
563 for(
int k=1; k<numofjoints; k++)
565 int otherjoint = _jsets[s].joints[k];
567 if(pidInfo[firstjoint].usernamePidSelected != pidInfo[otherjoint].usernamePidSelected)
569 yError() <<
"embObjMC "<< getBoardInfo() <<
"Joints beloning to same set must be have same control law. Joint " << otherjoint <<
" differs from " << firstjoint <<
"Set num " << s ;
582bool embObjMotionControl::verifyUserControlLawConsistencyInJointSet(
eomc::TrqPidInfo *pidInfo)
584 for(
size_t s=0; s<_jsets.size(); s++)
586 int numofjoints = _jsets[s].getNumberofJoints();
590 yError() <<
"embObjMC "<< getBoardInfo() <<
"Jointsset " << s <<
"hasn't joints!!! I should be never stay here!!!";
593 int firstjoint = _jsets[s].joints[0];
595 for(
int k=1; k<numofjoints; k++)
597 int otherjoint = _jsets[s].joints[k];
599 if(pidInfo[firstjoint].usernamePidSelected != pidInfo[otherjoint].usernamePidSelected)
601 yError() <<
"embObjMC"<< getBoardInfo() <<
"Joints beloning to same set must be have same control law. Joint " << otherjoint <<
" differs from " << firstjoint <<
"Set num " << s ;
611bool embObjMotionControl::updatedJointsetsCfgWithControlInfo()
615 for(
size_t s=0; s<_jsets.size(); s++)
617 if(_jsets[s].getNumberofJoints() == 0)
619 yError() <<
"embObjMC"<< getBoardInfo() <<
"Jointsset " << s <<
"hasn't joints!!! I should be never stay here!!!";
623 int joint = _jsets[s].joints[0];
633 _jsets[s].cfg.pid_output_types.postrj_ctrl_out_type = _trj_pids[joint].
out_type;
634 _jsets[s].cfg.pid_output_types.veltrj_ctrl_out_type = _trj_pids[joint].
out_type;
635 _jsets[s].cfg.pid_output_types.mixtrj_ctrl_out_type = _trj_pids[joint].
out_type;
639 _jsets[s].cfg.pid_output_types.posdir_ctrl_out_type = _trj_pids[joint].
out_type;
640 _jsets[s].cfg.pid_output_types.veldir_ctrl_out_type = _trj_pids[joint].
out_type;
642 _jsets[s].cfg.pid_output_types.torque_ctrl_out_type = _trq_pids[joint].
out_type;
644 _jsets[s].cfg.pid_output_types.pwm_ctrl_out_type = eomc_ctrl_out_type_pwm;
646 if (_cur_pids[joint].enabled)
648 _jsets[s].cfg.pid_output_types.cur_ctrl_out_type = eomc_ctrl_out_type_cur;
652 _jsets[s].cfg.pid_output_types.cur_ctrl_out_type = eomc_ctrl_out_type_n_a;
661bool embObjMotionControl::saveCouplingsData(
void)
663 eOmc_4jomo_coupling_t *jc_dest;
665 static eOmc_4jomo_coupling_t dummyjomocoupling = {};
667 switch(serviceConfig.
ethservice.configuration.type)
669 case eomn_serv_MC_foc:
671 jc_dest = &(serviceConfig.
ethservice.configuration.data.mc.foc_based.jomocoupling);
674 case eomn_serv_MC_mc4plus:
676 jc_dest = &(serviceConfig.
ethservice.configuration.data.mc.mc4plus_based.jomocoupling);
679 case eomn_serv_MC_mc4plusmais:
681 jc_dest = &(serviceConfig.
ethservice.configuration.data.mc.mc4plusmais_based.jomocoupling);
685 case eomn_serv_MC_mc2pluspsc:
687 jc_dest = &(serviceConfig.
ethservice.configuration.data.mc.mc2pluspsc.jomocoupling);
691 case eomn_serv_MC_mc4plusfaps:
693 jc_dest = &(serviceConfig.
ethservice.configuration.data.mc.mc4plusfaps.jomocoupling);
697 case eomn_serv_MC_advfoc:
699 jc_dest = &dummyjomocoupling;
702 case eomn_serv_MC_mc4:
707 case eomn_serv_MC_generic:
719 memset(jc_dest, 0,
sizeof(eOmc_4jomo_coupling_t));
723 for(
int i=0; i<4; i++)
725 jc_dest->joint2set[i] = eomc_jointSetNum_none;
728 if(_joint2set.size() > 4 )
730 yError() <<
"embObjMC "<< getBoardInfo() <<
"Jointsset size is bigger than 4. I can't send jointset information to fw.";
734 for(
size_t i=0; i<_joint2set.size(); i++)
736 jc_dest->joint2set[i] = _joint2set[i];
739 for(
int i=0; i<4; i++)
741 for(
int j=0; j<4; j++)
743 jc_dest->joint2motor[i][j] = eo_common_float_to_Q17_14((
float)_couplingInfo.
matrixJ2M[4*i+j]);
744 jc_dest->motor2joint[i][j] = eo_common_float_to_Q17_14((
float)_couplingInfo.
matrixM2J[4*i+j]);
749 for(
int r=0; r<4; r++)
751 for(
int c=0; c<6; c++)
753 jc_dest->encoder2joint[r][c] = eo_common_float_to_Q17_14((
float)_couplingInfo.
matrixE2J[6*r+c]);
757 for(
size_t s=0; s< _jsets.size(); s++)
759 eOmc_jointset_configuration_t* cfg_ptr = _jsets[s].getConfiguration();
760 memcpy(&(jc_dest->jsetcfg[s]), cfg_ptr,
sizeof(eOmc_jointset_configuration_t));
764 if(eomn_serv_MC_advfoc == serviceConfig.
ethservice.configuration.type)
767 eOmc_adv4jomo_coupling_t *ajc = &serviceConfig.
ethservice.configuration.data.mc.advfoc.adv4jomocoupling;
768 ajc->type = eommccoupling_traditional4x4;
770 std::memmove(&ajc->data.coupling4x4.joint2set[0], &jc_dest->joint2set[0], 4*
sizeof(uint8_t));
771 std::memmove(&ajc->data.coupling4x4.jsetcfg[0], &jc_dest->jsetcfg[0], 4*
sizeof(eOmc_jointset_configuration_t));
772 std::memmove(&ajc->data.coupling4x4.joint2motor, &jc_dest->joint2motor,
sizeof(eOmc_4x4_matrix_t));
773 std::memmove(&ajc->data.coupling4x4.motor2joint, &jc_dest->motor2joint,
sizeof(eOmc_4x4_matrix_t));
775 for(uint8_t r=0; r<4; r++)
777 for(uint8_t c=0; c<4; c++)
779 ajc->data.coupling4x4.encoder2joint4x4[r][c] = jc_dest->encoder2joint[r][c];
789bool embObjMotionControl::fromConfig_Step2(yarp::os::Searchable &config)
796 if(iNeedCouplingsInfo())
822 for (i = 0; i < _njoints; i++)
824 measConvFactors.angleToEncoder[i] = 1;
845 if(eomn_serv_MC_mc4 != (eOmn_serv_type_t)serviceConfig.
ethservice.configuration.type)
847 int* useMotorSpeedFbk = 0;
848 useMotorSpeedFbk =
new int[_njoints];
851 delete[] useMotorSpeedFbk;
856 if (!verifyUseMotorSpeedFbkInJointSet(useMotorSpeedFbk))
858 delete[] useMotorSpeedFbk;
861 delete[] useMotorSpeedFbk;
863 bool deadzoneIsAvailable;
866 if(!deadzoneIsAvailable)
868 updateDeadZoneWithDefaultValues();
880 bool lowLevPidisMandatory =
false;
882 if((serviceConfig.
ethservice.configuration.type == eomn_serv_MC_foc) || (serviceConfig.
ethservice.configuration.type == eomn_serv_MC_advfoc))
884 lowLevPidisMandatory =
true;
887 if(!_mcparser->
parsePids(config, _trj_pids, _trq_pids, _cur_pids, _spd_pids, lowLevPidisMandatory))
904 updatedJointsetsCfgWithControlInfo();
907 for (i = 0; i < _njoints; i++)
909 measConvFactors.newtonsToSensor[i] = 1000000.0f;
911 measConvFactors.bemf2raw[i] = measConvFactors.newtonsToSensor[i] / measConvFactors.angleToEncoder[i];
912 if (_trq_pids->
out_PidUnits == yarp::dev::PidOutputUnitsEnum::DUTYCYCLE_PWM_PERCENT)
914 measConvFactors.ktau2raw[i] = measConvFactors.dutycycleToPWM[i] / measConvFactors.newtonsToSensor[i];
916 else if (_trq_pids->
out_PidUnits == yarp::dev::PidOutputUnitsEnum::RAW_MACHINE_UNITS)
918 measConvFactors.ktau2raw[i] = 1.0 / measConvFactors.newtonsToSensor[i];
922 yError() <<
"Invalid ktau units";
return false;
927 _measureConverter =
new ControlBoardHelper(_njoints, _axisMap, measConvFactors.angleToEncoder, NULL, measConvFactors.newtonsToSensor, measConvFactors.ampsToSensor,
nullptr, measConvFactors.dutycycleToPWM , measConvFactors.bemf2raw, measConvFactors.ktau2raw);
928 _measureConverter->set_pid_conversion_units(PidControlTypeEnum::VOCAB_PIDTYPE_POSITION, _trj_pids->
fbk_PidUnits, _trj_pids->
out_PidUnits);
930 _measureConverter->set_pid_conversion_units(PidControlTypeEnum::VOCAB_PIDTYPE_TORQUE, _trq_pids->
fbk_PidUnits, _trq_pids->
out_PidUnits);
931 _measureConverter->set_pid_conversion_units(PidControlTypeEnum::VOCAB_PIDTYPE_CURRENT, _cur_pids->
fbk_PidUnits, _cur_pids->
out_PidUnits);
932 _measureConverter->set_pid_conversion_units(PidControlTypeEnum::VOCAB_PIDTYPE_VELOCITY, _spd_pids->
fbk_PidUnits, _spd_pids->
out_PidUnits);
945 initializeInterfaces(measConvFactors);
946 ImplementPidControl::setConversionUnits(PidControlTypeEnum::VOCAB_PIDTYPE_POSITION, _trj_pids->
fbk_PidUnits, _trj_pids->
out_PidUnits);
948 ImplementPidControl::setConversionUnits(PidControlTypeEnum::VOCAB_PIDTYPE_TORQUE, _trq_pids->
fbk_PidUnits, _trq_pids->
out_PidUnits);
949 ImplementPidControl::setConversionUnits(PidControlTypeEnum::VOCAB_PIDTYPE_CURRENT, _cur_pids->
fbk_PidUnits, _cur_pids->
out_PidUnits);
950 ImplementPidControl::setConversionUnits(PidControlTypeEnum::VOCAB_PIDTYPE_VELOCITY, _spd_pids->
fbk_PidUnits, _spd_pids->
out_PidUnits);
954 if(!saveCouplingsData())
961 yError() <<
"embObjMC " << getBoardInfo() <<
"IMPEDANCE section: error detected in parameters syntax";
968 yError() <<
"embObjMC " << getBoardInfo() <<
"LUGRE section: error detected in parameters syntax";
973 for(j=0; j<_njoints; j++)
976 _impedance_limits[j].
min_damp= 0.001;
977 _impedance_limits[j].
max_damp= 9.888;
980 _impedance_limits[j].
param_a= 0.011;
981 _impedance_limits[j].
param_b= 0.012;
982 _impedance_limits[j].
param_c= 0.013;
1003 eOmn_serv_type_t servtype =
static_cast<eOmn_serv_type_t
>(serviceConfig.
ethservice.configuration.type);
1005 if((eomn_serv_MC_foc == servtype) || (eomn_serv_MC_advfoc == servtype))
1007 std::string groupName = {};
1009 if(eomn_serv_MC_foc == servtype)
1012 eObrd_type_t brd =
static_cast<eObrd_type_t
>(serviceConfig.
ethservice.configuration.data.mc.foc_based.type);
1013 groupName = (eobrd_foc == brd) ?
"2FOC" :
"AMCBLDC";
1015 else if(eomn_serv_MC_advfoc == servtype)
1019 groupName =
"ADVFOC";
1022 if(!_mcparser->
parseFocGroup(config, _foc_based_info, groupName, _temperatureSensorsVector))
1025 for (j = 0; j < _njoints; j++)
1027 if (((_temperatureSensorsVector.at(j)->getType() !=
motor_temperature_sensor_none )) && ((_temperatureLimits[j].hardwareTemperatureLimit == 0) || (_temperatureLimits[j].warningTemperatureLimit == 0)))
1029 yError() <<
"In" << getBoardInfo() <<
"joint" << j <<
": inconsistent configuration, please update it. If Temperature limits are not set then TemperatureSensorType must be NONE or not set and/or HasTempSensor must be zero. Aborting...";
1035 yInfo() <<
"embObjMC " << getBoardInfo() <<
"joint " << j <<
" has motor not provided with any available type of temperature sensor. If needed update the configurations file accordingly";
1041 for (j = 0; j < _njoints; j++)
1043 _temperatureSensorsVector.at(j) = std::make_unique<eomc::TemperatureSensorNONE>();
1047 int defaultTimeout = 100;
1049 if (this->serviceConfig.
ethservice.configuration.type == eomn_serv_MC_advfoc)
1053 defaultTimeout = 300;
1066bool embObjMotionControl::verifyUseMotorSpeedFbkInJointSet(
int useMotorSpeedFbk [])
1068 for(
size_t s=0; s< _jsets.size(); s++)
1070 int numofjointsinset = _jsets[s].getNumberofJoints();
1071 if(numofjointsinset == 0 )
1073 yError() <<
"embObjMC " << getBoardInfo() <<
"Jointsset " << s <<
"hasn't joints!!! I should be never stay here!!!";
1077 int firstjointofset = _jsets[s].joints[0];
1078 for(
int j=1; j<numofjointsinset; j++)
1080 int joint = _jsets[s].joints[j];
1081 if(useMotorSpeedFbk[firstjointofset] != useMotorSpeedFbk[joint])
1083 yError() <<
"embObjMC " << getBoardInfo() <<
". Param useMotorSpeedFbk should have same value for joints belong same set. See joint " << firstjointofset <<
" and " << joint;
1088 _jsets[s].setUseSpeedFeedbackFromMotors(useMotorSpeedFbk[firstjointofset]);
1095bool embObjMotionControl::verifyTorquePidshasSameUnitTypes(yarp::dev::PidFeedbackUnitsEnum &fbk_pidunits, yarp::dev::PidOutputUnitsEnum& out_pidunits)
1097 fbk_pidunits = yarp::dev::PidFeedbackUnitsEnum::RAW_MACHINE_UNITS;
1098 out_pidunits = yarp::dev::PidOutputUnitsEnum::RAW_MACHINE_UNITS;
1100 int firstjoint = -1;
1101 for(
int i=0; i<_njoints; i++)
1103 if(_trq_pids[i].enabled)
1113 for(
int i=firstjoint+1; i<_njoints; i++)
1115 if(_trq_pids[i].enabled)
1117 if(_trq_pids[firstjoint].fbk_PidUnits != _trq_pids[i].fbk_PidUnits ||
1118 _trq_pids[firstjoint].out_PidUnits != _trq_pids[i].out_PidUnits)
1120 yError() <<
"embObjMC " << getBoardInfo() <<
"all joints with torque enabled should have same controlunits type. Joint " << firstjoint <<
" differs from joint " << i;
1131bool embObjMotionControl::isTorqueControlEnabled(
int joint)
1133 return (_trq_pids[joint].enabled);
1136bool embObjMotionControl::isVelocityControlEnabled(
int joint)
1139 return (_trj_pids[joint].enabled);
1143void embObjMotionControl::updateDeadZoneWithDefaultValues(
void)
1145 for(
int i=0; i<_njoints; i++)
1147 switch(_jointEncs[i].
type)
1155 case eomc_enc_aksim2:
1161 case eomc_enc_absanalog:
1164 case eomc_enc_hallmotor:
1165 case eomc_enc_spichainof2:
1166 case eomc_enc_spichainof3:
1176bool embObjMotionControl::fromConfig_readServiceCfg(yarp::os::Searchable &config)
1179 if(
false == parser->
parseService(config, serviceConfig))
1181 yError() <<
"embObjMC " << getBoardInfo() <<
"cannot parse service" ;
1185 if(eomn_serv_MC_generic == serviceConfig.
ethservice.configuration.type)
1187 yError() <<
"embObjMC " << getBoardInfo() <<
"it is no longer possible use eomn_serv_MC_generic, because firmware cannot configure itself!" ;
1195 for(
int i=0; i<_njoints; i++)
1200 if(NULL == jointEncoder_ptr)
1202 _jointEncs[i].resolution = 1;
1203 _jointEncs[i].type = eomc_enc_none;
1204 _jointEncs[i].tolerance = 0;
1208 _jointEncs[i].resolution = jointEncoder_ptr->
resolution;
1209 _jointEncs[i].type = (eOmc_encoder_t)jointEncoder_ptr->
desc.type;
1210 _jointEncs[i].tolerance = jointEncoder_ptr->
tolerance;
1214 if(NULL == motorEncoder_ptr)
1216 _motorEncs[i].resolution = 1;
1217 _motorEncs[i].type = eomc_enc_none;
1218 _motorEncs[i].tolerance = 0;
1222 _motorEncs[i].resolution = motorEncoder_ptr->
resolution;
1223 _motorEncs[i].type = (eOmc_encoder_t)motorEncoder_ptr->
desc.type;
1224 _motorEncs[i].tolerance = motorEncoder_ptr->
tolerance;
1236bool embObjMotionControl::fromConfig(yarp::os::Searchable &config)
1239 _njoints = fromConfig_NumOfJoints(config);
1243 yError() <<
"embObjMC"<< getBoardInfo() <<
"fromConfig(): detected _njoints = " << _njoints;
1248 if(!alloc(_njoints))
1250 yError() <<
"embObjMC"<< getBoardInfo() <<
"fromConfig(): alloc() failed for _njoints = " << _njoints;
1258 int currentMCversion =0;
1264 yError() <<
"embObjMC" << getBoardInfo() <<
"------ ATTENTION!!!! Wrong value of <MotioncontrolVersion> parameter !!!! ---------------------------------------------------------------------------------------";
1265 yError() <<
"embObjMC" << getBoardInfo() <<
"------ This means that the configuration files of this device are not compatible with my parser, so I cannot start. ";
1266 yError() <<
"embObjMC" << getBoardInfo() <<
"------ I need version " <<
PARSER_MOTION_CONTROL_VERSION <<
", but in configuration files have version " << currentMCversion <<
".";
1267 yError() <<
"embObjMC" << getBoardInfo() <<
"------ Please update configuration files in robots-configuration repository. (see https://icub-tech-iit.github.io/documentation/icub_robot_configuration/icub_robot_configuration_index/ for more information). ";
1268 yError() <<
"embObjMC" << getBoardInfo() <<
"------ If the problem persists contact icub-support@iit.it DO NOT DO IT BY YOURSELF.";
1269 yError() <<
"embObjMC" << getBoardInfo() <<
"----------------------------------------------------------------------------------------------------------------------------------------------------------------";
1275 yTrace() << config.toString().c_str();
1280 if(
false == fromConfig_readServiceCfg(config))
1296 if(
false == fromConfig_Step2(config))
1308bool embObjMotionControl::init()
1310 eOprotID32_t protid = 0;
1316 for(
int logico=0; logico< _njoints; logico++)
1318 int fisico = _axisMap[logico];
1319 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, fisico, eoprot_tag_mc_joint_cmmnds_controlmode);
1320 eOenum08_t controlMode = eomc_controlmode_cmd_idle;
1324 yError() <<
"embObjMotionControl::init() had an error while setting eomc_controlmode_cmd_idle in "<< getBoardInfo();
1330 SystemClock::delaySystem(0.010);
1337 vector<eOprotID32_t> id32v(0);
1338 for(
int n=0;
n<_njoints;
n++)
1340 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint,
n, eoprot_tag_mc_joint_status_core);
1341 id32v.push_back(protid);
1342 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint,
n, eoprot_tag_mc_joint_status_addinfo_multienc);
1343 id32v.push_back(protid);
1344 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor,
n, eoprot_tag_mc_motor_status);
1345 id32v.push_back(protid);
1348 if(eomn_serv_diagn_mode_MC_AMOyarp == mcdiagnostics.
config.mode)
1350 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, 0, eoprot_tag_mc_joint_status_debug);
1351 id32v.push_back(protid);
1352 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, 1, eoprot_tag_mc_joint_status_debug);
1353 id32v.push_back(protid);
1359 yError() <<
"embObjMotionControl::init() fails to add its variables to regulars in "<< getBoardInfo() <<
": cannot proceed any further";
1366 yDebug() <<
"embObjMotionControl::init() added" << id32v.size() <<
"regular rops to "<< getBoardInfo();
1368 for(
unsigned int r=0; r<id32v.size(); r++)
1370 uint32_t id32 = id32v.at(r);
1371 eoprot_ID2information(id32, nvinfo,
sizeof(nvinfo));
1372 yDebug() <<
"\t it added regular rop for" << nvinfo;
1377 SystemClock::delaySystem(0.005);
1384 for(
int logico=0; logico< _njoints; logico++)
1386 int fisico = _axisMap[logico];
1387 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, fisico, eoprot_tag_mc_joint_config);
1389 eOmc_joint_config_t jconfig = {0};
1390 memset(&jconfig, 0,
sizeof(eOmc_joint_config_t));
1392 tmp = _measureConverter->convert_pid_to_machine(yarp::dev::VOCAB_PIDTYPE_POSITION,_trj_pids[logico].pid, fisico);
1396 tmp = _measureConverter->convert_pid_to_machine(yarp::dev::VOCAB_PIDTYPE_TORQUE, _trq_pids[logico].pid, fisico);
1400 jconfig.impedance.damping = (eOmeas_damping_t) _measureConverter->impN2S(_impedance_params[logico].damping, fisico);
1401 jconfig.impedance.stiffness = (eOmeas_stiffness_t) _measureConverter->impN2S(_impedance_params[logico].stiffness, fisico);
1402 jconfig.impedance.offset = 0;
1404 _cacheImpedance[logico].stiffness = jconfig.impedance.stiffness;
1405 _cacheImpedance[logico].damping = jconfig.impedance.damping;
1406 _cacheImpedance[logico].offset = jconfig.impedance.offset;
1408 jconfig.userlimits.max = (eOmeas_position_t)
S_32(_measureConverter->posA2E(_jointsLimits[logico].posMax, fisico));
1409 jconfig.userlimits.min = (eOmeas_position_t)
S_32(_measureConverter->posA2E(_jointsLimits[logico].posMin, fisico));
1411 jconfig.hardwarelimits.max = (eOmeas_position_t)
S_32(_measureConverter->posA2E(_jointsLimits[logico].posHwMax, fisico));
1412 jconfig.hardwarelimits.min = (eOmeas_position_t)
S_32(_measureConverter->posA2E(_jointsLimits[logico].posHwMin, fisico));
1415 jconfig.maxvelocityofjoint =
S_32(_measureConverter->posA2E(_jointsLimits[logico].velMax, fisico));
1416 jconfig.velocitysetpointtimeout = (eOmeas_time_t)
U_16(_timeouts[logico].velocity_ref);
1417 jconfig.currentsetpointtimeout = (eOmeas_time_t)
U_16(_timeouts[logico].current_ref);
1418 jconfig.openloopsetpointtimeout = (eOmeas_time_t)
U_16(_timeouts[logico].pwm_ref);
1419 jconfig.torquesetpointtimeout = (eOmeas_time_t)
U_16(_timeouts[logico].torque_ref);
1420 jconfig.torquefeedbacktimeout = (eOmeas_time_t)
U_16(_timeouts[logico].torque_fbk);
1422 jconfig.jntEncoderResolution = _jointEncs[logico].resolution;
1423 jconfig.jntEncoderType = _jointEncs[logico].type;
1424 jconfig.jntEncTolerance = _jointEncs[logico].tolerance;
1426 jconfig.motor_params.bemf_value = _measureConverter->bemf_user2raw(_trq_pids[logico].kbemf, fisico);
1427 jconfig.motor_params.bemf_scale = 0;
1428 jconfig.motor_params.ktau_value = _measureConverter->ktau_user2raw(_trq_pids[logico].ktau, fisico);
1429 jconfig.motor_params.ktau_scale = 0;
1430 jconfig.motor_params.friction.viscous_pos_val = _measureConverter->viscousPos_user2raw(_trq_pids[logico].viscousPos, fisico);
1431 jconfig.motor_params.friction.viscous_neg_val = _measureConverter->viscousNeg_user2raw(_trq_pids[logico].viscousNeg, fisico);
1432 jconfig.motor_params.friction.coulomb_pos_val = _measureConverter->coulombPos_user2raw(_trq_pids[logico].coulombPos, fisico);
1433 jconfig.motor_params.friction.coulomb_neg_val = _measureConverter->coulombNeg_user2raw(_trq_pids[logico].coulombNeg, fisico);
1434 jconfig.motor_params.friction.velocityThres_val = _measureConverter->velocityThres_user2raw(_trq_pids[logico].velocityThres, fisico);
1436 jconfig.gearbox_E2J = _gearbox_E2J[logico];
1438 jconfig.deadzone = _measureConverter->posA2E(_deadzone[logico], fisico);
1440 jconfig.tcfiltertype=_trq_pids[logico].
filterType;
1442 jconfig.kalman_params.enabled = _kalman_params[logico].enabled;
1443 for(
int i=0; i<_kalman_params[logico].x0.size(); i++) jconfig.kalman_params.x0[i] = _kalman_params[logico].x0.at(i);
1444 for(
int i=0; i<_kalman_params[logico].Q.size(); i++) jconfig.kalman_params.Q[i] = _kalman_params[logico].Q.at(i);
1445 jconfig.kalman_params.R = _kalman_params[logico].R;
1446 jconfig.kalman_params.P0 = _kalman_params[logico].P0;
1450 yError() <<
"FATAL: embObjMotionControl::init() had an error while calling setcheckRemoteValue() for joint config fisico #" << fisico <<
"in "<< getBoardInfo();
1457 yDebug() <<
"embObjMotionControl::init() correctly configured joint config fisico #" << fisico <<
"in "<< getBoardInfo();
1468 for(
int logico=0; logico<_njoints; logico++)
1470 int fisico = _axisMap[logico];
1472 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, fisico, eoprot_tag_mc_motor_config);
1473 eOmc_motor_config_t motor_cfg = {0};
1474 motor_cfg.maxvelocityofmotor = 0;
1475 motor_cfg.currentLimits.nominalCurrent = _currentLimits[logico].nominalCurrent;
1476 motor_cfg.currentLimits.overloadCurrent = _currentLimits[logico].overloadCurrent;
1477 motor_cfg.currentLimits.peakCurrent = _currentLimits[logico].peakCurrent;
1478 motor_cfg.gearbox_M2J = _gearbox_M2J[logico];
1479 motor_cfg.rotorEncoderResolution = _motorEncs[logico].resolution;
1480 motor_cfg.rotEncTolerance = _motorEncs[logico].tolerance;
1481 motor_cfg.hasHallSensor = _foc_based_info[logico].
hasHallSensor;
1483 motor_cfg.hasTempSensor = _foc_based_info[logico].
hasTempSensor;
1486 motor_cfg.verbose = _foc_based_info[logico].
verbose;
1487 motor_cfg.motorPoles = _foc_based_info[logico].
motorPoles;
1489 motor_cfg.Kbemf = _foc_based_info[logico].
kbemf;
1490 motor_cfg.rotorEncoderType = _motorEncs[logico].type;
1491 motor_cfg.pwmLimit =_rotorsLimits[logico].pwmMax;
1492 motor_cfg.temperatureLimit = (eOmeas_temperature_t)
S_16(_temperatureSensorsVector.at(logico)->convertTempCelsiusToRaw(_temperatureLimits.at(logico).hardwareTemperatureLimit));
1493 motor_cfg.limitsofrotor.max = (eOmeas_position_t)
S_32(_measureConverter->posA2E(_rotorsLimits[logico].posMax, fisico ));
1494 motor_cfg.limitsofrotor.min = (eOmeas_position_t)
S_32(_measureConverter->posA2E(_rotorsLimits[logico].posMin, fisico ));
1496 motor_cfg.LuGre_params.Km = _lugre_params[logico].Km;
1497 motor_cfg.LuGre_params.Kw = _lugre_params[logico].Kw;
1498 motor_cfg.LuGre_params.S0 = _lugre_params[logico].S0;
1499 motor_cfg.LuGre_params.S1 = _lugre_params[logico].S1;
1500 motor_cfg.LuGre_params.Vth = _lugre_params[logico].Vth;
1501 motor_cfg.LuGre_params.Fc_pos = _lugre_params[logico].Fc_pos;
1502 motor_cfg.LuGre_params.Fc_neg = _lugre_params[logico].Fc_neg;
1503 motor_cfg.LuGre_params.Fs_pos = _lugre_params[logico].Fs_pos;
1504 motor_cfg.LuGre_params.Fs_neg = _lugre_params[logico].Fs_neg;
1507 tmp = _measureConverter->convert_pid_to_machine(yarp::dev::VOCAB_PIDTYPE_CURRENT, _cur_pids[logico].pid, fisico);
1510 tmp = _measureConverter->convert_pid_to_machine(yarp::dev::VOCAB_PIDTYPE_VELOCITY, _spd_pids[logico].pid, fisico);
1515 yError() <<
"FATAL: embObjMotionControl::init() had an error while calling setcheckRemoteValue() for motor config fisico #" << fisico <<
"in "<< getBoardInfo();
1522 yDebug() <<
"embObjMotionControl::init() correctly configured motor config fisico #" << fisico <<
"in "<< getBoardInfo();
1531 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_controller, 0, eoprot_tag_mc_controller_config);
1533 eOmc_controller_config_t controller_cfg = {0};
1534 memset(&controller_cfg, 0,
sizeof(eOmc_controller_config_t));
1535 controller_cfg.durationofctrlloop = (uint32_t)bdata.
settings.
txconfig.cycletime;
1540 yError() <<
"FATAL: embObjMotionControl::init() had an error while calling setcheckRemoteValue() for the controller " <<
"in "<< getBoardInfo();
1547 yDebug() <<
"embObjMotionControl::init() correctly configured controller config " <<
"in "<< getBoardInfo();
1554 const char* tag = eoprot_TAG2string(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_addinfo_multienc);
1556 _rawValuesMetadataMap.insert({{tag,
rawValuesKeyMetadata({}, {}, _njoints * eOmc_joint_multienc_maxnum)}});
1557 for (
auto &[k, v] : _rawValuesMetadataMap)
1559 std::string auxstring =
"";
1561 for (
int i = 0; i < _njoints; i++)
1566 v.axesNames.push_back(auxstring);
1567 v.rawValueNames.insert(v.rawValueNames.end(),
1568 {auxstring+
"_primary_encoder_raw_value",
1569 auxstring+
"_secondary_encoder_raw_value",
1570 auxstring+
"_primary_encoder_diagnostic"}
1576 yTrace() <<
"embObjMotionControl::init(): correctly instantiated for " << getBoardInfo();
1584 yTrace() <<
" embObjMotionControl::close()";
1586 ImplementControlMode::uninitialize();
1587 ImplementEncodersTimed::uninitialize();
1588 ImplementMotorEncoders::uninitialize();
1589 ImplementPositionControl::uninitialize();
1590 ImplementVelocityControl::uninitialize();
1591 ImplementPidControl::uninitialize();
1592 ImplementControlCalibration::uninitialize();
1593 ImplementAmplifierControl::uninitialize();
1594 ImplementImpedanceControl::uninitialize();
1595 ImplementControlLimits::uninitialize();
1596 ImplementTorqueControl::uninitialize();
1597 ImplementPositionDirect::uninitialize();
1598 ImplementInteractionMode::uninitialize();
1599 ImplementRemoteVariables::uninitialize();
1600 ImplementAxisInfo::uninitialize();
1601 ImplementCurrentControl::uninitialize();
1602 ImplementPWMControl::uninitialize();
1603 ImplementJointFault::uninitialize();
1605 if (_measureConverter) {
delete _measureConverter; _measureConverter=0;}
1608 if(eomn_serv_diagn_mode_MC_AMOyarp == mcdiagnostics.
config.mode)
1611 for(
size_t i=0; i<mcdiagnostics.
ports.size(); i++)
1613 mcdiagnostics.
ports[i]->close();
1614 delete mcdiagnostics.
ports[i];
1616 mcdiagnostics.
ports.clear();
1618 mcdiagnostics.
config.mode = eomn_serv_diagn_mode_NONE;
1619 mcdiagnostics.
config.par16 = 0;
1622 delete event_downsampler;
1636void embObjMotionControl::cleanup(
void)
1638 if(ethManager == NULL)
return;
1657 size_t joint = eoprot_ID2index(id32);
1658 eOprotEntity_t ent = eoprot_ID2entity(id32);
1659 eOprotTag_t tag = eoprot_ID2tag(id32);
1673 std::lock_guard<std::mutex> lck(_mutex);
1674 _encodersStamp[joint] = timestamp;
1678 if(eomn_serv_diagn_mode_MC_AMOyarp == mcdiagnostics.
config.mode)
1680 char str[128] =
"boh";
1682 eoprot_ID2information(id32, str,
sizeof(str));
1684 if((eoprot_entity_mc_joint == ent) && (eoprot_tag_mc_joint_status_debug == tag) && (joint < mcdiagnostics.
ports.size()))
1687 eOprotID32_t id32sc = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, joint, eoprot_tag_mc_joint_status_core);
1688 eOmc_joint_status_core_t jcore = {};
1692 int32_t *debug32 =
reinterpret_cast<int32_t*
>(rxdata);
1695 Bottle& output = mcdiagnostics.
ports[joint]->prepare();
1698 output.addString(
"[yt, amo, reg, pos]");
1699 output.addFloat64(timestamp);
1700 output.addInt32(debug32[0]);
1701 output.addInt32(debug32[1]);
1702 output.addInt32(jcore.measures.meas_position);
1703 mcdiagnostics.
ports[joint]->write();
1707 if((eoprot_entity_mc_motor == ent) && (eoprot_tag_mc_motor_status == tag))
1712 uint8_t motor = eoprot_ID2index(id32);
1716 eOmc_motor_status_t *mc_motor_status =
reinterpret_cast<eOmc_motor_status_t*
>(rxdata);
1718 if((
double)mc_motor_status->basic.mot_temperature < 0 )
1720 if(! _temperatureSensorErrorWatchdog.at(motor).isStarted())
1722 yWarning() << getBoardInfo() <<
"At time" << (yarp::os::Time::now() - _temperatureSensorErrorWatchdog.at(motor).getAbsoluteTime()) <<
"In motor" << motor <<
"cannot read Temperature from I2C. There might be cabling problems, TDB cable might be broken or sensor unreachable";
1723 _temperatureSensorErrorWatchdog.at(motor).start();
1727 _temperatureSensorErrorWatchdog.at(motor).increment();
1728 if( _temperatureSensorErrorWatchdog.at(motor).isExpired())
1730 yWarning()<< getBoardInfo() <<
"Motor" << motor <<
"failed to read" << _temperatureSensorErrorWatchdog.at(motor).getCount() <<
"temperature readings for" << yarp::os::Time::now() - _temperatureSensorErrorWatchdog.at(motor).getStartTime() <<
"seconds";
1731 _temperatureSensorErrorWatchdog.at(motor).start();
1738 double delta_tmp = 0;
1739 double tmp = _temperatureSensorsVector.at(motor)->convertRawToTempCelsius((
double)mc_motor_status->basic.mot_temperature);
1743 if(!_temperatureSpikesFilter.at(motor).isStarted())
1745 _temperatureSpikesFilter.at(motor).start(tmp);
1750 delta_tmp = std::abs(tmp - _temperatureSpikesFilter.at(motor).getPrevTemperature());
1753 if(delta_tmp > _temperatureSpikesFilter.at(motor).getTemperatureThreshold())
1759 _temperatureSpikesFilter.at(motor).updatePrevTemperature(tmp);
1762 if(tmp > _temperatureLimits[motor].warningTemperatureLimit)
1764 if(! _temperatureExceededLimitWatchdog.at(motor).isStarted())
1766 yWarning() << getBoardInfo() <<
"Motor" << motor <<
"The temperature (" << tmp <<
"[ ℃ ] ) exceeds the warning limit (" << _temperatureLimits[motor].warningTemperatureLimit <<
"[ ℃ ] ). Processes not stopped but it is strongly recommended decreasing motor usage or reducing currents and PWMs to not risk motor damaging";
1767 _temperatureExceededLimitWatchdog.at(motor).start();
1771 if(_temperatureExceededLimitWatchdog.at(motor).isExpired())
1773 yWarning() << getBoardInfo() <<
"Motor" << motor <<
"The temperature (" << tmp <<
"[ ℃ ] ) exceeds the warning limit (" << _temperatureLimits[motor].warningTemperatureLimit <<
"[ ℃ ] ) again!. Processes not stopped but it is strongly recommended decreasing motor usage or reducing currents and PWMs to not risk motor damaging";
1774 _temperatureExceededLimitWatchdog.at(motor).start();
1776 _temperatureExceededLimitWatchdog.at(motor).increment();
1781 _temperatureExceededLimitWatchdog.at(motor).clear();
1805 encoderTypeName.clear();
1807 if ((jomoId >= 0) && (jomoId < _njoints))
1811 case eomc_pos_atjoint:
1812 encoderTypeName = eomc_encoder2string(_jointEncs[jomoId].
type, eobool_true);
1814 case eomc_pos_atmotor:
1815 encoderTypeName = eomc_encoder2string(_motorEncs[jomoId].
type, eobool_true);
1817 case eomc_pos_unknown:
1818 encoderTypeName =
"UNKNOWN";
1822 encoderTypeName =
"NONE";
1829 encoderTypeName =
"ERROR";
1836 controlModeName.clear();
1838 if ((entityId>= 0) && (entityId< _njoints))
1840 controlModeName = eomc_controlmode2string(control_mode, compact_string);
1845 controlModeName = eomc_controlmode2string(eomc_ctrlmval_unknownError, compact_string);
1855 case VOCAB_PIDTYPE_POSITION:
1856 helper_setPosPidRaw(j,pid);
1858 case VOCAB_PIDTYPE_VELOCITY:
1860 helper_setSpdPidRaw(j, pid);
1862 case VOCAB_PIDTYPE_TORQUE:
1863 helper_setTrqPidRaw(j, pid);
1865 case VOCAB_PIDTYPE_CURRENT:
1866 helper_setCurPidRaw(j,pid);
1869 yError()<<
"Invalid pidtype:"<<pidtype;
1879 case VOCAB_PIDTYPE_POSITION:
1880 helper_getPosPidRaw(axis,pid);
1882 case VOCAB_PIDTYPE_VELOCITY:
1884 helper_getSpdPidRaw(axis, pid);
1886 case VOCAB_PIDTYPE_TORQUE:
1887 helper_getTrqPidRaw(axis, pid);
1889 case VOCAB_PIDTYPE_CURRENT:
1890 helper_getCurPidRaw(axis,pid);
1893 yError()<<
"Invalid pidtype:"<<pidtype;
1899bool embObjMotionControl::helper_setPosPidRaw(
int j,
const Pid &pid)
1901 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_pidtrajectory);
1910 yError() <<
"while setting position PIDs for " << getBoardInfo() <<
" joint " << j;
1920 for(
int j=0; j< _njoints; j++)
1935 for(
int j=0, index=0; j< _njoints; j++, index++)
1957 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
1958 eOmc_joint_status_core_t jcore = {0};
1965 case VOCAB_PIDTYPE_POSITION:
1967 if((eomc_controlmode_torque == jcore.modes.controlmodestatus) ||
1968 (eomc_controlmode_openloop == jcore.modes.controlmodestatus) ||
1969 (eomc_controlmode_current == jcore.modes.controlmodestatus))
1972 *err = (double) jcore.ofpid.generic.error1;
1983 case VOCAB_PIDTYPE_TORQUE:
1985 if ((eOmc_interactionmode_compliant == jcore.modes.interactionmodestatus) &&
1986 (eomc_controlmode_position == jcore.modes.controlmodestatus))
1988 *err = (double) jcore.ofpid.complpos.errtrq;
1991 if(eomc_controlmode_torque == jcore.modes.controlmodestatus)
1993 *err = (double) jcore.ofpid.torque.errtrq;
1997 case VOCAB_PIDTYPE_VELOCITY:
2003 case VOCAB_PIDTYPE_CURRENT:
2011 yError()<<
"Invalid pidtype:"<<pidtype;
2021 for(
int j=0; j< _njoints; j++)
2028bool embObjMotionControl::helper_getPosPidRaw(
int j, Pid *pid)
2030 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_pidtrajectory);
2033 eOmc_PID_t eoPID = {0};
2036#ifdef NETWORK_PERFORMANCE_BENCHMARK
2037 double start = yarp::os::Time::now();
2040 bool ret = askRemoteValue(protid, &eoPID, size);
2042#ifdef NETWORK_PERFORMANCE_BENCHMARK
2043 double end = yarp::os::Time::now();
2044 m_responseTimingVerifier.tick(end-start, start);
2057bool embObjMotionControl::helper_getPosPidsRaw(Pid *pid)
2059 std::vector<eOmc_PID_t> eoPIDList(_njoints);
2060 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_config_pidtrajectory, eoPIDList);
2063 yError() <<
"failed helper_getPosPidsRaw for" << getBoardInfo();
2067 for(
int j=0; j<_njoints; j++)
2081 case VOCAB_PIDTYPE_POSITION:
2082 helper_getPosPidsRaw(pids);
2087 case VOCAB_PIDTYPE_TORQUE:
2088 helper_getTrqPidsRaw(pids);
2090 case VOCAB_PIDTYPE_CURRENT:
2091 helper_getCurPidsRaw(pids);
2093 case VOCAB_PIDTYPE_VELOCITY:
2094 helper_getSpdPidsRaw(pids);
2097 yError()<<
"Invalid pidtype:"<<pidtype;
2105 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
2106 eOmc_joint_status_core_t jcore = {0};
2113 case VOCAB_PIDTYPE_POSITION:
2115 if((eomc_controlmode_torque == jcore.modes.controlmodestatus) ||
2116 (eomc_controlmode_openloop == jcore.modes.controlmodestatus) ||
2117 (eomc_controlmode_current == jcore.modes.controlmodestatus))
2118 { *ref = 0; yError() <<
"Invalid getPidReferenceRaw() request for current control mode";
return true; }
2119 *ref = (double) jcore.ofpid.generic.reference1;
2128 case VOCAB_PIDTYPE_TORQUE:
2134 case VOCAB_PIDTYPE_CURRENT:
2140 case VOCAB_PIDTYPE_VELOCITY:
2149 yError()<<
"Invalid pidtype:"<<pidtype;
2162 for(
int j=0; j< _njoints; j++)
2207 if( (mode != VOCAB_CM_VELOCITY) &&
2208 (mode != VOCAB_CM_MIXED) &&
2209 (mode != VOCAB_CM_IMPEDANCE_VEL) &&
2210 (mode != VOCAB_CM_IDLE))
2214 yError() <<
"velocityMoveRaw: skipping command because " << getBoardInfo() <<
" joint " << j <<
" is not in VOCAB_CM_VELOCITY mode";
2219 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_setpoint);
2221 _ref_command_speeds[j] = sp ;
2223 eOmc_setpoint_t setpoint;
2224 setpoint.type = eomc_setpoint_velocity;
2225 setpoint.to.velocity.value = (eOmeas_velocity_t)
S_32(_ref_command_speeds[j]);
2226 setpoint.to.velocity.withacceleration = (eOmeas_acceleration_t)
S_32(_ref_accs[j]);
2231 yError() <<
"while setting velocity mode";
2240 eOmc_setpoint_t setpoint;
2242 setpoint.type = eomc_setpoint_velocity;
2244 for(
int j=0; j<_njoints; j++)
2259 yTrace() <<
"setCalibrationParametersRaw for " << getBoardInfo() <<
"joint" << j;
2261 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_calibration);
2262 eOmc_calibrator_t calib;
2263 memset(&calib, 0x00,
sizeof(calib));
2264 calib.type = params.type;
2269 case eomc_calibration_type0_hard_stops:
2270 calib.params.type0.pwmlimit = (int16_t)
S_16(params.param1);
2271 calib.params.type0.velocity = (eOmeas_velocity_t)
S_32(params.param2);
2272 calib.params.type0.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2276 case eomc_calibration_type1_abs_sens_analog:
2277 calib.params.type1.position = (int16_t)
S_16(params.param1);
2278 calib.params.type1.velocity = (eOmeas_velocity_t)
S_32(params.param2);
2279 calib.params.type1.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2283 case eomc_calibration_type2_hard_stops_diff:
2284 calib.params.type2.pwmlimit = (int16_t)
S_16(params.param1);
2285 calib.params.type2.velocity = (eOmeas_velocity_t)
S_32(params.param2);
2286 calib.params.type2.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2290 case eomc_calibration_type3_abs_sens_digital:
2291 calib.params.type3.position = (int16_t)
S_16(params.param1);
2292 calib.params.type3.velocity = (eOmeas_velocity_t)
S_32(params.param2);
2293 calib.params.type3.offset = (int32_t)
S_32(params.param3);
2294 calib.params.type3.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2298 case eomc_calibration_type4_abs_and_incremental:
2299 calib.params.type4.position = (int16_t)
S_16(params.param1);
2300 calib.params.type4.velocity = (eOmeas_velocity_t)
S_32(params.param2);
2301 calib.params.type4.maxencoder = (int32_t)
S_32(params.param3);
2302 calib.params.type4.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2306 case eomc_calibration_type5_hard_stops:
2307 calib.params.type5.pwmlimit = (int32_t)
S_32(params.param1);
2308 calib.params.type5.final_pos = (int32_t)
S_32(params.param2);
2309 calib.params.type5.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2313 case eomc_calibration_type6_mais:
2314 calib.params.type6.position = (int32_t)
S_32(params.param1);
2315 calib.params.type6.velocity = (int32_t)
S_32(params.param2);
2316 calib.params.type6.current = (int32_t)
S_32(params.param3);
2317 calib.params.type6.vmin = (int32_t)
S_32(params.param4);
2318 calib.params.type6.vmax = (int32_t)
S_32(params.param5);
2319 calib.params.type6.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2323 case eomc_calibration_type7_hall_sensor:
2324 calib.params.type7.position = (int32_t)
S_32(params.param1);
2325 calib.params.type7.velocity = (int32_t)
S_32(params.param2);
2327 calib.params.type7.vmin = (int32_t)
S_32(params.param4);
2328 calib.params.type7.vmax = (int32_t)
S_32(params.param5);
2329 calib.params.type7.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2333 case eomc_calibration_type8_tripod_internal_hard_stop:
2334 calib.params.type8.pwmlimit = (int32_t)
S_32(params.param1);
2335 calib.params.type8.max_delta = (int32_t)
S_32(params.param2);
2336 calib.params.type8.calibrationZero = (int32_t)
S_32(params.paramZero );
2339 case eomc_calibration_type9_tripod_external_hard_stop:
2340 calib.params.type9.pwmlimit = (int32_t)
S_32(params.param1);
2341 calib.params.type9.max_delta = (int32_t)
S_32(params.param2);
2342 calib.params.type9.calibrationZero = (int32_t)
S_32(params.paramZero );
2345 case eomc_calibration_type10_abs_hard_stop:
2346 calib.params.type10.pwmlimit = (int32_t)
S_32(params.param1);
2347 calib.params.type10.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2350 case eomc_calibration_type11_cer_hands:
2351 calib.params.type11.offset0 = (int32_t)
S_32(params.param1);
2352 calib.params.type11.offset1 = (int32_t)
S_32(params.param2);
2353 calib.params.type11.offset2 = (int32_t)
S_32(params.param3);
2354 calib.params.type11.cable_range = (int32_t)
S_32(params.param4);
2355 calib.params.type11.pwm = (int32_t)
S_32(params.param5);
2359 case eomc_calibration_type12_absolute_sensor:
2360 calib.params.type12.rawValueAtZeroPos = (int32_t)
S_32(params.param1);
2361 calib.params.type12.calibrationDelta = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2364 case eomc_calibration_type13_cer_hands_2:
2365 calib.params.type13.rawValueAtZeroPos0 = (int32_t)
S_32(params.param1);
2366 calib.params.type13.rawValueAtZeroPos1 = (int32_t)
S_32(params.param2);
2367 calib.params.type13.rawValueAtZeroPos2 = (int32_t)
S_32(params.param3);
2368 calib.params.type13.rawValueAtZeroPos3 = (int32_t)
S_32(params.param4);
2371 case eomc_calibration_type14_qenc_hard_stop_and_fap:
2372 calib.params.type14.pwmlimit = (int32_t)
S_32(params.param1);
2373 calib.params.type14.final_pos = (int32_t)
S_32(params.param2);
2374 calib.params.type14.invertdirection = (uint8_t)
U_32(params.param3);
2375 calib.params.type14.rotation = (int32_t)
S_32(params.param4);
2377 if (calib.params.type14.invertdirection != 0 && calib.params.type14.invertdirection != 1)
2379 yError() <<
"Error in param3 of calibartion type 14 for joint " << j <<
"Admitted values are: 0=FALSE and 1=TRUE";
2384 if(!checkCalib14RotationParam(calib.params.type14.rotation))
2386 yError() <<
"Error in param4 of calibartion type 14 for joint " << j <<
"Admitted values are: 0, 32768, 16384, -16384 [0, 180, 90, -90] in iCubDegree";
2389 calib.params.type14.offset = (int32_t)
S_32(params.param5);
2390 calib.params.type14.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2395 yError() <<
"Calibration type unknown!! (embObjMotionControl)\n";
2402 yError() <<
"while setting velocity mode";
2406 _calibrated[j] =
true;
2411bool embObjMotionControl::checkCalib14RotationParam(int32_t calib_param4)
2413 eOmc_calib14_ROT_t urotation = eomc_int2calib14_ROT(calib_param4);
2415 if (urotation == eOmc_calib14_ROT_zero ||
2416 urotation == eOmc_calib14_ROT_plus180 ||
2417 urotation == eOmc_calib14_ROT_plus090 ||
2418 urotation == eOmc_calib14_ROT_minus090)
2428 yTrace() <<
"calibrateRaw for" << getBoardInfo() <<
"joint" << j;
2446 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_calibration);
2447 eOmc_calibrator_t calib;
2448 memset(&calib, 0x00,
sizeof(calib));
2454 case eomc_calibration_type0_hard_stops:
2455 calib.params.type0.pwmlimit = (int16_t)
S_16(p1);
2456 calib.params.type0.velocity = (eOmeas_velocity_t)
S_32(p2);
2460 case eomc_calibration_type1_abs_sens_analog:
2461 calib.params.type1.position = (int16_t)
S_16(p1);
2462 calib.params.type1.velocity = (eOmeas_velocity_t)
S_32(p2);
2466 case eomc_calibration_type2_hard_stops_diff:
2467 calib.params.type2.pwmlimit = (int16_t)
S_16(p1);
2468 calib.params.type2.velocity = (eOmeas_velocity_t)
S_32(p2);
2472 case eomc_calibration_type3_abs_sens_digital:
2473 calib.params.type3.position = (int16_t)
S_16(p1);
2474 calib.params.type3.velocity = (eOmeas_velocity_t)
S_32(p2);
2475 calib.params.type3.offset = (int32_t)
S_32(p3);
2479 case eomc_calibration_type4_abs_and_incremental:
2480 calib.params.type4.position = (int16_t)
S_16(p1);
2481 calib.params.type4.velocity = (eOmeas_velocity_t)
S_32(p2);
2482 calib.params.type4.maxencoder = (int32_t)
S_32(p3);
2486 yError () <<
"Calibration type unknown!! (embObjMotionControl)\n";
2493 yError() <<
"while setting velocity mode";
2497 _calibrated[j ] =
true;
2505 bool result =
false;
2506 eOmc_joint_status_core_t jcore = {0};
2507 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, axis, eoprot_tag_mc_joint_status_core);
2510 yError () <<
"Failure of getLocalValue() inside embObjMotionControl::calibrationDoneRaw(axis=" << axis <<
") for " << getBoardInfo();
2514 eOmc_controlmode_t
type = (eOmc_controlmode_t) jcore.modes.controlmodestatus;
2518 if (eomc_controlmode_idle ==
type)
2522 else if (eomc_controlmode_calib ==
type)
2526 else if (eomc_controlmode_hwFault ==
type)
2528 yError(
"unable to complete calibration: joint %d in 'hw_fault status' inside calibrationDoneRaw() function", axis);
2531 else if (eomc_controlmode_notConfigured ==
type)
2533 yError(
"unable to complete calibration: joint %d in 'not_configured' status inside calibrationDoneRaw() function", axis);
2536 else if (eomc_controlmode_unknownError ==
type)
2538 yError(
"unable to complete calibration: joint %d in 'unknownError' status inside calibrationDoneRaw() function", axis);
2541 else if (eomc_controlmode_configured ==
type)
2543 yError(
"unable to complete calibration: joint %d in 'configured' status inside calibrationDoneRaw() function", axis);
2568 yWarning() <<
"Performance warning: You are using positionMove commands at high rate (<"<<
MAX_POSITION_MOVE_INTERVAL*1000.0 <<
" ms). Probably position control mode is not the right control mode to use.";
2570 _last_position_move_time[j] = yarp::os::Time::now();
2574 if( (mode != VOCAB_CM_POSITION) &&
2575 (mode != VOCAB_CM_MIXED) &&
2576 (mode != VOCAB_CM_IMPEDANCE_POS) &&
2577 (mode != VOCAB_CM_IDLE))
2581 yError() <<
"positionMoveRaw: skipping command because " << getBoardInfo() <<
" joint " << j <<
" is not in VOCAB_CM_POSITION mode";
2586 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_setpoint);
2587 _ref_command_positions[j] = ref;
2589 eOmc_setpoint_t setpoint;
2591 setpoint.type = (eOenum08_t) eomc_setpoint_position;
2592 setpoint.to.position.value = (eOmeas_position_t)
S_32(_ref_command_positions[j]);
2593 setpoint.to.position.withvelocity = (eOmeas_velocity_t)
S_32(_ref_speeds[j]);
2602 for(
int j=0, index=0; j< _njoints; j++, index++)
2622 eObool_t ismotiondone = eobool_false;
2625 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core_modes_ismotiondone);
2626 if(
false == askRemoteValue(id32, &ismotiondone, size))
2628 yError () <<
"Failure of askRemoteValue() inside embObjMotionControl::checkMotionDoneRaw(j=" << j <<
") for " << getBoardInfo();
2633 *flag = ismotiondone;
2640 std::vector <eObool_t> ismotiondoneList(_njoints);
2641 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_core_modes_ismotiondone, ismotiondoneList);
2644 yError () <<
"Failure of askRemoteValues() inside embObjMotionControl::checkMotionDoneRaw for all joints of" << getBoardInfo();
2648 for(
int j=0; j<_njoints; j++)
2650 *flag &= ismotiondoneList[j];
2660 _ref_speeds[index] = sp;
2668 for(
int j=0, index=0; j< _njoints; j++, index++)
2670 _ref_speeds[index] = spds[index];
2682 _ref_accs[j ] = 1e6;
2684 else if (
acc < -1e6)
2686 _ref_accs[j ] = -1e6;
2690 _ref_accs[j ] =
acc;
2700 for(
int j=0, index=0; j< _njoints; j++, index++)
2704 _ref_accs[index] = 1e6;
2706 else if (accs[j] < -1e6)
2708 _ref_accs[index] = -1e6;
2712 _ref_accs[index] = accs[j];
2720 if (j<0 || j>_njoints)
return false;
2721#if ASK_REFERENCE_TO_FIRMWARE
2722 *spd = _ref_speeds[j];
2725 *spd = _ref_speeds[j];
2732 memcpy(spds, _ref_speeds,
sizeof(
double) * _njoints);
2738 *
acc = _ref_accs[j];
2744 memcpy(accs, _ref_accs,
sizeof(
double) * _njoints);
2750 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_stoptrajectory);
2752 eObool_t stop = eobool_true;
2760 for(
int j=0; j< _njoints; j++)
2775 for(
int j=0; j<n_joint; j++)
2785 for(
int j=0; j<n_joint; j++)
2796 for(
int j=0; j<n_joint; j++)
2798 if(joints[j] >= _njoints)
2800 yError() << getBoardInfo() <<
":checkMotionDoneRaw required for not existing joint ( " << joints[j] <<
")";
2806 std::vector <eObool_t> ismotiondoneList(_njoints);
2807 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_core_modes_ismotiondone, ismotiondoneList);
2810 yError () << getBoardInfo() <<
"Failure of askRemoteValues() inside embObjMotionControl::checkMotionDoneRaw for a group of joint"; getBoardInfo();
2815 bool tot_val =
true;
2816 for(
int j=0; j<n_joint; j++)
2818 tot_val &= ismotiondoneList[joints[j]];
2829 for(
int j=0; j<n_joint; j++)
2839 for(
int j=0; j<n_joint; j++)
2849 for(
int j=0; j<n_joint; j++)
2859 for(
int j=0; j<n_joint; j++)
2869 for(
int j=0; j<n_joint; j++)
2871 ret = ret &&
stopRaw(joints[j]);
2882 eOmc_joint_status_core_t jcore = {0};
2883 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
2887 eOmc_controlmode_t
type = (eOmc_controlmode_t) jcore.modes.controlmodestatus;
2897 for(
int j=0; j< _njoints; j++)
2907 for(
int j=0; j< n_joint; j++)
2922 eOenum08_t controlmodecommand = 0;
2924 if((_mode == VOCAB_CM_TORQUE) && (_trq_pids[j].enabled ==
false))
2926 yError()<<
"Torque control is disabled. Check your configuration parameters";
2932 yError() <<
"SetControlMode: received unknown control mode for " << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(_mode);
2936 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_controlmode);
2939 yError() <<
"setControlModeRaw failed for " << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(_mode);
2944 ret = checkRemoteControlModeStatus(j, _mode);
2948 yError() <<
"In embObjMotionControl::setControlModeRaw(j=" << j <<
", mode=" << yarp::os::Vocab32::decode(_mode).c_str() <<
") for " << getBoardInfo() <<
" has failed checkRemoteControlModeStatus()";
2958 eOenum08_t controlmodecommand = 0;
2961 for(
int i=0; i<n_joint; i++)
2963 if ((modes[i] == VOCAB_CM_TORQUE) && (_trq_pids[i].enabled ==
false)) {yError()<<
"Torque control is disabled. Check your configuration parameters";
continue;}
2967 yError() <<
"SetControlModesRaw(): received unknown control mode for " << getBoardInfo() <<
" joint " << joints[i] <<
" mode " << Vocab32::decode(modes[i]);
2972 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, joints[i], eoprot_tag_mc_joint_cmmnds_controlmode);
2975 yError() <<
"setControlModesRaw() could not send set<cmmnds_controlmode> for " << getBoardInfo() <<
" joint " << joints[i] <<
" mode " << Vocab32::decode(modes[i]);
2980 bool tmpresult = checkRemoteControlModeStatus(joints[i], modes[i]);
2981 if(
false == tmpresult)
2983 yError() <<
"setControlModesRaw(const int n_joint, const int *joints, int *modes) could not check with checkRemoteControlModeStatus() for " << getBoardInfo() <<
" joint " << joints[i] <<
" mode " << Vocab32::decode(modes[i]);
2986 ret = ret && tmpresult;
2996 eOenum08_t controlmodecommand = 0;
2998 for(
int i=0; i<_njoints; i++)
3001 if ((modes[i] == VOCAB_CM_TORQUE) && (_trq_pids[i].enabled ==
false))
3003 yError()<<
"Torque control is disabled. Check your configuration parameters";
3009 yError() <<
"SetControlMode: received unknown control mode for" << getBoardInfo() <<
" joint " << i <<
" mode " << Vocab32::decode(modes[i]);
3013 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, i, eoprot_tag_mc_joint_cmmnds_controlmode);
3016 yError() <<
"setControlModesRaw failed for " << getBoardInfo() <<
" joint " << i <<
" mode " << Vocab32::decode(modes[i]);
3020 bool tmpresult = checkRemoteControlModeStatus(i, modes[i]);
3021 if(
false == tmpresult)
3023 yError() <<
"setControlModesRaw(int *modes) could not check with checkRemoteControlModeStatus() for" << getBoardInfo() <<
" joint " << i <<
" mode " << Vocab32::decode(modes[i]);
3026 ret = ret && tmpresult;
3059 eOmc_joint_status_core_t core;
3060 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
3066 *value = (double) core.measures.meas_position;
3070 yError() <<
"embObjMotionControl while reading encoder";
3080 for(
int j=0; j< _njoints; j++)
3090 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
3091 eOmc_joint_status_core_t core;
3098 *sp = (double) core.measures.meas_velocity;
3105 for(
int j=0; j< _njoints; j++)
3114 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
3115 eOmc_joint_status_core_t core;
3121 *
acc = (double) core.measures.meas_acceleration;
3128 for(
int j=0; j< _njoints; j++)
3140 std::lock_guard<std::mutex> lck(_mutex);
3141 for(
int i=0; i<_njoints; i++)
3142 stamps[i] = _encodersStamp[i];
3149 std::lock_guard<std::mutex> lck(_mutex);
3150 *stamp = _encodersStamp[j];
3194 eOmc_motor_status_basic_t status;
3195 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_status_basic);
3200 *value = (double) status.mot_position;
3204 yError() <<
"embObjMotionControl while reading motor encoder position";
3214 for(
int j=0; j< _njoints; j++)
3224 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_status_basic);
3225 eOmc_motor_status_basic_t tmpMotorStatus;
3229 *sp = (double) tmpMotorStatus.mot_velocity;
3233 yError() <<
"embObjMotionControl while reading motor encoder speed";
3242 for(
int j=0; j< _njoints; j++)
3251 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_status_basic);
3252 eOmc_motor_status_basic_t tmpMotorStatus;
3256 *
acc = (double) tmpMotorStatus.mot_acceleration;
3260 yError() <<
"embObjMotionControl while reading motor encoder acceleration";
3269 for(
int j=0; j< _njoints; j++)
3279 std::lock_guard<std::mutex> lck(_mutex);
3280 for(
int i=0; i<_njoints; i++)
3281 stamps[i] = _encodersStamp[i];
3288 std::lock_guard<std::mutex> lck(_mutex);
3289 *stamp = _encodersStamp[m];
3308 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_status_basic);
3309 eOmc_motor_status_basic_t tmpMotorStatus;
3312 *value = (double) tmpMotorStatus.mot_current;
3319 for(
int j=0; j< _njoints; j++)
3328 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config_currentlimits);
3330 eOmc_current_limits_params_t currentlimits = {0};
3332 if(!askRemoteValue(protid, ¤tlimits, size))
3334 yError() <<
"embObjMotionControl::setMaxCurrentRaw() could not read max current for " << getBoardInfo() <<
"joint " << j;
3339 currentlimits.overloadCurrent = (eOmeas_current_t)
S_16(val);
3347 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config_currentlimits);
3349 eOmc_current_limits_params_t currentlimits = {0};
3352 if(!askRemoteValue(protid, ¤tlimits, size))
3354 yError() <<
"embObjMotionControl::getMaxCurrentRaw() could not read max current for " << getBoardInfo() <<
"joint " << j;
3358 *val = (double) currentlimits.overloadCurrent;
3366 (_enabledAmp[j ]) ? *st = 1 : *st = 0;
3373 for(
int j=0; j<_njoints; j++)
3375 sts[j] = _enabledAmp[j];
3381#ifdef IMPLEMENT_DEBUG_INTERFACE
3386bool embObjMotionControl::setParameterRaw(
int j,
unsigned int type,
double value) {
return NOT_YET_IMPLEMENTED(
"setParameterRaw"); }
3387bool embObjMotionControl::getParameterRaw(
int j,
unsigned int type,
double* value) {
return NOT_YET_IMPLEMENTED(
"getParameterRaw"); }
3388bool embObjMotionControl::getDebugParameterRaw(
int j,
unsigned int index,
double* value) {
return NOT_YET_IMPLEMENTED(
"getDebugParameterRaw"); }
3389bool embObjMotionControl::setDebugParameterRaw(
int j,
unsigned int index,
double value) {
return NOT_YET_IMPLEMENTED(
"setDebugParameterRaw"); }
3390bool embObjMotionControl::setDebugReferencePositionRaw(
int j,
double value) {
return NOT_YET_IMPLEMENTED(
"setDebugReferencePositionRaw"); }
3391bool embObjMotionControl::getDebugReferencePositionRaw(
int j,
double* value) {
return NOT_YET_IMPLEMENTED(
"getDebugReferencePositionRaw");}
3399 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_userlimits);
3401 eOmeas_position_limits_t limits;
3402 limits.max = (eOmeas_position_t)
S_32(max);
3403 limits.min = (eOmeas_position_t)
S_32(min);
3410 yError() <<
"while setting position limits for joint" << j <<
" \n";
3417 eOmeas_position_limits_t limits;
3418 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_userlimits);
3421 if(! askRemoteValue(protoid, &limits, size))
3424 *min = (double)limits.min + SAFETY_THRESHOLD;
3425 *max = (double)limits.max - SAFETY_THRESHOLD;
3431 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3433 eOmc_motor_config_t motor_cfg;
3434 if(! askRemoteValue(protoid, &motor_cfg, size))
3438 *gearbox = (double)motor_cfg.gearbox_M2J;
3445 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3447 eOmc_motor_config_t motor_cfg;
3448 if(! askRemoteValue(protoid, &motor_cfg, size))
3450 *rotorMax = (double)( motor_cfg.limitsofrotor.max);
3451 *rotorMin = (double)( motor_cfg.limitsofrotor.min);
3457 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config);
3459 eOmc_joint_config_t joint_cfg;
3460 if(! askRemoteValue(protoid, &joint_cfg, size))
3464 type = (int)joint_cfg.tcfiltertype;
3470 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3472 eOmc_motor_config_t motor_cfg;
3473 if(! askRemoteValue(protoid, &motor_cfg, size))
3477 rotres = (double)motor_cfg.rotorEncoderResolution;
3484 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config);
3486 eOmc_joint_config_t joint_cfg;
3487 if(! askRemoteValue(protoid, &joint_cfg, size))
3491 jntres = (double)joint_cfg.jntEncoderResolution;
3498 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config);
3500 eOmc_joint_config_t joint_cfg;
3501 if(! askRemoteValue(protoid, &joint_cfg, size))
3505 type = (int)joint_cfg.jntEncoderType;
3512 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3514 eOmc_motor_config_t motor_cfg;
3515 if(! askRemoteValue(protoid, &motor_cfg, size))
3519 type = (int)motor_cfg.rotorEncoderType;
3526 yError(
"getKinematicMJRaw not yet implemented");
3552 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3554 eOmc_motor_config_t motor_cfg;
3555 if(! askRemoteValue(protoid, &motor_cfg, size))
3559 ret = (int)motor_cfg.hasTempSensor;
3566 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3568 eOmc_motor_config_t motor_cfg;
3569 if(! askRemoteValue(protoid, &motor_cfg, size))
3573 ret = (int)motor_cfg.hasHallSensor;
3580 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3582 eOmc_motor_config_t motor_cfg;
3583 if(! askRemoteValue(protoid, &motor_cfg, size))
3587 ret = (int)motor_cfg.hasRotorEncoder;
3594 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3596 eOmc_motor_config_t motor_cfg;
3597 if(! askRemoteValue(protoid, &motor_cfg, size))
3601 ret = (int)motor_cfg.hasRotorEncoderIndex;
3608 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3611 eOmc_motor_config_t motor_cfg;
3612 if(! askRemoteValue(protoid, &motor_cfg, size))
3616 poles = (int)motor_cfg.motorPoles;
3623 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3625 eOmc_motor_config_t motor_cfg;
3626 if(! askRemoteValue(protoid, &motor_cfg, size))
3630 rotorOffset = (double)motor_cfg.rotorIndexOffset;
3637 if (axis >= 0 && axis < _njoints)
3639 name = _axesInfo[axis].name;
3651 if (axis >= 0 && axis < _njoints)
3653 type = _axesInfo[axis].type;
3662bool embObjMotionControl::getJointDeadZoneRaw(
int j,
double &jntDeadZone)
3664 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config);
3666 eOmc_joint_config_t joint_cfg;
3667 if(! askRemoteValue(protoid, &joint_cfg, size))
3671 jntDeadZone = _measureConverter->posE2A((
double)joint_cfg.deadzone, _axisMap[j]);
3680 if (key ==
"kinematic_mj")
3683 Bottle& ret = val.addList();
3685 eOmn_serv_type_t mc_serv_type = (eOmn_serv_type_t)serviceConfig.
ethservice.configuration.type;
3686 if(iNeedCouplingsInfo())
3688 for (
int r=0; r<_njoints; r++)
3690 for (
int c = 0; c < _njoints; c++)
3694 ret.addFloat64(_couplingInfo.
matrixJ2M[4 * r + c]);
3700 ret.addFloat64(0.0);
3704 else if (key ==
"encoders")
3706 Bottle& r = val.addList();
for (
int i = 0; i < _njoints; i++) { r.addFloat64(_measureConverter->posA2E(1.0, i)); }
3709 else if (key ==
"rotorEncoderResolution")
3711 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getRotorEncoderResolutionRaw(i, tmp); r.addFloat64(tmp); }
3714 else if (key ==
"jointEncoderResolution")
3716 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getJointEncoderResolutionRaw(i, tmp); r.addFloat64(tmp); }
3719 else if (key ==
"gearbox_M2J")
3721 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp=0;
getGearboxRatioRaw(i, &tmp); r.addFloat64(tmp); }
3724 else if (key ==
"gearbox_E2J")
3726 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp=0; getGerabox_E2J(i, &tmp); r.addFloat64(tmp); }
3729 else if (key ==
"hasHallSensor")
3731 Bottle& r = val.addList();
for (
int i = 0; i < _njoints; i++) {
int tmp = 0;
getHasHallSensorRaw(i, tmp); r.addInt32(tmp); }
3734 else if (key ==
"hasTempSensor")
3736 Bottle& r = val.addList();
for (
int i = 0; i < _njoints; i++) {
int tmp = 0;
getHasTempSensorsRaw(i, tmp); r.addInt32(tmp); }
3739 else if (key ==
"TemperatureSensorType")
3741 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) { std::string tmp =
"";
getTemperatureSensorTypeRaw(i, tmp); r.addString(tmp); }
3744 else if (key ==
"hasRotorEncoder")
3746 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
int tmp = 0;
getHasRotorEncoderRaw(i, tmp); r.addInt32(tmp); }
3749 else if (key ==
"hasRotorEncoderIndex")
3751 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
int tmp = 0;
getHasRotorEncoderIndexRaw(i, tmp); r.addInt32(tmp); }
3754 else if (key ==
"rotorIndexOffset")
3756 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getRotorIndexOffsetRaw(i, tmp); r.addFloat64(tmp); }
3759 else if (key ==
"motorPoles")
3761 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
int tmp = 0;
getMotorPolesRaw(i, tmp); r.addInt32(tmp); }
3764 else if (key ==
"pidCurrentKp")
3766 Bottle& r = val.addList();
for (
int i = 0; i < _njoints; i++) { Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_CURRENT, i, &
p); r.addFloat64(
p.kp); }
3769 else if (key ==
"pidCurrentKi")
3771 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) { Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_CURRENT, i, &
p); r.addFloat64(
p.ki); }
3774 else if (key ==
"pidCurrentShift")
3776 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) { Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_CURRENT, i, &
p); r.addFloat64(
p.scale); }
3779 else if (key ==
"pidCurrentOutput")
3781 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) { Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_CURRENT, i, &
p); r.addFloat64(
p.max_output); }
3784 else if (key ==
"jointEncoderType")
3786 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++)
3792 yError(
"Invalid jointEncoderType");
3798 else if (key ==
"rotorEncoderType")
3800 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++)
3806 yError(
"Invalid motorEncoderType");
3812 else if (key ==
"coulombThreshold")
3814 val.addString(
"not implemented yet");
3817 else if (key ==
"torqueControlFilterType")
3822 else if (key ==
"torqueControlEnabled")
3825 Bottle& r = val.addList();
3826 for(
int i = 0; i<_njoints; i++)
3828 r.addInt32((
int)_trq_pids[i].enabled );
3832 else if (key ==
"PWMLimit")
3834 Bottle& r = val.addList();
for (
int i = 0; i< _njoints; i++) {
double tmp = 0;
getPWMLimitRaw(i, &tmp); r.addFloat64(tmp); }
3837 else if (key ==
"motOverloadCurr")
3839 Bottle& r = val.addList();
for (
int i = 0; i< _njoints; i++) {
double tmp = 0;
getMaxCurrentRaw(i, &tmp); r.addFloat64(tmp); }
3842 else if (key ==
"motNominalCurr")
3844 Bottle& r = val.addList();
for (
int i = 0; i< _njoints; i++) {
double tmp = 0;
getNominalCurrentRaw(i, &tmp); r.addFloat64(tmp); }
3847 else if (key ==
"motPeakCurr")
3849 Bottle& r = val.addList();
for (
int i = 0; i< _njoints; i++) {
double tmp = 0;
getPeakCurrentRaw(i, &tmp); r.addFloat64(tmp); }
3852 else if (key ==
"PowerSuppVoltage")
3854 Bottle& r = val.addList();
for (
int i = 0; i< _njoints; i++) {
double tmp = 0;
getPowerSupplyVoltageRaw(i, &tmp); r.addFloat64(tmp); }
3857 else if (key ==
"rotorMax")
3860 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getRotorLimitsRaw(i, &tmp1, &tmp2); r.addFloat64(tmp2); }
3863 else if (key ==
"rotorMin")
3866 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getRotorLimitsRaw(i, &tmp1, &tmp2); r.addFloat64(tmp1); }
3869 else if (key ==
"jointMax")
3872 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getLimitsRaw(i, &tmp1, &tmp2); r.addFloat64(tmp2); }
3875 else if (key ==
"jointMin")
3878 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getLimitsRaw(i, &tmp1, &tmp2); r.addFloat64(tmp1); }
3881 else if (key ==
"jointEncTolerance")
3884 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0; getJointEncTolerance(i, &tmp1); r.addFloat64(tmp1); }
3887 else if (key ==
"motorEncTolerance")
3890 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0; getMotorEncTolerance(i, &tmp1); r.addFloat64(tmp1); }
3893 else if (key ==
"jointDeadZone")
3896 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0; getJointDeadZoneRaw(i, tmp1); r.addFloat64(tmp1); }
3899 else if (key ==
"readonly_position_PIDraw")
3901 Bottle& r = val.addList();
3902 for (
int i = 0; i < _njoints; i++)
3904 getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_POSITION, i, &
p);
3906 snprintf(buff, 1000,
"J %d : kp %+3.3f ki %+3.3f kd %+3.3f maxint %+3.3f maxout %+3.3f off %+3.3f scale %+3.3f up %+3.3f dwn %+3.3f kff %+3.3f", i,
p.kp,
p.ki,
p.kd,
p.max_int,
p.max_output,
p.offset,
p.scale,
p.stiction_up_val,
p.stiction_down_val,
p.kff);
3911 else if (key ==
"readonly_velocity_PIDraw")
3913 Bottle& r = val.addList();
3914 for (
int i = 0; i < _njoints; i++)
3915 { Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_VELOCITY, i, &
p);
3917 snprintf(buff, 1000,
"J %d : kp %+3.3f ki %+3.3f kd %+3.3f maxint %+3.3f maxout %+3.3f off %+3.3f scale %+3.3f up %+3.3f dwn %+3.3f kff %+3.3f", i,
p.kp,
p.ki,
p.kd,
p.max_int,
p.max_output,
p.offset,
p.scale,
p.stiction_up_val,
p.stiction_down_val,
p.kff);
3922 else if (key ==
"readonly_torque_PIDraw")
3924 Bottle& r = val.addList();
3925 for (
int i = 0; i < _njoints; i++)
3926 { Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_TORQUE, i, &
p);
3928 snprintf(buff, 1000,
"J %d : kp %+3.3f ki %+3.3f kd %+3.3f maxint %+3.3f maxout %+3.3f off %+3.3f scale %+3.3f up %+3.3f dwn %+3.3f kff %+3.3f", i,
p.kp,
p.ki,
p.kd,
p.max_int,
p.max_output,
p.offset,
p.scale,
p.stiction_up_val,
p.stiction_down_val,
p.kff);
3933 else if (key ==
"readonly_current_PIDraw")
3935 Bottle& r = val.addList();
3936 for (
int i = 0; i < _njoints; i++)
3937 { Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_CURRENT, i, &
p);
3939 snprintf(buff, 1000,
"J %d : kp %+3.3f ki %+3.3f kd %+3.3f maxint %+3.3f maxout %+3.3f off %+3.3f scale %+3.3f up %+3.3f dwn %+3.3f kff %+3.3f", i,
p.kp,
p.ki,
p.kd,
p.max_int,
p.max_output,
p.offset,
p.scale,
p.stiction_up_val,
p.stiction_down_val,
p.kff);
3944 else if (key ==
"readonly_llspeed_PIDraw")
3946 Bottle& r = val.addList();
3947 for (
int i = 0; i < _njoints; i++)
3949 Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_VELOCITY, i, &
p);
3951 snprintf(buff, 1000,
"J %d : kp %+3.3f ki %+3.3f kd %+3.3f maxint %+3.3f maxout %+3.3f off %+3.3f scale %+3.3f up %+3.3f dwn %+3.3f kff %+3.3f", i,
p.kp,
p.ki,
p.kd,
p.max_int,
p.max_output,
p.offset,
p.scale,
p.stiction_up_val,
p.stiction_down_val,
p.kff);
3956 else if (key ==
"readonly_motor_torque_params_raw")
3958 Bottle& r = val.addList();
3959 for (
int i = 0; i < _njoints; i++)
3961 MotorTorqueParameters params;
3964 snprintf(buff, 1000,
"J %d : bemf %+3.3f bemf_scale %+3.3f ktau %+3.3f ktau_scale %+3.3f viscousPos %+3.3f viscousNeg %+3.3f coulombPos %+3.3f coulombNeg %+3.3f velocityThres %+3.3f", i, params.bemf, params.bemf_scale, params.ktau, params.ktau_scale, params.viscousPos, params.viscousNeg, params.coulombPos, params.coulombNeg, params.velocityThres);
3969 yWarning(
"getRemoteVariable(): Unknown variable %s", key.c_str());
3975 string s1 = val.toString();
3976 if (val.size() != _njoints)
3978 yWarning(
"setRemoteVariable(): Protocol error %s", s1.c_str());
3982 if (key ==
"kinematic_mj")
3984 yWarning(
"setRemoteVariable(): Impossible to set kinematic_mj parameter at runtime.");
3997 else if (key ==
"PWMLimit")
3999 for (
int i = 0; i < _njoints; i++)
setPWMLimitRaw(i, val.get(i).asFloat64());
4004 else if (key ==
"jointMax")
4007 for (
int i = 0; i < _njoints; i++)
4014 else if (key ==
"jointMin")
4017 for (
int i = 0; i < _njoints; i++)
4024 yWarning(
"setRemoteVariable(): Unknown variable %s", key.c_str());
4030 listOfKeys->clear();
4031 listOfKeys->addString(
"kinematic_mj");
4032 listOfKeys->addString(
"encoders");
4033 listOfKeys->addString(
"gearbox_M2J");
4034 listOfKeys->addString(
"gearbox_E2J");
4035 listOfKeys->addString(
"hasHallSensor");
4036 listOfKeys->addString(
"hasTempSensor");
4037 listOfKeys->addString(
"TemperatureSensorType");
4038 listOfKeys->addString(
"hasRotorEncoder");
4039 listOfKeys->addString(
"hasRotorEncoderIndex");
4040 listOfKeys->addString(
"rotorIndexOffset");
4041 listOfKeys->addString(
"rotorEncoderResolution");
4042 listOfKeys->addString(
"jointEncoderResolution");
4043 listOfKeys->addString(
"motorPoles");
4044 listOfKeys->addString(
"pidCurrentKp");
4045 listOfKeys->addString(
"pidCurrentKi");
4046 listOfKeys->addString(
"pidCurrentShift");
4047 listOfKeys->addString(
"pidCurrentOutput");
4048 listOfKeys->addString(
"coulombThreshold");
4049 listOfKeys->addString(
"torqueControlFilterType");
4050 listOfKeys->addString(
"jointEncoderType");
4051 listOfKeys->addString(
"rotorEncoderType");
4052 listOfKeys->addString(
"PWMLimit");
4053 listOfKeys->addString(
"motOverloadCurr");
4054 listOfKeys->addString(
"motNominalCurr");
4055 listOfKeys->addString(
"motPeakCurr");
4056 listOfKeys->addString(
"PowerSuppVoltage");
4057 listOfKeys->addString(
"rotorMax");
4058 listOfKeys->addString(
"rotorMin");
4059 listOfKeys->addString(
"jointMax");
4060 listOfKeys->addString(
"jointMin");
4061 listOfKeys->addString(
"jointEncTolerance");
4062 listOfKeys->addString(
"motorEncTolerance");
4063 listOfKeys->addString(
"jointDeadZone");
4064 listOfKeys->addString(
"readonly_position_PIDraw");
4065 listOfKeys->addString(
"readonly_velocity_PIDraw");
4066 listOfKeys->addString(
"readonly_current_PIDraw");
4067 listOfKeys->addString(
"readonly_torque_PIDraw");
4068 listOfKeys->addString(
"readonly_motor_torque_params_raw");
4080 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, axis, eoprot_tag_mc_joint_config);
4082 eOmc_joint_config_t joint_cfg;
4083 if(! askRemoteValue(protoid, &joint_cfg, size))
4086 *max = joint_cfg.maxvelocityofjoint;
4102 return VAS_status::VAS_OK;
4114 for(
int j=0; j< _njoints; j++)
4123 int j = _axisMap[userLevel_jointNumber];
4125 eOmeas_torque_t meas_torque = 0;
4126 static double curr_time = Time::now();
4127 static int count_saturation=0;
4129 meas_torque = (eOmeas_torque_t)
S_32(_measureConverter->trqN2S(fTorque, j));
4131 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_inputs_externallymeasuredtorque);
4146 eOmc_joint_status_core_t jstatus;
4147 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
4149 *t = (double) _measureConverter->trqS2N(jstatus.measures.meas_torque, j);
4156 for(
int j=0; j<_njoints; j++)
4174 for(
int j=0; j<_njoints && ret; j++)
4181 eOmc_setpoint_t setpoint;
4182 setpoint.type = (eOenum08_t) eomc_setpoint_torque;
4183 setpoint.to.torque.value = (eOmeas_torque_t)
S_32(t);
4185 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_setpoint);
4192 for(
int j=0; j< n_joint; j++)
4202 for(
int j=0; j<_njoints && ret; j++)
4209 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
4210 eOmc_joint_status_core_t jcore = {0};
4216 yError() <<
"embObjMotionControl::getRefTorqueRaw() could not read pid torque reference pos for " << getBoardInfo() <<
"joint " << j;
4220 if ((eOmc_interactionmode_compliant == jcore.modes.interactionmodestatus) &&
4221 (eomc_controlmode_position == jcore.modes.controlmodestatus))
4223 *t = (double) jcore.ofpid.complpos.reftrq;
4226 if(eomc_controlmode_torque == jcore.modes.controlmodestatus)
4228 *t = (double) jcore.ofpid.torque.reftrq;
4234bool embObjMotionControl::helper_setTrqPidRaw(
int j,
const Pid &pid)
4242 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_pidtorque);
4246bool embObjMotionControl::helper_getTrqPidRaw(
int j, Pid *pid)
4248 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_pidtorque);
4252 if(! askRemoteValue(protoid, &eoPID, size))
4261bool embObjMotionControl::helper_getTrqPidsRaw(Pid *pid)
4263 std::vector<eOmc_PID_t> eoPIDList (_njoints);
4264 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_config_pidtorque, eoPIDList);
4267 for(
int j=0; j< _njoints; j++)
4279 eOmc_impedance_t val;
4284 *stiffness = (double) (val.stiffness);
4285 *damping = (double) (val.damping);
4293 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_impedance);
4295 if(! askRemoteValue(protoid, &imped, size))
4299 _cacheImpedance->damping = imped.damping;
4300 _cacheImpedance->stiffness = imped.stiffness;
4301 _cacheImpedance->offset = imped.offset;
4308 eOmc_impedance_t val;
4316 _cacheImpedance[j].stiffness = (eOmeas_stiffness_t) stiffness;
4317 _cacheImpedance[j].damping = (eOmeas_damping_t) damping;
4319 val.stiffness = _cacheImpedance[j].stiffness;
4320 val.damping = _cacheImpedance[j].damping;
4321 val.offset = _cacheImpedance[j].offset;
4323 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_impedance);
4333 eOmc_impedance_t val;
4339 _cacheImpedance[j].offset = (eOmeas_torque_t)
S_32(
offset);
4340 val.stiffness = _cacheImpedance[j].stiffness;
4341 val.damping = _cacheImpedance[j].damping;
4342 val.offset = _cacheImpedance[j].offset;
4344 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_impedance);
4354 eOmc_impedance_t val;
4365 *min_stiff = _impedance_limits[j].
min_stiff;
4366 *max_stiff = _impedance_limits[j].
max_stiff;
4367 *min_damp = _impedance_limits[j].
min_damp;
4368 *max_damp = _impedance_limits[j].
max_damp;
4374 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_motor_params);
4377 eOmc_motor_params_t eo_params = {0};
4378 if(! askRemoteValue(protoid, &eo_params, size))
4381 params->bemf = eo_params.bemf_value;
4382 params->bemf_scale = eo_params.bemf_scale;
4383 params->ktau = eo_params.ktau_value;
4384 params->ktau_scale = eo_params.ktau_scale;
4385 params->viscousPos = eo_params.friction.viscous_pos_val;
4386 params->viscousNeg = eo_params.friction.viscous_neg_val ;
4387 params->coulombPos = eo_params.friction.coulomb_pos_val;
4388 params->coulombNeg = eo_params.friction.coulomb_neg_val;
4389 params->velocityThres = eo_params.friction.velocityThres_val;
4398 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_motor_params);
4399 eOmc_motor_params_t eo_params = {0};
4403 eo_params.bemf_value = (float) params.bemf;
4404 eo_params.bemf_scale = (uint8_t) params.bemf_scale;
4405 eo_params.ktau_value = (float) params.ktau;
4406 eo_params.ktau_scale = (uint8_t) params.ktau_scale;
4407 eo_params.friction.viscous_pos_val =
static_cast<float32_t
>(params.viscousPos);
4408 eo_params.friction.viscous_neg_val =
static_cast<float32_t
>(params.viscousNeg);
4409 eo_params.friction.coulomb_pos_val =
static_cast<float32_t
>(params.coulombPos);
4410 eo_params.friction.coulomb_neg_val =
static_cast<float32_t
>(params.coulombNeg);
4411 eo_params.friction.velocityThres_val =
static_cast<float32_t
>(params.velocityThres);
4416 yError() <<
"embObjMotionControl::setMotorTorqueParamsRaw() could not send set message for" << getBoardInfo() <<
"joint " << j;
4428 for(
int j=0; j< n_joint; j++)
4462bool embObjMotionControl::helper_getVelPidRaw(
int j, Pid *pid)
4464 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_piddirect);
4467 if(! askRemoteValue(protoid, &eoPID, size))
4477bool embObjMotionControl::helper_getVelPidsRaw(Pid *pid)
4479 std::vector <eOmc_PID_t> eoPIDList (_njoints);
4480 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_config_piddirect, eoPIDList);
4484 for(
int j=0; j<_njoints; j++)
4499 if (mode != VOCAB_CM_POSITION_DIRECT &&
4500 mode != VOCAB_CM_IDLE)
4504 yError() <<
"setReferenceRaw: skipping command because" << getBoardInfo() <<
" joint " << j <<
" is not in VOCAB_CM_POSITION_DIRECT mode";
4509 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_setpoint);
4510 eOmc_setpoint_t setpoint = {0};
4512 _ref_positions[j] = ref;
4513 setpoint.type = (eOenum08_t) eomc_setpoint_positionraw;
4514 setpoint.to.position.value = (eOmeas_position_t)
S_32(ref);
4515 setpoint.to.position.withvelocity = 0;
4523 for(
int i=0; i<n_joint; i++)
4533 for (
int i = 0; i<_njoints; i++)
4543 if (axis<0 || axis>_njoints)
return false;
4544#if ASK_REFERENCE_TO_FIRMWARE
4545 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, axis, eoprot_tag_mc_joint_status_target);
4550 eOmc_joint_status_target_t target = {0};
4551 if(!askRemoteValue(id32, &target, size))
4553 yError() <<
"embObjMotionControl::getTargetPositionRaw() could not read reference pos for " << getBoardInfo() <<
"joint " << axis;
4557 *ref = (double) target.trgt_position;
4561 *ref = _ref_command_positions[axis];
4569 for (
int i = 0; i<_njoints; i++)
4579 for (
int i = 0; i<nj; i++)
4588 if (axis<0 || axis>_njoints)
return false;
4589#if ASK_REFERENCE_TO_FIRMWARE
4590 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, axis, eoprot_tag_mc_joint_status_target);
4595 eOmc_joint_status_target_t target = {0};
4596 if(!askRemoteValue(id32, &target, size))
4598 yError() <<
"embObjMotionControl::getRefVelocityRaw() could not read reference vel for " << getBoardInfo() <<
"joint " << axis;
4601 *ref = (double) target.trgt_velocity;
4604 *ref = _ref_command_speeds[axis];
4611 #if ASK_REFERENCE_TO_FIRMWARE
4612 std::vector <eOmc_joint_status_target_t> targetList(_njoints);
4613 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_target, targetList);
4616 yError() <<
"embObjMotionControl::getRefVelocitiesRaw() could not read reference vel for " << getBoardInfo() ;
4620 for(
int j=0; j<_njoints; j++)
4622 refs[j] = (double) targetList[j].trgt_velocity;
4626 for(
int j=0; j<_njoints; j++)
4628 refs[j] = _ref_command_speeds[j];
4636 std::vector <double> refsList(_njoints);
4640 for (
int i = 0; i<nj; i++)
4642 if(jnts[i]>= _njoints)
4644 yError() << getBoardInfo() <<
"getRefVelocitiesRaw: joint " << jnts[i] <<
"doesn't exist";
4647 refs[i] = refsList[jnts[i]];
4654 if (axis<0 || axis>_njoints)
return false;
4655#if ASK_REFERENCE_TO_FIRMWARE
4656 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, axis, eoprot_tag_mc_joint_status_target);
4660 eOmc_joint_status_target_t target = {0};
4661 if(!askRemoteValue(id32, &target, size))
4663 yError() <<
"embObjMotionControl::getRefPositionRaw() could not read reference pos for " << getBoardInfo() <<
"joint " << axis;
4667 *ref = (double) target.trgt_positionraw;
4670 *ref = _ref_positions[axis];
4677 #if ASK_REFERENCE_TO_FIRMWARE
4678 std::vector <eOmc_joint_status_target_t> targetList(_njoints);
4679 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_target, targetList);
4682 yError() <<
"embObjMotionControl::getRefPositionRaw() could not read reference pos for " << getBoardInfo();
4686 for(
int j=0; j< _njoints; j++)
4687 refs[j] = (
double) targetList[j].trgt_positionraw;
4690 for(
int j=0; j< _njoints; j++)
4691 refs[j] = _ref_positions[j];
4699 for (
int i = 0; i<nj; i++)
4712 eOenum08_t interactionmodestatus;
4715 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core_modes_interactionmodestatus);
4719 int tmp = (int) *_mode;
4723 *_mode = (yarp::dev::InteractionModeEnum) tmp;
4742 for(
int j=0; j<_njoints; j++)
4752 eOenum08_t interactionmodecommand = 0;
4757 if (_mode == VOCAB_IM_COMPLIANT && _trq_pids[j].enabled ==
false) {yError()<<
"Torque control is disabled. Check your configuration parameters";
return false;}
4761 yError() <<
"setInteractionModeRaw: received unknown mode for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(_mode);
4764 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_interactionmode);
4766 if(
false == res->
setRemoteValue(protid, &interactionmodecommand) )
4768 yError() <<
"setInteractionModeRaw failed for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(_mode);
4774 eOenum08_t interactionmodestatus = 0;
4776 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_interactionmodestatus);
4777 bool ret = askRemoteValue(id32, &interactionmodestatus, size);
4779 if((
false == ret) || (interactionmodecommand != interactionmodestatus))
4781 yError() <<
"check of embObjMotionControl::setInteractionModeRaw() failed for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(_mode);
4794 eOenum08_t interactionmodecommand = 0;
4796 for(
int j=0; j<n_joints; j++)
4798 if (modes[j] == VOCAB_IM_COMPLIANT && _trq_pids[j].enabled ==
false) {yError()<<
"Torque control is disabled. Check your configuration parameters";
continue;}
4802 yError() <<
"embObjMotionControl::setInteractionModesRaw(): received unknown interactionMode for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(modes[j]) <<
" " << modes[j];
4806 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_interactionmode);
4807 if(
false == res->
setRemoteValue(protid, &interactionmodecommand) )
4809 yError() <<
"embObjMotionControl::setInteractionModesRaw() failed for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(modes[j]);
4815 eOenum08_t interactionmodestatus = 0;
4817 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_interactionmodestatus);
4818 bool ret = askRemoteValue(id32, &interactionmodestatus, size);
4820 if((
false == ret) || (interactionmodecommand != interactionmodestatus))
4824 yError() <<
"check of embObjMotionControl::setInteractionModesRaw() failed for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(modes[j]);
4830 yError() <<
"setInteractionModeRaw failed for" << getBoardInfo() <<
" joint " << j <<
" because of interactionMode mismatching \n\tSet " \
4831 << Vocab32::decode(modes[j]) <<
" Got " << Vocab32::decode(tmp);
4833 yError() <<
"setInteractionModeRaw failed for" << getBoardInfo() <<
" joint " << j <<
" because of interactionMode mismatching \n\tSet " \
4834 << Vocab32::decode(modes[j]) <<
" Got an unknown value!";
4847 eOenum08_t interactionmodecommand = 0;
4849 for(
int j=0; j<_njoints; j++)
4851 if ((modes[j] == VOCAB_IM_COMPLIANT) && (_trq_pids[j].enabled ==
false))
4853 yError()<<
"Torque control is disabled. Check your configuration parameters";
4859 yError() <<
"setInteractionModeRaw: received unknown interactionMode for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(modes[j]);
4863 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_interactionmode);
4864 if(
false == res->
setRemoteValue(protid, &interactionmodecommand) )
4866 yError() <<
"setInteractionModeRaw failed for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(modes[j]);
4872 eOenum08_t interactionmodestatus = 0;
4874 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_interactionmodestatus);
4875 bool ret = askRemoteValue(id32, &interactionmodestatus, size);
4877 if((
false == ret) || (interactionmodecommand != interactionmodestatus))
4881 yError() <<
"check of embObjMotionControl::setInteractionModesRaw() failed for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(modes[j]);
4887 yError() <<
"setInteractionModeRaw failed for" << getBoardInfo() <<
" joint " << j <<
" because of interactionMode mismatching \n\tSet " \
4888 << Vocab32::decode(modes[j]) <<
" Got " << Vocab32::decode(tmp);
4890 yError() <<
"setInteractionModeRaw failed for" << getBoardInfo() <<
" joint " << j <<
" because of interactionMode mismatching \n\tSet " \
4891 << Vocab32::decode(modes[j]) <<
" Got an unknown value!";
4904 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
4905 eOmc_joint_status_core_t jcore = {0};
4912 case VOCAB_PIDTYPE_POSITION:
4913 if((eomc_controlmode_torque == jcore.modes.controlmodestatus) || (eomc_controlmode_current == jcore.modes.controlmodestatus))
4916 *
out = (double) jcore.ofpid.generic.output;
4921 case VOCAB_PIDTYPE_TORQUE:
4922 if ((eomc_controlmode_torque == jcore.modes.controlmodestatus) ||
4923 ((eomc_controlmode_position == jcore.modes.controlmodestatus) && (eOmc_interactionmode_compliant == jcore.modes.interactionmodestatus)))
4924 *
out = jcore.ofpid.generic.output;
4928 case VOCAB_PIDTYPE_CURRENT:
4931 case VOCAB_PIDTYPE_VELOCITY:
4935 yError()<<
"Invalid pidtype:"<<pidtype;
4944 for(
int j=0; j< _njoints; j++)
4964 eOmc_motor_status_basic_t status;
4965 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_status_basic);
4975 yError() << getBoardInfo() <<
"At timestamp" << yarp::os::Time::now() <<
"In motor" << m <<
"embObjMotionControl::getTemperatureRaw failed to complete getLocalValue()";
4979 *val = _temperatureSensorsVector.at(m)->convertRawToTempCelsius((
double)status.mot_temperature);
4988 for(
int j=0; j< _njoints; j++)
4997 *temp= _temperatureLimits[m].warningTemperatureLimit;
5004 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_config_temperaturelimit);
5005 eOmeas_temperature_t temperatureLimit = (eOmeas_pwm_t)
S_16(temp);
5012 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_config_currentlimits);
5014 eOmc_current_limits_params_t currentlimits = {0};
5016 if(!askRemoteValue(protid, ¤tlimits, size))
5018 yError() <<
"embObjMotionControl::getPeakCurrentRaw() can't read current limits for" << getBoardInfo() <<
" motor " << m;
5022 *val = (double) currentlimits.peakCurrent ;
5028 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_config_currentlimits);
5031 eOmc_current_limits_params_t currentlimits = {0};
5032 if(!askRemoteValue(protid, ¤tlimits, size))
5034 yError() <<
"embObjMotionControl::setPeakCurrentRaw can't read current limits for" << getBoardInfo() <<
" motor " << m ;
5039 currentlimits.peakCurrent = (eOmeas_current_t)
S_16(val);
5045 yError() <<
"embObjMotionControl::setPeakCurrentRaw failed sending new value for" << getBoardInfo() <<
" motor " << m ;
5052 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_config_currentlimits);
5054 eOmc_current_limits_params_t currentlimits = {0};
5056 if(!askRemoteValue(protid, ¤tlimits, size))
5058 yError() <<
"embObjMotionControl::getNominalCurrentRaw() can't read current limits for" << getBoardInfo() <<
" motor " << m;
5062 *val = (double) currentlimits.nominalCurrent ;
5068 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_config_currentlimits);
5072 eOmc_current_limits_params_t currentlimits = {0};
5073 if(!askRemoteValue(protid, ¤tlimits, size))
5075 yError() <<
"embObjMotionControl::setNominalCurrentRaw can't read current limits for" << getBoardInfo() <<
" motor " << m ;
5080 currentlimits.nominalCurrent = (eOmeas_current_t)
S_16(val);
5086 yError() <<
"embObjMotionControl::setNominalCurrentRaw failed sending new value for" << getBoardInfo() <<
" motor " << m ;
5094 eOmc_motor_status_basic_t status;
5095 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_status_basic);
5100 *val = (double) status.mot_pwm;
5104 yError() <<
"embObjMotionControl::getPWMRaw failed for" << getBoardInfo() <<
" motor " << j ;
5113 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config_pwmlimit);
5115 eOmeas_pwm_t motorPwmLimit;
5117 bool ret = askRemoteValue(protid, &motorPwmLimit, size);
5120 *val = (double) motorPwmLimit;
5124 yError() <<
"embObjMotionControl::getPWMLimitRaw failed for" << getBoardInfo() <<
" motor " << j ;
5135 yError() <<
"embObjMotionControl::setPWMLimitRaw failed because pwmLimit is negative for" << getBoardInfo() <<
" motor " << j ;
5138 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config_pwmlimit);
5139 eOmeas_pwm_t motorPwmLimit = (eOmeas_pwm_t)
S_16(val);
5145 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_controller, 0, eoprot_tag_mc_controller_status);
5147 eOmc_controller_status_t controllerStatus;
5149 bool ret = askRemoteValue(protid, &controllerStatus, size);
5152 *val = (double) controllerStatus.supplyVoltage;
5156 yError() <<
"embObjMotionControl::getPowerSupplyVoltageRaw failed for" << getBoardInfo() <<
" motor " << j ;
5163bool embObjMotionControl::askRemoteValue(eOprotID32_t id32,
void* value, uint16_t& size)
5170bool embObjMotionControl::askRemoteValues(eOprotEndpoint_t ep, eOprotEntity_t entity, eOprotTag_t tag, std::vector<T>& values)
5172 std::vector<eOprotID32_t> idList;
5173 std::vector<void*> valueList;
5176 for(
int j=0; j<_njoints; j++)
5178 eOprotID32_t protoId = eoprot_ID_get(ep, entity, j, tag);
5179 idList.push_back(protoId);
5180 valueList.push_back((
void*)&values[j]);
5186 yError() <<
"embObjMotionControl::askRemoteValues failed for all joints of" << getBoardInfo();
5195bool embObjMotionControl::checkRemoteControlModeStatus(
int joint,
int target_mode)
5198 eOenum08_t temp = 0;
5201 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, joint, eoprot_tag_mc_joint_status_core_modes_controlmodestatus);
5202 const double timeout = 0.250;
5203 const int maxretries = 25;
5204 const double delaybetweenqueries = 0.010;
5208 double timeofstart = yarp::os::Time::now();
5211 for( attempt = 0; attempt < maxretries; attempt++)
5213 ret = askRemoteValue(id32, &temp, size);
5216 yError (
"An error occurred inside embObjMotionControl::checkRemoteControlModeStatus(j=%d, targetmode=%s) for BOARD %s IP %s", joint, yarp::os::Vocab32::decode(target_mode).c_str(), res->
getProperties().
boardnameString.c_str(), res->
getProperties().
ipv4addrString.c_str());
5220 if(current_mode == target_mode)
5225 if((current_mode == VOCAB_CM_IDLE) && (target_mode == VOCAB_CM_FORCE_IDLE))
5230 if(current_mode == VOCAB_CM_HW_FAULT)
5232 if(target_mode != VOCAB_CM_FORCE_IDLE) { yError (
"embObjMotionControl::checkRemoteControlModeStatus(%d, %d) is unable to check the control mode of BOARD %s IP %s because it is now in HW_FAULT", joint, target_mode, res->
getProperties().
boardnameString.c_str(), res->
getProperties().
ipv4addrString.c_str()); }
5237 if((yarp::os::Time::now()-timeofstart) > timeout)
5240 yError (
"A %f sec timeout occured in embObjMotionControl::checkRemoteControlModeStatus(), BOARD %s IP %s, joint %d, current mode: %s, requested: %s", timeout, res->
getProperties().
boardnameString.c_str(), res->
getProperties().
ipv4addrString.c_str(), joint, yarp::os::Vocab32::decode(current_mode).c_str(), yarp::os::Vocab32::decode(target_mode).c_str());
5245 yWarning (
"embObjMotionControl::checkRemoteControlModeStatus() has done %d attempts and will retry again after a %f sec delay. (BOARD %s IP %s, joint %d) -> current mode = %s, requested = %s", attempt+1, delaybetweenqueries, res->
getProperties().
boardnameString.c_str() , res->
getProperties().
ipv4addrString.c_str(), joint, yarp::os::Vocab32::decode(current_mode).c_str(), yarp::os::Vocab32::decode(target_mode).c_str());
5247 SystemClock::delaySystem(delaybetweenqueries);
5252 yError(
"failure of embObjMotionControl::checkRemoteControlModeStatus(j=%d, targetmode=%s) for BOARD %s IP %s after %d attempts and %f seconds", joint, yarp::os::Vocab32::decode(target_mode).c_str(), res->
getProperties().
boardnameString.c_str(), res->
getProperties().
ipv4addrString.c_str(), attempt, yarp::os::Time::now()-timeofstart);
5260bool embObjMotionControl::iNeedCouplingsInfo(
void)
5262 eOmn_serv_type_t mc_serv_type = (eOmn_serv_type_t)serviceConfig.
ethservice.configuration.type;
5263 if( (mc_serv_type == eomn_serv_MC_foc) ||
5264 (mc_serv_type == eomn_serv_MC_mc4plus) ||
5265 (mc_serv_type == eomn_serv_MC_mc4plusmais) ||
5266 (mc_serv_type == eomn_serv_MC_mc2pluspsc) ||
5267 (mc_serv_type == eomn_serv_MC_mc4plusfaps) ||
5268 (mc_serv_type == eomn_serv_MC_advfoc)
5278 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_setpoint);
5280 eOmc_setpoint_t setpoint;
5282 setpoint.type = (eOenum08_t)eomc_setpoint_openloop;
5283 setpoint.to.openloop.value = (eOmeas_pwm_t)
S_16(v);
5291 for (
int j = 0; j<_njoints; j++)
5300 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_target);
5303 eOmc_joint_status_target_t target = { 0 };
5306 if (!askRemoteValue(protoId, &target, size))
5308 yError() <<
"embObjMotionControl::getRefDutyCycleRaw() could not read openloop reference for " << getBoardInfo() <<
"joint " << j;
5312 *v = (double)target.trgt_pwm;
5319 std::vector <eOmc_joint_status_target_t> targetList(_njoints);
5320 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_target, targetList);
5323 yError() <<
"embObjMotionControl::getDutyCyclesRaw failed for all joints of" << getBoardInfo();
5326 for (
int j = 0; j<_njoints; j++)
5328 v[j]= targetList[j].trgt_pwm;
5335 eOmc_motor_status_basic_t status;
5336 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_status_basic);
5341 *v = (double)status.mot_pwm;
5345 yError() <<
"embObjMotionControl::getDutyCycleRaw failed for" << getBoardInfo() <<
" motor " << j;
5355 for (
int j = 0; j< _njoints; j++)
5377 for (
int j = 0; j< _njoints; j++)
5387 for (
int j = 0; j<_njoints; j++)
5396 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_setpoint);
5398 eOmc_setpoint_t setpoint;
5400 setpoint.type = (eOenum08_t)eomc_setpoint_current;
5401 setpoint.to.current.value = (eOmeas_pwm_t)
S_16(t);
5409 for (
int j = 0; j<n_joint; j++)
5418 std::vector <eOmc_joint_status_target_t> targetList(_njoints);
5419 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_target, targetList);
5422 yError() <<
"embObjMotionControl::getDutyCyclesRaw failed for all joints of" << getBoardInfo();
5425 for (
int j = 0; j<_njoints; j++)
5427 t[j] = targetList[j].trgt_current;
5434 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_target);
5437 eOmc_joint_status_target_t target = { 0 };
5440 if (!askRemoteValue(protoId, &target, size))
5442 yError() <<
"embObjMotionControl::getRefDutyCycleRaw() could not read openloop reference for " << getBoardInfo() <<
"joint " << j;
5446 *t = (double)target.trgt_current;
5451bool embObjMotionControl::helper_setCurPidRaw(
int j,
const Pid &pid)
5453 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config_pidcurrent);
5457 if (!_cur_pids[j].enabled)
5459 yError() <<
"eoMc " << getBoardInfo() <<
": it is not possible set current pid for motor " << j <<
", because current pid is not enabled in xml files";
5467 yError() <<
"while setting velocity PIDs for" << getBoardInfo() <<
" joint " << j;
5476bool embObjMotionControl::helper_setSpdPidRaw(
int j,
const Pid &pid)
5478 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config_pidspeed);
5482 if (!_cur_pids[j].enabled)
5484 yError() <<
"eoMc " << getBoardInfo() <<
": it is not possible set speed pid for motor " << j <<
", because speed pid is not enabled in xml files";
5492 yError() <<
"while setting velocity PIDs for" << getBoardInfo() <<
" joint " << j;
5501bool embObjMotionControl::helper_getCurPidRaw(
int j, Pid *pid)
5503 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
5505 eOmc_motor_config_t motor_cfg;
5506 if(! askRemoteValue(protoid, &motor_cfg, size))
5510 eOmc_PID_t
tmp = (eOmc_PID_t)motor_cfg.pidcurrent;
5516bool embObjMotionControl::helper_getSpdPidRaw(
int j, Pid *pid)
5518 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
5520 eOmc_motor_config_t motor_cfg;
5521 if (!askRemoteValue(protoid, &motor_cfg, size))
5525 eOmc_PID_t
tmp = (eOmc_PID_t)motor_cfg.pidspeed;
5531bool embObjMotionControl::helper_getCurPidsRaw(Pid *pid)
5533 std::vector <eOmc_motor_config_t> motor_cfg_list(_njoints);
5534 bool ret = askRemoteValues<eOmc_motor_config_t>(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, eoprot_tag_mc_motor_config, motor_cfg_list);
5538 for(
int j=0; j<_njoints; j++)
5540 eOmc_PID_t
tmp = (eOmc_PID_t)motor_cfg_list[j].pidcurrent;
5546bool embObjMotionControl::helper_getSpdPidsRaw(Pid *pid)
5548 std::vector <eOmc_motor_config_t> motor_cfg_list(_njoints);
5549 bool ret = askRemoteValues<eOmc_motor_config_t>(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, eoprot_tag_mc_motor_config, motor_cfg_list);
5553 for (
int j = 0; j<_njoints; j++)
5555 eOmc_PID_t
tmp = (eOmc_PID_t)motor_cfg_list[j].pidspeed;
5561bool embObjMotionControl::getJointConfiguration(
int joint, eOmc_joint_config_t *jntCfg_ptr)
5563 uint32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, joint, eoprot_tag_mc_joint_config);
5565 if(!askRemoteValue(protoid, jntCfg_ptr, size))
5573bool embObjMotionControl::getMotorConfiguration(
int axis, eOmc_motor_config_t *motCfg_ptr)
5575 uint32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, axis, eoprot_tag_mc_motor_config);
5577 if(!askRemoteValue(protoid, motCfg_ptr, size))
5586bool embObjMotionControl::getGerabox_E2J(
int joint,
double *gearbox_E2J_ptr)
5588 eOmc_joint_config_t jntCfg;
5590 if(!getJointConfiguration(joint, &jntCfg))
5595 *gearbox_E2J_ptr = jntCfg.gearbox_E2J;
5599bool embObjMotionControl::getJointEncTolerance(
int joint,
double *jEncTolerance_ptr)
5601 eOmc_joint_config_t jntCfg;
5603 if(!getJointConfiguration(joint, &jntCfg))
5608 *jEncTolerance_ptr = jntCfg.jntEncTolerance;
5612bool embObjMotionControl::getMotorEncTolerance(
int axis,
double *mEncTolerance_ptr)
5614 eOmc_motor_config_t motorCfg;
5615 if(!getMotorConfiguration(axis, &motorCfg))
5620 *mEncTolerance_ptr = motorCfg.rotEncTolerance;
5626 eOmc_motor_status_t status;
5628 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol,
5629 eoprot_entity_mc_motor, j,
5630 eoprot_tag_mc_motor_status);
5639 message =
"Could not retrieve the fault state.";
5643 if (status.mc_fault_state == EOERROR_CODE_DUMMY)
5645 fault = EOERROR_CODE_DUMMY;
5646 message =
"No fault detected.";
5651 fault = eoerror_code2value(status.mc_fault_state);
5652 message = eoerror_code2string(status.mc_fault_state);
5657bool embObjMotionControl::getRawData_core(std::string key, std::vector<std::int32_t> &
data)
5662 for(
int j=0; j< _njoints; j++)
5664 eOmc_joint_status_additionalInfo_t addinfo;
5665 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_addinfo_multienc);
5670 for (
int k = 0; k < std::size(addinfo.multienc); k++)
5672 data.push_back((int32_t)addinfo.multienc[k]);
5681 for (
auto it = _rawValuesMetadataMap.begin(); it != _rawValuesMetadataMap.end(); it++)
5683 if(!getRawData_core(it->first, _rawDataAuxVector))
5685 yError() << getBoardInfo() <<
"getRawData failed. Cannot retrieve all raw data from local memory";
5688 map.insert({it->first, _rawDataAuxVector});
5696 if(_rawValuesMetadataMap.find(key) != _rawValuesMetadataMap.end())
5698 getRawData_core(key,
data);
5702 yError() << getBoardInfo() <<
"Request key:" << key <<
"is not available. Cannot retrieve get raw data.";
5711 for (
const auto &
p : _rawValuesMetadataMap)
5713 keys.push_back(
p.first);
5721 return _rawValuesMetadataMap.size();
5726 if (_rawValuesMetadataMap.empty())
5728 yError() << getBoardInfo() <<
"embObjMotionControl Map is empty. Closing...";
5737 if(_rawValuesMetadataMap.find(key) != _rawValuesMetadataMap.end())
5739 meta = _rawValuesMetadataMap[key];
5743 yError() << getBoardInfo() <<
"Requested key" << key <<
"is not available in the map. Closing...";
5754 if (_rawValuesMetadataMap.find(key) != _rawValuesMetadataMap.end())
5756 axesNames.assign(_rawValuesMetadataMap[key].axesNames.begin(), _rawValuesMetadataMap[key].axesNames.end());
5760 yError() << getBoardInfo() <<
"Requested key" << key <<
"is not available in the map. Exiting";
bool NOT_YET_IMPLEMENTED(const char *txt)
bool DEPRECATED(const char *txt)
#define MAX_POSITION_MOVE_INTERVAL
servMC_encoder_t * getEncoderAtMotor(int index)
bool parseService(yarp::os::Searchable &config, servConfigMais_t &maisconfig)
servMC_encoder_t * getEncoderAtJoint(int index)
virtual bool setcheckRemoteValue(const eOprotID32_t id32, void *value, const unsigned int retries=10, const double waitbeforecheck=0.001, const double timeout=0.050)=0
virtual bool serviceVerifyActivate(eOmn_serv_category_t category, const eOmn_serv_parameter_t *param, double timeout=0.500)=0
virtual const Properties & getProperties()=0
virtual bool setRemoteValue(const eOprotID32_t id32, void *value)=0
virtual bool verifyEPprotocol(eOprot_endpoint_t ep)=0
virtual bool getLocalValue(const eOprotID32_t id32, void *value)=0
virtual bool serviceSetRegulars(eOmn_serv_category_t category, vector< eOprotID32_t > &id32vector, double timeout=0.500)=0
virtual bool serviceStart(eOmn_serv_category_t category, double timeout=0.500)=0
virtual bool getRemoteValue(const eOprotID32_t id32, void *value, const double timeout=0.100, const unsigned int retries=0)=0
virtual bool getRemoteValues(const std::vector< eOprotID32_t > &id32s, const std::vector< void * > &values, const double timeout=0.500)=0
int releaseResource2(eth::AbstractEthResource *ethresource, IethResource *interface)
bool verifyEthBoardInfo(yarp::os::Searchable &cfgtotal, eOipv4addr_t &boardipv4, string boardipv4string, string boardname)
static bool killYourself()
static TheEthManager * instance()
eth::AbstractEthResource * requestResource2(IethResource *interface, yarp::os::Searchable &cfgtotal)
bool start()
Instantiates the yarp::os::Timer object and starts it.
bool canprint()
Called by the object that implements the downsampler.
virtual bool getPidReferenceRaw(const PidControlTypeEnum &pidtype, int j, double *ref) override
virtual bool setVelLimitsRaw(int axis, double min, double max) override
virtual bool setMaxCurrentRaw(int j, double val) override
virtual bool getMotorEncoderRaw(int m, double *v) override
virtual bool enablePidRaw(const PidControlTypeEnum &pidtype, int j) override
virtual bool getRawData(std::string key, std::vector< std::int32_t > &data) override
virtual bool setPidErrorLimitsRaw(const PidControlTypeEnum &pidtype, const double *limits) override
virtual bool setRefSpeedsRaw(const double *spds) override
virtual bool getEncoderTypeName(uint32_t jomoId, eOmc_position_t pos, std::string &encoderTypeName) override
virtual bool getTorqueRangesRaw(double *min, double *max) override
virtual bool getControlModesRaw(int *v) override
virtual bool getRefCurrentRaw(int j, double *t) override
virtual bool setInteractionModeRaw(int j, yarp::dev::InteractionModeEnum _mode) override
virtual bool getPidOutputRaw(const PidControlTypeEnum &pidtype, int j, double *out) override
virtual bool getInteractionModesRaw(int n_joints, int *joints, yarp::dev::InteractionModeEnum *modes) override
virtual bool setInteractionModesRaw(int n_joints, int *joints, yarp::dev::InteractionModeEnum *modes) override
bool getRotorEncoderTypeRaw(int j, int &type)
virtual bool setRefAccelerationsRaw(const double *accs) override
virtual bool disablePidRaw(const PidControlTypeEnum &pidtype, int j) override
virtual bool getImpedanceRaw(int j, double *stiffness, double *damping) override
virtual bool update(eOprotID32_t id32, double timestamp, void *rxdata)
virtual bool setPidOffsetRaw(const PidControlTypeEnum &pidtype, int j, double v) override
virtual bool getPowerSupplyVoltageRaw(int j, double *val) override
virtual bool setPidsRaw(const PidControlTypeEnum &pidtype, const Pid *pids) override
virtual bool getPidErrorLimitRaw(const PidControlTypeEnum &pidtype, int j, double *limit) override
virtual bool setPeakCurrentRaw(int m, const double val) override
virtual bool enableAmpRaw(int j) override
bool getHasRotorEncoderRaw(int j, int &ret)
virtual bool setRefTorqueRaw(int j, double t) override
virtual bool relativeMoveRaw(int j, double delta) override
virtual bool disableAmpRaw(int j) override
virtual bool getRefVelocityRaw(const int joint, double *ref) override
virtual bool getEncodersRaw(double *encs) override
virtual bool getLastJointFaultRaw(int j, int &fault, std::string &message) override
virtual bool getDutyCyclesRaw(double *v) override
virtual bool getPidReferencesRaw(const PidControlTypeEnum &pidtype, double *refs) override
virtual bool getMotorEncoderAccelerationsRaw(double *accs) override
virtual bool resetMotorEncoderRaw(int m) override
virtual bool checkMotionDoneRaw(bool *flag) override
virtual bool getPWMLimitRaw(int j, double *val) override
virtual bool getControlModeRaw(int j, int *v) override
virtual bool getPWMRaw(int j, double *val) override
bool getRotorLimitsRaw(int j, double *rotorMin, double *rotorMax)
virtual bool getTorqueRaw(int j, double *t) override
virtual bool getMotorEncodersRaw(double *encs) override
virtual bool open(yarp::os::Searchable &par)
virtual bool getEncodersTimedRaw(double *encs, double *stamps) override
bool getHasHallSensorRaw(int j, int &ret)
bool getJointEncoderResolutionRaw(int m, double &jntres)
virtual bool getRefSpeedsRaw(double *spds) override
virtual bool getInteractionModeRaw(int j, yarp::dev::InteractionModeEnum *_mode) override
virtual bool getEntityName(uint32_t entityId, std::string &entityName)
virtual eth::iethresType_t type()
bool getTemperatureSensorTypeRaw(int j, std::string &ret)
virtual bool getEntityControlModeName(uint32_t entityId, eOenum08_t control_mode, std::string &controlModeName, eObool_t compact_string) override
virtual bool getCurrentRangesRaw(double *min, double *max) override
virtual bool getLimitsRaw(int axis, double *min, double *max) override
virtual bool setPidReferenceRaw(const PidControlTypeEnum &pidtype, int j, double ref) override
virtual bool updateVirtualAnalogSensorMeasure(yarp::sig::Vector &fTorques) override
virtual bool setImpedanceRaw(int j, double stiffness, double damping) override
virtual bool setRemoteVariableRaw(std::string key, const yarp::os::Bottle &val) override
virtual bool getCurrentsRaw(double *vals) override
virtual bool getTorqueRangeRaw(int j, double *min, double *max) override
virtual bool getTorquesRaw(double *t) override
virtual bool getAmpStatusRaw(int *st) override
virtual yarp::dev::VAS_status getVirtualAnalogSensorStatus(int ch) override
bool getHasTempSensorsRaw(int j, int &ret)
virtual bool setRefCurrentsRaw(const double *t) override
virtual bool getTargetPositionRaw(const int joint, double *ref) override
virtual bool setMotorEncoderCountsPerRevolutionRaw(int m, const double cpr) override
virtual bool getGearboxRatioRaw(int m, double *gearbox) override
virtual bool resetEncodersRaw() override
virtual bool getTemperatureLimitRaw(int m, double *temp) override
virtual bool setCalibrationParametersRaw(int axis, const CalibrationParameters ¶ms) override
virtual bool getRawDataMap(std::map< std::string, std::vector< std::int32_t > > &map) override
virtual bool setNominalCurrentRaw(int m, const double val) override
virtual bool setMotorTorqueParamsRaw(int j, const MotorTorqueParameters params) override
virtual bool setRefCurrentRaw(int j, double t) override
virtual bool setTemperatureLimitRaw(int m, const double temp) override
virtual bool getRemoteVariableRaw(std::string key, yarp::os::Bottle &val) override
virtual bool calibrationDoneRaw(int j) override
virtual bool getEncoderTimedRaw(int j, double *encs, double *stamp) override
virtual bool getMetadataMap(rawValuesKeyMetadataMap &metamap) override
virtual bool getAxisNameRaw(int axis, std::string &name) override
virtual bool setPWMLimitRaw(int j, const double val) override
virtual bool getRefAccelerationRaw(int j, double *acc) override
virtual bool resetPidRaw(const PidControlTypeEnum &pidtype, int j) override
virtual bool getPidRaw(const PidControlTypeEnum &pidtype, int j, Pid *pid) override
virtual bool setPositionRaw(int j, double ref) override
virtual bool getRefSpeedRaw(int j, double *ref) override
virtual bool setPidErrorLimitRaw(const PidControlTypeEnum &pidtype, int j, double limit) override
virtual bool setControlModesRaw(const int n_joint, const int *joints, int *modes) override
bool getRotorEncoderResolutionRaw(int m, double &rotres)
virtual bool setRefDutyCycleRaw(int j, double v) override
virtual bool getImpedanceOffsetRaw(int j, double *offset) override
bool getWholeImpedanceRaw(int j, eOmc_impedance_t &imped)
virtual bool getEncoderSpeedsRaw(double *spds) override
virtual bool setPositionsRaw(const int n_joint, const int *joints, const double *refs) override
virtual bool resetMotorEncodersRaw() override
bool getJointEncoderTypeRaw(int j, int &type)
virtual bool getNumberOfMotorEncodersRaw(int *num) override
virtual bool getPidErrorLimitsRaw(const PidControlTypeEnum &pidtype, double *limits) override
virtual bool setMotorEncoderRaw(int m, const double val) override
virtual bool stopRaw() override
virtual bool getMotorEncoderTimedRaw(int m, double *encs, double *stamp) override
virtual bool setEncoderRaw(int j, double val) override
virtual bool resetEncoderRaw(int j) override
virtual bool setPidRaw(const PidControlTypeEnum &pidtype, int j, const Pid &pid) override
virtual bool getRefAccelerationsRaw(double *accs) override
virtual bool getPidOutputsRaw(const PidControlTypeEnum &pidtype, double *outs) override
virtual bool getRefPositionsRaw(double *refs) override
virtual bool getJointTypeRaw(int axis, yarp::dev::JointTypeEnum &type) override
virtual bool calibrateAxisWithParamsRaw(int axis, unsigned int type, double p1, double p2, double p3) override
virtual bool getNominalCurrentRaw(int m, double *val) override
virtual bool initialised()
virtual bool setRefTorquesRaw(const double *t) override
virtual bool getRefDutyCyclesRaw(double *v) override
virtual bool getCurrentRaw(int j, double *val) override
bool getMotorPolesRaw(int j, int &poles)
virtual bool getCurrentRangeRaw(int j, double *min, double *max) override
virtual bool getRefTorquesRaw(double *t) override
virtual bool setEncodersRaw(const double *vals) override
virtual bool getEncoderRaw(int j, double *v) override
virtual bool getKeys(std::vector< std::string > &keys) override
virtual bool setControlModeRaw(const int j, const int mode) override
virtual bool positionMoveRaw(int j, double ref) override
bool getKinematicMJRaw(int j, double &rotres)
virtual bool setLimitsRaw(int axis, double min, double max) override
virtual bool getEncoderAccelerationRaw(int j, double *spds) override
virtual bool getMotorTorqueParamsRaw(int j, MotorTorqueParameters *params) override
virtual bool getTemperatureRaw(int m, double *val) override
virtual int getNumberOfKeys() override
virtual bool setPidReferencesRaw(const PidControlTypeEnum &pidtype, const double *refs) override
virtual bool getCurrentImpedanceLimitRaw(int j, double *min_stiff, double *max_stiff, double *min_damp, double *max_damp) override
virtual bool getVelLimitsRaw(int axis, double *min, double *max) override
virtual bool getRefTorqueRaw(int j, double *t) override
virtual bool getNumberOfMotorsRaw(int *num) override
virtual bool getAxesNames(std::string key, std::vector< std::string > &axesNames) override
virtual bool setRefSpeedRaw(int j, double sp) override
virtual bool getMotorEncoderSpeedsRaw(double *spds) override
virtual bool getMaxCurrentRaw(int j, double *val) override
virtual bool getTemperaturesRaw(double *vals) override
virtual bool getMotorEncoderCountsPerRevolutionRaw(int m, double *v) override
virtual bool getEncoderAccelerationsRaw(double *accs) override
virtual bool getPidsRaw(const PidControlTypeEnum &pidtype, Pid *pids) override
virtual bool getRemoteVariablesListRaw(yarp::os::Bottle *listOfKeys) override
bool getTorqueControlFilterType(int j, int &type)
virtual bool getRefCurrentsRaw(double *t) override
virtual bool getPidErrorRaw(const PidControlTypeEnum &pidtype, int j, double *err) override
virtual bool setImpedanceOffsetRaw(int j, double offset) override
virtual bool getRefDutyCycleRaw(int j, double *v) override
virtual bool getMotorEncodersTimedRaw(double *encs, double *stamps) override
virtual int getVirtualAnalogSensorChannels() override
bool getRotorIndexOffsetRaw(int j, double &rotorOffset)
virtual bool setMotorEncodersRaw(const double *vals) override
virtual bool isPidEnabledRaw(const PidControlTypeEnum &pidtype, int j, bool *enabled) override
virtual bool setRefAccelerationRaw(int j, double acc) override
virtual bool getEncoderSpeedRaw(int j, double *sp) override
virtual bool getMotorEncoderSpeedRaw(int m, double *sp) override
virtual bool getMotorEncoderAccelerationRaw(int m, double *spds) override
virtual bool getAxes(int *ax) override
virtual bool getRefPositionRaw(const int joint, double *ref) override
virtual bool setRefDutyCyclesRaw(const double *v) override
virtual bool getKeyMetadata(std::string key, rawValuesKeyMetadata &meta) override
virtual bool velocityMoveRaw(int j, double sp) override
virtual bool getPeakCurrentRaw(int m, double *val) override
virtual bool getPidErrorsRaw(const PidControlTypeEnum &pidtype, double *errs) override
virtual bool getRefVelocitiesRaw(double *refs) override
virtual bool getTargetPositionsRaw(double *refs) override
bool getHasRotorEncoderIndexRaw(int j, int &ret)
virtual bool getDutyCycleRaw(int j, double *v) override
bool parseJointsetCfgGroup(yarp::os::Searchable &config, std::vector< JointsSet > &jsets, std::vector< int > &jointtoset)
bool parseJointsLimits(yarp::os::Searchable &config, std::vector< jointLimits_t > &jointsLimits)
bool parseTimeoutsGroup(yarp::os::Searchable &config, std::vector< timeouts_t > &timeouts, int defaultTimeout)
bool parseMaintenanceModeGroup(yarp::os::Searchable &config, bool &skipRecalibrationEnabled)
bool parseAmpsToSensor(yarp::os::Searchable &config, double ampsToSensor[])
bool parseMechanicalsFlags(yarp::os::Searchable &config, int useMotorSpeedFbk[])
bool parseMotioncontrolVersion(yarp::os::Searchable &config, int &version)
bool parseLugreGroup(yarp::os::Searchable &config, std::vector< lugreParameters_t > &lugre)
bool parseAxisInfo(yarp::os::Searchable &config, int axisMap[], std::vector< axisInfo_t > &axisInfo)
bool parseFocGroup(yarp::os::Searchable &config, focBasedSpecificInfo_t *foc_based_info, std::string groupName, std::vector< std::unique_ptr< eomc::ITemperatureSensor > > &temperatureSensorsVector)
bool parseCouplingInfo(yarp::os::Searchable &config, couplingInfo_t &couplingInfo)
bool parsePids(yarp::os::Searchable &config, PidInfo *ppids, TrqPidInfo *tpids, PidInfo *cpids, PidInfo *spids, bool lowLevPidisMandatory)
bool parseTemperatureLimits(yarp::os::Searchable &config, std::vector< temperatureLimits_t > &temperatureLimits)
bool parseDeadzoneValue(yarp::os::Searchable &config, double deadzone[], bool *found)
bool isVerboseEnabled(yarp::os::Searchable &config)
bool parseCurrentLimits(yarp::os::Searchable &config, std::vector< motorCurrentLimits_t > &currLimits)
bool parseEncoderFactor(yarp::os::Searchable &config, double encoderFactor[])
bool parsefullscalePWM(yarp::os::Searchable &config, double dutycycleToPWM[])
bool parseRotorsLimits(yarp::os::Searchable &config, std::vector< rotorLimits_t > &rotorsLimits)
bool parseImpedanceGroup(yarp::os::Searchable &config, std::vector< impedanceParameters_t > &impedance)
bool parseKalmanFilterParams(yarp::os::Searchable &config, std::vector< kalmanFilterParams_t > &kalmanFilterParams)
bool parseGearboxValues(yarp::os::Searchable &config, double gearbox_M2J[], double gearbox_E2J[])
bool parseBehaviourFalgs(yarp::os::Searchable &config, bool &useRawEncoderData, bool &pwmIsLimited)
std::string usernamePidSelected
yarp::dev::PidFeedbackUnitsEnum fbk_PidUnits
eOmc_ctrl_out_type_t out_type
yarp::dev::PidOutputUnitsEnum out_PidUnits
static uint32_t idx[BOARD_NUM]
static bool nv_not_found(void)
static bool NOT_YET_IMPLEMENTED(const char *txt)
#define PARSER_MOTION_CONTROL_VERSION
static bool DEPRECATED(const char *txt)
const double jointWithAKSIM2
const double jointWithAEA3
const double jointWithAMO
const double jointWithAEA
bool read(yarp::os::Searchable &cfgtotal, pc104Data &pc104data)
bool EncoderType_eo2iCub(const uint8_t *in, string *out)
int controlModeStatusConvert_embObj2yarp(eOenum08_t embObjMode)
bool interactionModeStatusConvert_embObj2yarp(eOenum08_t embObjMode, int &vocabOut)
bool controlModeCommandConvert_yarp2embObj(int vocabMode, eOenum08_t &embOut)
void copyPid_eo2iCub(eOmc_PID_t *in, Pid *out)
@ motor_temperature_sensor_pt100
@ motor_temperature_sensor_pt1000
@ motor_temperature_sensor_none
void copyPid_iCub2eo(const Pid *in, eOmc_PID_t *out)
bool interactionModeCommandConvert_yarp2embObj(int vocabMode, eOenum08_t &embOut)
std::vector< BufferedPort< Bottle > * > ports
eOmn_serv_diagn_cfg_t config
eOmn_appl_config_t txconfig
eOmn_serv_parameter_t ethservice
eOmc_encoder_descriptor_t desc
bool useRawEncoderData
its value depends on environment variable "ETH_VERBOSEWHENOK"
bool pwmIsLimited
if true than do not use calibration data
std::vector< double > matrixM2J
std::vector< double > matrixE2J
std::vector< double > matrixJ2M
bool hasRotorEncoderIndex
bool enableSkipRecalibration