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 yError() << txt <<
" is not yet implemented for embObjMotionControl";
63 yError() << 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>();
1059bool embObjMotionControl::verifyUseMotorSpeedFbkInJointSet(
int useMotorSpeedFbk [])
1061 for(
size_t s=0; s< _jsets.size(); s++)
1063 int numofjointsinset = _jsets[s].getNumberofJoints();
1064 if(numofjointsinset == 0 )
1066 yError() <<
"embObjMC " << getBoardInfo() <<
"Jointsset " << s <<
"hasn't joints!!! I should be never stay here!!!";
1070 int firstjointofset = _jsets[s].joints[0];
1071 for(
int j=1; j<numofjointsinset; j++)
1073 int joint = _jsets[s].joints[j];
1074 if(useMotorSpeedFbk[firstjointofset] != useMotorSpeedFbk[joint])
1076 yError() <<
"embObjMC " << getBoardInfo() <<
". Param useMotorSpeedFbk should have same value for joints belong same set. See joint " << firstjointofset <<
" and " << joint;
1081 _jsets[s].setUseSpeedFeedbackFromMotors(useMotorSpeedFbk[firstjointofset]);
1088bool embObjMotionControl::verifyTorquePidshasSameUnitTypes(yarp::dev::PidFeedbackUnitsEnum &fbk_pidunits, yarp::dev::PidOutputUnitsEnum& out_pidunits)
1090 fbk_pidunits = yarp::dev::PidFeedbackUnitsEnum::RAW_MACHINE_UNITS;
1091 out_pidunits = yarp::dev::PidOutputUnitsEnum::RAW_MACHINE_UNITS;
1093 int firstjoint = -1;
1094 for(
int i=0; i<_njoints; i++)
1096 if(_trq_pids[i].enabled)
1106 for(
int i=firstjoint+1; i<_njoints; i++)
1108 if(_trq_pids[i].enabled)
1110 if(_trq_pids[firstjoint].fbk_PidUnits != _trq_pids[i].fbk_PidUnits ||
1111 _trq_pids[firstjoint].out_PidUnits != _trq_pids[i].out_PidUnits)
1113 yError() <<
"embObjMC " << getBoardInfo() <<
"all joints with torque enabled should have same controlunits type. Joint " << firstjoint <<
" differs from joint " << i;
1124bool embObjMotionControl::isTorqueControlEnabled(
int joint)
1126 return (_trq_pids[joint].enabled);
1129bool embObjMotionControl::isVelocityControlEnabled(
int joint)
1132 return (_trj_pids[joint].enabled);
1136void embObjMotionControl::updateDeadZoneWithDefaultValues(
void)
1138 for(
int i=0; i<_njoints; i++)
1140 switch(_jointEncs[i].
type)
1148 case eomc_enc_aksim2:
1154 case eomc_enc_absanalog:
1157 case eomc_enc_hallmotor:
1158 case eomc_enc_spichainof2:
1159 case eomc_enc_spichainof3:
1169bool embObjMotionControl::fromConfig_readServiceCfg(yarp::os::Searchable &config)
1172 if(
false == parser->
parseService(config, serviceConfig))
1174 yError() <<
"embObjMC " << getBoardInfo() <<
"cannot parse service" ;
1178 if(eomn_serv_MC_generic == serviceConfig.
ethservice.configuration.type)
1180 yError() <<
"embObjMC " << getBoardInfo() <<
"it is no longer possible use eomn_serv_MC_generic, because firmware cannot configure itself!" ;
1188 for(
int i=0; i<_njoints; i++)
1193 if(NULL == jointEncoder_ptr)
1195 _jointEncs[i].resolution = 1;
1196 _jointEncs[i].type = eomc_enc_none;
1197 _jointEncs[i].tolerance = 0;
1201 _jointEncs[i].resolution = jointEncoder_ptr->
resolution;
1202 _jointEncs[i].type = (eOmc_encoder_t)jointEncoder_ptr->
desc.type;
1203 _jointEncs[i].tolerance = jointEncoder_ptr->
tolerance;
1207 if(NULL == motorEncoder_ptr)
1209 _motorEncs[i].resolution = 1;
1210 _motorEncs[i].type = eomc_enc_none;
1211 _motorEncs[i].tolerance = 0;
1215 _motorEncs[i].resolution = motorEncoder_ptr->
resolution;
1216 _motorEncs[i].type = (eOmc_encoder_t)motorEncoder_ptr->
desc.type;
1217 _motorEncs[i].tolerance = motorEncoder_ptr->
tolerance;
1229bool embObjMotionControl::fromConfig(yarp::os::Searchable &config)
1232 _njoints = fromConfig_NumOfJoints(config);
1236 yError() <<
"embObjMC"<< getBoardInfo() <<
"fromConfig(): detected _njoints = " << _njoints;
1241 if(!alloc(_njoints))
1243 yError() <<
"embObjMC"<< getBoardInfo() <<
"fromConfig(): alloc() failed for _njoints = " << _njoints;
1251 int currentMCversion =0;
1257 yError() <<
"embObjMC" << getBoardInfo() <<
"------ ATTENTION!!!! Wrong value of <MotioncontrolVersion> parameter !!!! ---------------------------------------------------------------------------------------";
1258 yError() <<
"embObjMC" << getBoardInfo() <<
"------ This means that the configuration files of this device are not compatible with my parser, so I cannot start. ";
1259 yError() <<
"embObjMC" << getBoardInfo() <<
"------ I need version " <<
PARSER_MOTION_CONTROL_VERSION <<
", but in configuration files have version " << currentMCversion <<
".";
1260 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). ";
1261 yError() <<
"embObjMC" << getBoardInfo() <<
"------ If the problem persists contact icub-support@iit.it DO NOT DO IT BY YOURSELF.";
1262 yError() <<
"embObjMC" << getBoardInfo() <<
"----------------------------------------------------------------------------------------------------------------------------------------------------------------";
1268 yTrace() << config.toString().c_str();
1273 if(
false == fromConfig_readServiceCfg(config))
1289 if(
false == fromConfig_Step2(config))
1301bool embObjMotionControl::init()
1303 eOprotID32_t protid = 0;
1309 for(
int logico=0; logico< _njoints; logico++)
1311 int fisico = _axisMap[logico];
1312 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, fisico, eoprot_tag_mc_joint_cmmnds_controlmode);
1313 eOenum08_t controlMode = eomc_controlmode_cmd_idle;
1317 yError() <<
"embObjMotionControl::init() had an error while setting eomc_controlmode_cmd_idle in "<< getBoardInfo();
1323 SystemClock::delaySystem(0.010);
1330 vector<eOprotID32_t> id32v(0);
1331 for(
int n=0;
n<_njoints;
n++)
1333 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint,
n, eoprot_tag_mc_joint_status_core);
1334 id32v.push_back(protid);
1335 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint,
n, eoprot_tag_mc_joint_status_addinfo_multienc);
1336 id32v.push_back(protid);
1337 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor,
n, eoprot_tag_mc_motor_status);
1338 id32v.push_back(protid);
1341 if(eomn_serv_diagn_mode_MC_AMOyarp == mcdiagnostics.
config.mode)
1343 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, 0, eoprot_tag_mc_joint_status_debug);
1344 id32v.push_back(protid);
1345 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, 1, eoprot_tag_mc_joint_status_debug);
1346 id32v.push_back(protid);
1352 yError() <<
"embObjMotionControl::init() fails to add its variables to regulars in "<< getBoardInfo() <<
": cannot proceed any further";
1359 yDebug() <<
"embObjMotionControl::init() added" << id32v.size() <<
"regular rops to "<< getBoardInfo();
1361 for(
unsigned int r=0; r<id32v.size(); r++)
1363 uint32_t id32 = id32v.at(r);
1364 eoprot_ID2information(id32, nvinfo,
sizeof(nvinfo));
1365 yDebug() <<
"\t it added regular rop for" << nvinfo;
1370 SystemClock::delaySystem(0.005);
1377 for(
int logico=0; logico< _njoints; logico++)
1379 int fisico = _axisMap[logico];
1380 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, fisico, eoprot_tag_mc_joint_config);
1382 eOmc_joint_config_t jconfig = {0};
1383 memset(&jconfig, 0,
sizeof(eOmc_joint_config_t));
1385 tmp = _measureConverter->convert_pid_to_machine(yarp::dev::VOCAB_PIDTYPE_POSITION,_trj_pids[logico].pid, fisico);
1389 tmp = _measureConverter->convert_pid_to_machine(yarp::dev::VOCAB_PIDTYPE_TORQUE, _trq_pids[logico].pid, fisico);
1393 jconfig.impedance.damping = (eOmeas_damping_t) _measureConverter->impN2S(_impedance_params[logico].damping, fisico);
1394 jconfig.impedance.stiffness = (eOmeas_stiffness_t) _measureConverter->impN2S(_impedance_params[logico].stiffness, fisico);
1395 jconfig.impedance.offset = 0;
1397 _cacheImpedance[logico].stiffness = jconfig.impedance.stiffness;
1398 _cacheImpedance[logico].damping = jconfig.impedance.damping;
1399 _cacheImpedance[logico].offset = jconfig.impedance.offset;
1401 jconfig.userlimits.max = (eOmeas_position_t)
S_32(_measureConverter->posA2E(_jointsLimits[logico].posMax, fisico));
1402 jconfig.userlimits.min = (eOmeas_position_t)
S_32(_measureConverter->posA2E(_jointsLimits[logico].posMin, fisico));
1404 jconfig.hardwarelimits.max = (eOmeas_position_t)
S_32(_measureConverter->posA2E(_jointsLimits[logico].posHwMax, fisico));
1405 jconfig.hardwarelimits.min = (eOmeas_position_t)
S_32(_measureConverter->posA2E(_jointsLimits[logico].posHwMin, fisico));
1408 jconfig.maxvelocityofjoint =
S_32(_measureConverter->posA2E(_jointsLimits[logico].velMax, fisico));
1409 jconfig.velocitysetpointtimeout = (eOmeas_time_t)
U_16(_timeouts[logico].velocity);
1411 jconfig.jntEncoderResolution = _jointEncs[logico].resolution;
1412 jconfig.jntEncoderType = _jointEncs[logico].type;
1413 jconfig.jntEncTolerance = _jointEncs[logico].tolerance;
1415 jconfig.motor_params.bemf_value = _measureConverter->bemf_user2raw(_trq_pids[logico].kbemf, fisico);
1416 jconfig.motor_params.bemf_scale = 0;
1417 jconfig.motor_params.ktau_value = _measureConverter->ktau_user2raw(_trq_pids[logico].ktau, fisico);
1418 jconfig.motor_params.ktau_scale = 0;
1419 jconfig.motor_params.friction.viscous_pos_val = _measureConverter->viscousPos_user2raw(_trq_pids[logico].viscousPos, fisico);
1420 jconfig.motor_params.friction.viscous_neg_val = _measureConverter->viscousNeg_user2raw(_trq_pids[logico].viscousNeg, fisico);
1421 jconfig.motor_params.friction.coulomb_pos_val = _measureConverter->coulombPos_user2raw(_trq_pids[logico].coulombPos, fisico);
1422 jconfig.motor_params.friction.coulomb_neg_val = _measureConverter->coulombNeg_user2raw(_trq_pids[logico].coulombNeg, fisico);
1423 jconfig.motor_params.friction.velocityThres_val = _measureConverter->velocityThres_user2raw(_trq_pids[logico].velocityThres, fisico);
1425 jconfig.gearbox_E2J = _gearbox_E2J[logico];
1427 jconfig.deadzone = _measureConverter->posA2E(_deadzone[logico], fisico);
1429 jconfig.tcfiltertype=_trq_pids[logico].
filterType;
1431 jconfig.kalman_params.enabled = _kalman_params[logico].enabled;
1432 for(
int i=0; i<_kalman_params[logico].x0.size(); i++) jconfig.kalman_params.x0[i] = _kalman_params[logico].x0.at(i);
1433 for(
int i=0; i<_kalman_params[logico].Q.size(); i++) jconfig.kalman_params.Q[i] = _kalman_params[logico].Q.at(i);
1434 jconfig.kalman_params.R = _kalman_params[logico].R;
1435 jconfig.kalman_params.P0 = _kalman_params[logico].P0;
1439 yError() <<
"FATAL: embObjMotionControl::init() had an error while calling setcheckRemoteValue() for joint config fisico #" << fisico <<
"in "<< getBoardInfo();
1446 yDebug() <<
"embObjMotionControl::init() correctly configured joint config fisico #" << fisico <<
"in "<< getBoardInfo();
1457 for(
int logico=0; logico<_njoints; logico++)
1459 int fisico = _axisMap[logico];
1461 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, fisico, eoprot_tag_mc_motor_config);
1462 eOmc_motor_config_t motor_cfg = {0};
1463 motor_cfg.maxvelocityofmotor = 0;
1464 motor_cfg.currentLimits.nominalCurrent = _currentLimits[logico].nominalCurrent;
1465 motor_cfg.currentLimits.overloadCurrent = _currentLimits[logico].overloadCurrent;
1466 motor_cfg.currentLimits.peakCurrent = _currentLimits[logico].peakCurrent;
1467 motor_cfg.gearbox_M2J = _gearbox_M2J[logico];
1468 motor_cfg.rotorEncoderResolution = _motorEncs[logico].resolution;
1469 motor_cfg.rotEncTolerance = _motorEncs[logico].tolerance;
1470 motor_cfg.hasHallSensor = _foc_based_info[logico].
hasHallSensor;
1472 motor_cfg.hasTempSensor = _foc_based_info[logico].
hasTempSensor;
1475 motor_cfg.verbose = _foc_based_info[logico].
verbose;
1476 motor_cfg.motorPoles = _foc_based_info[logico].
motorPoles;
1478 motor_cfg.rotorEncoderType = _motorEncs[logico].type;
1479 motor_cfg.pwmLimit =_rotorsLimits[logico].pwmMax;
1480 motor_cfg.temperatureLimit = (eOmeas_temperature_t)
S_16(_temperatureSensorsVector.at(logico)->convertTempCelsiusToRaw(_temperatureLimits.at(logico).hardwareTemperatureLimit));
1481 motor_cfg.limitsofrotor.max = (eOmeas_position_t)
S_32(_measureConverter->posA2E(_rotorsLimits[logico].posMax, fisico ));
1482 motor_cfg.limitsofrotor.min = (eOmeas_position_t)
S_32(_measureConverter->posA2E(_rotorsLimits[logico].posMin, fisico ));
1484 motor_cfg.LuGre_params.Km = _lugre_params[logico].Km;
1485 motor_cfg.LuGre_params.Kw = _lugre_params[logico].Kw;
1486 motor_cfg.LuGre_params.S0 = _lugre_params[logico].S0;
1487 motor_cfg.LuGre_params.S1 = _lugre_params[logico].S1;
1488 motor_cfg.LuGre_params.Vth = _lugre_params[logico].Vth;
1489 motor_cfg.LuGre_params.Fc_pos = _lugre_params[logico].Fc_pos;
1490 motor_cfg.LuGre_params.Fc_neg = _lugre_params[logico].Fc_neg;
1491 motor_cfg.LuGre_params.Fs_pos = _lugre_params[logico].Fs_pos;
1492 motor_cfg.LuGre_params.Fs_neg = _lugre_params[logico].Fs_neg;
1495 tmp = _measureConverter->convert_pid_to_machine(yarp::dev::VOCAB_PIDTYPE_CURRENT, _cur_pids[logico].pid, fisico);
1498 tmp = _measureConverter->convert_pid_to_machine(yarp::dev::VOCAB_PIDTYPE_VELOCITY, _spd_pids[logico].pid, fisico);
1503 yError() <<
"FATAL: embObjMotionControl::init() had an error while calling setcheckRemoteValue() for motor config fisico #" << fisico <<
"in "<< getBoardInfo();
1510 yDebug() <<
"embObjMotionControl::init() correctly configured motor config fisico #" << fisico <<
"in "<< getBoardInfo();
1519 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_controller, 0, eoprot_tag_mc_controller_config);
1521 eOmc_controller_config_t controller_cfg = {0};
1522 memset(&controller_cfg, 0,
sizeof(eOmc_controller_config_t));
1523 controller_cfg.durationofctrlloop = (uint32_t)bdata.
settings.
txconfig.cycletime;
1528 yError() <<
"FATAL: embObjMotionControl::init() had an error while calling setcheckRemoteValue() for the controller " <<
"in "<< getBoardInfo();
1535 yDebug() <<
"embObjMotionControl::init() correctly configured controller config " <<
"in "<< getBoardInfo();
1542 const char* tag = eoprot_TAG2string(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_addinfo_multienc);
1544 _rawValuesMetadataMap.insert({{tag,
rawValuesKeyMetadata({}, _njoints * eOmc_joint_multienc_maxnum)}});
1545 for (
auto &[k, v] : _rawValuesMetadataMap)
1547 std::string auxstring =
"";
1549 for (
int i = 0; i < _njoints; i++)
1554 v.rawValueNames.insert(v.rawValueNames.end(),
1555 {auxstring+
"_primary_encoder_raw_value",
1556 auxstring+
"_secondary_encoder_raw_value",
1557 auxstring+
"_primary_encoder_diagnostic"}
1563 yTrace() <<
"embObjMotionControl::init(): correctly instantiated for " << getBoardInfo();
1571 yTrace() <<
" embObjMotionControl::close()";
1573 ImplementControlMode::uninitialize();
1574 ImplementEncodersTimed::uninitialize();
1575 ImplementMotorEncoders::uninitialize();
1576 ImplementPositionControl::uninitialize();
1577 ImplementVelocityControl::uninitialize();
1578 ImplementPidControl::uninitialize();
1579 ImplementControlCalibration::uninitialize();
1580 ImplementAmplifierControl::uninitialize();
1581 ImplementImpedanceControl::uninitialize();
1582 ImplementControlLimits::uninitialize();
1583 ImplementTorqueControl::uninitialize();
1584 ImplementPositionDirect::uninitialize();
1585 ImplementInteractionMode::uninitialize();
1586 ImplementRemoteVariables::uninitialize();
1587 ImplementAxisInfo::uninitialize();
1588 ImplementCurrentControl::uninitialize();
1589 ImplementPWMControl::uninitialize();
1590 ImplementJointFault::uninitialize();
1592 if (_measureConverter) {
delete _measureConverter; _measureConverter=0;}
1595 if(eomn_serv_diagn_mode_MC_AMOyarp == mcdiagnostics.
config.mode)
1598 for(
size_t i=0; i<mcdiagnostics.
ports.size(); i++)
1600 mcdiagnostics.
ports[i]->close();
1601 delete mcdiagnostics.
ports[i];
1603 mcdiagnostics.
ports.clear();
1605 mcdiagnostics.
config.mode = eomn_serv_diagn_mode_NONE;
1606 mcdiagnostics.
config.par16 = 0;
1609 delete event_downsampler;
1623void embObjMotionControl::cleanup(
void)
1625 if(ethManager == NULL)
return;
1644 size_t joint = eoprot_ID2index(id32);
1645 eOprotEntity_t ent = eoprot_ID2entity(id32);
1646 eOprotTag_t tag = eoprot_ID2tag(id32);
1660 std::lock_guard<std::mutex> lck(_mutex);
1661 _encodersStamp[joint] = timestamp;
1665 if(eomn_serv_diagn_mode_MC_AMOyarp == mcdiagnostics.
config.mode)
1667 char str[128] =
"boh";
1669 eoprot_ID2information(id32, str,
sizeof(str));
1671 if((eoprot_entity_mc_joint == ent) && (eoprot_tag_mc_joint_status_debug == tag) && (joint < mcdiagnostics.
ports.size()))
1674 eOprotID32_t id32sc = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, joint, eoprot_tag_mc_joint_status_core);
1675 eOmc_joint_status_core_t jcore = {};
1679 int32_t *debug32 =
reinterpret_cast<int32_t*
>(rxdata);
1682 Bottle& output = mcdiagnostics.
ports[joint]->prepare();
1685 output.addString(
"[yt, amo, reg, pos]");
1686 output.addFloat64(timestamp);
1687 output.addInt32(debug32[0]);
1688 output.addInt32(debug32[1]);
1689 output.addInt32(jcore.measures.meas_position);
1690 mcdiagnostics.
ports[joint]->write();
1694 if((eoprot_entity_mc_motor == ent) && (eoprot_tag_mc_motor_status == tag))
1699 uint8_t motor = eoprot_ID2index(id32);
1703 eOmc_motor_status_t *mc_motor_status =
reinterpret_cast<eOmc_motor_status_t*
>(rxdata);
1705 if((
double)mc_motor_status->basic.mot_temperature < 0 )
1707 if(! _temperatureSensorErrorWatchdog.at(motor).isStarted())
1709 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";
1710 _temperatureSensorErrorWatchdog.at(motor).start();
1714 _temperatureSensorErrorWatchdog.at(motor).increment();
1715 if( _temperatureSensorErrorWatchdog.at(motor).isExpired())
1717 yWarning()<< getBoardInfo() <<
"Motor" << motor <<
"failed to read" << _temperatureSensorErrorWatchdog.at(motor).getCount() <<
"temperature readings for" << yarp::os::Time::now() - _temperatureSensorErrorWatchdog.at(motor).getStartTime() <<
"seconds";
1718 _temperatureSensorErrorWatchdog.at(motor).start();
1725 double delta_tmp = 0;
1726 double tmp = _temperatureSensorsVector.at(motor)->convertRawToTempCelsius((
double)mc_motor_status->basic.mot_temperature);
1730 if(!_temperatureSpikesFilter.at(motor).isStarted())
1732 _temperatureSpikesFilter.at(motor).start(tmp);
1737 delta_tmp = std::abs(tmp - _temperatureSpikesFilter.at(motor).getPrevTemperature());
1740 if(delta_tmp > _temperatureSpikesFilter.at(motor).getTemperatureThreshold())
1746 _temperatureSpikesFilter.at(motor).updatePrevTemperature(tmp);
1749 if(tmp > _temperatureLimits[motor].warningTemperatureLimit)
1751 if(! _temperatureExceededLimitWatchdog.at(motor).isStarted())
1753 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";
1754 _temperatureExceededLimitWatchdog.at(motor).start();
1758 if(_temperatureExceededLimitWatchdog.at(motor).isExpired())
1760 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";
1761 _temperatureExceededLimitWatchdog.at(motor).start();
1763 _temperatureExceededLimitWatchdog.at(motor).increment();
1768 _temperatureExceededLimitWatchdog.at(motor).clear();
1792 encoderTypeName.clear();
1794 if ((jomoId >= 0) && (jomoId < _njoints))
1798 case eomc_pos_atjoint:
1799 encoderTypeName = eomc_encoder2string(_jointEncs[jomoId].
type, eobool_true);
1801 case eomc_pos_atmotor:
1802 encoderTypeName = eomc_encoder2string(_motorEncs[jomoId].
type, eobool_true);
1804 case eomc_pos_unknown:
1805 encoderTypeName =
"UNKNOWN";
1809 encoderTypeName =
"NONE";
1816 encoderTypeName =
"ERROR";
1826 case VOCAB_PIDTYPE_POSITION:
1827 helper_setPosPidRaw(j,pid);
1829 case VOCAB_PIDTYPE_VELOCITY:
1831 helper_setSpdPidRaw(j, pid);
1833 case VOCAB_PIDTYPE_TORQUE:
1834 helper_setTrqPidRaw(j, pid);
1836 case VOCAB_PIDTYPE_CURRENT:
1837 helper_setCurPidRaw(j,pid);
1840 yError()<<
"Invalid pidtype:"<<pidtype;
1850 case VOCAB_PIDTYPE_POSITION:
1851 helper_getPosPidRaw(axis,pid);
1853 case VOCAB_PIDTYPE_VELOCITY:
1855 helper_getSpdPidRaw(axis, pid);
1857 case VOCAB_PIDTYPE_TORQUE:
1858 helper_getTrqPidRaw(axis, pid);
1860 case VOCAB_PIDTYPE_CURRENT:
1861 helper_getCurPidRaw(axis,pid);
1864 yError()<<
"Invalid pidtype:"<<pidtype;
1870bool embObjMotionControl::helper_setPosPidRaw(
int j,
const Pid &pid)
1872 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_pidtrajectory);
1881 yError() <<
"while setting position PIDs for " << getBoardInfo() <<
" joint " << j;
1891 for(
int j=0; j< _njoints; j++)
1906 for(
int j=0, index=0; j< _njoints; j++, index++)
1928 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
1929 eOmc_joint_status_core_t jcore = {0};
1936 case VOCAB_PIDTYPE_POSITION:
1938 if((eomc_controlmode_torque == jcore.modes.controlmodestatus) ||
1939 (eomc_controlmode_openloop == jcore.modes.controlmodestatus) ||
1940 (eomc_controlmode_current == jcore.modes.controlmodestatus))
1943 *err = (double) jcore.ofpid.generic.error1;
1954 case VOCAB_PIDTYPE_TORQUE:
1956 if ((eOmc_interactionmode_compliant == jcore.modes.interactionmodestatus) &&
1957 (eomc_controlmode_position == jcore.modes.controlmodestatus))
1959 *err = (double) jcore.ofpid.complpos.errtrq;
1962 if(eomc_controlmode_torque == jcore.modes.controlmodestatus)
1964 *err = (double) jcore.ofpid.torque.errtrq;
1968 case VOCAB_PIDTYPE_VELOCITY:
1974 case VOCAB_PIDTYPE_CURRENT:
1982 yError()<<
"Invalid pidtype:"<<pidtype;
1992 for(
int j=0; j< _njoints; j++)
1999bool embObjMotionControl::helper_getPosPidRaw(
int j, Pid *pid)
2001 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_pidtrajectory);
2004 eOmc_PID_t eoPID = {0};
2007#ifdef NETWORK_PERFORMANCE_BENCHMARK
2008 double start = yarp::os::Time::now();
2011 bool ret = askRemoteValue(protid, &eoPID, size);
2013#ifdef NETWORK_PERFORMANCE_BENCHMARK
2014 double end = yarp::os::Time::now();
2015 m_responseTimingVerifier.tick(end-start, start);
2028bool embObjMotionControl::helper_getPosPidsRaw(Pid *pid)
2030 std::vector<eOmc_PID_t> eoPIDList(_njoints);
2031 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_config_pidtrajectory, eoPIDList);
2034 yError() <<
"failed helper_getPosPidsRaw for" << getBoardInfo();
2038 for(
int j=0; j<_njoints; j++)
2052 case VOCAB_PIDTYPE_POSITION:
2053 helper_getPosPidsRaw(pids);
2058 case VOCAB_PIDTYPE_TORQUE:
2059 helper_getTrqPidsRaw(pids);
2061 case VOCAB_PIDTYPE_CURRENT:
2062 helper_getCurPidsRaw(pids);
2064 case VOCAB_PIDTYPE_VELOCITY:
2065 helper_getSpdPidsRaw(pids);
2068 yError()<<
"Invalid pidtype:"<<pidtype;
2076 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
2077 eOmc_joint_status_core_t jcore = {0};
2084 case VOCAB_PIDTYPE_POSITION:
2086 if((eomc_controlmode_torque == jcore.modes.controlmodestatus) ||
2087 (eomc_controlmode_openloop == jcore.modes.controlmodestatus) ||
2088 (eomc_controlmode_current == jcore.modes.controlmodestatus))
2089 { *ref = 0; yError() <<
"Invalid getPidReferenceRaw() request for current control mode";
return true; }
2090 *ref = (double) jcore.ofpid.generic.reference1;
2099 case VOCAB_PIDTYPE_TORQUE:
2105 case VOCAB_PIDTYPE_CURRENT:
2111 case VOCAB_PIDTYPE_VELOCITY:
2120 yError()<<
"Invalid pidtype:"<<pidtype;
2133 for(
int j=0; j< _njoints; j++)
2178 if( (mode != VOCAB_CM_VELOCITY) &&
2179 (mode != VOCAB_CM_MIXED) &&
2180 (mode != VOCAB_CM_IMPEDANCE_VEL) &&
2181 (mode != VOCAB_CM_IDLE))
2185 yError() <<
"velocityMoveRaw: skipping command because " << getBoardInfo() <<
" joint " << j <<
" is not in VOCAB_CM_VELOCITY mode";
2190 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_setpoint);
2192 _ref_command_speeds[j] = sp ;
2194 eOmc_setpoint_t setpoint;
2195 setpoint.type = eomc_setpoint_velocity;
2196 setpoint.to.velocity.value = (eOmeas_velocity_t)
S_32(_ref_command_speeds[j]);
2197 setpoint.to.velocity.withacceleration = (eOmeas_acceleration_t)
S_32(_ref_accs[j]);
2202 yError() <<
"while setting velocity mode";
2211 eOmc_setpoint_t setpoint;
2213 setpoint.type = eomc_setpoint_velocity;
2215 for(
int j=0; j<_njoints; j++)
2230 yTrace() <<
"setCalibrationParametersRaw for " << getBoardInfo() <<
"joint" << j;
2232 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_calibration);
2233 eOmc_calibrator_t calib;
2234 memset(&calib, 0x00,
sizeof(calib));
2235 calib.type = params.type;
2240 case eomc_calibration_type0_hard_stops:
2241 calib.params.type0.pwmlimit = (int16_t)
S_16(params.param1);
2242 calib.params.type0.velocity = (eOmeas_velocity_t)
S_32(params.param2);
2243 calib.params.type0.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2247 case eomc_calibration_type1_abs_sens_analog:
2248 calib.params.type1.position = (int16_t)
S_16(params.param1);
2249 calib.params.type1.velocity = (eOmeas_velocity_t)
S_32(params.param2);
2250 calib.params.type1.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2254 case eomc_calibration_type2_hard_stops_diff:
2255 calib.params.type2.pwmlimit = (int16_t)
S_16(params.param1);
2256 calib.params.type2.velocity = (eOmeas_velocity_t)
S_32(params.param2);
2257 calib.params.type2.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2261 case eomc_calibration_type3_abs_sens_digital:
2262 calib.params.type3.position = (int16_t)
S_16(params.param1);
2263 calib.params.type3.velocity = (eOmeas_velocity_t)
S_32(params.param2);
2264 calib.params.type3.offset = (int32_t)
S_32(params.param3);
2265 calib.params.type3.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2269 case eomc_calibration_type4_abs_and_incremental:
2270 calib.params.type4.position = (int16_t)
S_16(params.param1);
2271 calib.params.type4.velocity = (eOmeas_velocity_t)
S_32(params.param2);
2272 calib.params.type4.maxencoder = (int32_t)
S_32(params.param3);
2273 calib.params.type4.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2277 case eomc_calibration_type5_hard_stops:
2278 calib.params.type5.pwmlimit = (int32_t)
S_32(params.param1);
2279 calib.params.type5.final_pos = (int32_t)
S_32(params.param2);
2280 calib.params.type5.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2284 case eomc_calibration_type6_mais:
2285 calib.params.type6.position = (int32_t)
S_32(params.param1);
2286 calib.params.type6.velocity = (int32_t)
S_32(params.param2);
2287 calib.params.type6.current = (int32_t)
S_32(params.param3);
2288 calib.params.type6.vmin = (int32_t)
S_32(params.param4);
2289 calib.params.type6.vmax = (int32_t)
S_32(params.param5);
2290 calib.params.type6.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2294 case eomc_calibration_type7_hall_sensor:
2295 calib.params.type7.position = (int32_t)
S_32(params.param1);
2296 calib.params.type7.velocity = (int32_t)
S_32(params.param2);
2298 calib.params.type7.vmin = (int32_t)
S_32(params.param4);
2299 calib.params.type7.vmax = (int32_t)
S_32(params.param5);
2300 calib.params.type7.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2304 case eomc_calibration_type8_tripod_internal_hard_stop:
2305 calib.params.type8.pwmlimit = (int32_t)
S_32(params.param1);
2306 calib.params.type8.max_delta = (int32_t)
S_32(params.param2);
2307 calib.params.type8.calibrationZero = (int32_t)
S_32(params.paramZero );
2310 case eomc_calibration_type9_tripod_external_hard_stop:
2311 calib.params.type9.pwmlimit = (int32_t)
S_32(params.param1);
2312 calib.params.type9.max_delta = (int32_t)
S_32(params.param2);
2313 calib.params.type9.calibrationZero = (int32_t)
S_32(params.paramZero );
2316 case eomc_calibration_type10_abs_hard_stop:
2317 calib.params.type10.pwmlimit = (int32_t)
S_32(params.param1);
2318 calib.params.type10.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2321 case eomc_calibration_type11_cer_hands:
2322 calib.params.type11.offset0 = (int32_t)
S_32(params.param1);
2323 calib.params.type11.offset1 = (int32_t)
S_32(params.param2);
2324 calib.params.type11.offset2 = (int32_t)
S_32(params.param3);
2325 calib.params.type11.cable_range = (int32_t)
S_32(params.param4);
2326 calib.params.type11.pwm = (int32_t)
S_32(params.param5);
2330 case eomc_calibration_type12_absolute_sensor:
2331 calib.params.type12.rawValueAtZeroPos = (int32_t)
S_32(params.param1);
2332 calib.params.type12.calibrationDelta = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2335 case eomc_calibration_type13_cer_hands_2:
2336 calib.params.type13.rawValueAtZeroPos0 = (int32_t)
S_32(params.param1);
2337 calib.params.type13.rawValueAtZeroPos1 = (int32_t)
S_32(params.param2);
2338 calib.params.type13.rawValueAtZeroPos2 = (int32_t)
S_32(params.param3);
2339 calib.params.type13.rawValueAtZeroPos3 = (int32_t)
S_32(params.param4);
2342 case eomc_calibration_type14_qenc_hard_stop_and_fap:
2343 calib.params.type14.pwmlimit = (int32_t)
S_32(params.param1);
2344 calib.params.type14.final_pos = (int32_t)
S_32(params.param2);
2345 calib.params.type14.invertdirection = (uint8_t)
U_32(params.param3);
2346 calib.params.type14.rotation = (int32_t)
S_32(params.param4);
2348 if (calib.params.type14.invertdirection != 0 && calib.params.type14.invertdirection != 1)
2350 yError() <<
"Error in param3 of calibartion type 14 for joint " << j <<
"Admitted values are: 0=FALSE and 1=TRUE";
2355 if(!checkCalib14RotationParam(calib.params.type14.rotation))
2357 yError() <<
"Error in param4 of calibartion type 14 for joint " << j <<
"Admitted values are: 0, 32768, 16384, -16384 [0, 180, 90, -90] in iCubDegree";
2360 calib.params.type14.offset = (int32_t)
S_32(params.param5);
2361 calib.params.type14.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2366 yError() <<
"Calibration type unknown!! (embObjMotionControl)\n";
2373 yError() <<
"while setting velocity mode";
2377 _calibrated[j] =
true;
2382bool embObjMotionControl::checkCalib14RotationParam(int32_t calib_param4)
2384 eOmc_calib14_ROT_t urotation = eomc_int2calib14_ROT(calib_param4);
2386 if (urotation == eOmc_calib14_ROT_zero ||
2387 urotation == eOmc_calib14_ROT_plus180 ||
2388 urotation == eOmc_calib14_ROT_plus090 ||
2389 urotation == eOmc_calib14_ROT_minus090)
2399 yTrace() <<
"calibrateRaw for" << getBoardInfo() <<
"joint" << j;
2417 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_calibration);
2418 eOmc_calibrator_t calib;
2419 memset(&calib, 0x00,
sizeof(calib));
2425 case eomc_calibration_type0_hard_stops:
2426 calib.params.type0.pwmlimit = (int16_t)
S_16(p1);
2427 calib.params.type0.velocity = (eOmeas_velocity_t)
S_32(p2);
2431 case eomc_calibration_type1_abs_sens_analog:
2432 calib.params.type1.position = (int16_t)
S_16(p1);
2433 calib.params.type1.velocity = (eOmeas_velocity_t)
S_32(p2);
2437 case eomc_calibration_type2_hard_stops_diff:
2438 calib.params.type2.pwmlimit = (int16_t)
S_16(p1);
2439 calib.params.type2.velocity = (eOmeas_velocity_t)
S_32(p2);
2443 case eomc_calibration_type3_abs_sens_digital:
2444 calib.params.type3.position = (int16_t)
S_16(p1);
2445 calib.params.type3.velocity = (eOmeas_velocity_t)
S_32(p2);
2446 calib.params.type3.offset = (int32_t)
S_32(p3);
2450 case eomc_calibration_type4_abs_and_incremental:
2451 calib.params.type4.position = (int16_t)
S_16(p1);
2452 calib.params.type4.velocity = (eOmeas_velocity_t)
S_32(p2);
2453 calib.params.type4.maxencoder = (int32_t)
S_32(p3);
2457 yError () <<
"Calibration type unknown!! (embObjMotionControl)\n";
2464 yError() <<
"while setting velocity mode";
2468 _calibrated[j ] =
true;
2476 bool result =
false;
2477 eOmc_joint_status_core_t jcore = {0};
2478 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, axis, eoprot_tag_mc_joint_status_core);
2481 yError () <<
"Failure of getLocalValue() inside embObjMotionControl::calibrationDoneRaw(axis=" << axis <<
") for " << getBoardInfo();
2485 eOmc_controlmode_t
type = (eOmc_controlmode_t) jcore.modes.controlmodestatus;
2489 if (eomc_controlmode_idle ==
type)
2493 else if (eomc_controlmode_calib ==
type)
2497 else if (eomc_controlmode_hwFault ==
type)
2499 yError(
"unable to complete calibration: joint %d in 'hw_fault status' inside calibrationDoneRaw() function", axis);
2502 else if (eomc_controlmode_notConfigured ==
type)
2504 yError(
"unable to complete calibration: joint %d in 'not_configured' status inside calibrationDoneRaw() function", axis);
2507 else if (eomc_controlmode_unknownError ==
type)
2509 yError(
"unable to complete calibration: joint %d in 'unknownError' status inside calibrationDoneRaw() function", axis);
2512 else if (eomc_controlmode_configured ==
type)
2514 yError(
"unable to complete calibration: joint %d in 'configured' status inside calibrationDoneRaw() function", axis);
2539 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.";
2541 _last_position_move_time[j] = yarp::os::Time::now();
2545 if( (mode != VOCAB_CM_POSITION) &&
2546 (mode != VOCAB_CM_MIXED) &&
2547 (mode != VOCAB_CM_IMPEDANCE_POS) &&
2548 (mode != VOCAB_CM_IDLE))
2552 yError() <<
"positionMoveRaw: skipping command because " << getBoardInfo() <<
" joint " << j <<
" is not in VOCAB_CM_POSITION mode";
2557 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_setpoint);
2558 _ref_command_positions[j] = ref;
2560 eOmc_setpoint_t setpoint;
2562 setpoint.type = (eOenum08_t) eomc_setpoint_position;
2563 setpoint.to.position.value = (eOmeas_position_t)
S_32(_ref_command_positions[j]);
2564 setpoint.to.position.withvelocity = (eOmeas_velocity_t)
S_32(_ref_speeds[j]);
2573 for(
int j=0, index=0; j< _njoints; j++, index++)
2593 eObool_t ismotiondone = eobool_false;
2596 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core_modes_ismotiondone);
2597 if(
false == askRemoteValue(id32, &ismotiondone, size))
2599 yError () <<
"Failure of askRemoteValue() inside embObjMotionControl::checkMotionDoneRaw(j=" << j <<
") for " << getBoardInfo();
2604 *flag = ismotiondone;
2611 std::vector <eObool_t> ismotiondoneList(_njoints);
2612 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_core_modes_ismotiondone, ismotiondoneList);
2615 yError () <<
"Failure of askRemoteValues() inside embObjMotionControl::checkMotionDoneRaw for all joints of" << getBoardInfo();
2619 for(
int j=0; j<_njoints; j++)
2621 *flag &= ismotiondoneList[j];
2631 _ref_speeds[index] = sp;
2639 for(
int j=0, index=0; j< _njoints; j++, index++)
2641 _ref_speeds[index] = spds[index];
2653 _ref_accs[j ] = 1e6;
2655 else if (
acc < -1e6)
2657 _ref_accs[j ] = -1e6;
2661 _ref_accs[j ] =
acc;
2671 for(
int j=0, index=0; j< _njoints; j++, index++)
2675 _ref_accs[index] = 1e6;
2677 else if (accs[j] < -1e6)
2679 _ref_accs[index] = -1e6;
2683 _ref_accs[index] = accs[j];
2691 if (j<0 || j>_njoints)
return false;
2692#if ASK_REFERENCE_TO_FIRMWARE
2693 *spd = _ref_speeds[j];
2696 *spd = _ref_speeds[j];
2703 memcpy(spds, _ref_speeds,
sizeof(
double) * _njoints);
2709 *
acc = _ref_accs[j];
2715 memcpy(accs, _ref_accs,
sizeof(
double) * _njoints);
2721 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_stoptrajectory);
2723 eObool_t stop = eobool_true;
2731 for(
int j=0; j< _njoints; j++)
2746 for(
int j=0; j<n_joint; j++)
2756 for(
int j=0; j<n_joint; j++)
2767 for(
int j=0; j<n_joint; j++)
2769 if(joints[j] >= _njoints)
2771 yError() << getBoardInfo() <<
":checkMotionDoneRaw required for not existing joint ( " << joints[j] <<
")";
2777 std::vector <eObool_t> ismotiondoneList(_njoints);
2778 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_core_modes_ismotiondone, ismotiondoneList);
2781 yError () << getBoardInfo() <<
"Failure of askRemoteValues() inside embObjMotionControl::checkMotionDoneRaw for a group of joint"; getBoardInfo();
2786 bool tot_val =
true;
2787 for(
int j=0; j<n_joint; j++)
2789 tot_val &= ismotiondoneList[joints[j]];
2800 for(
int j=0; j<n_joint; j++)
2810 for(
int j=0; j<n_joint; j++)
2820 for(
int j=0; j<n_joint; j++)
2830 for(
int j=0; j<n_joint; j++)
2840 for(
int j=0; j<n_joint; j++)
2842 ret = ret &&
stopRaw(joints[j]);
2853 eOmc_joint_status_core_t jcore = {0};
2854 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
2858 eOmc_controlmode_t
type = (eOmc_controlmode_t) jcore.modes.controlmodestatus;
2868 for(
int j=0; j< _njoints; j++)
2878 for(
int j=0; j< n_joint; j++)
2893 eOenum08_t controlmodecommand = 0;
2895 if((_mode == VOCAB_CM_TORQUE) && (_trq_pids[j].enabled ==
false))
2897 yError()<<
"Torque control is disabled. Check your configuration parameters";
2903 yError() <<
"SetControlMode: received unknown control mode for " << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(_mode);
2907 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_controlmode);
2910 yError() <<
"setControlModeRaw failed for " << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(_mode);
2915 ret = checkRemoteControlModeStatus(j, _mode);
2919 yError() <<
"In embObjMotionControl::setControlModeRaw(j=" << j <<
", mode=" << yarp::os::Vocab32::decode(_mode).c_str() <<
") for " << getBoardInfo() <<
" has failed checkRemoteControlModeStatus()";
2929 eOenum08_t controlmodecommand = 0;
2932 for(
int i=0; i<n_joint; i++)
2934 if ((modes[i] == VOCAB_CM_TORQUE) && (_trq_pids[i].enabled ==
false)) {yError()<<
"Torque control is disabled. Check your configuration parameters";
continue;}
2938 yError() <<
"SetControlModesRaw(): received unknown control mode for " << getBoardInfo() <<
" joint " << joints[i] <<
" mode " << Vocab32::decode(modes[i]);
2943 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, joints[i], eoprot_tag_mc_joint_cmmnds_controlmode);
2946 yError() <<
"setControlModesRaw() could not send set<cmmnds_controlmode> for " << getBoardInfo() <<
" joint " << joints[i] <<
" mode " << Vocab32::decode(modes[i]);
2951 bool tmpresult = checkRemoteControlModeStatus(joints[i], modes[i]);
2952 if(
false == tmpresult)
2954 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]);
2957 ret = ret && tmpresult;
2967 eOenum08_t controlmodecommand = 0;
2969 for(
int i=0; i<_njoints; i++)
2972 if ((modes[i] == VOCAB_CM_TORQUE) && (_trq_pids[i].enabled ==
false))
2974 yError()<<
"Torque control is disabled. Check your configuration parameters";
2980 yError() <<
"SetControlMode: received unknown control mode for" << getBoardInfo() <<
" joint " << i <<
" mode " << Vocab32::decode(modes[i]);
2984 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, i, eoprot_tag_mc_joint_cmmnds_controlmode);
2987 yError() <<
"setControlModesRaw failed for " << getBoardInfo() <<
" joint " << i <<
" mode " << Vocab32::decode(modes[i]);
2991 bool tmpresult = checkRemoteControlModeStatus(i, modes[i]);
2992 if(
false == tmpresult)
2994 yError() <<
"setControlModesRaw(int *modes) could not check with checkRemoteControlModeStatus() for" << getBoardInfo() <<
" joint " << i <<
" mode " << Vocab32::decode(modes[i]);
2997 ret = ret && tmpresult;
3030 eOmc_joint_status_core_t core;
3031 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
3037 *value = (double) core.measures.meas_position;
3041 yError() <<
"embObjMotionControl while reading encoder";
3051 for(
int j=0; j< _njoints; j++)
3061 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
3062 eOmc_joint_status_core_t core;
3069 *sp = (double) core.measures.meas_velocity;
3076 for(
int j=0; j< _njoints; j++)
3085 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
3086 eOmc_joint_status_core_t core;
3092 *
acc = (double) core.measures.meas_acceleration;
3099 for(
int j=0; j< _njoints; j++)
3111 std::lock_guard<std::mutex> lck(_mutex);
3112 for(
int i=0; i<_njoints; i++)
3113 stamps[i] = _encodersStamp[i];
3120 std::lock_guard<std::mutex> lck(_mutex);
3121 *stamp = _encodersStamp[j];
3165 eOmc_motor_status_basic_t status;
3166 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_status_basic);
3171 *value = (double) status.mot_position;
3175 yError() <<
"embObjMotionControl while reading motor encoder position";
3185 for(
int j=0; j< _njoints; j++)
3195 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_status_basic);
3196 eOmc_motor_status_basic_t tmpMotorStatus;
3200 *sp = (double) tmpMotorStatus.mot_velocity;
3204 yError() <<
"embObjMotionControl while reading motor encoder speed";
3213 for(
int j=0; j< _njoints; j++)
3222 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_status_basic);
3223 eOmc_motor_status_basic_t tmpMotorStatus;
3227 *
acc = (double) tmpMotorStatus.mot_acceleration;
3231 yError() <<
"embObjMotionControl while reading motor encoder acceleration";
3240 for(
int j=0; j< _njoints; j++)
3250 std::lock_guard<std::mutex> lck(_mutex);
3251 for(
int i=0; i<_njoints; i++)
3252 stamps[i] = _encodersStamp[i];
3259 std::lock_guard<std::mutex> lck(_mutex);
3260 *stamp = _encodersStamp[m];
3279 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_status_basic);
3280 eOmc_motor_status_basic_t tmpMotorStatus;
3283 *value = (double) tmpMotorStatus.mot_current;
3290 for(
int j=0; j< _njoints; j++)
3299 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config_currentlimits);
3301 eOmc_current_limits_params_t currentlimits = {0};
3303 if(!askRemoteValue(protid, ¤tlimits, size))
3305 yError() <<
"embObjMotionControl::setMaxCurrentRaw() could not read max current for " << getBoardInfo() <<
"joint " << j;
3310 currentlimits.overloadCurrent = (eOmeas_current_t)
S_16(val);
3318 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config_currentlimits);
3320 eOmc_current_limits_params_t currentlimits = {0};
3323 if(!askRemoteValue(protid, ¤tlimits, size))
3325 yError() <<
"embObjMotionControl::getMaxCurrentRaw() could not read max current for " << getBoardInfo() <<
"joint " << j;
3329 *val = (double) currentlimits.overloadCurrent;
3337 (_enabledAmp[j ]) ? *st = 1 : *st = 0;
3344 for(
int j=0; j<_njoints; j++)
3346 sts[j] = _enabledAmp[j];
3352#ifdef IMPLEMENT_DEBUG_INTERFACE
3357bool embObjMotionControl::setParameterRaw(
int j,
unsigned int type,
double value) {
return NOT_YET_IMPLEMENTED(
"setParameterRaw"); }
3358bool embObjMotionControl::getParameterRaw(
int j,
unsigned int type,
double* value) {
return NOT_YET_IMPLEMENTED(
"getParameterRaw"); }
3359bool embObjMotionControl::getDebugParameterRaw(
int j,
unsigned int index,
double* value) {
return NOT_YET_IMPLEMENTED(
"getDebugParameterRaw"); }
3360bool embObjMotionControl::setDebugParameterRaw(
int j,
unsigned int index,
double value) {
return NOT_YET_IMPLEMENTED(
"setDebugParameterRaw"); }
3361bool embObjMotionControl::setDebugReferencePositionRaw(
int j,
double value) {
return NOT_YET_IMPLEMENTED(
"setDebugReferencePositionRaw"); }
3362bool embObjMotionControl::getDebugReferencePositionRaw(
int j,
double* value) {
return NOT_YET_IMPLEMENTED(
"getDebugReferencePositionRaw");}
3370 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_userlimits);
3372 eOmeas_position_limits_t limits;
3373 limits.max = (eOmeas_position_t)
S_32(max);
3374 limits.min = (eOmeas_position_t)
S_32(min);
3381 yError() <<
"while setting position limits for joint" << j <<
" \n";
3388 eOmeas_position_limits_t limits;
3389 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_userlimits);
3392 if(! askRemoteValue(protoid, &limits, size))
3395 *min = (double)limits.min + SAFETY_THRESHOLD;
3396 *max = (double)limits.max - SAFETY_THRESHOLD;
3402 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3404 eOmc_motor_config_t motor_cfg;
3405 if(! askRemoteValue(protoid, &motor_cfg, size))
3409 *gearbox = (double)motor_cfg.gearbox_M2J;
3416 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3418 eOmc_motor_config_t motor_cfg;
3419 if(! askRemoteValue(protoid, &motor_cfg, size))
3421 *rotorMax = (double)( motor_cfg.limitsofrotor.max);
3422 *rotorMin = (double)( motor_cfg.limitsofrotor.min);
3428 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config);
3430 eOmc_joint_config_t joint_cfg;
3431 if(! askRemoteValue(protoid, &joint_cfg, size))
3435 type = (int)joint_cfg.tcfiltertype;
3441 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3443 eOmc_motor_config_t motor_cfg;
3444 if(! askRemoteValue(protoid, &motor_cfg, size))
3448 rotres = (double)motor_cfg.rotorEncoderResolution;
3455 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config);
3457 eOmc_joint_config_t joint_cfg;
3458 if(! askRemoteValue(protoid, &joint_cfg, size))
3462 jntres = (double)joint_cfg.jntEncoderResolution;
3469 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config);
3471 eOmc_joint_config_t joint_cfg;
3472 if(! askRemoteValue(protoid, &joint_cfg, size))
3476 type = (int)joint_cfg.jntEncoderType;
3483 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3485 eOmc_motor_config_t motor_cfg;
3486 if(! askRemoteValue(protoid, &motor_cfg, size))
3490 type = (int)motor_cfg.rotorEncoderType;
3497 yError(
"getKinematicMJRaw not yet implemented");
3523 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3525 eOmc_motor_config_t motor_cfg;
3526 if(! askRemoteValue(protoid, &motor_cfg, size))
3530 ret = (int)motor_cfg.hasTempSensor;
3537 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3539 eOmc_motor_config_t motor_cfg;
3540 if(! askRemoteValue(protoid, &motor_cfg, size))
3544 ret = (int)motor_cfg.hasHallSensor;
3551 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3553 eOmc_motor_config_t motor_cfg;
3554 if(! askRemoteValue(protoid, &motor_cfg, size))
3558 ret = (int)motor_cfg.hasRotorEncoder;
3565 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3567 eOmc_motor_config_t motor_cfg;
3568 if(! askRemoteValue(protoid, &motor_cfg, size))
3572 ret = (int)motor_cfg.hasRotorEncoderIndex;
3579 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 poles = (int)motor_cfg.motorPoles;
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 rotorOffset = (double)motor_cfg.rotorIndexOffset;
3608 if (axis >= 0 && axis < _njoints)
3610 name = _axesInfo[axis].name;
3622 if (axis >= 0 && axis < _njoints)
3624 type = _axesInfo[axis].type;
3633bool embObjMotionControl::getJointDeadZoneRaw(
int j,
double &jntDeadZone)
3635 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config);
3637 eOmc_joint_config_t joint_cfg;
3638 if(! askRemoteValue(protoid, &joint_cfg, size))
3642 jntDeadZone = _measureConverter->posE2A((
double)joint_cfg.deadzone, _axisMap[j]);
3651 if (key ==
"kinematic_mj")
3654 Bottle& ret = val.addList();
3656 eOmn_serv_type_t mc_serv_type = (eOmn_serv_type_t)serviceConfig.
ethservice.configuration.type;
3657 if(iNeedCouplingsInfo())
3659 for (
int r=0; r<_njoints; r++)
3661 for (
int c = 0; c < _njoints; c++)
3665 ret.addFloat64(_couplingInfo.
matrixJ2M[4 * r + c]);
3671 ret.addFloat64(0.0);
3675 else if (key ==
"encoders")
3677 Bottle& r = val.addList();
for (
int i = 0; i < _njoints; i++) { r.addFloat64(_measureConverter->posA2E(1.0, i)); }
3680 else if (key ==
"rotorEncoderResolution")
3682 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getRotorEncoderResolutionRaw(i, tmp); r.addFloat64(tmp); }
3685 else if (key ==
"jointEncoderResolution")
3687 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getJointEncoderResolutionRaw(i, tmp); r.addFloat64(tmp); }
3690 else if (key ==
"gearbox_M2J")
3692 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp=0;
getGearboxRatioRaw(i, &tmp); r.addFloat64(tmp); }
3695 else if (key ==
"gearbox_E2J")
3697 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp=0; getGerabox_E2J(i, &tmp); r.addFloat64(tmp); }
3700 else if (key ==
"hasHallSensor")
3702 Bottle& r = val.addList();
for (
int i = 0; i < _njoints; i++) {
int tmp = 0;
getHasHallSensorRaw(i, tmp); r.addInt32(tmp); }
3705 else if (key ==
"hasTempSensor")
3707 Bottle& r = val.addList();
for (
int i = 0; i < _njoints; i++) {
int tmp = 0;
getHasTempSensorsRaw(i, tmp); r.addInt32(tmp); }
3710 else if (key ==
"TemperatureSensorType")
3712 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) { std::string tmp =
"";
getTemperatureSensorTypeRaw(i, tmp); r.addString(tmp); }
3715 else if (key ==
"hasRotorEncoder")
3717 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
int tmp = 0;
getHasRotorEncoderRaw(i, tmp); r.addInt32(tmp); }
3720 else if (key ==
"hasRotorEncoderIndex")
3722 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
int tmp = 0;
getHasRotorEncoderIndexRaw(i, tmp); r.addInt32(tmp); }
3725 else if (key ==
"rotorIndexOffset")
3727 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getRotorIndexOffsetRaw(i, tmp); r.addFloat64(tmp); }
3730 else if (key ==
"motorPoles")
3732 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
int tmp = 0;
getMotorPolesRaw(i, tmp); r.addInt32(tmp); }
3735 else if (key ==
"pidCurrentKp")
3737 Bottle& r = val.addList();
for (
int i = 0; i < _njoints; i++) { Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_CURRENT, i, &
p); r.addFloat64(
p.kp); }
3740 else if (key ==
"pidCurrentKi")
3742 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) { Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_CURRENT, i, &
p); r.addFloat64(
p.ki); }
3745 else if (key ==
"pidCurrentShift")
3747 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) { Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_CURRENT, i, &
p); r.addFloat64(
p.scale); }
3750 else if (key ==
"pidCurrentOutput")
3752 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); }
3755 else if (key ==
"jointEncoderType")
3757 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++)
3763 yError(
"Invalid jointEncoderType");
3769 else if (key ==
"rotorEncoderType")
3771 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++)
3777 yError(
"Invalid motorEncoderType");
3783 else if (key ==
"coulombThreshold")
3785 val.addString(
"not implemented yet");
3788 else if (key ==
"torqueControlFilterType")
3793 else if (key ==
"torqueControlEnabled")
3796 Bottle& r = val.addList();
3797 for(
int i = 0; i<_njoints; i++)
3799 r.addInt32((
int)_trq_pids[i].enabled );
3803 else if (key ==
"PWMLimit")
3805 Bottle& r = val.addList();
for (
int i = 0; i< _njoints; i++) {
double tmp = 0;
getPWMLimitRaw(i, &tmp); r.addFloat64(tmp); }
3808 else if (key ==
"motOverloadCurr")
3810 Bottle& r = val.addList();
for (
int i = 0; i< _njoints; i++) {
double tmp = 0;
getMaxCurrentRaw(i, &tmp); r.addFloat64(tmp); }
3813 else if (key ==
"motNominalCurr")
3815 Bottle& r = val.addList();
for (
int i = 0; i< _njoints; i++) {
double tmp = 0;
getNominalCurrentRaw(i, &tmp); r.addFloat64(tmp); }
3818 else if (key ==
"motPeakCurr")
3820 Bottle& r = val.addList();
for (
int i = 0; i< _njoints; i++) {
double tmp = 0;
getPeakCurrentRaw(i, &tmp); r.addFloat64(tmp); }
3823 else if (key ==
"PowerSuppVoltage")
3825 Bottle& r = val.addList();
for (
int i = 0; i< _njoints; i++) {
double tmp = 0;
getPowerSupplyVoltageRaw(i, &tmp); r.addFloat64(tmp); }
3828 else if (key ==
"rotorMax")
3831 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getRotorLimitsRaw(i, &tmp1, &tmp2); r.addFloat64(tmp2); }
3834 else if (key ==
"rotorMin")
3837 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getRotorLimitsRaw(i, &tmp1, &tmp2); r.addFloat64(tmp1); }
3840 else if (key ==
"jointMax")
3843 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getLimitsRaw(i, &tmp1, &tmp2); r.addFloat64(tmp2); }
3846 else if (key ==
"jointMin")
3849 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getLimitsRaw(i, &tmp1, &tmp2); r.addFloat64(tmp1); }
3852 else if (key ==
"jointEncTolerance")
3855 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0; getJointEncTolerance(i, &tmp1); r.addFloat64(tmp1); }
3858 else if (key ==
"motorEncTolerance")
3861 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0; getMotorEncTolerance(i, &tmp1); r.addFloat64(tmp1); }
3864 else if (key ==
"jointDeadZone")
3867 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0; getJointDeadZoneRaw(i, tmp1); r.addFloat64(tmp1); }
3870 else if (key ==
"readonly_position_PIDraw")
3872 Bottle& r = val.addList();
3873 for (
int i = 0; i < _njoints; i++)
3875 getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_POSITION, i, &
p);
3877 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);
3882 else if (key ==
"readonly_velocity_PIDraw")
3884 Bottle& r = val.addList();
3885 for (
int i = 0; i < _njoints; i++)
3886 { Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_VELOCITY, i, &
p);
3888 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);
3893 else if (key ==
"readonly_torque_PIDraw")
3895 Bottle& r = val.addList();
3896 for (
int i = 0; i < _njoints; i++)
3897 { Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_TORQUE, i, &
p);
3899 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);
3904 else if (key ==
"readonly_current_PIDraw")
3906 Bottle& r = val.addList();
3907 for (
int i = 0; i < _njoints; i++)
3908 { Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_CURRENT, i, &
p);
3910 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);
3915 else if (key ==
"readonly_llspeed_PIDraw")
3917 Bottle& r = val.addList();
3918 for (
int i = 0; i < _njoints; i++)
3920 Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_VELOCITY, i, &
p);
3922 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);
3927 else if (key ==
"readonly_motor_torque_params_raw")
3929 Bottle& r = val.addList();
3930 for (
int i = 0; i < _njoints; i++)
3932 MotorTorqueParameters params;
3935 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);
3940 yWarning(
"getRemoteVariable(): Unknown variable %s", key.c_str());
3946 string s1 = val.toString();
3947 if (val.size() != _njoints)
3949 yWarning(
"setRemoteVariable(): Protocol error %s", s1.c_str());
3953 if (key ==
"kinematic_mj")
3955 yWarning(
"setRemoteVariable(): Impossible to set kinematic_mj parameter at runtime.");
3968 else if (key ==
"PWMLimit")
3970 for (
int i = 0; i < _njoints; i++)
setPWMLimitRaw(i, val.get(i).asFloat64());
3975 else if (key ==
"jointMax")
3978 for (
int i = 0; i < _njoints; i++)
3985 else if (key ==
"jointMin")
3988 for (
int i = 0; i < _njoints; i++)
3995 yWarning(
"setRemoteVariable(): Unknown variable %s", key.c_str());
4001 listOfKeys->clear();
4002 listOfKeys->addString(
"kinematic_mj");
4003 listOfKeys->addString(
"encoders");
4004 listOfKeys->addString(
"gearbox_M2J");
4005 listOfKeys->addString(
"gearbox_E2J");
4006 listOfKeys->addString(
"hasHallSensor");
4007 listOfKeys->addString(
"hasTempSensor");
4008 listOfKeys->addString(
"TemperatureSensorType");
4009 listOfKeys->addString(
"hasRotorEncoder");
4010 listOfKeys->addString(
"hasRotorEncoderIndex");
4011 listOfKeys->addString(
"rotorIndexOffset");
4012 listOfKeys->addString(
"rotorEncoderResolution");
4013 listOfKeys->addString(
"jointEncoderResolution");
4014 listOfKeys->addString(
"motorPoles");
4015 listOfKeys->addString(
"pidCurrentKp");
4016 listOfKeys->addString(
"pidCurrentKi");
4017 listOfKeys->addString(
"pidCurrentShift");
4018 listOfKeys->addString(
"pidCurrentOutput");
4019 listOfKeys->addString(
"coulombThreshold");
4020 listOfKeys->addString(
"torqueControlFilterType");
4021 listOfKeys->addString(
"jointEncoderType");
4022 listOfKeys->addString(
"rotorEncoderType");
4023 listOfKeys->addString(
"PWMLimit");
4024 listOfKeys->addString(
"motOverloadCurr");
4025 listOfKeys->addString(
"motNominalCurr");
4026 listOfKeys->addString(
"motPeakCurr");
4027 listOfKeys->addString(
"PowerSuppVoltage");
4028 listOfKeys->addString(
"rotorMax");
4029 listOfKeys->addString(
"rotorMin");
4030 listOfKeys->addString(
"jointMax");
4031 listOfKeys->addString(
"jointMin");
4032 listOfKeys->addString(
"jointEncTolerance");
4033 listOfKeys->addString(
"motorEncTolerance");
4034 listOfKeys->addString(
"jointDeadZone");
4035 listOfKeys->addString(
"readonly_position_PIDraw");
4036 listOfKeys->addString(
"readonly_velocity_PIDraw");
4037 listOfKeys->addString(
"readonly_current_PIDraw");
4038 listOfKeys->addString(
"readonly_torque_PIDraw");
4039 listOfKeys->addString(
"readonly_motor_torque_params_raw");
4051 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, axis, eoprot_tag_mc_joint_config);
4053 eOmc_joint_config_t joint_cfg;
4054 if(! askRemoteValue(protoid, &joint_cfg, size))
4057 *max = joint_cfg.maxvelocityofjoint;
4073 return VAS_status::VAS_OK;
4085 for(
int j=0; j< _njoints; j++)
4094 int j = _axisMap[userLevel_jointNumber];
4096 eOmeas_torque_t meas_torque = 0;
4097 static double curr_time = Time::now();
4098 static int count_saturation=0;
4100 meas_torque = (eOmeas_torque_t)
S_32(_measureConverter->trqN2S(fTorque, j));
4102 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_inputs_externallymeasuredtorque);
4117 eOmc_joint_status_core_t jstatus;
4118 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
4120 *t = (double) _measureConverter->trqS2N(jstatus.measures.meas_torque, j);
4127 for(
int j=0; j<_njoints; j++)
4145 for(
int j=0; j<_njoints && ret; j++)
4152 eOmc_setpoint_t setpoint;
4153 setpoint.type = (eOenum08_t) eomc_setpoint_torque;
4154 setpoint.to.torque.value = (eOmeas_torque_t)
S_32(t);
4156 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_setpoint);
4163 for(
int j=0; j< n_joint; j++)
4173 for(
int j=0; j<_njoints && ret; j++)
4180 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
4181 eOmc_joint_status_core_t jcore = {0};
4187 yError() <<
"embObjMotionControl::getRefTorqueRaw() could not read pid torque reference pos for " << getBoardInfo() <<
"joint " << j;
4191 if ((eOmc_interactionmode_compliant == jcore.modes.interactionmodestatus) &&
4192 (eomc_controlmode_position == jcore.modes.controlmodestatus))
4194 *t = (double) jcore.ofpid.complpos.reftrq;
4197 if(eomc_controlmode_torque == jcore.modes.controlmodestatus)
4199 *t = (double) jcore.ofpid.torque.reftrq;
4205bool embObjMotionControl::helper_setTrqPidRaw(
int j,
const Pid &pid)
4213 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_pidtorque);
4217bool embObjMotionControl::helper_getTrqPidRaw(
int j, Pid *pid)
4219 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_pidtorque);
4223 if(! askRemoteValue(protoid, &eoPID, size))
4232bool embObjMotionControl::helper_getTrqPidsRaw(Pid *pid)
4234 std::vector<eOmc_PID_t> eoPIDList (_njoints);
4235 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_config_pidtorque, eoPIDList);
4238 for(
int j=0; j< _njoints; j++)
4250 eOmc_impedance_t val;
4255 *stiffness = (double) (val.stiffness);
4256 *damping = (double) (val.damping);
4264 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_impedance);
4266 if(! askRemoteValue(protoid, &imped, size))
4270 _cacheImpedance->damping = imped.damping;
4271 _cacheImpedance->stiffness = imped.stiffness;
4272 _cacheImpedance->offset = imped.offset;
4279 eOmc_impedance_t val;
4287 _cacheImpedance[j].stiffness = (eOmeas_stiffness_t) stiffness;
4288 _cacheImpedance[j].damping = (eOmeas_damping_t) damping;
4290 val.stiffness = _cacheImpedance[j].stiffness;
4291 val.damping = _cacheImpedance[j].damping;
4292 val.offset = _cacheImpedance[j].offset;
4294 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_impedance);
4304 eOmc_impedance_t val;
4310 _cacheImpedance[j].offset = (eOmeas_torque_t)
S_32(
offset);
4311 val.stiffness = _cacheImpedance[j].stiffness;
4312 val.damping = _cacheImpedance[j].damping;
4313 val.offset = _cacheImpedance[j].offset;
4315 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_impedance);
4325 eOmc_impedance_t val;
4336 *min_stiff = _impedance_limits[j].
min_stiff;
4337 *max_stiff = _impedance_limits[j].
max_stiff;
4338 *min_damp = _impedance_limits[j].
min_damp;
4339 *max_damp = _impedance_limits[j].
max_damp;
4345 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_motor_params);
4348 eOmc_motor_params_t eo_params = {0};
4349 if(! askRemoteValue(protoid, &eo_params, size))
4352 params->bemf = eo_params.bemf_value;
4353 params->bemf_scale = eo_params.bemf_scale;
4354 params->ktau = eo_params.ktau_value;
4355 params->ktau_scale = eo_params.ktau_scale;
4356 params->viscousPos = eo_params.friction.viscous_pos_val;
4357 params->viscousNeg = eo_params.friction.viscous_neg_val ;
4358 params->coulombPos = eo_params.friction.coulomb_pos_val;
4359 params->coulombNeg = eo_params.friction.coulomb_neg_val;
4360 params->velocityThres = eo_params.friction.velocityThres_val;
4369 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_motor_params);
4370 eOmc_motor_params_t eo_params = {0};
4374 eo_params.bemf_value = (float) params.bemf;
4375 eo_params.bemf_scale = (uint8_t) params.bemf_scale;
4376 eo_params.ktau_value = (float) params.ktau;
4377 eo_params.ktau_scale = (uint8_t) params.ktau_scale;
4378 eo_params.friction.viscous_pos_val =
static_cast<float32_t
>(params.viscousPos);
4379 eo_params.friction.viscous_neg_val =
static_cast<float32_t
>(params.viscousNeg);
4380 eo_params.friction.coulomb_pos_val =
static_cast<float32_t
>(params.coulombPos);
4381 eo_params.friction.coulomb_neg_val =
static_cast<float32_t
>(params.coulombNeg);
4382 eo_params.friction.velocityThres_val =
static_cast<float32_t
>(params.velocityThres);
4387 yError() <<
"embObjMotionControl::setMotorTorqueParamsRaw() could not send set message for" << getBoardInfo() <<
"joint " << j;
4399 for(
int j=0; j< n_joint; j++)
4433bool embObjMotionControl::helper_getVelPidRaw(
int j, Pid *pid)
4435 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_piddirect);
4438 if(! askRemoteValue(protoid, &eoPID, size))
4448bool embObjMotionControl::helper_getVelPidsRaw(Pid *pid)
4450 std::vector <eOmc_PID_t> eoPIDList (_njoints);
4451 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_config_piddirect, eoPIDList);
4455 for(
int j=0; j<_njoints; j++)
4470 if (mode != VOCAB_CM_POSITION_DIRECT &&
4471 mode != VOCAB_CM_IDLE)
4475 yError() <<
"setReferenceRaw: skipping command because" << getBoardInfo() <<
" joint " << j <<
" is not in VOCAB_CM_POSITION_DIRECT mode";
4480 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_setpoint);
4481 eOmc_setpoint_t setpoint = {0};
4483 _ref_positions[j] = ref;
4484 setpoint.type = (eOenum08_t) eomc_setpoint_positionraw;
4485 setpoint.to.position.value = (eOmeas_position_t)
S_32(ref);
4486 setpoint.to.position.withvelocity = 0;
4494 for(
int i=0; i<n_joint; i++)
4504 for (
int i = 0; i<_njoints; i++)
4514 if (axis<0 || axis>_njoints)
return false;
4515#if ASK_REFERENCE_TO_FIRMWARE
4516 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, axis, eoprot_tag_mc_joint_status_target);
4521 eOmc_joint_status_target_t target = {0};
4522 if(!askRemoteValue(id32, &target, size))
4524 yError() <<
"embObjMotionControl::getTargetPositionRaw() could not read reference pos for " << getBoardInfo() <<
"joint " << axis;
4528 *ref = (double) target.trgt_position;
4532 *ref = _ref_command_positions[axis];
4540 for (
int i = 0; i<_njoints; i++)
4550 for (
int i = 0; i<nj; i++)
4559 if (axis<0 || axis>_njoints)
return false;
4560#if ASK_REFERENCE_TO_FIRMWARE
4561 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, axis, eoprot_tag_mc_joint_status_target);
4566 eOmc_joint_status_target_t target = {0};
4567 if(!askRemoteValue(id32, &target, size))
4569 yError() <<
"embObjMotionControl::getRefVelocityRaw() could not read reference vel for " << getBoardInfo() <<
"joint " << axis;
4572 *ref = (double) target.trgt_velocity;
4575 *ref = _ref_command_speeds[axis];
4582 #if ASK_REFERENCE_TO_FIRMWARE
4583 std::vector <eOmc_joint_status_target_t> targetList(_njoints);
4584 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_target, targetList);
4587 yError() <<
"embObjMotionControl::getRefVelocitiesRaw() could not read reference vel for " << getBoardInfo() ;
4591 for(
int j=0; j<_njoints; j++)
4593 refs[j] = (double) targetList[j].trgt_velocity;
4597 for(
int j=0; j<_njoints; j++)
4599 refs[j] = _ref_command_speeds[j];
4607 std::vector <double> refsList(_njoints);
4611 for (
int i = 0; i<nj; i++)
4613 if(
jnts[i]>= _njoints)
4615 yError() << getBoardInfo() <<
"getRefVelocitiesRaw: joint " <<
jnts[i] <<
"doesn't exist";
4618 refs[i] = refsList[
jnts[i]];
4625 if (axis<0 || axis>_njoints)
return false;
4626#if ASK_REFERENCE_TO_FIRMWARE
4627 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, axis, eoprot_tag_mc_joint_status_target);
4631 eOmc_joint_status_target_t target = {0};
4632 if(!askRemoteValue(id32, &target, size))
4634 yError() <<
"embObjMotionControl::getRefPositionRaw() could not read reference pos for " << getBoardInfo() <<
"joint " << axis;
4638 *ref = (double) target.trgt_positionraw;
4641 *ref = _ref_positions[axis];
4648 #if ASK_REFERENCE_TO_FIRMWARE
4649 std::vector <eOmc_joint_status_target_t> targetList(_njoints);
4650 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_target, targetList);
4653 yError() <<
"embObjMotionControl::getRefPositionRaw() could not read reference pos for " << getBoardInfo();
4657 for(
int j=0; j< _njoints; j++)
4658 refs[j] = (
double) targetList[j].trgt_positionraw;
4661 for(
int j=0; j< _njoints; j++)
4662 refs[j] = _ref_positions[j];
4670 for (
int i = 0; i<nj; i++)
4683 eOenum08_t interactionmodestatus;
4686 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core_modes_interactionmodestatus);
4690 int tmp = (int) *_mode;
4694 *_mode = (yarp::dev::InteractionModeEnum) tmp;
4713 for(
int j=0; j<_njoints; j++)
4723 eOenum08_t interactionmodecommand = 0;
4728 if (_mode == VOCAB_IM_COMPLIANT && _trq_pids[j].enabled ==
false) {yError()<<
"Torque control is disabled. Check your configuration parameters";
return false;}
4732 yError() <<
"setInteractionModeRaw: received unknown mode for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(_mode);
4735 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_interactionmode);
4737 if(
false == res->
setRemoteValue(protid, &interactionmodecommand) )
4739 yError() <<
"setInteractionModeRaw failed for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(_mode);
4745 eOenum08_t interactionmodestatus = 0;
4747 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_interactionmodestatus);
4748 bool ret = askRemoteValue(id32, &interactionmodestatus, size);
4750 if((
false == ret) || (interactionmodecommand != interactionmodestatus))
4752 yError() <<
"check of embObjMotionControl::setInteractionModeRaw() failed for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(_mode);
4765 eOenum08_t interactionmodecommand = 0;
4767 for(
int j=0; j<n_joints; j++)
4769 if (modes[j] == VOCAB_IM_COMPLIANT && _trq_pids[j].enabled ==
false) {yError()<<
"Torque control is disabled. Check your configuration parameters";
continue;}
4773 yError() <<
"embObjMotionControl::setInteractionModesRaw(): received unknown interactionMode for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(modes[j]) <<
" " << modes[j];
4777 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_interactionmode);
4778 if(
false == res->
setRemoteValue(protid, &interactionmodecommand) )
4780 yError() <<
"embObjMotionControl::setInteractionModesRaw() failed for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(modes[j]);
4786 eOenum08_t interactionmodestatus = 0;
4788 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_interactionmodestatus);
4789 bool ret = askRemoteValue(id32, &interactionmodestatus, size);
4791 if((
false == ret) || (interactionmodecommand != interactionmodestatus))
4795 yError() <<
"check of embObjMotionControl::setInteractionModesRaw() failed for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(modes[j]);
4801 yError() <<
"setInteractionModeRaw failed for" << getBoardInfo() <<
" joint " << j <<
" because of interactionMode mismatching \n\tSet " \
4802 << Vocab32::decode(modes[j]) <<
" Got " << Vocab32::decode(tmp);
4804 yError() <<
"setInteractionModeRaw failed for" << getBoardInfo() <<
" joint " << j <<
" because of interactionMode mismatching \n\tSet " \
4805 << Vocab32::decode(modes[j]) <<
" Got an unknown value!";
4818 eOenum08_t interactionmodecommand = 0;
4820 for(
int j=0; j<_njoints; j++)
4822 if ((modes[j] == VOCAB_IM_COMPLIANT) && (_trq_pids[j].enabled ==
false))
4824 yError()<<
"Torque control is disabled. Check your configuration parameters";
4830 yError() <<
"setInteractionModeRaw: received unknown interactionMode for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(modes[j]);
4834 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_interactionmode);
4835 if(
false == res->
setRemoteValue(protid, &interactionmodecommand) )
4837 yError() <<
"setInteractionModeRaw failed for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(modes[j]);
4843 eOenum08_t interactionmodestatus = 0;
4845 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_interactionmodestatus);
4846 bool ret = askRemoteValue(id32, &interactionmodestatus, size);
4848 if((
false == ret) || (interactionmodecommand != interactionmodestatus))
4852 yError() <<
"check of embObjMotionControl::setInteractionModesRaw() failed for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(modes[j]);
4858 yError() <<
"setInteractionModeRaw failed for" << getBoardInfo() <<
" joint " << j <<
" because of interactionMode mismatching \n\tSet " \
4859 << Vocab32::decode(modes[j]) <<
" Got " << Vocab32::decode(tmp);
4861 yError() <<
"setInteractionModeRaw failed for" << getBoardInfo() <<
" joint " << j <<
" because of interactionMode mismatching \n\tSet " \
4862 << Vocab32::decode(modes[j]) <<
" Got an unknown value!";
4875 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
4876 eOmc_joint_status_core_t jcore = {0};
4883 case VOCAB_PIDTYPE_POSITION:
4884 if((eomc_controlmode_torque == jcore.modes.controlmodestatus) || (eomc_controlmode_current == jcore.modes.controlmodestatus))
4887 *
out = (double) jcore.ofpid.generic.output;
4892 case VOCAB_PIDTYPE_TORQUE:
4893 if ((eomc_controlmode_torque == jcore.modes.controlmodestatus) ||
4894 ((eomc_controlmode_position == jcore.modes.controlmodestatus) && (eOmc_interactionmode_compliant == jcore.modes.interactionmodestatus)))
4895 *
out = jcore.ofpid.generic.output;
4899 case VOCAB_PIDTYPE_CURRENT:
4902 case VOCAB_PIDTYPE_VELOCITY:
4906 yError()<<
"Invalid pidtype:"<<pidtype;
4915 for(
int j=0; j< _njoints; j++)
4935 eOmc_motor_status_basic_t status;
4936 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_status_basic);
4946 yError() << getBoardInfo() <<
"At timestamp" << yarp::os::Time::now() <<
"In motor" << m <<
"embObjMotionControl::getTemperatureRaw failed to complete getLocalValue()";
4950 *val = _temperatureSensorsVector.at(m)->convertRawToTempCelsius((
double)status.mot_temperature);
4959 for(
int j=0; j< _njoints; j++)
4968 *temp= _temperatureLimits[m].warningTemperatureLimit;
4975 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_config_temperaturelimit);
4976 eOmeas_temperature_t temperatureLimit = (eOmeas_pwm_t)
S_16(temp);
4983 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_config_currentlimits);
4985 eOmc_current_limits_params_t currentlimits = {0};
4987 if(!askRemoteValue(protid, ¤tlimits, size))
4989 yError() <<
"embObjMotionControl::getPeakCurrentRaw() can't read current limits for" << getBoardInfo() <<
" motor " << m;
4993 *val = (double) currentlimits.peakCurrent ;
4999 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_config_currentlimits);
5002 eOmc_current_limits_params_t currentlimits = {0};
5003 if(!askRemoteValue(protid, ¤tlimits, size))
5005 yError() <<
"embObjMotionControl::setPeakCurrentRaw can't read current limits for" << getBoardInfo() <<
" motor " << m ;
5010 currentlimits.peakCurrent = (eOmeas_current_t)
S_16(val);
5016 yError() <<
"embObjMotionControl::setPeakCurrentRaw failed sending new value for" << getBoardInfo() <<
" motor " << m ;
5023 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_config_currentlimits);
5025 eOmc_current_limits_params_t currentlimits = {0};
5027 if(!askRemoteValue(protid, ¤tlimits, size))
5029 yError() <<
"embObjMotionControl::getNominalCurrentRaw() can't read current limits for" << getBoardInfo() <<
" motor " << m;
5033 *val = (double) currentlimits.nominalCurrent ;
5039 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_config_currentlimits);
5043 eOmc_current_limits_params_t currentlimits = {0};
5044 if(!askRemoteValue(protid, ¤tlimits, size))
5046 yError() <<
"embObjMotionControl::setNominalCurrentRaw can't read current limits for" << getBoardInfo() <<
" motor " << m ;
5051 currentlimits.nominalCurrent = (eOmeas_current_t)
S_16(val);
5057 yError() <<
"embObjMotionControl::setNominalCurrentRaw failed sending new value for" << getBoardInfo() <<
" motor " << m ;
5065 eOmc_motor_status_basic_t status;
5066 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_status_basic);
5071 *val = (double) status.mot_pwm;
5075 yError() <<
"embObjMotionControl::getPWMRaw failed for" << getBoardInfo() <<
" motor " << j ;
5084 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config_pwmlimit);
5086 eOmeas_pwm_t motorPwmLimit;
5088 bool ret = askRemoteValue(protid, &motorPwmLimit, size);
5091 *val = (double) motorPwmLimit;
5095 yError() <<
"embObjMotionControl::getPWMLimitRaw failed for" << getBoardInfo() <<
" motor " << j ;
5106 yError() <<
"embObjMotionControl::setPWMLimitRaw failed because pwmLimit is negative for" << getBoardInfo() <<
" motor " << j ;
5109 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config_pwmlimit);
5110 eOmeas_pwm_t motorPwmLimit = (eOmeas_pwm_t)
S_16(val);
5116 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_controller, 0, eoprot_tag_mc_controller_status);
5118 eOmc_controller_status_t controllerStatus;
5120 bool ret = askRemoteValue(protid, &controllerStatus, size);
5123 *val = (double) controllerStatus.supplyVoltage;
5127 yError() <<
"embObjMotionControl::getPowerSupplyVoltageRaw failed for" << getBoardInfo() <<
" motor " << j ;
5134bool embObjMotionControl::askRemoteValue(eOprotID32_t id32,
void* value, uint16_t& size)
5141bool embObjMotionControl::askRemoteValues(eOprotEndpoint_t ep, eOprotEntity_t entity, eOprotTag_t tag, std::vector<T>& values)
5143 std::vector<eOprotID32_t> idList;
5144 std::vector<void*> valueList;
5147 for(
int j=0; j<_njoints; j++)
5149 eOprotID32_t protoId = eoprot_ID_get(ep, entity, j, tag);
5150 idList.push_back(protoId);
5151 valueList.push_back((
void*)&values[j]);
5157 yError() <<
"embObjMotionControl::askRemoteValues failed for all joints of" << getBoardInfo();
5166bool embObjMotionControl::checkRemoteControlModeStatus(
int joint,
int target_mode)
5169 eOenum08_t temp = 0;
5172 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, joint, eoprot_tag_mc_joint_status_core_modes_controlmodestatus);
5173 const double timeout = 0.250;
5174 const int maxretries = 25;
5175 const double delaybetweenqueries = 0.010;
5179 double timeofstart = yarp::os::Time::now();
5182 for( attempt = 0; attempt < maxretries; attempt++)
5184 ret = askRemoteValue(id32, &temp, size);
5187 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());
5191 if(current_mode == target_mode)
5196 if((current_mode == VOCAB_CM_IDLE) && (target_mode == VOCAB_CM_FORCE_IDLE))
5201 if(current_mode == VOCAB_CM_HW_FAULT)
5203 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()); }
5208 if((yarp::os::Time::now()-timeofstart) > timeout)
5211 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());
5216 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());
5218 SystemClock::delaySystem(delaybetweenqueries);
5223 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);
5231bool embObjMotionControl::iNeedCouplingsInfo(
void)
5233 eOmn_serv_type_t mc_serv_type = (eOmn_serv_type_t)serviceConfig.
ethservice.configuration.type;
5234 if( (mc_serv_type == eomn_serv_MC_foc) ||
5235 (mc_serv_type == eomn_serv_MC_mc4plus) ||
5236 (mc_serv_type == eomn_serv_MC_mc4plusmais) ||
5237 (mc_serv_type == eomn_serv_MC_mc2pluspsc) ||
5238 (mc_serv_type == eomn_serv_MC_mc4plusfaps) ||
5239 (mc_serv_type == eomn_serv_MC_advfoc)
5249 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_setpoint);
5251 eOmc_setpoint_t setpoint;
5253 setpoint.type = (eOenum08_t)eomc_setpoint_openloop;
5254 setpoint.to.openloop.value = (eOmeas_pwm_t)
S_16(v);
5262 for (
int j = 0; j<_njoints; j++)
5271 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_target);
5274 eOmc_joint_status_target_t target = { 0 };
5277 if (!askRemoteValue(protoId, &target, size))
5279 yError() <<
"embObjMotionControl::getRefDutyCycleRaw() could not read openloop reference for " << getBoardInfo() <<
"joint " << j;
5283 *v = (double)target.trgt_pwm;
5290 std::vector <eOmc_joint_status_target_t> targetList(_njoints);
5291 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_target, targetList);
5294 yError() <<
"embObjMotionControl::getDutyCyclesRaw failed for all joints of" << getBoardInfo();
5297 for (
int j = 0; j<_njoints; j++)
5299 v[j]= targetList[j].trgt_pwm;
5306 eOmc_motor_status_basic_t status;
5307 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_status_basic);
5312 *v = (double)status.mot_pwm;
5316 yError() <<
"embObjMotionControl::getDutyCycleRaw failed for" << getBoardInfo() <<
" motor " << j;
5326 for (
int j = 0; j< _njoints; j++)
5348 for (
int j = 0; j< _njoints; j++)
5358 for (
int j = 0; j<_njoints; j++)
5367 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_setpoint);
5369 eOmc_setpoint_t setpoint;
5371 setpoint.type = (eOenum08_t)eomc_setpoint_current;
5372 setpoint.to.current.value = (eOmeas_pwm_t)
S_16(t);
5380 for (
int j = 0; j<n_joint; j++)
5389 std::vector <eOmc_joint_status_target_t> targetList(_njoints);
5390 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_target, targetList);
5393 yError() <<
"embObjMotionControl::getDutyCyclesRaw failed for all joints of" << getBoardInfo();
5396 for (
int j = 0; j<_njoints; j++)
5398 t[j] = targetList[j].trgt_current;
5405 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_target);
5408 eOmc_joint_status_target_t target = { 0 };
5411 if (!askRemoteValue(protoId, &target, size))
5413 yError() <<
"embObjMotionControl::getRefDutyCycleRaw() could not read openloop reference for " << getBoardInfo() <<
"joint " << j;
5417 *t = (double)target.trgt_current;
5422bool embObjMotionControl::helper_setCurPidRaw(
int j,
const Pid &pid)
5424 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config_pidcurrent);
5428 if (!_cur_pids[j].enabled)
5430 yError() <<
"eoMc " << getBoardInfo() <<
": it is not possible set current pid for motor " << j <<
", because current pid is not enabled in xml files";
5438 yError() <<
"while setting velocity PIDs for" << getBoardInfo() <<
" joint " << j;
5447bool embObjMotionControl::helper_setSpdPidRaw(
int j,
const Pid &pid)
5449 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config_pidspeed);
5453 if (!_cur_pids[j].enabled)
5455 yError() <<
"eoMc " << getBoardInfo() <<
": it is not possible set speed pid for motor " << j <<
", because speed pid is not enabled in xml files";
5463 yError() <<
"while setting velocity PIDs for" << getBoardInfo() <<
" joint " << j;
5472bool embObjMotionControl::helper_getCurPidRaw(
int j, Pid *pid)
5474 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
5476 eOmc_motor_config_t motor_cfg;
5477 if(! askRemoteValue(protoid, &motor_cfg, size))
5481 eOmc_PID_t
tmp = (eOmc_PID_t)motor_cfg.pidcurrent;
5487bool embObjMotionControl::helper_getSpdPidRaw(
int j, Pid *pid)
5489 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
5491 eOmc_motor_config_t motor_cfg;
5492 if (!askRemoteValue(protoid, &motor_cfg, size))
5496 eOmc_PID_t
tmp = (eOmc_PID_t)motor_cfg.pidspeed;
5502bool embObjMotionControl::helper_getCurPidsRaw(Pid *pid)
5504 std::vector <eOmc_motor_config_t> motor_cfg_list(_njoints);
5505 bool ret = askRemoteValues<eOmc_motor_config_t>(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, eoprot_tag_mc_motor_config, motor_cfg_list);
5509 for(
int j=0; j<_njoints; j++)
5511 eOmc_PID_t
tmp = (eOmc_PID_t)motor_cfg_list[j].pidcurrent;
5517bool embObjMotionControl::helper_getSpdPidsRaw(Pid *pid)
5519 std::vector <eOmc_motor_config_t> motor_cfg_list(_njoints);
5520 bool ret = askRemoteValues<eOmc_motor_config_t>(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, eoprot_tag_mc_motor_config, motor_cfg_list);
5524 for (
int j = 0; j<_njoints; j++)
5526 eOmc_PID_t
tmp = (eOmc_PID_t)motor_cfg_list[j].pidspeed;
5532bool embObjMotionControl::getJointConfiguration(
int joint, eOmc_joint_config_t *jntCfg_ptr)
5534 uint32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, joint, eoprot_tag_mc_joint_config);
5536 if(!askRemoteValue(protoid, jntCfg_ptr, size))
5544bool embObjMotionControl::getMotorConfiguration(
int axis, eOmc_motor_config_t *motCfg_ptr)
5546 uint32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, axis, eoprot_tag_mc_motor_config);
5548 if(!askRemoteValue(protoid, motCfg_ptr, size))
5557bool embObjMotionControl::getGerabox_E2J(
int joint,
double *gearbox_E2J_ptr)
5559 eOmc_joint_config_t jntCfg;
5561 if(!getJointConfiguration(joint, &jntCfg))
5566 *gearbox_E2J_ptr = jntCfg.gearbox_E2J;
5570bool embObjMotionControl::getJointEncTolerance(
int joint,
double *jEncTolerance_ptr)
5572 eOmc_joint_config_t jntCfg;
5574 if(!getJointConfiguration(joint, &jntCfg))
5579 *jEncTolerance_ptr = jntCfg.jntEncTolerance;
5583bool embObjMotionControl::getMotorEncTolerance(
int axis,
double *mEncTolerance_ptr)
5585 eOmc_motor_config_t motorCfg;
5586 if(!getMotorConfiguration(axis, &motorCfg))
5591 *mEncTolerance_ptr = motorCfg.rotEncTolerance;
5597 eOmc_motor_status_t status;
5599 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol,
5600 eoprot_entity_mc_motor, j,
5601 eoprot_tag_mc_motor_status);
5610 message =
"Could not retrieve the fault state.";
5614 if (status.mc_fault_state == EOERROR_CODE_DUMMY)
5616 fault = EOERROR_CODE_DUMMY;
5617 message =
"No fault detected.";
5622 fault = eoerror_code2value(status.mc_fault_state);
5623 message = eoerror_code2string(status.mc_fault_state);
5628bool embObjMotionControl::getRawData_core(std::string key, std::vector<std::int32_t> &
data)
5633 for(
int j=0; j< _njoints; j++)
5635 eOmc_joint_status_additionalInfo_t addinfo;
5636 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_addinfo_multienc);
5641 for (
int k = 0; k < std::size(addinfo.multienc); k++)
5643 data.push_back((int32_t)addinfo.multienc[k]);
5652 for (
auto it = _rawValuesMetadataMap.begin(); it != _rawValuesMetadataMap.end(); it++)
5654 if(!getRawData_core(it->first, _rawDataAuxVector))
5656 yError() << getBoardInfo() <<
"getRawData failed. Cannot retrieve all raw data from local memory";
5659 map.insert({it->first, _rawDataAuxVector});
5667 if(_rawValuesMetadataMap.find(key) != _rawValuesMetadataMap.end())
5669 getRawData_core(key,
data);
5673 yError() << getBoardInfo() <<
"Request key:" << key <<
"is not available. Cannot retrieve get raw data.";
5682 for (
const auto &
p : _rawValuesMetadataMap)
5684 keys.push_back(
p.first);
5692 return _rawValuesMetadataMap.size();
5697 if (_rawValuesMetadataMap.empty())
5699 yError() << getBoardInfo() <<
"embObjMotionControl Map is empty. Closing...";
5708 if(_rawValuesMetadataMap.find(key) != _rawValuesMetadataMap.end())
5710 meta = _rawValuesMetadataMap[key];
5714 yError() << getBoardInfo() <<
"Requested key" << key <<
"is not available in the map. Closing...";
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 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 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 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 parseTimeoutsGroup(yarp::os::Searchable &config, std::vector< timeouts_t > &timeouts, int defaultVelocityTimeout)
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