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 _axesInfo.resize(nj);
129 _jointEncs.resize(nj);
130 _motorEncs.resize(nj);
131 _kalman_params.resize(nj);
132 _temperatureSensorsVector.resize(nj);
133 _temperatureExceededLimitWatchdog.resize(nj);
134 _temperatureSensorErrorWatchdog.resize(nj);
135 _temperatureSpikesFilter.resize(nj);
139 for(
int i = 0; i < nj; ++i)
141 _temperatureExceededLimitWatchdog.at(i).setThreshold(txrate);
142 _temperatureSensorErrorWatchdog.at(i).setThreshold(txrate);
148bool embObjMotionControl::dealloc()
150 checkAndDestroy(_axisMap);
151 checkAndDestroy(_encodersStamp);
152 checkAndDestroy(_gearbox_M2J);
153 checkAndDestroy(_gearbox_E2J);
154 checkAndDestroy(_deadzone);
155 checkAndDestroy(_impedance_limits);
156 checkAndDestroy(checking_motiondone);
157 checkAndDestroy(_ref_command_positions);
158 checkAndDestroy(_ref_positions);
159 checkAndDestroy(_ref_command_speeds);
160 checkAndDestroy(_ref_speeds);
161 checkAndDestroy(_ref_accs);
163 checkAndDestroy(_enabledAmp);
164 checkAndDestroy(_enabledPid);
165 checkAndDestroy(_calibrated);
166 checkAndDestroy(_foc_based_info);
188 ImplementControlCalibration(this),
189 ImplementAmplifierControl(this),
190 ImplementPidControl(this),
191 ImplementEncodersTimed(this),
192 ImplementPositionControl(this),
193 ImplementVelocityControl(this),
194 ImplementControlMode(this),
195 ImplementImpedanceControl(this),
196 ImplementMotorEncoders(this),
197#ifdef IMPLEMENT_DEBUG_INTERFACE
200 ImplementTorqueControl(this),
201 ImplementControlLimits(this),
202 ImplementPositionDirect(this),
203 ImplementInteractionMode(this),
204 ImplementMotor(this),
205 ImplementRemoteVariables(this),
206 ImplementAxisInfo(this),
207 ImplementPWMControl(this),
208 ImplementCurrentControl(this),
209 ImplementJointFault(this),
210 SAFETY_THRESHOLD(2.0),
214 _temperatureLimits(0),
218 _impedance_params(0),
223 _temperatureSensorsVector(0),
224 _temperatureExceededLimitWatchdog(0),
225 _temperatureSensorErrorWatchdog(0),
226 _temperatureSpikesFilter(0),
227 _rawDataAuxVector(0),
228 _rawValuesMetadataMap({})
242 _encodersStamp = NULL;
243 _foc_based_info = NULL;
244 _cacheImpedance = NULL;
245 _impedance_limits = NULL;
247 _ref_command_speeds = NULL;
248 _ref_command_positions= NULL;
249 _ref_positions = NULL;
251 _measureConverter = NULL;
253 checking_motiondone = NULL;
264 _last_position_move_time = NULL;
266 behFlags.useRawEncoderData =
false;
267 behFlags.pwmIsLimited =
false;
269 std::string tmp = yarp::conf::environment::get_string(
"ETH_VERBOSEWHENOK");
272 behFlags.verbosewhenok = (bool)yarp::conf::numeric::from_string(tmp, 0U);
276 behFlags.verbosewhenok =
false;
281#ifdef NETWORK_PERFORMANCE_BENCHMARK
285 m_responseTimingVerifier.init(0.003, 0.00025, 0.001, 0.01, 0.0005, 30);
293 yTrace() <<
"embObjMotionControl::~embObjMotionControl()";
301 if(NULL != _mcparser)
319 ImplementControlCalibration::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL);
320 ImplementAmplifierControl::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL,
f.ampsToSensor);
321 ImplementEncodersTimed::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL);
322 ImplementMotorEncoders::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL);
323 ImplementPositionControl::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL);
324 ImplementPidControl::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL,
f.newtonsToSensor,
f.ampsToSensor,
f.dutycycleToPWM);
325 ImplementControlMode::initialize(_njoints, _axisMap);
326 ImplementVelocityControl::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL);
327 ImplementControlLimits::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL);
328 ImplementImpedanceControl::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL,
f.newtonsToSensor);
329 ImplementTorqueControl::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL,
f.newtonsToSensor,
f.ampsToSensor,
f.dutycycleToPWM,
f.bemf2raw,
f.ktau2raw);
330 ImplementPositionDirect::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL);
331 ImplementInteractionMode::initialize(_njoints, _axisMap,
f.angleToEncoder, NULL);
332 ImplementMotor::initialize(_njoints, _axisMap);
333 ImplementRemoteVariables::initialize(_njoints, _axisMap);
334 ImplementAxisInfo::initialize(_njoints, _axisMap);
335 ImplementCurrentControl::initialize(_njoints, _axisMap,
f.ampsToSensor);
336 ImplementPWMControl::initialize(_njoints, _axisMap,
f.dutycycleToPWM);
337 ImplementJointFault::initialize(_njoints, _axisMap);
348 if(NULL == ethManager)
350 yFatal() <<
"embObjMotionControl::open() fails to instantiate ethManager";
354 eOipv4addr_t ipv4addr;
355 string boardIPstring;
357 if(
false == ethManager->
verifyEthBoardInfo(config, ipv4addr, boardIPstring, boardName))
359 yError() <<
"embObjMotionControl::open(): object TheEthManager fails in parsing ETH propertiex from xml file";
378 yError() <<
"embObjMotionControl::open() fails because could not instantiate the ethResource for " << getBoardInfo() <<
" ... unable to continue";
382 if(!fromConfig(config))
384 yError() << getBoardInfo() <<
"Missing motion control parameters in config file";
390 yError() <<
"embObjMotionControl: failed verifyEPprotocol. Cannot continue!";
396 const eOmn_serv_parameter_t* servparam = &serviceConfig.
ethservice;
397 if(eomn_serv_MC_generic == serviceConfig.
ethservice.configuration.type)
403 mcdiagnostics.
config.mode = serviceConfig.
ethservice.configuration.diagnosticsmode;
404 mcdiagnostics.
config.par16 = serviceConfig.
ethservice.configuration.diagnosticsparam;
405 if(eomn_serv_diagn_mode_MC_AMOyarp == mcdiagnostics.
config.mode)
408 mcdiagnostics.
ports.resize(2);
409 for(
size_t i=0; i<mcdiagnostics.
ports.size(); i++)
411 mcdiagnostics.
ports[i] =
new BufferedPort<Bottle>;
422 event_downsampler->
config.
info = getBoardInfo();
423 event_downsampler->
start();
427 yError() <<
"embObjMotionControl::open() has an error in call of ethResources::serviceVerifyActivate() for" << getBoardInfo();
432 yDebug() <<
"embObjMotionControl:serviceVerifyActivate OK!";
437 yError() <<
"embObjMotionControl::open() has an error in call of embObjMotionControl::init() for" << getBoardInfo();
444 yDebug() <<
"embObjMotionControl::init() has succesfully initted" << getBoardInfo();
451 yError() <<
"embObjMotionControl::open() fails to start mc service for" << getBoardInfo() <<
": cannot continue";
459 yDebug() <<
"embObjMotionControl::open() correctly starts mc service of" << getBoardInfo();
467 if(eomn_serv_diagn_mode_MC_AMOyarp == mcdiagnostics.
config.mode)
498 SystemClock::delaySystem(0.001*mcdiagnostics.
config.par16);
505int embObjMotionControl::fromConfig_NumOfJoints(yarp::os::Searchable &config)
510 int jn = config.findGroup(
"GENERAL").check(
"Joints", Value(1),
"Number of degrees of freedom").asInt32();
517void embObjMotionControl::debugUtil_printJointsetInfo(
void)
520 yError() <<
"****** DEBUG PRINTS **********";
521 yError() <<
"joint to set:";
522 for(
int x=0;
x< _njoints;
x++)
523 yError() <<
" /t j " <<
x <<
": set " <<_joint2set[
x];
524 yError() <<
"jointmap:";
526 yError() <<
" number of sets" << _jsets.size();
527 for(
size_t x=0;
x< _jsets.size();
x++)
529 yError() <<
"set " <<
x<<
"has size " <<_jsets[
x].getNumberofJoints();
530 for(
int y=0;
y<_jsets[
x].getNumberofJoints();
y++)
531 yError() <<
"set " <<
x <<
": " << _jsets[
x].joints[
y];
533 yError() <<
"********* END ****************";
540bool embObjMotionControl::verifyUserControlLawConsistencyInJointSet(
eomc::PidInfo *pidInfo)
543 for(
size_t s=0; s<_jsets.size(); s++)
545 int numofjoints = _jsets[s].getNumberofJoints();
549 yError() <<
"embObjMC" << getBoardInfo() <<
"Jointsset " << s <<
"hasn't joints!!! I should be never stay here!!!";
552 int firstjoint = _jsets[s].joints[0];
554 for(
int k=1; k<numofjoints; k++)
556 int otherjoint = _jsets[s].joints[k];
558 if(pidInfo[firstjoint].usernamePidSelected != pidInfo[otherjoint].usernamePidSelected)
560 yError() <<
"embObjMC "<< getBoardInfo() <<
"Joints beloning to same set must be have same control law. Joint " << otherjoint <<
" differs from " << firstjoint <<
"Set num " << s ;
573bool embObjMotionControl::verifyUserControlLawConsistencyInJointSet(
eomc::TrqPidInfo *pidInfo)
575 for(
size_t s=0; s<_jsets.size(); s++)
577 int numofjoints = _jsets[s].getNumberofJoints();
581 yError() <<
"embObjMC "<< getBoardInfo() <<
"Jointsset " << s <<
"hasn't joints!!! I should be never stay here!!!";
584 int firstjoint = _jsets[s].joints[0];
586 for(
int k=1; k<numofjoints; k++)
588 int otherjoint = _jsets[s].joints[k];
590 if(pidInfo[firstjoint].usernamePidSelected != pidInfo[otherjoint].usernamePidSelected)
592 yError() <<
"embObjMC"<< getBoardInfo() <<
"Joints beloning to same set must be have same control law. Joint " << otherjoint <<
" differs from " << firstjoint <<
"Set num " << s ;
602bool embObjMotionControl::updatedJointsetsCfgWithControlInfo()
606 for(
size_t s=0; s<_jsets.size(); s++)
608 if(_jsets[s].getNumberofJoints() == 0)
610 yError() <<
"embObjMC"<< getBoardInfo() <<
"Jointsset " << s <<
"hasn't joints!!! I should be never stay here!!!";
614 int joint = _jsets[s].joints[0];
624 _jsets[s].cfg.pid_output_types.postrj_ctrl_out_type = _trj_pids[joint].
out_type;
625 _jsets[s].cfg.pid_output_types.veltrj_ctrl_out_type = _trj_pids[joint].
out_type;
626 _jsets[s].cfg.pid_output_types.mixtrj_ctrl_out_type = _trj_pids[joint].
out_type;
630 _jsets[s].cfg.pid_output_types.posdir_ctrl_out_type = _trj_pids[joint].
out_type;
631 _jsets[s].cfg.pid_output_types.veldir_ctrl_out_type = _trj_pids[joint].
out_type;
633 _jsets[s].cfg.pid_output_types.torque_ctrl_out_type = _trq_pids[joint].
out_type;
635 _jsets[s].cfg.pid_output_types.pwm_ctrl_out_type = eomc_ctrl_out_type_pwm;
637 if (_cur_pids[joint].enabled)
639 _jsets[s].cfg.pid_output_types.cur_ctrl_out_type = eomc_ctrl_out_type_cur;
643 _jsets[s].cfg.pid_output_types.cur_ctrl_out_type = eomc_ctrl_out_type_n_a;
652bool embObjMotionControl::saveCouplingsData(
void)
654 eOmc_4jomo_coupling_t *jc_dest;
656 static eOmc_4jomo_coupling_t dummyjomocoupling = {};
658 switch(serviceConfig.
ethservice.configuration.type)
660 case eomn_serv_MC_foc:
662 jc_dest = &(serviceConfig.
ethservice.configuration.data.mc.foc_based.jomocoupling);
665 case eomn_serv_MC_mc4plus:
667 jc_dest = &(serviceConfig.
ethservice.configuration.data.mc.mc4plus_based.jomocoupling);
670 case eomn_serv_MC_mc4plusmais:
672 jc_dest = &(serviceConfig.
ethservice.configuration.data.mc.mc4plusmais_based.jomocoupling);
676 case eomn_serv_MC_mc2pluspsc:
678 jc_dest = &(serviceConfig.
ethservice.configuration.data.mc.mc2pluspsc.jomocoupling);
682 case eomn_serv_MC_mc4plusfaps:
684 jc_dest = &(serviceConfig.
ethservice.configuration.data.mc.mc4plusfaps.jomocoupling);
688 case eomn_serv_MC_advfoc:
690 jc_dest = &dummyjomocoupling;
693 case eomn_serv_MC_mc4:
698 case eomn_serv_MC_generic:
710 memset(jc_dest, 0,
sizeof(eOmc_4jomo_coupling_t));
714 for(
int i=0; i<4; i++)
716 jc_dest->joint2set[i] = eomc_jointSetNum_none;
719 if(_joint2set.size() > 4 )
721 yError() <<
"embObjMC "<< getBoardInfo() <<
"Jointsset size is bigger than 4. I can't send jointset information to fw.";
725 for(
size_t i=0; i<_joint2set.size(); i++)
727 jc_dest->joint2set[i] = _joint2set[i];
730 for(
int i=0; i<4; i++)
732 for(
int j=0; j<4; j++)
734 jc_dest->joint2motor[i][j] = eo_common_float_to_Q17_14((
float)_couplingInfo.
matrixJ2M[4*i+j]);
735 jc_dest->motor2joint[i][j] = eo_common_float_to_Q17_14((
float)_couplingInfo.
matrixM2J[4*i+j]);
740 for(
int r=0; r<4; r++)
742 for(
int c=0; c<6; c++)
744 jc_dest->encoder2joint[r][c] = eo_common_float_to_Q17_14((
float)_couplingInfo.
matrixE2J[6*r+c]);
748 for(
size_t s=0; s< _jsets.size(); s++)
750 eOmc_jointset_configuration_t* cfg_ptr = _jsets[s].getConfiguration();
751 memcpy(&(jc_dest->jsetcfg[s]), cfg_ptr,
sizeof(eOmc_jointset_configuration_t));
755 if(eomn_serv_MC_advfoc == serviceConfig.
ethservice.configuration.type)
758 eOmc_adv4jomo_coupling_t *ajc = &serviceConfig.
ethservice.configuration.data.mc.advfoc.adv4jomocoupling;
759 ajc->type = eommccoupling_traditional4x4;
761 std::memmove(&ajc->data.coupling4x4.joint2set[0], &jc_dest->joint2set[0], 4*
sizeof(uint8_t));
762 std::memmove(&ajc->data.coupling4x4.jsetcfg[0], &jc_dest->jsetcfg[0], 4*
sizeof(eOmc_jointset_configuration_t));
763 std::memmove(&ajc->data.coupling4x4.joint2motor, &jc_dest->joint2motor,
sizeof(eOmc_4x4_matrix_t));
764 std::memmove(&ajc->data.coupling4x4.motor2joint, &jc_dest->motor2joint,
sizeof(eOmc_4x4_matrix_t));
766 for(uint8_t r=0; r<4; r++)
768 for(uint8_t c=0; c<4; c++)
770 ajc->data.coupling4x4.encoder2joint4x4[r][c] = jc_dest->encoder2joint[r][c];
780bool embObjMotionControl::fromConfig_Step2(yarp::os::Searchable &config)
787 if(iNeedCouplingsInfo())
813 for (i = 0; i < _njoints; i++)
815 measConvFactors.angleToEncoder[i] = 1;
836 if(eomn_serv_MC_mc4 != (eOmn_serv_type_t)serviceConfig.
ethservice.configuration.type)
838 int* useMotorSpeedFbk = 0;
839 useMotorSpeedFbk =
new int[_njoints];
842 delete[] useMotorSpeedFbk;
847 if (!verifyUseMotorSpeedFbkInJointSet(useMotorSpeedFbk))
849 delete[] useMotorSpeedFbk;
852 delete[] useMotorSpeedFbk;
854 bool deadzoneIsAvailable;
857 if(!deadzoneIsAvailable)
859 updateDeadZoneWithDefaultValues();
871 bool lowLevPidisMandatory =
false;
873 if((serviceConfig.
ethservice.configuration.type == eomn_serv_MC_foc) || (serviceConfig.
ethservice.configuration.type == eomn_serv_MC_advfoc))
875 lowLevPidisMandatory =
true;
878 if(!_mcparser->
parsePids(config, _trj_pids, _trq_pids, _cur_pids, _spd_pids, lowLevPidisMandatory))
895 updatedJointsetsCfgWithControlInfo();
898 for (i = 0; i < _njoints; i++)
900 measConvFactors.newtonsToSensor[i] = 1000000.0f;
902 measConvFactors.bemf2raw[i] = measConvFactors.newtonsToSensor[i] / measConvFactors.angleToEncoder[i];
903 if (_trq_pids->
out_PidUnits == yarp::dev::PidOutputUnitsEnum::DUTYCYCLE_PWM_PERCENT)
905 measConvFactors.ktau2raw[i] = measConvFactors.dutycycleToPWM[i] / measConvFactors.newtonsToSensor[i];
907 else if (_trq_pids->
out_PidUnits == yarp::dev::PidOutputUnitsEnum::RAW_MACHINE_UNITS)
909 measConvFactors.ktau2raw[i] = 1.0 / measConvFactors.newtonsToSensor[i];
913 yError() <<
"Invalid ktau units";
return false;
918 _measureConverter =
new ControlBoardHelper(_njoints, _axisMap, measConvFactors.angleToEncoder, NULL, measConvFactors.newtonsToSensor, measConvFactors.ampsToSensor,
nullptr, measConvFactors.dutycycleToPWM , measConvFactors.bemf2raw, measConvFactors.ktau2raw);
919 _measureConverter->set_pid_conversion_units(PidControlTypeEnum::VOCAB_PIDTYPE_POSITION, _trj_pids->
fbk_PidUnits, _trj_pids->
out_PidUnits);
921 _measureConverter->set_pid_conversion_units(PidControlTypeEnum::VOCAB_PIDTYPE_TORQUE, _trq_pids->
fbk_PidUnits, _trq_pids->
out_PidUnits);
922 _measureConverter->set_pid_conversion_units(PidControlTypeEnum::VOCAB_PIDTYPE_CURRENT, _cur_pids->
fbk_PidUnits, _cur_pids->
out_PidUnits);
923 _measureConverter->set_pid_conversion_units(PidControlTypeEnum::VOCAB_PIDTYPE_VELOCITY, _spd_pids->
fbk_PidUnits, _spd_pids->
out_PidUnits);
936 initializeInterfaces(measConvFactors);
937 ImplementPidControl::setConversionUnits(PidControlTypeEnum::VOCAB_PIDTYPE_POSITION, _trj_pids->
fbk_PidUnits, _trj_pids->
out_PidUnits);
939 ImplementPidControl::setConversionUnits(PidControlTypeEnum::VOCAB_PIDTYPE_TORQUE, _trq_pids->
fbk_PidUnits, _trq_pids->
out_PidUnits);
940 ImplementPidControl::setConversionUnits(PidControlTypeEnum::VOCAB_PIDTYPE_CURRENT, _cur_pids->
fbk_PidUnits, _cur_pids->
out_PidUnits);
941 ImplementPidControl::setConversionUnits(PidControlTypeEnum::VOCAB_PIDTYPE_VELOCITY, _spd_pids->
fbk_PidUnits, _spd_pids->
out_PidUnits);
945 if(!saveCouplingsData())
952 yError() <<
"embObjMC " << getBoardInfo() <<
"IMPEDANCE section: error detected in parameters syntax";
958 for(j=0; j<_njoints; j++)
961 _impedance_limits[j].
min_damp= 0.001;
962 _impedance_limits[j].
max_damp= 9.888;
965 _impedance_limits[j].
param_a= 0.011;
966 _impedance_limits[j].
param_b= 0.012;
967 _impedance_limits[j].
param_c= 0.013;
988 eOmn_serv_type_t servtype =
static_cast<eOmn_serv_type_t
>(serviceConfig.
ethservice.configuration.type);
990 if((eomn_serv_MC_foc == servtype) || (eomn_serv_MC_advfoc == servtype))
992 std::string groupName = {};
994 if(eomn_serv_MC_foc == servtype)
997 eObrd_type_t brd =
static_cast<eObrd_type_t
>(serviceConfig.
ethservice.configuration.data.mc.foc_based.type);
998 groupName = (eobrd_foc == brd) ?
"2FOC" :
"AMCBLDC";
1000 else if(eomn_serv_MC_advfoc == servtype)
1004 groupName =
"ADVFOC";
1007 if(!_mcparser->
parseFocGroup(config, _foc_based_info, groupName, _temperatureSensorsVector))
1010 for (j = 0; j < _njoints; j++)
1012 if (((_temperatureSensorsVector.at(j)->getType() !=
motor_temperature_sensor_none )) && ((_temperatureLimits[j].hardwareTemperatureLimit == 0) || (_temperatureLimits[j].warningTemperatureLimit == 0)))
1014 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...";
1020 yInfo() <<
"embObjMC " << getBoardInfo() <<
"joint " << j <<
" has motor not provided with any available type of temperature sensor. If needed update the configurations file accordingly";
1026 for (j = 0; j < _njoints; j++)
1028 _temperatureSensorsVector.at(j) = std::make_unique<eomc::TemperatureSensorNONE>();
1044bool embObjMotionControl::verifyUseMotorSpeedFbkInJointSet(
int useMotorSpeedFbk [])
1046 for(
size_t s=0; s< _jsets.size(); s++)
1048 int numofjointsinset = _jsets[s].getNumberofJoints();
1049 if(numofjointsinset == 0 )
1051 yError() <<
"embObjMC " << getBoardInfo() <<
"Jointsset " << s <<
"hasn't joints!!! I should be never stay here!!!";
1055 int firstjointofset = _jsets[s].joints[0];
1056 for(
int j=1; j<numofjointsinset; j++)
1058 int joint = _jsets[s].joints[j];
1059 if(useMotorSpeedFbk[firstjointofset] != useMotorSpeedFbk[joint])
1061 yError() <<
"embObjMC " << getBoardInfo() <<
". Param useMotorSpeedFbk should have same value for joints belong same set. See joint " << firstjointofset <<
" and " << joint;
1066 _jsets[s].setUseSpeedFeedbackFromMotors(useMotorSpeedFbk[firstjointofset]);
1073bool embObjMotionControl::verifyTorquePidshasSameUnitTypes(yarp::dev::PidFeedbackUnitsEnum &fbk_pidunits, yarp::dev::PidOutputUnitsEnum& out_pidunits)
1075 fbk_pidunits = yarp::dev::PidFeedbackUnitsEnum::RAW_MACHINE_UNITS;
1076 out_pidunits = yarp::dev::PidOutputUnitsEnum::RAW_MACHINE_UNITS;
1078 int firstjoint = -1;
1079 for(
int i=0; i<_njoints; i++)
1081 if(_trq_pids[i].enabled)
1091 for(
int i=firstjoint+1; i<_njoints; i++)
1093 if(_trq_pids[i].enabled)
1095 if(_trq_pids[firstjoint].fbk_PidUnits != _trq_pids[i].fbk_PidUnits ||
1096 _trq_pids[firstjoint].out_PidUnits != _trq_pids[i].out_PidUnits)
1098 yError() <<
"embObjMC " << getBoardInfo() <<
"all joints with torque enabled should have same controlunits type. Joint " << firstjoint <<
" differs from joint " << i;
1109bool embObjMotionControl::isTorqueControlEnabled(
int joint)
1111 return (_trq_pids[joint].enabled);
1114bool embObjMotionControl::isVelocityControlEnabled(
int joint)
1117 return (_trj_pids[joint].enabled);
1121void embObjMotionControl::updateDeadZoneWithDefaultValues(
void)
1123 for(
int i=0; i<_njoints; i++)
1125 switch(_jointEncs[i].
type)
1133 case eomc_enc_aksim2:
1139 case eomc_enc_absanalog:
1142 case eomc_enc_hallmotor:
1143 case eomc_enc_spichainof2:
1144 case eomc_enc_spichainof3:
1154bool embObjMotionControl::fromConfig_readServiceCfg(yarp::os::Searchable &config)
1157 if(
false == parser->
parseService(config, serviceConfig))
1159 yError() <<
"embObjMC " << getBoardInfo() <<
"cannot parse service" ;
1163 if(eomn_serv_MC_generic == serviceConfig.
ethservice.configuration.type)
1165 yError() <<
"embObjMC " << getBoardInfo() <<
"it is no longer possible use eomn_serv_MC_generic, because firmware cannot configure itself!" ;
1173 for(
int i=0; i<_njoints; i++)
1178 if(NULL == jointEncoder_ptr)
1180 _jointEncs[i].resolution = 1;
1181 _jointEncs[i].type = eomc_enc_none;
1182 _jointEncs[i].tolerance = 0;
1186 _jointEncs[i].resolution = jointEncoder_ptr->
resolution;
1187 _jointEncs[i].type = (eOmc_encoder_t)jointEncoder_ptr->
desc.type;
1188 _jointEncs[i].tolerance = jointEncoder_ptr->
tolerance;
1192 if(NULL == motorEncoder_ptr)
1194 _motorEncs[i].resolution = 1;
1195 _motorEncs[i].type = eomc_enc_none;
1196 _motorEncs[i].tolerance = 0;
1200 _motorEncs[i].resolution = motorEncoder_ptr->
resolution;
1201 _motorEncs[i].type = (eOmc_encoder_t)motorEncoder_ptr->
desc.type;
1202 _motorEncs[i].tolerance = motorEncoder_ptr->
tolerance;
1214bool embObjMotionControl::fromConfig(yarp::os::Searchable &config)
1217 _njoints = fromConfig_NumOfJoints(config);
1221 yError() <<
"embObjMC"<< getBoardInfo() <<
"fromConfig(): detected _njoints = " << _njoints;
1226 if(!alloc(_njoints))
1228 yError() <<
"embObjMC"<< getBoardInfo() <<
"fromConfig(): alloc() failed for _njoints = " << _njoints;
1236 int currentMCversion =0;
1242 yError() <<
"embObjMC" << getBoardInfo() <<
"------ ATTENTION!!!! Wrong value of <MotioncontrolVersion> parameter !!!! ---------------------------------------------------------------------------------------";
1243 yError() <<
"embObjMC" << getBoardInfo() <<
"------ This means that the configuration files of this device are not compatible with my parser, so I cannot start. ";
1244 yError() <<
"embObjMC" << getBoardInfo() <<
"------ I need version " <<
PARSER_MOTION_CONTROL_VERSION <<
", but in configuration files have version " << currentMCversion <<
".";
1245 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). ";
1246 yError() <<
"embObjMC" << getBoardInfo() <<
"------ If the problem persists contact icub-support@iit.it DO NOT DO IT BY YOURSELF.";
1247 yError() <<
"embObjMC" << getBoardInfo() <<
"----------------------------------------------------------------------------------------------------------------------------------------------------------------";
1253 yTrace() << config.toString().c_str();
1258 if(
false == fromConfig_readServiceCfg(config))
1270 if(
false == fromConfig_Step2(config))
1282bool embObjMotionControl::init()
1284 eOprotID32_t protid = 0;
1290 for(
int logico=0; logico< _njoints; logico++)
1292 int fisico = _axisMap[logico];
1293 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, fisico, eoprot_tag_mc_joint_cmmnds_controlmode);
1294 eOenum08_t controlMode = eomc_controlmode_cmd_idle;
1298 yError() <<
"embObjMotionControl::init() had an error while setting eomc_controlmode_cmd_idle in "<< getBoardInfo();
1304 SystemClock::delaySystem(0.010);
1311 vector<eOprotID32_t> id32v(0);
1312 for(
int n=0;
n<_njoints;
n++)
1314 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint,
n, eoprot_tag_mc_joint_status_core);
1315 id32v.push_back(protid);
1316 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint,
n, eoprot_tag_mc_joint_status_addinfo_multienc);
1317 id32v.push_back(protid);
1318 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor,
n, eoprot_tag_mc_motor_status);
1319 id32v.push_back(protid);
1322 if(eomn_serv_diagn_mode_MC_AMOyarp == mcdiagnostics.
config.mode)
1324 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, 0, eoprot_tag_mc_joint_status_debug);
1325 id32v.push_back(protid);
1326 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, 1, eoprot_tag_mc_joint_status_debug);
1327 id32v.push_back(protid);
1333 yError() <<
"embObjMotionControl::init() fails to add its variables to regulars in "<< getBoardInfo() <<
": cannot proceed any further";
1340 yDebug() <<
"embObjMotionControl::init() added" << id32v.size() <<
"regular rops to "<< getBoardInfo();
1342 for(
unsigned int r=0; r<id32v.size(); r++)
1344 uint32_t id32 = id32v.at(r);
1345 eoprot_ID2information(id32, nvinfo,
sizeof(nvinfo));
1346 yDebug() <<
"\t it added regular rop for" << nvinfo;
1351 SystemClock::delaySystem(0.005);
1358 for(
int logico=0; logico< _njoints; logico++)
1360 int fisico = _axisMap[logico];
1361 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, fisico, eoprot_tag_mc_joint_config);
1363 eOmc_joint_config_t jconfig = {0};
1364 memset(&jconfig, 0,
sizeof(eOmc_joint_config_t));
1366 tmp = _measureConverter->convert_pid_to_machine(yarp::dev::VOCAB_PIDTYPE_POSITION,_trj_pids[logico].pid, fisico);
1370 tmp = _measureConverter->convert_pid_to_machine(yarp::dev::VOCAB_PIDTYPE_TORQUE, _trq_pids[logico].pid, fisico);
1374 jconfig.impedance.damping = (eOmeas_damping_t) _measureConverter->impN2S(_impedance_params[logico].damping, fisico);
1375 jconfig.impedance.stiffness = (eOmeas_stiffness_t) _measureConverter->impN2S(_impedance_params[logico].stiffness, fisico);
1376 jconfig.impedance.offset = 0;
1378 _cacheImpedance[logico].stiffness = jconfig.impedance.stiffness;
1379 _cacheImpedance[logico].damping = jconfig.impedance.damping;
1380 _cacheImpedance[logico].offset = jconfig.impedance.offset;
1382 jconfig.userlimits.max = (eOmeas_position_t)
S_32(_measureConverter->posA2E(_jointsLimits[logico].posMax, fisico));
1383 jconfig.userlimits.min = (eOmeas_position_t)
S_32(_measureConverter->posA2E(_jointsLimits[logico].posMin, fisico));
1385 jconfig.hardwarelimits.max = (eOmeas_position_t)
S_32(_measureConverter->posA2E(_jointsLimits[logico].posHwMax, fisico));
1386 jconfig.hardwarelimits.min = (eOmeas_position_t)
S_32(_measureConverter->posA2E(_jointsLimits[logico].posHwMin, fisico));
1389 jconfig.maxvelocityofjoint =
S_32(_measureConverter->posA2E(_jointsLimits[logico].velMax, fisico));
1390 jconfig.velocitysetpointtimeout = (eOmeas_time_t)
U_16(_timeouts[logico].velocity);
1392 jconfig.jntEncoderResolution = _jointEncs[logico].resolution;
1393 jconfig.jntEncoderType = _jointEncs[logico].type;
1394 jconfig.jntEncTolerance = _jointEncs[logico].tolerance;
1396 jconfig.motor_params.bemf_value = _measureConverter->bemf_user2raw(_trq_pids[logico].kbemf, fisico);
1397 jconfig.motor_params.bemf_scale = 0;
1398 jconfig.motor_params.ktau_value = _measureConverter->ktau_user2raw(_trq_pids[logico].ktau, fisico);
1399 jconfig.motor_params.ktau_scale = 0;
1400 jconfig.motor_params.friction.viscous_pos_val = _measureConverter->viscousPos_user2raw(_trq_pids[logico].viscousPos, fisico);
1401 jconfig.motor_params.friction.viscous_neg_val = _measureConverter->viscousNeg_user2raw(_trq_pids[logico].viscousNeg, fisico);
1402 jconfig.motor_params.friction.coulomb_pos_val = _measureConverter->coulombPos_user2raw(_trq_pids[logico].coulombPos, fisico);
1403 jconfig.motor_params.friction.coulomb_neg_val = _measureConverter->coulombNeg_user2raw(_trq_pids[logico].coulombNeg, fisico);
1404 jconfig.motor_params.friction.velocityThres_val = _measureConverter->velocityThres_user2raw(_trq_pids[logico].velocityThres, fisico);
1406 jconfig.gearbox_E2J = _gearbox_E2J[logico];
1408 jconfig.deadzone = _measureConverter->posA2E(_deadzone[logico], fisico);
1410 jconfig.tcfiltertype=_trq_pids[logico].
filterType;
1412 jconfig.kalman_params.enabled = _kalman_params[logico].enabled;
1413 for(
int i=0; i<_kalman_params[logico].x0.size(); i++) jconfig.kalman_params.x0[i] = _kalman_params[logico].x0.at(i);
1414 for(
int i=0; i<_kalman_params[logico].Q.size(); i++) jconfig.kalman_params.Q[i] = _kalman_params[logico].Q.at(i);
1415 jconfig.kalman_params.R = _kalman_params[logico].R;
1416 jconfig.kalman_params.P0 = _kalman_params[logico].P0;
1420 yError() <<
"FATAL: embObjMotionControl::init() had an error while calling setcheckRemoteValue() for joint config fisico #" << fisico <<
"in "<< getBoardInfo();
1427 yDebug() <<
"embObjMotionControl::init() correctly configured joint config fisico #" << fisico <<
"in "<< getBoardInfo();
1438 for(
int logico=0; logico<_njoints; logico++)
1440 int fisico = _axisMap[logico];
1442 protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, fisico, eoprot_tag_mc_motor_config);
1443 eOmc_motor_config_t motor_cfg = {0};
1444 motor_cfg.maxvelocityofmotor = 0;
1445 motor_cfg.currentLimits.nominalCurrent = _currentLimits[logico].nominalCurrent;
1446 motor_cfg.currentLimits.overloadCurrent = _currentLimits[logico].overloadCurrent;
1447 motor_cfg.currentLimits.peakCurrent = _currentLimits[logico].peakCurrent;
1448 motor_cfg.gearbox_M2J = _gearbox_M2J[logico];
1449 motor_cfg.rotorEncoderResolution = _motorEncs[logico].resolution;
1450 motor_cfg.rotEncTolerance = _motorEncs[logico].tolerance;
1451 motor_cfg.hasHallSensor = _foc_based_info[logico].
hasHallSensor;
1453 motor_cfg.hasTempSensor = _foc_based_info[logico].
hasTempSensor;
1456 motor_cfg.verbose = _foc_based_info[logico].
verbose;
1457 motor_cfg.motorPoles = _foc_based_info[logico].
motorPoles;
1459 motor_cfg.rotorEncoderType = _motorEncs[logico].type;
1460 motor_cfg.pwmLimit =_rotorsLimits[logico].pwmMax;
1461 motor_cfg.temperatureLimit = (eOmeas_temperature_t)
S_16(_temperatureSensorsVector.at(logico)->convertTempCelsiusToRaw(_temperatureLimits.at(logico).hardwareTemperatureLimit));
1462 motor_cfg.limitsofrotor.max = (eOmeas_position_t)
S_32(_measureConverter->posA2E(_rotorsLimits[logico].posMax, fisico ));
1463 motor_cfg.limitsofrotor.min = (eOmeas_position_t)
S_32(_measureConverter->posA2E(_rotorsLimits[logico].posMin, fisico ));
1466 tmp = _measureConverter->convert_pid_to_machine(yarp::dev::VOCAB_PIDTYPE_CURRENT, _cur_pids[logico].pid, fisico);
1469 tmp = _measureConverter->convert_pid_to_machine(yarp::dev::VOCAB_PIDTYPE_VELOCITY, _spd_pids[logico].pid, fisico);
1474 yError() <<
"FATAL: embObjMotionControl::init() had an error while calling setcheckRemoteValue() for motor config fisico #" << fisico <<
"in "<< getBoardInfo();
1481 yDebug() <<
"embObjMotionControl::init() correctly configured motor config fisico #" << fisico <<
"in "<< getBoardInfo();
1495 const char* tag = eoprot_TAG2string(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_addinfo_multienc);
1497 _rawValuesMetadataMap.insert({{tag,
rawValuesKeyMetadata({}, _njoints * eOmc_joint_multienc_maxnum)}});
1498 for (
auto &[k, v] : _rawValuesMetadataMap)
1500 std::string auxstring =
"";
1502 for (
int i = 0; i < _njoints; i++)
1507 v.rawValueNames.insert(v.rawValueNames.end(),
1508 {auxstring+
"_primary_encoder_raw_value",
1509 auxstring+
"_secondary_encoder_raw_value",
1510 auxstring+
"_primary_encoder_diagnostic"}
1516 yTrace() <<
"embObjMotionControl::init(): correctly instantiated for " << getBoardInfo();
1524 yTrace() <<
" embObjMotionControl::close()";
1526 ImplementControlMode::uninitialize();
1527 ImplementEncodersTimed::uninitialize();
1528 ImplementMotorEncoders::uninitialize();
1529 ImplementPositionControl::uninitialize();
1530 ImplementVelocityControl::uninitialize();
1531 ImplementPidControl::uninitialize();
1532 ImplementControlCalibration::uninitialize();
1533 ImplementAmplifierControl::uninitialize();
1534 ImplementImpedanceControl::uninitialize();
1535 ImplementControlLimits::uninitialize();
1536 ImplementTorqueControl::uninitialize();
1537 ImplementPositionDirect::uninitialize();
1538 ImplementInteractionMode::uninitialize();
1539 ImplementRemoteVariables::uninitialize();
1540 ImplementAxisInfo::uninitialize();
1541 ImplementCurrentControl::uninitialize();
1542 ImplementPWMControl::uninitialize();
1543 ImplementJointFault::uninitialize();
1545 if (_measureConverter) {
delete _measureConverter; _measureConverter=0;}
1548 if(eomn_serv_diagn_mode_MC_AMOyarp == mcdiagnostics.
config.mode)
1551 for(
size_t i=0; i<mcdiagnostics.
ports.size(); i++)
1553 mcdiagnostics.
ports[i]->close();
1554 delete mcdiagnostics.
ports[i];
1556 mcdiagnostics.
ports.clear();
1558 mcdiagnostics.
config.mode = eomn_serv_diagn_mode_NONE;
1559 mcdiagnostics.
config.par16 = 0;
1562 delete event_downsampler;
1576void embObjMotionControl::cleanup(
void)
1578 if(ethManager == NULL)
return;
1597 size_t joint = eoprot_ID2index(id32);
1598 eOprotEntity_t ent = eoprot_ID2entity(id32);
1599 eOprotTag_t tag = eoprot_ID2tag(id32);
1613 std::lock_guard<std::mutex> lck(_mutex);
1614 _encodersStamp[joint] = timestamp;
1618 if(eomn_serv_diagn_mode_MC_AMOyarp == mcdiagnostics.
config.mode)
1620 char str[128] =
"boh";
1622 eoprot_ID2information(id32, str,
sizeof(str));
1624 if((eoprot_entity_mc_joint == ent) && (eoprot_tag_mc_joint_status_debug == tag) && (joint < mcdiagnostics.
ports.size()))
1627 eOprotID32_t id32sc = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, joint, eoprot_tag_mc_joint_status_core);
1628 eOmc_joint_status_core_t jcore = {};
1632 int32_t *debug32 =
reinterpret_cast<int32_t*
>(rxdata);
1635 Bottle& output = mcdiagnostics.
ports[joint]->prepare();
1638 output.addString(
"[yt, amo, reg, pos]");
1639 output.addFloat64(timestamp);
1640 output.addInt32(debug32[0]);
1641 output.addInt32(debug32[1]);
1642 output.addInt32(jcore.measures.meas_position);
1643 mcdiagnostics.
ports[joint]->write();
1647 if((eoprot_entity_mc_motor == ent) && (eoprot_tag_mc_motor_status == tag))
1652 uint8_t motor = eoprot_ID2index(id32);
1656 eOmc_motor_status_t *mc_motor_status =
reinterpret_cast<eOmc_motor_status_t*
>(rxdata);
1658 if((
double)mc_motor_status->basic.mot_temperature < 0 )
1660 if(! _temperatureSensorErrorWatchdog.at(motor).isStarted())
1662 yError() << getBoardInfo() <<
"At timestamp" << yarp::os::Time::now() <<
"In motor" << motor <<
"cannot read Temperature from I2C. There might be cabling problems, TDB cable might be broken or sensor unreachable";
1663 _temperatureSensorErrorWatchdog.at(motor).start();
1667 _temperatureSensorErrorWatchdog.at(motor).increment();
1668 if( _temperatureSensorErrorWatchdog.at(motor).isExpired())
1670 yError()<< getBoardInfo() <<
"Motor" << motor <<
"failed to read" << _temperatureSensorErrorWatchdog.at(motor).getCount() <<
"temperature readings for" << yarp::os::Time::now() - _temperatureSensorErrorWatchdog.at(motor).getStartTime() <<
"seconds";
1671 _temperatureSensorErrorWatchdog.at(motor).start();
1678 double delta_tmp = 0;
1679 double tmp = _temperatureSensorsVector.at(motor)->convertRawToTempCelsius((
double)mc_motor_status->basic.mot_temperature);
1683 if(!_temperatureSpikesFilter.at(motor).isStarted())
1685 _temperatureSpikesFilter.at(motor).start(tmp);
1690 delta_tmp = std::abs(tmp - _temperatureSpikesFilter.at(motor).getPrevTemperature());
1693 if(delta_tmp > _temperatureSpikesFilter.at(motor).getTemperatureThreshold())
1699 _temperatureSpikesFilter.at(motor).updatePrevTemperature(tmp);
1702 if(tmp > _temperatureLimits[motor].warningTemperatureLimit)
1704 if(! _temperatureExceededLimitWatchdog.at(motor).isStarted())
1706 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";
1707 _temperatureExceededLimitWatchdog.at(motor).start();
1711 if(_temperatureExceededLimitWatchdog.at(motor).isExpired())
1713 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";
1714 _temperatureExceededLimitWatchdog.at(motor).start();
1716 _temperatureExceededLimitWatchdog.at(motor).increment();
1721 _temperatureExceededLimitWatchdog.at(motor).clear();
1745 encoderTypeName.clear();
1747 if ((jomoId >= 0) && (jomoId < _njoints))
1751 case eomc_pos_atjoint:
1752 encoderTypeName = eomc_encoder2string(_jointEncs[jomoId].
type, eobool_true);
1754 case eomc_pos_atmotor:
1755 encoderTypeName = eomc_encoder2string(_motorEncs[jomoId].
type, eobool_true);
1757 case eomc_pos_unknown:
1758 encoderTypeName =
"UNKNOWN";
1762 encoderTypeName =
"NONE";
1769 encoderTypeName =
"ERROR";
1779 case VOCAB_PIDTYPE_POSITION:
1780 helper_setPosPidRaw(j,pid);
1782 case VOCAB_PIDTYPE_VELOCITY:
1784 helper_setSpdPidRaw(j, pid);
1786 case VOCAB_PIDTYPE_TORQUE:
1787 helper_setTrqPidRaw(j, pid);
1789 case VOCAB_PIDTYPE_CURRENT:
1790 helper_setCurPidRaw(j,pid);
1793 yError()<<
"Invalid pidtype:"<<pidtype;
1803 case VOCAB_PIDTYPE_POSITION:
1804 helper_getPosPidRaw(axis,pid);
1806 case VOCAB_PIDTYPE_VELOCITY:
1808 helper_getSpdPidRaw(axis, pid);
1810 case VOCAB_PIDTYPE_TORQUE:
1811 helper_getTrqPidRaw(axis, pid);
1813 case VOCAB_PIDTYPE_CURRENT:
1814 helper_getCurPidRaw(axis,pid);
1817 yError()<<
"Invalid pidtype:"<<pidtype;
1823bool embObjMotionControl::helper_setPosPidRaw(
int j,
const Pid &pid)
1825 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_pidtrajectory);
1834 yError() <<
"while setting position PIDs for " << getBoardInfo() <<
" joint " << j;
1844 for(
int j=0; j< _njoints; j++)
1859 for(
int j=0, index=0; j< _njoints; j++, index++)
1881 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
1882 eOmc_joint_status_core_t jcore = {0};
1889 case VOCAB_PIDTYPE_POSITION:
1891 if((eomc_controlmode_torque == jcore.modes.controlmodestatus) ||
1892 (eomc_controlmode_openloop == jcore.modes.controlmodestatus) ||
1893 (eomc_controlmode_current == jcore.modes.controlmodestatus))
1896 *err = (double) jcore.ofpid.generic.error1;
1907 case VOCAB_PIDTYPE_TORQUE:
1909 if ((eOmc_interactionmode_compliant == jcore.modes.interactionmodestatus) &&
1910 (eomc_controlmode_position == jcore.modes.controlmodestatus))
1912 *err = (double) jcore.ofpid.complpos.errtrq;
1915 if(eomc_controlmode_torque == jcore.modes.controlmodestatus)
1917 *err = (double) jcore.ofpid.torque.errtrq;
1921 case VOCAB_PIDTYPE_VELOCITY:
1927 case VOCAB_PIDTYPE_CURRENT:
1935 yError()<<
"Invalid pidtype:"<<pidtype;
1945 for(
int j=0; j< _njoints; j++)
1952bool embObjMotionControl::helper_getPosPidRaw(
int j, Pid *pid)
1954 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_pidtrajectory);
1957 eOmc_PID_t eoPID = {0};
1960#ifdef NETWORK_PERFORMANCE_BENCHMARK
1961 double start = yarp::os::Time::now();
1964 bool ret = askRemoteValue(protid, &eoPID, size);
1966#ifdef NETWORK_PERFORMANCE_BENCHMARK
1967 double end = yarp::os::Time::now();
1968 m_responseTimingVerifier.tick(end-start, start);
1981bool embObjMotionControl::helper_getPosPidsRaw(Pid *pid)
1983 std::vector<eOmc_PID_t> eoPIDList(_njoints);
1984 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_config_pidtrajectory, eoPIDList);
1987 yError() <<
"failed helper_getPosPidsRaw for" << getBoardInfo();
1991 for(
int j=0; j<_njoints; j++)
2005 case VOCAB_PIDTYPE_POSITION:
2006 helper_getPosPidsRaw(pids);
2011 case VOCAB_PIDTYPE_TORQUE:
2012 helper_getTrqPidsRaw(pids);
2014 case VOCAB_PIDTYPE_CURRENT:
2015 helper_getCurPidsRaw(pids);
2017 case VOCAB_PIDTYPE_VELOCITY:
2018 helper_getSpdPidsRaw(pids);
2021 yError()<<
"Invalid pidtype:"<<pidtype;
2029 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
2030 eOmc_joint_status_core_t jcore = {0};
2037 case VOCAB_PIDTYPE_POSITION:
2039 if((eomc_controlmode_torque == jcore.modes.controlmodestatus) ||
2040 (eomc_controlmode_openloop == jcore.modes.controlmodestatus) ||
2041 (eomc_controlmode_current == jcore.modes.controlmodestatus))
2042 { *ref = 0; yError() <<
"Invalid getPidReferenceRaw() request for current control mode";
return true; }
2043 *ref = (double) jcore.ofpid.generic.reference1;
2052 case VOCAB_PIDTYPE_TORQUE:
2058 case VOCAB_PIDTYPE_CURRENT:
2064 case VOCAB_PIDTYPE_VELOCITY:
2073 yError()<<
"Invalid pidtype:"<<pidtype;
2086 for(
int j=0; j< _njoints; j++)
2131 if( (mode != VOCAB_CM_VELOCITY) &&
2132 (mode != VOCAB_CM_MIXED) &&
2133 (mode != VOCAB_CM_IMPEDANCE_VEL) &&
2134 (mode != VOCAB_CM_IDLE))
2138 yError() <<
"velocityMoveRaw: skipping command because " << getBoardInfo() <<
" joint " << j <<
" is not in VOCAB_CM_VELOCITY mode";
2143 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_setpoint);
2145 _ref_command_speeds[j] = sp ;
2147 eOmc_setpoint_t setpoint;
2148 setpoint.type = eomc_setpoint_velocity;
2149 setpoint.to.velocity.value = (eOmeas_velocity_t)
S_32(_ref_command_speeds[j]);
2150 setpoint.to.velocity.withacceleration = (eOmeas_acceleration_t)
S_32(_ref_accs[j]);
2155 yError() <<
"while setting velocity mode";
2164 eOmc_setpoint_t setpoint;
2166 setpoint.type = eomc_setpoint_velocity;
2168 for(
int j=0; j<_njoints; j++)
2183 yTrace() <<
"setCalibrationParametersRaw for " << getBoardInfo() <<
"joint" << j;
2185 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_calibration);
2186 eOmc_calibrator_t calib;
2187 memset(&calib, 0x00,
sizeof(calib));
2188 calib.type = params.type;
2193 case eomc_calibration_type0_hard_stops:
2194 calib.params.type0.pwmlimit = (int16_t)
S_16(params.param1);
2195 calib.params.type0.velocity = (eOmeas_velocity_t)
S_32(params.param2);
2196 calib.params.type0.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2200 case eomc_calibration_type1_abs_sens_analog:
2201 calib.params.type1.position = (int16_t)
S_16(params.param1);
2202 calib.params.type1.velocity = (eOmeas_velocity_t)
S_32(params.param2);
2203 calib.params.type1.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2207 case eomc_calibration_type2_hard_stops_diff:
2208 calib.params.type2.pwmlimit = (int16_t)
S_16(params.param1);
2209 calib.params.type2.velocity = (eOmeas_velocity_t)
S_32(params.param2);
2210 calib.params.type2.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2214 case eomc_calibration_type3_abs_sens_digital:
2215 calib.params.type3.position = (int16_t)
S_16(params.param1);
2216 calib.params.type3.velocity = (eOmeas_velocity_t)
S_32(params.param2);
2217 calib.params.type3.offset = (int32_t)
S_32(params.param3);
2218 calib.params.type3.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2222 case eomc_calibration_type4_abs_and_incremental:
2223 calib.params.type4.position = (int16_t)
S_16(params.param1);
2224 calib.params.type4.velocity = (eOmeas_velocity_t)
S_32(params.param2);
2225 calib.params.type4.maxencoder = (int32_t)
S_32(params.param3);
2226 calib.params.type4.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2230 case eomc_calibration_type5_hard_stops:
2231 calib.params.type5.pwmlimit = (int32_t)
S_32(params.param1);
2232 calib.params.type5.final_pos = (int32_t)
S_32(params.param2);
2233 calib.params.type5.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2237 case eomc_calibration_type6_mais:
2238 calib.params.type6.position = (int32_t)
S_32(params.param1);
2239 calib.params.type6.velocity = (int32_t)
S_32(params.param2);
2240 calib.params.type6.current = (int32_t)
S_32(params.param3);
2241 calib.params.type6.vmin = (int32_t)
S_32(params.param4);
2242 calib.params.type6.vmax = (int32_t)
S_32(params.param5);
2243 calib.params.type6.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2247 case eomc_calibration_type7_hall_sensor:
2248 calib.params.type7.position = (int32_t)
S_32(params.param1);
2249 calib.params.type7.velocity = (int32_t)
S_32(params.param2);
2251 calib.params.type7.vmin = (int32_t)
S_32(params.param4);
2252 calib.params.type7.vmax = (int32_t)
S_32(params.param5);
2253 calib.params.type7.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2257 case eomc_calibration_type8_tripod_internal_hard_stop:
2258 calib.params.type8.pwmlimit = (int32_t)
S_32(params.param1);
2259 calib.params.type8.max_delta = (int32_t)
S_32(params.param2);
2260 calib.params.type8.calibrationZero = (int32_t)
S_32(params.paramZero );
2263 case eomc_calibration_type9_tripod_external_hard_stop:
2264 calib.params.type9.pwmlimit = (int32_t)
S_32(params.param1);
2265 calib.params.type9.max_delta = (int32_t)
S_32(params.param2);
2266 calib.params.type9.calibrationZero = (int32_t)
S_32(params.paramZero );
2269 case eomc_calibration_type10_abs_hard_stop:
2270 calib.params.type10.pwmlimit = (int32_t)
S_32(params.param1);
2271 calib.params.type10.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2274 case eomc_calibration_type11_cer_hands:
2275 calib.params.type11.offset0 = (int32_t)
S_32(params.param1);
2276 calib.params.type11.offset1 = (int32_t)
S_32(params.param2);
2277 calib.params.type11.offset2 = (int32_t)
S_32(params.param3);
2278 calib.params.type11.cable_range = (int32_t)
S_32(params.param4);
2279 calib.params.type11.pwm = (int32_t)
S_32(params.param5);
2283 case eomc_calibration_type12_absolute_sensor:
2284 calib.params.type12.rawValueAtZeroPos = (int32_t)
S_32(params.param1);
2285 calib.params.type12.calibrationDelta = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2288 case eomc_calibration_type13_cer_hands_2:
2289 calib.params.type13.rawValueAtZeroPos0 = (int32_t)
S_32(params.param1);
2290 calib.params.type13.rawValueAtZeroPos1 = (int32_t)
S_32(params.param2);
2291 calib.params.type13.rawValueAtZeroPos2 = (int32_t)
S_32(params.param3);
2292 calib.params.type13.rawValueAtZeroPos3 = (int32_t)
S_32(params.param4);
2295 case eomc_calibration_type14_qenc_hard_stop_and_fap:
2296 calib.params.type14.pwmlimit = (int32_t)
S_32(params.param1);
2297 calib.params.type14.final_pos = (int32_t)
S_32(params.param2);
2298 calib.params.type14.invertdirection = (uint8_t)
U_32(params.param3);
2299 calib.params.type14.rotation = (int32_t)
S_32(params.param4);
2301 if (calib.params.type14.invertdirection != 0 && calib.params.type14.invertdirection != 1)
2303 yError() <<
"Error in param3 of calibartion type 14 for joint " << j <<
"Admitted values are: 0=FALSE and 1=TRUE";
2308 if(!checkCalib14RotationParam(calib.params.type14.rotation))
2310 yError() <<
"Error in param4 of calibartion type 14 for joint " << j <<
"Admitted values are: 0, 32768, 16384, -16384 [0, 180, 90, -90] in iCubDegree";
2313 calib.params.type14.offset = (int32_t)
S_32(params.param5);
2314 calib.params.type14.calibrationZero = (int32_t)
S_32(_measureConverter->posA2E(params.paramZero, j));
2316 yDebug() <<
"***** calib.params.type14.pwmlimit = " <<calib.params.type14.pwmlimit;
2317 yDebug() <<
"***** calib.params.type14.final_pos = " <<calib.params.type14.final_pos;
2318 yDebug() <<
"***** calib.params.type14.invertdirection = " <<calib.params.type14.invertdirection;
2319 yDebug() <<
"***** calib.params.type14.rotation = " <<calib.params.type14.rotation;
2320 yDebug() <<
"***** calib.params.type14.offset = " <<calib.params.type14.offset;
2321 yDebug() <<
"***** calib.params.type14.calibrationZero = " <<calib.params.type14.calibrationZero;
2325 yError() <<
"Calibration type unknown!! (embObjMotionControl)\n";
2332 yError() <<
"while setting velocity mode";
2336 _calibrated[j] =
true;
2341bool embObjMotionControl::checkCalib14RotationParam(int32_t calib_param4)
2343 eOmc_calib14_ROT_t urotation = eomc_int2calib14_ROT(calib_param4);
2345 if (urotation == eOmc_calib14_ROT_zero ||
2346 urotation == eOmc_calib14_ROT_plus180 ||
2347 urotation == eOmc_calib14_ROT_plus090 ||
2348 urotation == eOmc_calib14_ROT_minus090)
2358 yTrace() <<
"calibrateRaw for" << getBoardInfo() <<
"joint" << j;
2376 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_calibration);
2377 eOmc_calibrator_t calib;
2378 memset(&calib, 0x00,
sizeof(calib));
2384 case eomc_calibration_type0_hard_stops:
2385 calib.params.type0.pwmlimit = (int16_t)
S_16(p1);
2386 calib.params.type0.velocity = (eOmeas_velocity_t)
S_32(p2);
2390 case eomc_calibration_type1_abs_sens_analog:
2391 calib.params.type1.position = (int16_t)
S_16(p1);
2392 calib.params.type1.velocity = (eOmeas_velocity_t)
S_32(p2);
2396 case eomc_calibration_type2_hard_stops_diff:
2397 calib.params.type2.pwmlimit = (int16_t)
S_16(p1);
2398 calib.params.type2.velocity = (eOmeas_velocity_t)
S_32(p2);
2402 case eomc_calibration_type3_abs_sens_digital:
2403 calib.params.type3.position = (int16_t)
S_16(p1);
2404 calib.params.type3.velocity = (eOmeas_velocity_t)
S_32(p2);
2405 calib.params.type3.offset = (int32_t)
S_32(p3);
2409 case eomc_calibration_type4_abs_and_incremental:
2410 calib.params.type4.position = (int16_t)
S_16(p1);
2411 calib.params.type4.velocity = (eOmeas_velocity_t)
S_32(p2);
2412 calib.params.type4.maxencoder = (int32_t)
S_32(p3);
2416 yError () <<
"Calibration type unknown!! (embObjMotionControl)\n";
2423 yError() <<
"while setting velocity mode";
2427 _calibrated[j ] =
true;
2435 bool result =
false;
2436 eOenum08_t temp = 0;
2438 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, axis, eoprot_tag_mc_joint_status_core_modes_controlmodestatus);
2439 if(
false == askRemoteValue(id32, &temp, size))
2441 yError () <<
"Failure of askRemoteValue() inside embObjMotionControl::doneRaw(axis=" << axis <<
") for " << getBoardInfo();
2445 eOmc_controlmode_t
type = (eOmc_controlmode_t) temp;
2449 if (eomc_controlmode_idle ==
type)
2453 else if (eomc_controlmode_calib ==
type)
2457 else if (eomc_controlmode_hwFault ==
type)
2459 yError(
"unable to complete calibration: joint %d in 'hw_fault status' inside doneRaw() function", axis);
2462 else if (eomc_controlmode_notConfigured ==
type)
2464 yError(
"unable to complete calibration: joint %d in 'not_configured' status inside doneRaw() function", axis);
2467 else if (eomc_controlmode_unknownError ==
type)
2469 yError(
"unable to complete calibration: joint %d in 'unknownError' status inside doneRaw() function", axis);
2472 else if (eomc_controlmode_configured ==
type)
2474 yError(
"unable to complete calibration: joint %d in 'configured' status inside doneRaw() function", axis);
2499 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.";
2501 _last_position_move_time[j] = yarp::os::Time::now();
2505 if( (mode != VOCAB_CM_POSITION) &&
2506 (mode != VOCAB_CM_MIXED) &&
2507 (mode != VOCAB_CM_IMPEDANCE_POS) &&
2508 (mode != VOCAB_CM_IDLE))
2512 yError() <<
"positionMoveRaw: skipping command because " << getBoardInfo() <<
" joint " << j <<
" is not in VOCAB_CM_POSITION mode";
2517 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_setpoint);
2518 _ref_command_positions[j] = ref;
2520 eOmc_setpoint_t setpoint;
2522 setpoint.type = (eOenum08_t) eomc_setpoint_position;
2523 setpoint.to.position.value = (eOmeas_position_t)
S_32(_ref_command_positions[j]);
2524 setpoint.to.position.withvelocity = (eOmeas_velocity_t)
S_32(_ref_speeds[j]);
2533 for(
int j=0, index=0; j< _njoints; j++, index++)
2553 eObool_t ismotiondone = eobool_false;
2556 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core_modes_ismotiondone);
2557 if(
false == askRemoteValue(id32, &ismotiondone, size))
2559 yError () <<
"Failure of askRemoteValue() inside embObjMotionControl::checkMotionDoneRaw(j=" << j <<
") for " << getBoardInfo();
2564 *flag = ismotiondone;
2571 std::vector <eObool_t> ismotiondoneList(_njoints);
2572 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_core_modes_ismotiondone, ismotiondoneList);
2575 yError () <<
"Failure of askRemoteValues() inside embObjMotionControl::checkMotionDoneRaw for all joints of" << getBoardInfo();
2579 for(
int j=0; j<_njoints; j++)
2581 *flag &= ismotiondoneList[j];
2591 _ref_speeds[index] = sp;
2599 for(
int j=0, index=0; j< _njoints; j++, index++)
2601 _ref_speeds[index] = spds[index];
2613 _ref_accs[j ] = 1e6;
2615 else if (
acc < -1e6)
2617 _ref_accs[j ] = -1e6;
2621 _ref_accs[j ] =
acc;
2631 for(
int j=0, index=0; j< _njoints; j++, index++)
2635 _ref_accs[index] = 1e6;
2637 else if (accs[j] < -1e6)
2639 _ref_accs[index] = -1e6;
2643 _ref_accs[index] = accs[j];
2651 if (j<0 || j>_njoints)
return false;
2652#if ASK_REFERENCE_TO_FIRMWARE
2653 *spd = _ref_speeds[j];
2656 *spd = _ref_speeds[j];
2663 memcpy(spds, _ref_speeds,
sizeof(
double) * _njoints);
2669 *
acc = _ref_accs[j];
2675 memcpy(accs, _ref_accs,
sizeof(
double) * _njoints);
2681 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_stoptrajectory);
2683 eObool_t stop = eobool_true;
2691 for(
int j=0; j< _njoints; j++)
2706 for(
int j=0; j<n_joint; j++)
2716 for(
int j=0; j<n_joint; j++)
2727 for(
int j=0; j<n_joint; j++)
2729 if(joints[j] >= _njoints)
2731 yError() << getBoardInfo() <<
":checkMotionDoneRaw required for not existing joint ( " << joints[j] <<
")";
2737 std::vector <eObool_t> ismotiondoneList(_njoints);
2738 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_core_modes_ismotiondone, ismotiondoneList);
2741 yError () << getBoardInfo() <<
"Failure of askRemoteValues() inside embObjMotionControl::checkMotionDoneRaw for a group of joint"; getBoardInfo();
2746 bool tot_val =
true;
2747 for(
int j=0; j<n_joint; j++)
2749 tot_val &= ismotiondoneList[joints[j]];
2760 for(
int j=0; j<n_joint; j++)
2770 for(
int j=0; j<n_joint; j++)
2780 for(
int j=0; j<n_joint; j++)
2790 for(
int j=0; j<n_joint; j++)
2800 for(
int j=0; j<n_joint; j++)
2802 ret = ret &&
stopRaw(joints[j]);
2813 eOmc_joint_status_core_t jcore = {0};
2814 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
2818 eOmc_controlmode_t
type = (eOmc_controlmode_t) jcore.modes.controlmodestatus;
2828 for(
int j=0; j< _njoints; j++)
2838 for(
int j=0; j< n_joint; j++)
2853 eOenum08_t controlmodecommand = 0;
2855 if((_mode == VOCAB_CM_TORQUE) && (_trq_pids[j].enabled ==
false))
2857 yError()<<
"Torque control is disabled. Check your configuration parameters";
2863 yError() <<
"SetControlMode: received unknown control mode for " << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(_mode);
2867 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_controlmode);
2870 yError() <<
"setControlModeRaw failed for " << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(_mode);
2875 ret = checkRemoteControlModeStatus(j, _mode);
2879 yError() <<
"In embObjMotionControl::setControlModeRaw(j=" << j <<
", mode=" << yarp::os::Vocab32::decode(_mode).c_str() <<
") for " << getBoardInfo() <<
" has failed checkRemoteControlModeStatus()";
2889 eOenum08_t controlmodecommand = 0;
2892 for(
int i=0; i<n_joint; i++)
2894 if ((modes[i] == VOCAB_CM_TORQUE) && (_trq_pids[i].enabled ==
false)) {yError()<<
"Torque control is disabled. Check your configuration parameters";
continue;}
2898 yError() <<
"SetControlModesRaw(): received unknown control mode for " << getBoardInfo() <<
" joint " << joints[i] <<
" mode " << Vocab32::decode(modes[i]);
2903 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, joints[i], eoprot_tag_mc_joint_cmmnds_controlmode);
2906 yError() <<
"setControlModesRaw() could not send set<cmmnds_controlmode> for " << getBoardInfo() <<
" joint " << joints[i] <<
" mode " << Vocab32::decode(modes[i]);
2911 bool tmpresult = checkRemoteControlModeStatus(joints[i], modes[i]);
2912 if(
false == tmpresult)
2914 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]);
2917 ret = ret && tmpresult;
2927 eOenum08_t controlmodecommand = 0;
2929 for(
int i=0; i<_njoints; i++)
2932 if ((modes[i] == VOCAB_CM_TORQUE) && (_trq_pids[i].enabled ==
false))
2934 yError()<<
"Torque control is disabled. Check your configuration parameters";
2940 yError() <<
"SetControlMode: received unknown control mode for" << getBoardInfo() <<
" joint " << i <<
" mode " << Vocab32::decode(modes[i]);
2944 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, i, eoprot_tag_mc_joint_cmmnds_controlmode);
2947 yError() <<
"setControlModesRaw failed for " << getBoardInfo() <<
" joint " << i <<
" mode " << Vocab32::decode(modes[i]);
2951 bool tmpresult = checkRemoteControlModeStatus(i, modes[i]);
2952 if(
false == tmpresult)
2954 yError() <<
"setControlModesRaw(int *modes) could not check with checkRemoteControlModeStatus() for" << getBoardInfo() <<
" joint " << i <<
" mode " << Vocab32::decode(modes[i]);
2957 ret = ret && tmpresult;
2990 eOmc_joint_status_core_t core;
2991 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
2997 *value = (double) core.measures.meas_position;
3001 yError() <<
"embObjMotionControl while reading encoder";
3011 for(
int j=0; j< _njoints; j++)
3021 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
3022 eOmc_joint_status_core_t core;
3029 *sp = (double) core.measures.meas_velocity;
3036 for(
int j=0; j< _njoints; j++)
3045 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
3046 eOmc_joint_status_core_t core;
3052 *
acc = (double) core.measures.meas_acceleration;
3059 for(
int j=0; j< _njoints; j++)
3071 std::lock_guard<std::mutex> lck(_mutex);
3072 for(
int i=0; i<_njoints; i++)
3073 stamps[i] = _encodersStamp[i];
3080 std::lock_guard<std::mutex> lck(_mutex);
3081 *stamp = _encodersStamp[j];
3125 eOmc_motor_status_basic_t status;
3126 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_status_basic);
3131 *value = (double) status.mot_position;
3135 yError() <<
"embObjMotionControl while reading motor encoder position";
3145 for(
int j=0; j< _njoints; j++)
3155 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_status_basic);
3156 eOmc_motor_status_basic_t tmpMotorStatus;
3160 *sp = (double) tmpMotorStatus.mot_velocity;
3164 yError() <<
"embObjMotionControl while reading motor encoder speed";
3173 for(
int j=0; j< _njoints; j++)
3182 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_status_basic);
3183 eOmc_motor_status_basic_t tmpMotorStatus;
3187 *
acc = (double) tmpMotorStatus.mot_acceleration;
3191 yError() <<
"embObjMotionControl while reading motor encoder acceleration";
3200 for(
int j=0; j< _njoints; j++)
3210 std::lock_guard<std::mutex> lck(_mutex);
3211 for(
int i=0; i<_njoints; i++)
3212 stamps[i] = _encodersStamp[i];
3219 std::lock_guard<std::mutex> lck(_mutex);
3220 *stamp = _encodersStamp[m];
3239 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_status_basic);
3240 eOmc_motor_status_basic_t tmpMotorStatus;
3243 *value = (double) tmpMotorStatus.mot_current;
3250 for(
int j=0; j< _njoints; j++)
3259 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config_currentlimits);
3261 eOmc_current_limits_params_t currentlimits = {0};
3263 if(!askRemoteValue(protid, ¤tlimits, size))
3265 yError() <<
"embObjMotionControl::setMaxCurrentRaw() could not read max current for " << getBoardInfo() <<
"joint " << j;
3270 currentlimits.overloadCurrent = (eOmeas_current_t)
S_16(val);
3278 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config_currentlimits);
3280 eOmc_current_limits_params_t currentlimits = {0};
3283 if(!askRemoteValue(protid, ¤tlimits, size))
3285 yError() <<
"embObjMotionControl::getMaxCurrentRaw() could not read max current for " << getBoardInfo() <<
"joint " << j;
3289 *val = (double) currentlimits.overloadCurrent;
3297 (_enabledAmp[j ]) ? *st = 1 : *st = 0;
3304 for(
int j=0; j<_njoints; j++)
3306 sts[j] = _enabledAmp[j];
3312#ifdef IMPLEMENT_DEBUG_INTERFACE
3317bool embObjMotionControl::setParameterRaw(
int j,
unsigned int type,
double value) {
return NOT_YET_IMPLEMENTED(
"setParameterRaw"); }
3318bool embObjMotionControl::getParameterRaw(
int j,
unsigned int type,
double* value) {
return NOT_YET_IMPLEMENTED(
"getParameterRaw"); }
3319bool embObjMotionControl::getDebugParameterRaw(
int j,
unsigned int index,
double* value) {
return NOT_YET_IMPLEMENTED(
"getDebugParameterRaw"); }
3320bool embObjMotionControl::setDebugParameterRaw(
int j,
unsigned int index,
double value) {
return NOT_YET_IMPLEMENTED(
"setDebugParameterRaw"); }
3321bool embObjMotionControl::setDebugReferencePositionRaw(
int j,
double value) {
return NOT_YET_IMPLEMENTED(
"setDebugReferencePositionRaw"); }
3322bool embObjMotionControl::getDebugReferencePositionRaw(
int j,
double* value) {
return NOT_YET_IMPLEMENTED(
"getDebugReferencePositionRaw");}
3330 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_userlimits);
3332 eOmeas_position_limits_t limits;
3333 limits.max = (eOmeas_position_t)
S_32(max);
3334 limits.min = (eOmeas_position_t)
S_32(min);
3341 yError() <<
"while setting position limits for joint" << j <<
" \n";
3348 eOmeas_position_limits_t limits;
3349 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_userlimits);
3352 if(! askRemoteValue(protoid, &limits, size))
3355 *min = (double)limits.min + SAFETY_THRESHOLD;
3356 *max = (double)limits.max - SAFETY_THRESHOLD;
3362 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3364 eOmc_motor_config_t motor_cfg;
3365 if(! askRemoteValue(protoid, &motor_cfg, size))
3369 *gearbox = (double)motor_cfg.gearbox_M2J;
3376 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3378 eOmc_motor_config_t motor_cfg;
3379 if(! askRemoteValue(protoid, &motor_cfg, size))
3381 *rotorMax = (double)( motor_cfg.limitsofrotor.max);
3382 *rotorMin = (double)( motor_cfg.limitsofrotor.min);
3388 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config);
3390 eOmc_joint_config_t joint_cfg;
3391 if(! askRemoteValue(protoid, &joint_cfg, size))
3395 type = (int)joint_cfg.tcfiltertype;
3401 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3403 eOmc_motor_config_t motor_cfg;
3404 if(! askRemoteValue(protoid, &motor_cfg, size))
3408 rotres = (double)motor_cfg.rotorEncoderResolution;
3415 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config);
3417 eOmc_joint_config_t joint_cfg;
3418 if(! askRemoteValue(protoid, &joint_cfg, size))
3422 jntres = (double)joint_cfg.jntEncoderResolution;
3429 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config);
3431 eOmc_joint_config_t joint_cfg;
3432 if(! askRemoteValue(protoid, &joint_cfg, size))
3436 type = (int)joint_cfg.jntEncoderType;
3443 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3445 eOmc_motor_config_t motor_cfg;
3446 if(! askRemoteValue(protoid, &motor_cfg, size))
3450 type = (int)motor_cfg.rotorEncoderType;
3457 yError(
"getKinematicMJRaw not yet implemented");
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 ret = (int)motor_cfg.hasTempSensor;
3497 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3499 eOmc_motor_config_t motor_cfg;
3500 if(! askRemoteValue(protoid, &motor_cfg, size))
3504 ret = (int)motor_cfg.hasHallSensor;
3511 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3513 eOmc_motor_config_t motor_cfg;
3514 if(! askRemoteValue(protoid, &motor_cfg, size))
3518 ret = (int)motor_cfg.hasRotorEncoder;
3525 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3527 eOmc_motor_config_t motor_cfg;
3528 if(! askRemoteValue(protoid, &motor_cfg, size))
3532 ret = (int)motor_cfg.hasRotorEncoderIndex;
3539 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3542 eOmc_motor_config_t motor_cfg;
3543 if(! askRemoteValue(protoid, &motor_cfg, size))
3547 poles = (int)motor_cfg.motorPoles;
3554 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
3556 eOmc_motor_config_t motor_cfg;
3557 if(! askRemoteValue(protoid, &motor_cfg, size))
3561 rotorOffset = (double)motor_cfg.rotorIndexOffset;
3568 if (axis >= 0 && axis < _njoints)
3570 name = _axesInfo[axis].name;
3582 if (axis >= 0 && axis < _njoints)
3584 type = _axesInfo[axis].type;
3593bool embObjMotionControl::getJointDeadZoneRaw(
int j,
double &jntDeadZone)
3595 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config);
3597 eOmc_joint_config_t joint_cfg;
3598 if(! askRemoteValue(protoid, &joint_cfg, size))
3602 jntDeadZone = _measureConverter->posE2A((
double)joint_cfg.deadzone, _axisMap[j]);
3611 if (key ==
"kinematic_mj")
3614 Bottle& ret = val.addList();
3616 eOmn_serv_type_t mc_serv_type = (eOmn_serv_type_t)serviceConfig.
ethservice.configuration.type;
3617 if(iNeedCouplingsInfo())
3619 for (
int r=0; r<_njoints; r++)
3621 for (
int c = 0; c < _njoints; c++)
3625 ret.addFloat64(_couplingInfo.
matrixJ2M[4 * r + c]);
3631 ret.addFloat64(0.0);
3635 else if (key ==
"encoders")
3637 Bottle& r = val.addList();
for (
int i = 0; i < _njoints; i++) { r.addFloat64(_measureConverter->posA2E(1.0, i)); }
3640 else if (key ==
"rotorEncoderResolution")
3642 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getRotorEncoderResolutionRaw(i, tmp); r.addFloat64(tmp); }
3645 else if (key ==
"jointEncoderResolution")
3647 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getJointEncoderResolutionRaw(i, tmp); r.addFloat64(tmp); }
3650 else if (key ==
"gearbox_M2J")
3652 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp=0;
getGearboxRatioRaw(i, &tmp); r.addFloat64(tmp); }
3655 else if (key ==
"gearbox_E2J")
3657 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp=0; getGerabox_E2J(i, &tmp); r.addFloat64(tmp); }
3660 else if (key ==
"hasHallSensor")
3662 Bottle& r = val.addList();
for (
int i = 0; i < _njoints; i++) {
int tmp = 0;
getHasHallSensorRaw(i, tmp); r.addInt32(tmp); }
3665 else if (key ==
"hasTempSensor")
3667 Bottle& r = val.addList();
for (
int i = 0; i < _njoints; i++) {
int tmp = 0;
getHasTempSensorsRaw(i, tmp); r.addInt32(tmp); }
3670 else if (key ==
"TemperatureSensorType")
3672 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) { std::string tmp =
"";
getTemperatureSensorTypeRaw(i, tmp); r.addString(tmp); }
3675 else if (key ==
"hasRotorEncoder")
3677 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
int tmp = 0;
getHasRotorEncoderRaw(i, tmp); r.addInt32(tmp); }
3680 else if (key ==
"hasRotorEncoderIndex")
3682 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
int tmp = 0;
getHasRotorEncoderIndexRaw(i, tmp); r.addInt32(tmp); }
3685 else if (key ==
"rotorIndexOffset")
3687 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getRotorIndexOffsetRaw(i, tmp); r.addFloat64(tmp); }
3690 else if (key ==
"motorPoles")
3692 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
int tmp = 0;
getMotorPolesRaw(i, tmp); r.addInt32(tmp); }
3695 else if (key ==
"pidCurrentKp")
3697 Bottle& r = val.addList();
for (
int i = 0; i < _njoints; i++) { Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_CURRENT, i, &
p); r.addFloat64(
p.kp); }
3700 else if (key ==
"pidCurrentKi")
3702 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) { Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_CURRENT, i, &
p); r.addFloat64(
p.ki); }
3705 else if (key ==
"pidCurrentShift")
3707 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) { Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_CURRENT, i, &
p); r.addFloat64(
p.scale); }
3710 else if (key ==
"pidCurrentOutput")
3712 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); }
3715 else if (key ==
"jointEncoderType")
3717 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++)
3723 yError(
"Invalid jointEncoderType");
3729 else if (key ==
"rotorEncoderType")
3731 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++)
3737 yError(
"Invalid motorEncoderType");
3743 else if (key ==
"coulombThreshold")
3745 val.addString(
"not implemented yet");
3748 else if (key ==
"torqueControlFilterType")
3753 else if (key ==
"torqueControlEnabled")
3756 Bottle& r = val.addList();
3757 for(
int i = 0; i<_njoints; i++)
3759 r.addInt32((
int)_trq_pids[i].enabled );
3763 else if (key ==
"PWMLimit")
3765 Bottle& r = val.addList();
for (
int i = 0; i< _njoints; i++) {
double tmp = 0;
getPWMLimitRaw(i, &tmp); r.addFloat64(tmp); }
3768 else if (key ==
"motOverloadCurr")
3770 Bottle& r = val.addList();
for (
int i = 0; i< _njoints; i++) {
double tmp = 0;
getMaxCurrentRaw(i, &tmp); r.addFloat64(tmp); }
3773 else if (key ==
"motNominalCurr")
3775 Bottle& r = val.addList();
for (
int i = 0; i< _njoints; i++) {
double tmp = 0;
getNominalCurrentRaw(i, &tmp); r.addFloat64(tmp); }
3778 else if (key ==
"motPeakCurr")
3780 Bottle& r = val.addList();
for (
int i = 0; i< _njoints; i++) {
double tmp = 0;
getPeakCurrentRaw(i, &tmp); r.addFloat64(tmp); }
3783 else if (key ==
"PowerSuppVoltage")
3785 Bottle& r = val.addList();
for (
int i = 0; i< _njoints; i++) {
double tmp = 0;
getPowerSupplyVoltageRaw(i, &tmp); r.addFloat64(tmp); }
3788 else if (key ==
"rotorMax")
3791 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getRotorLimitsRaw(i, &tmp1, &tmp2); r.addFloat64(tmp2); }
3794 else if (key ==
"rotorMin")
3797 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getRotorLimitsRaw(i, &tmp1, &tmp2); r.addFloat64(tmp1); }
3800 else if (key ==
"jointMax")
3803 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getLimitsRaw(i, &tmp1, &tmp2); r.addFloat64(tmp2); }
3806 else if (key ==
"jointMin")
3809 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0;
getLimitsRaw(i, &tmp1, &tmp2); r.addFloat64(tmp1); }
3812 else if (key ==
"jointEncTolerance")
3815 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0; getJointEncTolerance(i, &tmp1); r.addFloat64(tmp1); }
3818 else if (key ==
"motorEncTolerance")
3821 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0; getMotorEncTolerance(i, &tmp1); r.addFloat64(tmp1); }
3824 else if (key ==
"jointDeadZone")
3827 Bottle& r = val.addList();
for (
int i = 0; i<_njoints; i++) {
double tmp = 0; getJointDeadZoneRaw(i, tmp1); r.addFloat64(tmp1); }
3830 else if (key ==
"readonly_position_PIDraw")
3832 Bottle& r = val.addList();
3833 for (
int i = 0; i < _njoints; i++)
3835 getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_POSITION, i, &
p);
3837 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);
3842 else if (key ==
"readonly_velocity_PIDraw")
3844 Bottle& r = val.addList();
3845 for (
int i = 0; i < _njoints; i++)
3846 { Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_VELOCITY, i, &
p);
3848 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);
3853 else if (key ==
"readonly_torque_PIDraw")
3855 Bottle& r = val.addList();
3856 for (
int i = 0; i < _njoints; i++)
3857 { Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_TORQUE, i, &
p);
3859 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);
3864 else if (key ==
"readonly_current_PIDraw")
3866 Bottle& r = val.addList();
3867 for (
int i = 0; i < _njoints; i++)
3868 { Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_CURRENT, i, &
p);
3870 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);
3875 else if (key ==
"readonly_llspeed_PIDraw")
3877 Bottle& r = val.addList();
3878 for (
int i = 0; i < _njoints; i++)
3880 Pid
p;
getPidRaw(PidControlTypeEnum::VOCAB_PIDTYPE_VELOCITY, i, &
p);
3882 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);
3887 else if (key ==
"readonly_motor_torque_params_raw")
3889 Bottle& r = val.addList();
3890 for (
int i = 0; i < _njoints; i++)
3892 MotorTorqueParameters params;
3895 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);
3900 yWarning(
"getRemoteVariable(): Unknown variable %s", key.c_str());
3906 string s1 = val.toString();
3907 if (val.size() != _njoints)
3909 yWarning(
"setRemoteVariable(): Protocol error %s", s1.c_str());
3913 if (key ==
"kinematic_mj")
3915 yWarning(
"setRemoteVariable(): Impossible to set kinematic_mj parameter at runtime.");
3928 else if (key ==
"PWMLimit")
3930 for (
int i = 0; i < _njoints; i++)
setPWMLimitRaw(i, val.get(i).asFloat64());
3935 else if (key ==
"jointMax")
3938 for (
int i = 0; i < _njoints; i++)
3945 else if (key ==
"jointMin")
3948 for (
int i = 0; i < _njoints; i++)
3955 yWarning(
"setRemoteVariable(): Unknown variable %s", key.c_str());
3961 listOfKeys->clear();
3962 listOfKeys->addString(
"kinematic_mj");
3963 listOfKeys->addString(
"encoders");
3964 listOfKeys->addString(
"gearbox_M2J");
3965 listOfKeys->addString(
"gearbox_E2J");
3966 listOfKeys->addString(
"hasHallSensor");
3967 listOfKeys->addString(
"hasTempSensor");
3968 listOfKeys->addString(
"TemperatureSensorType");
3969 listOfKeys->addString(
"hasRotorEncoder");
3970 listOfKeys->addString(
"hasRotorEncoderIndex");
3971 listOfKeys->addString(
"rotorIndexOffset");
3972 listOfKeys->addString(
"rotorEncoderResolution");
3973 listOfKeys->addString(
"jointEncoderResolution");
3974 listOfKeys->addString(
"motorPoles");
3975 listOfKeys->addString(
"pidCurrentKp");
3976 listOfKeys->addString(
"pidCurrentKi");
3977 listOfKeys->addString(
"pidCurrentShift");
3978 listOfKeys->addString(
"pidCurrentOutput");
3979 listOfKeys->addString(
"coulombThreshold");
3980 listOfKeys->addString(
"torqueControlFilterType");
3981 listOfKeys->addString(
"jointEncoderType");
3982 listOfKeys->addString(
"rotorEncoderType");
3983 listOfKeys->addString(
"PWMLimit");
3984 listOfKeys->addString(
"motOverloadCurr");
3985 listOfKeys->addString(
"motNominalCurr");
3986 listOfKeys->addString(
"motPeakCurr");
3987 listOfKeys->addString(
"PowerSuppVoltage");
3988 listOfKeys->addString(
"rotorMax");
3989 listOfKeys->addString(
"rotorMin");
3990 listOfKeys->addString(
"jointMax");
3991 listOfKeys->addString(
"jointMin");
3992 listOfKeys->addString(
"jointEncTolerance");
3993 listOfKeys->addString(
"motorEncTolerance");
3994 listOfKeys->addString(
"jointDeadZone");
3995 listOfKeys->addString(
"readonly_position_PIDraw");
3996 listOfKeys->addString(
"readonly_velocity_PIDraw");
3997 listOfKeys->addString(
"readonly_current_PIDraw");
3998 listOfKeys->addString(
"readonly_torque_PIDraw");
3999 listOfKeys->addString(
"readonly_motor_torque_params_raw");
4011 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, axis, eoprot_tag_mc_joint_config);
4013 eOmc_joint_config_t joint_cfg;
4014 if(! askRemoteValue(protoid, &joint_cfg, size))
4017 *max = joint_cfg.maxvelocityofjoint;
4033 return VAS_status::VAS_OK;
4045 for(
int j=0; j< _njoints; j++)
4054 int j = _axisMap[userLevel_jointNumber];
4056 eOmeas_torque_t meas_torque = 0;
4057 static double curr_time = Time::now();
4058 static int count_saturation=0;
4060 meas_torque = (eOmeas_torque_t)
S_32(_measureConverter->trqN2S(fTorque, j));
4062 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_inputs_externallymeasuredtorque);
4077 eOmc_joint_status_core_t jstatus;
4078 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
4080 *t = (double) _measureConverter->trqS2N(jstatus.measures.meas_torque, j);
4087 for(
int j=0; j<_njoints; j++)
4105 for(
int j=0; j<_njoints && ret; j++)
4112 eOmc_setpoint_t setpoint;
4113 setpoint.type = (eOenum08_t) eomc_setpoint_torque;
4114 setpoint.to.torque.value = (eOmeas_torque_t)
S_32(t);
4116 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_setpoint);
4123 for(
int j=0; j< n_joint; j++)
4133 for(
int j=0; j<_njoints && ret; j++)
4140 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
4141 eOmc_joint_status_core_t jcore = {0};
4147 yError() <<
"embObjMotionControl::getRefTorqueRaw() could not read pid torque reference pos for " << getBoardInfo() <<
"joint " << j;
4151 if ((eOmc_interactionmode_compliant == jcore.modes.interactionmodestatus) &&
4152 (eomc_controlmode_position == jcore.modes.controlmodestatus))
4154 *t = (double) jcore.ofpid.complpos.reftrq;
4157 if(eomc_controlmode_torque == jcore.modes.controlmodestatus)
4159 *t = (double) jcore.ofpid.torque.reftrq;
4165bool embObjMotionControl::helper_setTrqPidRaw(
int j,
const Pid &pid)
4173 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_pidtorque);
4177bool embObjMotionControl::helper_getTrqPidRaw(
int j, Pid *pid)
4179 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_pidtorque);
4183 if(! askRemoteValue(protoid, &eoPID, size))
4192bool embObjMotionControl::helper_getTrqPidsRaw(Pid *pid)
4194 std::vector<eOmc_PID_t> eoPIDList (_njoints);
4195 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_config_pidtorque, eoPIDList);
4198 for(
int j=0; j< _njoints; j++)
4210 eOmc_impedance_t val;
4215 *stiffness = (double) (val.stiffness);
4216 *damping = (double) (val.damping);
4224 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_impedance);
4226 if(! askRemoteValue(protoid, &imped, size))
4230 _cacheImpedance->damping = imped.damping;
4231 _cacheImpedance->stiffness = imped.stiffness;
4232 _cacheImpedance->offset = imped.offset;
4239 eOmc_impedance_t val;
4247 _cacheImpedance[j].stiffness = (eOmeas_stiffness_t) stiffness;
4248 _cacheImpedance[j].damping = (eOmeas_damping_t) damping;
4250 val.stiffness = _cacheImpedance[j].stiffness;
4251 val.damping = _cacheImpedance[j].damping;
4252 val.offset = _cacheImpedance[j].offset;
4254 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_impedance);
4264 eOmc_impedance_t val;
4270 _cacheImpedance[j].offset = (eOmeas_torque_t)
S_32(
offset);
4271 val.stiffness = _cacheImpedance[j].stiffness;
4272 val.damping = _cacheImpedance[j].damping;
4273 val.offset = _cacheImpedance[j].offset;
4275 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_impedance);
4285 eOmc_impedance_t val;
4296 *min_stiff = _impedance_limits[j].
min_stiff;
4297 *max_stiff = _impedance_limits[j].
max_stiff;
4298 *min_damp = _impedance_limits[j].
min_damp;
4299 *max_damp = _impedance_limits[j].
max_damp;
4305 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_motor_params);
4308 eOmc_motor_params_t eo_params = {0};
4309 if(! askRemoteValue(protoid, &eo_params, size))
4312 params->bemf = eo_params.bemf_value;
4313 params->bemf_scale = eo_params.bemf_scale;
4314 params->ktau = eo_params.ktau_value;
4315 params->ktau_scale = eo_params.ktau_scale;
4316 params->viscousPos = eo_params.friction.viscous_pos_val;
4317 params->viscousNeg = eo_params.friction.viscous_neg_val ;
4318 params->coulombPos = eo_params.friction.coulomb_pos_val;
4319 params->coulombNeg = eo_params.friction.coulomb_neg_val;
4320 params->velocityThres = eo_params.friction.velocityThres_val;
4329 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_motor_params);
4330 eOmc_motor_params_t eo_params = {0};
4334 eo_params.bemf_value = (float) params.bemf;
4335 eo_params.bemf_scale = (uint8_t) params.bemf_scale;
4336 eo_params.ktau_value = (float) params.ktau;
4337 eo_params.ktau_scale = (uint8_t) params.ktau_scale;
4338 eo_params.friction.viscous_pos_val =
static_cast<float32_t
>(params.viscousPos);
4339 eo_params.friction.viscous_neg_val =
static_cast<float32_t
>(params.viscousNeg);
4340 eo_params.friction.coulomb_pos_val =
static_cast<float32_t
>(params.coulombPos);
4341 eo_params.friction.coulomb_neg_val =
static_cast<float32_t
>(params.coulombNeg);
4342 eo_params.friction.velocityThres_val =
static_cast<float32_t
>(params.velocityThres);
4347 yError() <<
"embObjMotionControl::setMotorTorqueParamsRaw() could not send set message for" << getBoardInfo() <<
"joint " << j;
4359 for(
int j=0; j< n_joint; j++)
4393bool embObjMotionControl::helper_getVelPidRaw(
int j, Pid *pid)
4395 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_config_piddirect);
4398 if(! askRemoteValue(protoid, &eoPID, size))
4408bool embObjMotionControl::helper_getVelPidsRaw(Pid *pid)
4410 std::vector <eOmc_PID_t> eoPIDList (_njoints);
4411 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_config_piddirect, eoPIDList);
4415 for(
int j=0; j<_njoints; j++)
4430 if (mode != VOCAB_CM_POSITION_DIRECT &&
4431 mode != VOCAB_CM_IDLE)
4435 yError() <<
"setReferenceRaw: skipping command because" << getBoardInfo() <<
" joint " << j <<
" is not in VOCAB_CM_POSITION_DIRECT mode";
4440 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_setpoint);
4441 eOmc_setpoint_t setpoint = {0};
4443 _ref_positions[j] = ref;
4444 setpoint.type = (eOenum08_t) eomc_setpoint_positionraw;
4445 setpoint.to.position.value = (eOmeas_position_t)
S_32(ref);
4446 setpoint.to.position.withvelocity = 0;
4454 for(
int i=0; i<n_joint; i++)
4464 for (
int i = 0; i<_njoints; i++)
4474 if (axis<0 || axis>_njoints)
return false;
4475#if ASK_REFERENCE_TO_FIRMWARE
4476 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, axis, eoprot_tag_mc_joint_status_target);
4481 eOmc_joint_status_target_t target = {0};
4482 if(!askRemoteValue(id32, &target, size))
4484 yError() <<
"embObjMotionControl::getTargetPositionRaw() could not read reference pos for " << getBoardInfo() <<
"joint " << axis;
4488 *ref = (double) target.trgt_position;
4492 *ref = _ref_command_positions[axis];
4500 for (
int i = 0; i<_njoints; i++)
4510 for (
int i = 0; i<nj; i++)
4519 if (axis<0 || axis>_njoints)
return false;
4520#if ASK_REFERENCE_TO_FIRMWARE
4521 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, axis, eoprot_tag_mc_joint_status_target);
4526 eOmc_joint_status_target_t target = {0};
4527 if(!askRemoteValue(id32, &target, size))
4529 yError() <<
"embObjMotionControl::getRefVelocityRaw() could not read reference vel for " << getBoardInfo() <<
"joint " << axis;
4532 *ref = (double) target.trgt_velocity;
4535 *ref = _ref_command_speeds[axis];
4542 #if ASK_REFERENCE_TO_FIRMWARE
4543 std::vector <eOmc_joint_status_target_t> targetList(_njoints);
4544 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_target, targetList);
4547 yError() <<
"embObjMotionControl::getRefVelocitiesRaw() could not read reference vel for " << getBoardInfo() ;
4551 for(
int j=0; j<_njoints; j++)
4553 refs[j] = (double) targetList[j].trgt_velocity;
4557 for(
int j=0; j<_njoints; j++)
4559 refs[j] = _ref_command_speeds[j];
4567 std::vector <double> refsList(_njoints);
4571 for (
int i = 0; i<nj; i++)
4573 if(
jnts[i]>= _njoints)
4575 yError() << getBoardInfo() <<
"getRefVelocitiesRaw: joint " <<
jnts[i] <<
"doesn't exist";
4578 refs[i] = refsList[
jnts[i]];
4585 if (axis<0 || axis>_njoints)
return false;
4586#if ASK_REFERENCE_TO_FIRMWARE
4587 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, axis, eoprot_tag_mc_joint_status_target);
4591 eOmc_joint_status_target_t target = {0};
4592 if(!askRemoteValue(id32, &target, size))
4594 yError() <<
"embObjMotionControl::getRefPositionRaw() could not read reference pos for " << getBoardInfo() <<
"joint " << axis;
4598 *ref = (double) target.trgt_positionraw;
4601 *ref = _ref_positions[axis];
4608 #if ASK_REFERENCE_TO_FIRMWARE
4609 std::vector <eOmc_joint_status_target_t> targetList(_njoints);
4610 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_target, targetList);
4613 yError() <<
"embObjMotionControl::getRefPositionRaw() could not read reference pos for " << getBoardInfo();
4617 for(
int j=0; j< _njoints; j++)
4618 refs[j] = (
double) targetList[j].trgt_positionraw;
4621 for(
int j=0; j< _njoints; j++)
4622 refs[j] = _ref_positions[j];
4630 for (
int i = 0; i<nj; i++)
4643 eOenum08_t interactionmodestatus;
4646 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core_modes_interactionmodestatus);
4650 int tmp = (int) *_mode;
4654 *_mode = (yarp::dev::InteractionModeEnum) tmp;
4673 for(
int j=0; j<_njoints; j++)
4683 eOenum08_t interactionmodecommand = 0;
4688 if (_mode == VOCAB_IM_COMPLIANT && _trq_pids[j].enabled ==
false) {yError()<<
"Torque control is disabled. Check your configuration parameters";
return false;}
4692 yError() <<
"setInteractionModeRaw: received unknown mode for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(_mode);
4695 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_interactionmode);
4697 if(
false == res->
setRemoteValue(protid, &interactionmodecommand) )
4699 yError() <<
"setInteractionModeRaw failed for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(_mode);
4705 eOenum08_t interactionmodestatus = 0;
4707 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_interactionmodestatus);
4708 bool ret = askRemoteValue(id32, &interactionmodestatus, size);
4710 if((
false == ret) || (interactionmodecommand != interactionmodestatus))
4712 yError() <<
"check of embObjMotionControl::setInteractionModeRaw() failed for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(_mode);
4725 eOenum08_t interactionmodecommand = 0;
4727 for(
int j=0; j<n_joints; j++)
4729 if (modes[j] == VOCAB_IM_COMPLIANT && _trq_pids[j].enabled ==
false) {yError()<<
"Torque control is disabled. Check your configuration parameters";
continue;}
4733 yError() <<
"embObjMotionControl::setInteractionModesRaw(): received unknown interactionMode for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(modes[j]) <<
" " << modes[j];
4737 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_interactionmode);
4738 if(
false == res->
setRemoteValue(protid, &interactionmodecommand) )
4740 yError() <<
"embObjMotionControl::setInteractionModesRaw() failed for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(modes[j]);
4746 eOenum08_t interactionmodestatus = 0;
4748 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_interactionmodestatus);
4749 bool ret = askRemoteValue(id32, &interactionmodestatus, size);
4751 if((
false == ret) || (interactionmodecommand != interactionmodestatus))
4755 yError() <<
"check of embObjMotionControl::setInteractionModesRaw() failed for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(modes[j]);
4761 yError() <<
"setInteractionModeRaw failed for" << getBoardInfo() <<
" joint " << j <<
" because of interactionMode mismatching \n\tSet " \
4762 << Vocab32::decode(modes[j]) <<
" Got " << Vocab32::decode(tmp);
4764 yError() <<
"setInteractionModeRaw failed for" << getBoardInfo() <<
" joint " << j <<
" because of interactionMode mismatching \n\tSet " \
4765 << Vocab32::decode(modes[j]) <<
" Got an unknown value!";
4778 eOenum08_t interactionmodecommand = 0;
4780 for(
int j=0; j<_njoints; j++)
4782 if ((modes[j] == VOCAB_IM_COMPLIANT) && (_trq_pids[j].enabled ==
false))
4784 yError()<<
"Torque control is disabled. Check your configuration parameters";
4790 yError() <<
"setInteractionModeRaw: received unknown interactionMode for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(modes[j]);
4794 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_interactionmode);
4795 if(
false == res->
setRemoteValue(protid, &interactionmodecommand) )
4797 yError() <<
"setInteractionModeRaw failed for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(modes[j]);
4803 eOenum08_t interactionmodestatus = 0;
4805 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_interactionmodestatus);
4806 bool ret = askRemoteValue(id32, &interactionmodestatus, size);
4808 if((
false == ret) || (interactionmodecommand != interactionmodestatus))
4812 yError() <<
"check of embObjMotionControl::setInteractionModesRaw() failed for" << getBoardInfo() <<
" joint " << j <<
" mode " << Vocab32::decode(modes[j]);
4818 yError() <<
"setInteractionModeRaw failed for" << getBoardInfo() <<
" joint " << j <<
" because of interactionMode mismatching \n\tSet " \
4819 << Vocab32::decode(modes[j]) <<
" Got " << Vocab32::decode(tmp);
4821 yError() <<
"setInteractionModeRaw failed for" << getBoardInfo() <<
" joint " << j <<
" because of interactionMode mismatching \n\tSet " \
4822 << Vocab32::decode(modes[j]) <<
" Got an unknown value!";
4835 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_core);
4836 eOmc_joint_status_core_t jcore = {0};
4843 case VOCAB_PIDTYPE_POSITION:
4844 if((eomc_controlmode_torque == jcore.modes.controlmodestatus) || (eomc_controlmode_current == jcore.modes.controlmodestatus))
4847 *
out = (double) jcore.ofpid.generic.output;
4852 case VOCAB_PIDTYPE_TORQUE:
4853 if ((eomc_controlmode_torque == jcore.modes.controlmodestatus) ||
4854 ((eomc_controlmode_position == jcore.modes.controlmodestatus) && (eOmc_interactionmode_compliant == jcore.modes.interactionmodestatus)))
4855 *
out = jcore.ofpid.generic.output;
4859 case VOCAB_PIDTYPE_CURRENT:
4862 case VOCAB_PIDTYPE_VELOCITY:
4866 yError()<<
"Invalid pidtype:"<<pidtype;
4875 for(
int j=0; j< _njoints; j++)
4895 eOmc_motor_status_basic_t status;
4896 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_status_basic);
4907 yError() << getBoardInfo() <<
"At timestamp" << yarp::os::Time::now() <<
"In motor" << m <<
"embObjMotionControl::getTemperatureRaw failed to complete getLocalValue()";
4916 *val = _temperatureSensorsVector.at(m)->convertRawToTempCelsius((
double)status.mot_temperature);
4925 for(
int j=0; j< _njoints; j++)
4946 *temp= _temperatureLimits[m].warningTemperatureLimit;
4953 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_config_temperaturelimit);
4954 eOmeas_temperature_t temperatureLimit = (eOmeas_pwm_t)
S_16(temp);
4961 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_config_currentlimits);
4963 eOmc_current_limits_params_t currentlimits = {0};
4965 if(!askRemoteValue(protid, ¤tlimits, size))
4967 yError() <<
"embObjMotionControl::getPeakCurrentRaw() can't read current limits for" << getBoardInfo() <<
" motor " << m;
4971 *val = (double) currentlimits.peakCurrent ;
4977 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_config_currentlimits);
4980 eOmc_current_limits_params_t currentlimits = {0};
4981 if(!askRemoteValue(protid, ¤tlimits, size))
4983 yError() <<
"embObjMotionControl::setPeakCurrentRaw can't read current limits for" << getBoardInfo() <<
" motor " << m ;
4988 currentlimits.peakCurrent = (eOmeas_current_t)
S_16(val);
4994 yError() <<
"embObjMotionControl::setPeakCurrentRaw failed sending new value for" << getBoardInfo() <<
" motor " << m ;
5001 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_config_currentlimits);
5003 eOmc_current_limits_params_t currentlimits = {0};
5005 if(!askRemoteValue(protid, ¤tlimits, size))
5007 yError() <<
"embObjMotionControl::getNominalCurrentRaw() can't read current limits for" << getBoardInfo() <<
" motor " << m;
5011 *val = (double) currentlimits.nominalCurrent ;
5017 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, m, eoprot_tag_mc_motor_config_currentlimits);
5021 eOmc_current_limits_params_t currentlimits = {0};
5022 if(!askRemoteValue(protid, ¤tlimits, size))
5024 yError() <<
"embObjMotionControl::setNominalCurrentRaw can't read current limits for" << getBoardInfo() <<
" motor " << m ;
5029 currentlimits.nominalCurrent = (eOmeas_current_t)
S_16(val);
5035 yError() <<
"embObjMotionControl::setNominalCurrentRaw failed sending new value for" << getBoardInfo() <<
" motor " << m ;
5043 eOmc_motor_status_basic_t status;
5044 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_status_basic);
5049 *val = (double) status.mot_pwm;
5053 yError() <<
"embObjMotionControl::getPWMRaw failed for" << getBoardInfo() <<
" motor " << j ;
5062 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config_pwmlimit);
5064 eOmeas_pwm_t motorPwmLimit;
5066 bool ret = askRemoteValue(protid, &motorPwmLimit, size);
5069 *val = (double) motorPwmLimit;
5073 yError() <<
"embObjMotionControl::getPWMLimitRaw failed for" << getBoardInfo() <<
" motor " << j ;
5084 yError() <<
"embObjMotionControl::setPWMLimitRaw failed because pwmLimit is negative for" << getBoardInfo() <<
" motor " << j ;
5087 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config_pwmlimit);
5088 eOmeas_pwm_t motorPwmLimit = (eOmeas_pwm_t)
S_16(val);
5094 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_controller, 0, eoprot_tag_mc_controller_status);
5096 eOmc_controller_status_t controllerStatus;
5098 bool ret = askRemoteValue(protid, &controllerStatus, size);
5101 *val = (double) controllerStatus.supplyVoltage;
5105 yError() <<
"embObjMotionControl::getPowerSupplyVoltageRaw failed for" << getBoardInfo() <<
" motor " << j ;
5112bool embObjMotionControl::askRemoteValue(eOprotID32_t id32,
void* value, uint16_t& size)
5119bool embObjMotionControl::askRemoteValues(eOprotEndpoint_t ep, eOprotEntity_t entity, eOprotTag_t tag, std::vector<T>& values)
5121 std::vector<eOprotID32_t> idList;
5122 std::vector<void*> valueList;
5125 for(
int j=0; j<_njoints; j++)
5127 eOprotID32_t protoId = eoprot_ID_get(ep, entity, j, tag);
5128 idList.push_back(protoId);
5129 valueList.push_back((
void*)&values[j]);
5135 yError() <<
"embObjMotionControl::askRemoteValues failed for all joints of" << getBoardInfo();
5144bool embObjMotionControl::checkRemoteControlModeStatus(
int joint,
int target_mode)
5147 eOenum08_t temp = 0;
5150 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, joint, eoprot_tag_mc_joint_status_core_modes_controlmodestatus);
5151 const double timeout = 0.250;
5152 const int maxretries = 25;
5153 const double delaybetweenqueries = 0.010;
5157 double timeofstart = yarp::os::Time::now();
5160 for( attempt = 0; attempt < maxretries; attempt++)
5162 ret = askRemoteValue(id32, &temp, size);
5165 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());
5169 if(current_mode == target_mode)
5174 if((current_mode == VOCAB_CM_IDLE) && (target_mode == VOCAB_CM_FORCE_IDLE))
5179 if(current_mode == VOCAB_CM_HW_FAULT)
5181 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()); }
5186 if((yarp::os::Time::now()-timeofstart) > timeout)
5189 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());
5194 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());
5196 SystemClock::delaySystem(delaybetweenqueries);
5201 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);
5209bool embObjMotionControl::iNeedCouplingsInfo(
void)
5211 eOmn_serv_type_t mc_serv_type = (eOmn_serv_type_t)serviceConfig.
ethservice.configuration.type;
5212 if( (mc_serv_type == eomn_serv_MC_foc) ||
5213 (mc_serv_type == eomn_serv_MC_mc4plus) ||
5214 (mc_serv_type == eomn_serv_MC_mc4plusmais) ||
5215 (mc_serv_type == eomn_serv_MC_mc2pluspsc) ||
5216 (mc_serv_type == eomn_serv_MC_mc4plusfaps) ||
5217 (mc_serv_type == eomn_serv_MC_advfoc)
5227 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_setpoint);
5229 eOmc_setpoint_t setpoint;
5231 setpoint.type = (eOenum08_t)eomc_setpoint_openloop;
5232 setpoint.to.openloop.value = (eOmeas_pwm_t)
S_16(v);
5240 for (
int j = 0; j<_njoints; j++)
5249 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_target);
5252 eOmc_joint_status_target_t target = { 0 };
5255 if (!askRemoteValue(protoId, &target, size))
5257 yError() <<
"embObjMotionControl::getRefDutyCycleRaw() could not read openloop reference for " << getBoardInfo() <<
"joint " << j;
5261 *v = (double)target.trgt_pwm;
5268 std::vector <eOmc_joint_status_target_t> targetList(_njoints);
5269 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_target, targetList);
5272 yError() <<
"embObjMotionControl::getDutyCyclesRaw failed for all joints of" << getBoardInfo();
5275 for (
int j = 0; j<_njoints; j++)
5277 v[j]= targetList[j].trgt_pwm;
5284 eOmc_motor_status_basic_t status;
5285 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_status_basic);
5290 *v = (double)status.mot_pwm;
5294 yError() <<
"embObjMotionControl::getDutyCycleRaw failed for" << getBoardInfo() <<
" motor " << j;
5304 for (
int j = 0; j< _njoints; j++)
5326 for (
int j = 0; j< _njoints; j++)
5336 for (
int j = 0; j<_njoints; j++)
5345 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_cmmnds_setpoint);
5347 eOmc_setpoint_t setpoint;
5349 setpoint.type = (eOenum08_t)eomc_setpoint_current;
5350 setpoint.to.current.value = (eOmeas_pwm_t)
S_16(t);
5358 for (
int j = 0; j<n_joint; j++)
5367 std::vector <eOmc_joint_status_target_t> targetList(_njoints);
5368 bool ret = askRemoteValues(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, eoprot_tag_mc_joint_status_target, targetList);
5371 yError() <<
"embObjMotionControl::getDutyCyclesRaw failed for all joints of" << getBoardInfo();
5374 for (
int j = 0; j<_njoints; j++)
5376 t[j] = targetList[j].trgt_current;
5383 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_target);
5386 eOmc_joint_status_target_t target = { 0 };
5389 if (!askRemoteValue(protoId, &target, size))
5391 yError() <<
"embObjMotionControl::getRefDutyCycleRaw() could not read openloop reference for " << getBoardInfo() <<
"joint " << j;
5395 *t = (double)target.trgt_current;
5400bool embObjMotionControl::helper_setCurPidRaw(
int j,
const Pid &pid)
5402 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config_pidcurrent);
5406 if (!_cur_pids[j].enabled)
5408 yError() <<
"eoMc " << getBoardInfo() <<
": it is not possible set current pid for motor " << j <<
", because current pid is not enabled in xml files";
5416 yError() <<
"while setting velocity PIDs for" << getBoardInfo() <<
" joint " << j;
5425bool embObjMotionControl::helper_setSpdPidRaw(
int j,
const Pid &pid)
5427 eOprotID32_t protoId = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config_pidspeed);
5431 if (!_cur_pids[j].enabled)
5433 yError() <<
"eoMc " << getBoardInfo() <<
": it is not possible set speed pid for motor " << j <<
", because speed pid is not enabled in xml files";
5441 yError() <<
"while setting velocity PIDs for" << getBoardInfo() <<
" joint " << j;
5450bool embObjMotionControl::helper_getCurPidRaw(
int j, Pid *pid)
5452 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
5454 eOmc_motor_config_t motor_cfg;
5455 if(! askRemoteValue(protoid, &motor_cfg, size))
5459 eOmc_PID_t
tmp = (eOmc_PID_t)motor_cfg.pidcurrent;
5465bool embObjMotionControl::helper_getSpdPidRaw(
int j, Pid *pid)
5467 eOprotID32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, j, eoprot_tag_mc_motor_config);
5469 eOmc_motor_config_t motor_cfg;
5470 if (!askRemoteValue(protoid, &motor_cfg, size))
5474 eOmc_PID_t
tmp = (eOmc_PID_t)motor_cfg.pidspeed;
5480bool embObjMotionControl::helper_getCurPidsRaw(Pid *pid)
5482 std::vector <eOmc_motor_config_t> motor_cfg_list(_njoints);
5483 bool ret = askRemoteValues<eOmc_motor_config_t>(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, eoprot_tag_mc_motor_config, motor_cfg_list);
5487 for(
int j=0; j<_njoints; j++)
5489 eOmc_PID_t
tmp = (eOmc_PID_t)motor_cfg_list[j].pidcurrent;
5495bool embObjMotionControl::helper_getSpdPidsRaw(Pid *pid)
5497 std::vector <eOmc_motor_config_t> motor_cfg_list(_njoints);
5498 bool ret = askRemoteValues<eOmc_motor_config_t>(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, eoprot_tag_mc_motor_config, motor_cfg_list);
5502 for (
int j = 0; j<_njoints; j++)
5504 eOmc_PID_t
tmp = (eOmc_PID_t)motor_cfg_list[j].pidspeed;
5510bool embObjMotionControl::getJointConfiguration(
int joint, eOmc_joint_config_t *jntCfg_ptr)
5512 uint32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, joint, eoprot_tag_mc_joint_config);
5514 if(!askRemoteValue(protoid, jntCfg_ptr, size))
5522bool embObjMotionControl::getMotorConfiguration(
int axis, eOmc_motor_config_t *motCfg_ptr)
5524 uint32_t protoid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, axis, eoprot_tag_mc_motor_config);
5526 if(!askRemoteValue(protoid, motCfg_ptr, size))
5535bool embObjMotionControl::getGerabox_E2J(
int joint,
double *gearbox_E2J_ptr)
5537 eOmc_joint_config_t jntCfg;
5539 if(!getJointConfiguration(joint, &jntCfg))
5544 *gearbox_E2J_ptr = jntCfg.gearbox_E2J;
5548bool embObjMotionControl::getJointEncTolerance(
int joint,
double *jEncTolerance_ptr)
5550 eOmc_joint_config_t jntCfg;
5552 if(!getJointConfiguration(joint, &jntCfg))
5557 *jEncTolerance_ptr = jntCfg.jntEncTolerance;
5561bool embObjMotionControl::getMotorEncTolerance(
int axis,
double *mEncTolerance_ptr)
5563 eOmc_motor_config_t motorCfg;
5564 if(!getMotorConfiguration(axis, &motorCfg))
5569 *mEncTolerance_ptr = motorCfg.rotEncTolerance;
5575 eOmc_motor_status_t status;
5577 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol,
5578 eoprot_entity_mc_motor, j,
5579 eoprot_tag_mc_motor_status);
5588 message =
"Could not retrieve the fault state.";
5592 if (status.mc_fault_state == EOERROR_CODE_DUMMY)
5594 fault = EOERROR_CODE_DUMMY;
5595 message =
"No fault detected.";
5600 fault = eoerror_code2value(status.mc_fault_state);
5601 message = eoerror_code2string(status.mc_fault_state);
5606bool embObjMotionControl::getRawData_core(std::string key, std::vector<std::int32_t> &
data)
5611 for(
int j=0; j< _njoints; j++)
5613 eOmc_joint_status_additionalInfo_t addinfo;
5614 eOprotID32_t protid = eoprot_ID_get(eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, j, eoprot_tag_mc_joint_status_addinfo_multienc);
5619 for (
int k = 0; k < std::size(addinfo.multienc); k++)
5621 data.push_back((int32_t)addinfo.multienc[k]);
5630 for (
auto it = _rawValuesMetadataMap.begin(); it != _rawValuesMetadataMap.end(); it++)
5632 if(!getRawData_core(it->first, _rawDataAuxVector))
5634 yError() << getBoardInfo() <<
"getRawData failed. Cannot retrieve all raw data from local memory";
5637 map.insert({it->first, _rawDataAuxVector});
5645 if(_rawValuesMetadataMap.find(key) != _rawValuesMetadataMap.end())
5647 getRawData_core(key,
data);
5651 yError() << getBoardInfo() <<
"Request key:" << key <<
"is not available. Cannot retrieve get raw data.";
5660 for (
const auto &
p : _rawValuesMetadataMap)
5662 keys.push_back(
p.first);
5670 return _rawValuesMetadataMap.size();
5675 if (_rawValuesMetadataMap.empty())
5677 yError() << getBoardInfo() <<
"embObjMotionControl Map is empty. Closing...";
5686 if(_rawValuesMetadataMap.find(key) != _rawValuesMetadataMap.end())
5688 meta = _rawValuesMetadataMap[key];
5692 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 parseAmpsToSensor(yarp::os::Searchable &config, double ampsToSensor[])
bool parseMechanicalsFlags(yarp::os::Searchable &config, int useMotorSpeedFbk[])
bool parseMotioncontrolVersion(yarp::os::Searchable &config, int &version)
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 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_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