21 fbk_units = PidFeedbackUnitsEnum::RAW_MACHINE_UNITS;
22 out_units = PidOutputUnitsEnum::RAW_MACHINE_UNITS;
196ControlBoardHelper::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)
202 memcpy(mPriv->
axisMap, aMap,
sizeof(
int)*n);
207 if (angToEncs !=
nullptr) {
210 if (newtons !=
nullptr) {
213 if (amps !=
nullptr) {
216 if (volts !=
nullptr) {
219 if (dutycycles !=
nullptr) {
222 if (kbemf !=
nullptr) {
223 memcpy(mPriv->
bemfToRaws, kbemf,
sizeof(
double) * n);
225 if (ktau !=
nullptr) {
226 memcpy(mPriv->
ktauToRaws, ktau,
sizeof(
double) * n);
230 memset (mPriv->
invAxisMap, 0,
sizeof(
int) * n);
232 for (i = 0; i < n; i++)
235 for (j = 0; j < n; j++)
248 if (mPriv) {
delete mPriv; mPriv =
nullptr; }
264 if( (
id >= mPriv->
nj) || (
id< 0))
274 if(n_axes > mPriv->
nj)
277 yError(
"checkAxesIds: num of axes is too big");
281 for(
int idx = 0; idx<n_axes; idx++)
283 if( (axesList[idx]<0) || (axesList[idx]>= mPriv->
nj) )
286 yError(
"checkAxesIds: joint id out of bound");
296{
return mPriv->
axisMap[axis]; }
304 for (
int k = 0; k < mPriv->
nj; k++) {
305 user[
toUser(k)] = hwData[k];
310void ControlBoardHelper::ControlBoardHelper::toUser(
const int *hwData,
int *user)
312 for (
int k = 0; k < mPriv->nj; k++) {
313 user[toUser(k)] = hwData[k];
320 for (
int k = 0; k < mPriv->
nj; k++) {
321 hwData[
toHw(k)] = usr[k];
328 for (
int k = 0; k < mPriv->
nj; k++) {
329 hwData[
toHw(k)] = usr[k];
373 for(
int j=0;j<mPriv->
nj;j++)
375 impN2S(newtons[j], j, tmp, index);
396 for(
int j=0;j<mPriv->
nj;j++)
398 trqN2S(newtons[j], j, tmp, index);
408 for(
int j=0;j<mPriv->
nj;j++)
410 trqS2N(sens[j], j, tmp, index);
431 for(
int j=0;j<mPriv->
nj;j++)
433 impS2N(sens[j], j, tmp, index);
528 for(
int j=0;j<mPriv->
nj;j++)
530 posA2E(ang[j], j, tmp, index);
540 for(
int j=0;j<mPriv->
nj;j++)
542 posE2A(enc[j], j, tmp, index);
551 for(
int j=0;j<mPriv->
nj;j++)
553 velA2E(ang[j], j, tmp, index);
562 for(
int j=0;j<mPriv->
nj;j++)
573 for(
int j=0;j<mPriv->
nj;j++)
575 velE2A(enc[j], j, tmp, index);
584 for(
int j=0;j<mPriv->
nj;j++)
595 for(
int j=0;j<mPriv->
nj;j++)
597 accA2E(ang[j], j, tmp, index);
606 for(
int j=0;j<mPriv->
nj;j++)
617 for(
int j=0;j<mPriv->
nj;j++)
619 accE2A(enc[j], j, tmp, index);
628 for(
int j=0;j<mPriv->
nj;j++)
652 for(
int j=0;j<mPriv->
nj;j++)
664 for(
int j=0;j<mPriv->
nj;j++)
701 for(
int j=0;j<mPriv->
nj;j++)
713 for(
int j=0;j<mPriv->
nj;j++)
749 for (
int j = 0; j<mPriv->
nj; j++)
760 for (
int j = 0; j<mPriv->
nj; j++)
763 dutycycle[index] = tmp;
825 bemf_user = bemf_raw / mPriv->
bemfToRaws[j_user];
831 ktau_user = ktau_raw / mPriv->
ktauToRaws[j_user];
909 double output_conversion_factor;
910 switch (mPriv->
pid_units[pidtype][j].out_units)
918 default: output_conversion_factor = mPriv->
helper_ones[j];
break;
920 return output_conversion_factor;
925 double feedback_conversion_factor = 0.0;
926 switch (mPriv->
pid_units[pidtype][j].fbk_units)
938 default: feedback_conversion_factor = mPriv->
helper_ones[j];
break;
940 return (1.0 / feedback_conversion_factor);
945 k_usr = cb_helper->
toUser(j_raw);
950 out_usr.
kp = out_usr.
kp / feedback_conversion_units_user2raw;
951 out_usr.
ki = out_usr.
ki / feedback_conversion_units_user2raw;
952 out_usr.
kd = out_usr.
kd / feedback_conversion_units_user2raw;
956 out_usr.
kp = out_usr.
kp / output_conversion_units_user2raw;
957 out_usr.
ki = out_usr.
ki / output_conversion_units_user2raw;
958 out_usr.
kd = out_usr.
kd / output_conversion_units_user2raw;
960 out_usr.
max_int = out_usr.
max_int / output_conversion_units_user2raw;
963 out_usr.
offset = out_usr.
offset / output_conversion_units_user2raw;
977 k_raw = cb_helper->
toHw(j_usr);
982 out_raw.
kp = out_raw.
kp * feedback_conversion_units_user2raw;
983 out_raw.
ki = out_raw.
ki * feedback_conversion_units_user2raw;
984 out_raw.
kd = out_raw.
kd * feedback_conversion_units_user2raw;
988 out_raw.
kp = out_raw.
kp * output_conversion_units_user2raw;
989 out_raw.
ki = out_raw.
ki * output_conversion_units_user2raw;
990 out_raw.
kd = out_raw.
kd * output_conversion_units_user2raw;
992 out_raw.
max_int = out_raw.
max_int * output_conversion_units_user2raw;
995 out_raw.
offset = out_raw.
offset * output_conversion_units_user2raw;
1006 cb_helper->
posA2E(userval, j, machineval, k);
1009 cb_helper->
velA2E(userval, j, machineval, k);
1012 cb_helper->
trqN2S(userval, j, machineval, k);
1015 cb_helper->
ampereA2S(userval, j, machineval, k);
1018 yError() <<
"convert_units_to_machine: invalid pidtype";
1031 cb_helper->
posA2E(userval, machineval);
1034 cb_helper->
velA2E(userval, machineval);
1037 cb_helper->
trqN2S(userval, machineval);
1040 cb_helper->
ampereA2S(userval, machineval);
1043 yError() <<
"convert_units_to_machine: invalid pidtype";
1056 *userval = cb_helper->
posE2A(machineval, k);
1059 *userval = cb_helper->
velE2A(machineval, k);
1062 *userval = cb_helper->
trqS2N(machineval, k);
1065 *userval = cb_helper->
ampereS2A(machineval, k);
1068 yError() <<
"convert_units_to_machine: invalid pidtype";
1081 cb_helper->
posE2A(machineval, userval);
1084 cb_helper->
velE2A(machineval, userval);
1087 cb_helper->
trqS2N(machineval, userval);
1090 cb_helper->
ampereS2A(machineval, userval);
1093 yError() <<
"convert_units_to_machine: invalid pidtype";
1101 int nj = cb_helper->
axes();
1102 for (
int i = 0; i < nj; i++)
1104 mPriv->
pid_units[pidtype][i].fbk_units = fbk_conv_units;
1105 mPriv->
pid_units[pidtype][i].out_units = out_conv_units;
void checkAndDestroy(T *&p)
double * viscousPosToRaws
double * newtonsToSensors
double * coulombNegToRaws
double * velocityThresToRaws
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)
double velocityThres_user2raw(double velocityThres_user, int j)
void velocityThres_raw2user(double threshold_raw, int k_raw, double &velocityThres_user, int &j_user)
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