21 fbk_units = PidFeedbackUnitsEnum::RAW_MACHINE_UNITS;
22 out_units = PidOutputUnitsEnum::RAW_MACHINE_UNITS;
189ControlBoardHelper::ControlBoardHelper(
int n,
const int *aMap,
const double *angToEncs,
const double *zs,
const double *newtons,
const double *amps,
const double *volts,
const double *dutycycles,
const double *kbemf,
const double *ktau)
195 memcpy(mPriv->
axisMap, aMap,
sizeof(
int)*n);
200 if (angToEncs !=
nullptr) {
203 if (newtons !=
nullptr) {
206 if (amps !=
nullptr) {
209 if (volts !=
nullptr) {
212 if (dutycycles !=
nullptr) {
215 if (kbemf !=
nullptr) {
216 memcpy(mPriv->
bemfToRaws, kbemf,
sizeof(
double) * n);
218 if (ktau !=
nullptr) {
219 memcpy(mPriv->
ktauToRaws, ktau,
sizeof(
double) * n);
223 memset (mPriv->
invAxisMap, 0,
sizeof(
int) * n);
225 for (i = 0; i < n; i++)
228 for (j = 0; j < n; j++)
241 if (mPriv) {
delete mPriv; mPriv =
nullptr; }
257 if( (
id >= mPriv->
nj) || (
id< 0))
267 if(n_axes > mPriv->
nj)
270 yError(
"checkAxesIds: num of axes is too big");
274 for(
int idx = 0; idx<n_axes; idx++)
276 if( (axesList[idx]<0) || (axesList[idx]>= mPriv->
nj) )
279 yError(
"checkAxesIds: joint id out of bound");
289{
return mPriv->
axisMap[axis]; }
297 for (
int k = 0; k < mPriv->
nj; k++) {
298 user[
toUser(k)] = hwData[k];
303void ControlBoardHelper::ControlBoardHelper::toUser(
const int *hwData,
int *user)
305 for (
int k = 0; k < mPriv->nj; k++) {
306 user[toUser(k)] = hwData[k];
313 for (
int k = 0; k < mPriv->
nj; k++) {
314 hwData[
toHw(k)] = usr[k];
321 for (
int k = 0; k < mPriv->
nj; k++) {
322 hwData[
toHw(k)] = usr[k];
366 for(
int j=0;j<mPriv->
nj;j++)
368 impN2S(newtons[j], j, tmp, index);
389 for(
int j=0;j<mPriv->
nj;j++)
391 trqN2S(newtons[j], j, tmp, index);
401 for(
int j=0;j<mPriv->
nj;j++)
403 trqS2N(sens[j], j, tmp, index);
424 for(
int j=0;j<mPriv->
nj;j++)
426 impS2N(sens[j], j, tmp, index);
521 for(
int j=0;j<mPriv->
nj;j++)
523 posA2E(ang[j], j, tmp, index);
533 for(
int j=0;j<mPriv->
nj;j++)
535 posE2A(enc[j], j, tmp, index);
544 for(
int j=0;j<mPriv->
nj;j++)
546 velA2E(ang[j], j, tmp, index);
555 for(
int j=0;j<mPriv->
nj;j++)
566 for(
int j=0;j<mPriv->
nj;j++)
568 velE2A(enc[j], j, tmp, index);
577 for(
int j=0;j<mPriv->
nj;j++)
588 for(
int j=0;j<mPriv->
nj;j++)
590 accA2E(ang[j], j, tmp, index);
599 for(
int j=0;j<mPriv->
nj;j++)
610 for(
int j=0;j<mPriv->
nj;j++)
612 accE2A(enc[j], j, tmp, index);
621 for(
int j=0;j<mPriv->
nj;j++)
645 for(
int j=0;j<mPriv->
nj;j++)
657 for(
int j=0;j<mPriv->
nj;j++)
694 for(
int j=0;j<mPriv->
nj;j++)
706 for(
int j=0;j<mPriv->
nj;j++)
742 for (
int j = 0; j<mPriv->
nj; j++)
753 for (
int j = 0; j<mPriv->
nj; j++)
756 dutycycle[index] = tmp;
812 bemf_user = bemf_raw / mPriv->
bemfToRaws[j_user];
818 ktau_user = ktau_raw / mPriv->
ktauToRaws[j_user];
885 double output_conversion_factor;
886 switch (mPriv->
pid_units[pidtype][j].out_units)
894 default: output_conversion_factor = mPriv->
helper_ones[j];
break;
896 return output_conversion_factor;
901 double feedback_conversion_factor = 0.0;
902 switch (mPriv->
pid_units[pidtype][j].fbk_units)
914 default: feedback_conversion_factor = mPriv->
helper_ones[j];
break;
916 return (1.0 / feedback_conversion_factor);
921 k_usr = cb_helper->
toUser(j_raw);
926 out_usr.
kp = out_usr.
kp / feedback_conversion_units_user2raw;
927 out_usr.
ki = out_usr.
ki / feedback_conversion_units_user2raw;
928 out_usr.
kd = out_usr.
kd / feedback_conversion_units_user2raw;
932 out_usr.
kp = out_usr.
kp / output_conversion_units_user2raw;
933 out_usr.
ki = out_usr.
ki / output_conversion_units_user2raw;
934 out_usr.
kd = out_usr.
kd / output_conversion_units_user2raw;
936 out_usr.
max_int = out_usr.
max_int / output_conversion_units_user2raw;
939 out_usr.
offset = out_usr.
offset / output_conversion_units_user2raw;
953 k_raw = cb_helper->
toHw(j_usr);
958 out_raw.
kp = out_raw.
kp * feedback_conversion_units_user2raw;
959 out_raw.
ki = out_raw.
ki * feedback_conversion_units_user2raw;
960 out_raw.
kd = out_raw.
kd * feedback_conversion_units_user2raw;
964 out_raw.
kp = out_raw.
kp * output_conversion_units_user2raw;
965 out_raw.
ki = out_raw.
ki * output_conversion_units_user2raw;
966 out_raw.
kd = out_raw.
kd * output_conversion_units_user2raw;
968 out_raw.
max_int = out_raw.
max_int * output_conversion_units_user2raw;
971 out_raw.
offset = out_raw.
offset * output_conversion_units_user2raw;
982 cb_helper->
posA2E(userval, j, machineval, k);
985 cb_helper->
velA2E(userval, j, machineval, k);
988 cb_helper->
trqN2S(userval, j, machineval, k);
991 cb_helper->
ampereA2S(userval, j, machineval, k);
994 yError() <<
"convert_units_to_machine: invalid pidtype";
1007 cb_helper->
posA2E(userval, machineval);
1010 cb_helper->
velA2E(userval, machineval);
1013 cb_helper->
trqN2S(userval, machineval);
1016 cb_helper->
ampereA2S(userval, machineval);
1019 yError() <<
"convert_units_to_machine: invalid pidtype";
1032 *userval = cb_helper->
posE2A(machineval, k);
1035 *userval = cb_helper->
velE2A(machineval, k);
1038 *userval = cb_helper->
trqS2N(machineval, k);
1041 *userval = cb_helper->
ampereS2A(machineval, k);
1044 yError() <<
"convert_units_to_machine: invalid pidtype";
1057 cb_helper->
posE2A(machineval, userval);
1060 cb_helper->
velE2A(machineval, userval);
1063 cb_helper->
trqS2N(machineval, userval);
1066 cb_helper->
ampereS2A(machineval, userval);
1069 yError() <<
"convert_units_to_machine: invalid pidtype";
1077 int nj = cb_helper->
axes();
1078 for (
int i = 0; i < nj; i++)
1080 mPriv->
pid_units[pidtype][i].fbk_units = fbk_conv_units;
1081 mPriv->
pid_units[pidtype][i].out_units = out_conv_units;
void checkAndDestroy(T *&p)
double * viscousPosToRaws
double * newtonsToSensors
double * coulombNegToRaws
PrivateUnitsHandler(int size)
PrivateUnitsHandler(const PrivateUnitsHandler &other)
double * viscousNegToRaws
std::map< PidControlTypeEnum, PidUnits * > pid_units
double * coulombPosToRaws
double get_pidfeedback_conversion_factor_user2raw(const yarp::dev::PidControlTypeEnum &pidtype, int j)
void accE2A(double enc, int j, double &ang, int &k)
void convert_pid_to_user(const yarp::dev::PidControlTypeEnum &pidtype, const Pid &in_raw, int j_raw, Pid &out_usr, int &k_usr)
void viscousNeg_raw2user(double viscousNeg_raw, int k_raw, double &viscousNeg_user, int &j_user)
double viscousNeg_user2raw(double viscousNeg_user, int j)
void ktau_raw2user(double ktau_raw, int k_raw, double &ktau_user, int &j_user)
void trqN2S(double newtons, int j, double &sens, int &k)
void velE2A_abs(double enc, int j, double &ang, int &k)
void convert_pidunits_to_machine(const yarp::dev::PidControlTypeEnum &pidtype, double userval, int j, double &machineval, int &k)
void bemf_raw2user(double bemf_raw, int k_raw, double &bemf_user, int &j_user)
void coulombPos_raw2user(double coulombPos_raw, int k_raw, double &coulombPos_user, int &j_user)
void voltageS2V(const double *sens, double *voltage)
void convert_pid_to_machine(const yarp::dev::PidControlTypeEnum &pidtype, const Pid &in_usr, int j_usr, Pid &out_raw, int &k_raw)
void ampereA2S(double ampere, int j, double &sens, int &k)
void impN2S(double newtons, int j, double &sens, int &k)
double ktau_user2raw(double ktau_user, int j)
double coulombPos_user2raw(double coulombPos_user, int j)
void velE2A(double enc, int j, double &ang, int &k)
double coulombNeg_user2raw(double coulombNeg_user, int j)
void velA2E(double ang, int j, double &enc, int &k)
void dutycycle2PWM(double dutycycle, int j, double &pwm, int &k)
void ampereS2A(const double *sens, double *ampere)
double viscousPos_user2raw(double viscousPos_user, int j)
void posE2A(double enc, int j, double &ang, int &k)
void coulombNeg_raw2user(double coulombNeg_raw, int k_raw, double &coulombNeg_user, int &j_user)
void trqS2N(const double *sens, double *newtons)
double get_pidoutput_conversion_factor_user2raw(const yarp::dev::PidControlTypeEnum &pidtype, int j)
void set_pid_conversion_units(const PidControlTypeEnum &pidtype, const PidFeedbackUnitsEnum fbk_conv_units, const PidOutputUnitsEnum out_conv_units)
void voltageV2S(double voltage, int j, double &sens, int &k)
ControlBoardHelper & operator=(const ControlBoardHelper &other)
double bemf_user2raw(double bemf_user, int j)
void accA2E_abs(double ang, int j, double &enc, int &k)
void accA2E(double ang, int j, double &enc, int &k)
void accE2A_abs(double enc, int j, double &ang, int &k)
void velA2E_abs(double ang, int j, double &enc, int &k)
ControlBoardHelper(int n, const int *aMap, const double *angToEncs=nullptr, const double *zs=nullptr, const double *newtons=nullptr, const double *amps=nullptr, const double *volts=nullptr, const double *dutycycles=nullptr, const double *kbemf=nullptr, const double *ktau=nullptr)
void viscousPos_raw2user(double viscousPos_raw, int k_raw, double &viscousPos_user, int &j_user)
void convert_pidunits_to_user(const yarp::dev::PidControlTypeEnum &pidtype, const double machineval, double *userval, int k)
void impS2N(const double *sens, double *newtons)
void PWM2dutycycle(const double *pwm, double *dutycycle)
bool checkAxesIds(const int n_axes, const int *axesList)
void posA2E(double ang, int j, double &enc, int &k)
Contains the parameters for a PID.
double offset
pwm offset added to the pid output
double stiction_down_val
down stiction offset added to the pid output
double stiction_up_val
up stiction offset added to the pid output
double max_output
max output
double ki
integrative gain
double max_int
saturation threshold for the integrator
double kp
proportional gain
For streams capable of holding different kinds of content, check what they actually have.
PidOutputUnitsEnum out_units
PidFeedbackUnitsEnum fbk_units