161 ControlBoardHelper::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)
167 memcpy(mPriv->
axisMap, aMap,
sizeof(
int)*n);
172 if (angToEncs !=
nullptr) {
175 if (newtons !=
nullptr) {
178 if (amps !=
nullptr) {
181 if (volts !=
nullptr) {
184 if (dutycycles !=
nullptr) {
187 if (kbemf !=
nullptr) {
188 memcpy(mPriv->
bemfToRaws, kbemf,
sizeof(
double) * n);
190 if (ktau !=
nullptr) {
191 memcpy(mPriv->
ktauToRaws, ktau,
sizeof(
double) * n);
195 memset (mPriv->
invAxisMap, 0,
sizeof(
int) * n);
197 for (i = 0; i < n; i++)
200 for (j = 0; j < n; j++)
213 if (mPriv) {
delete mPriv; mPriv =
nullptr; }
229 if( (
id >= mPriv->
nj) || (
id< 0))
239 if(n_axes > mPriv->
nj)
242 yError(
"checkAxesIds: num of axes is too big");
246 for(
int idx = 0; idx<n_axes; idx++)
248 if( (axesList[idx]<0) || (axesList[idx]>= mPriv->
nj) )
251 yError(
"checkAxesIds: joint id out of bound");
261 {
return mPriv->
axisMap[axis]; }
269 for (
int k = 0; k < mPriv->
nj; k++) {
270 user[
toUser(k)] = hwData[k];
275 void ControlBoardHelper::ControlBoardHelper::toUser(
const int *hwData,
int *user)
277 for (
int k = 0; k < mPriv->nj; k++) {
278 user[toUser(k)] = hwData[k];
285 for (
int k = 0; k < mPriv->
nj; k++) {
286 hwData[
toHw(k)] = usr[k];
293 for (
int k = 0; k < mPriv->
nj; k++) {
294 hwData[
toHw(k)] = usr[k];
338 for(
int j=0;j<mPriv->
nj;j++)
340 impN2S(newtons[j], j, tmp, index);
361 for(
int j=0;j<mPriv->
nj;j++)
363 trqN2S(newtons[j], j, tmp, index);
373 for(
int j=0;j<mPriv->
nj;j++)
375 trqS2N(sens[j], j, tmp, index);
396 for(
int j=0;j<mPriv->
nj;j++)
398 impS2N(sens[j], j, tmp, index);
493 for(
int j=0;j<mPriv->
nj;j++)
495 posA2E(ang[j], j, tmp, index);
505 for(
int j=0;j<mPriv->
nj;j++)
507 posE2A(enc[j], j, tmp, index);
516 for(
int j=0;j<mPriv->
nj;j++)
518 velA2E(ang[j], j, tmp, index);
527 for(
int j=0;j<mPriv->
nj;j++)
538 for(
int j=0;j<mPriv->
nj;j++)
540 velE2A(enc[j], j, tmp, index);
549 for(
int j=0;j<mPriv->
nj;j++)
560 for(
int j=0;j<mPriv->
nj;j++)
562 accA2E(ang[j], j, tmp, index);
571 for(
int j=0;j<mPriv->
nj;j++)
582 for(
int j=0;j<mPriv->
nj;j++)
584 accE2A(enc[j], j, tmp, index);
593 for(
int j=0;j<mPriv->
nj;j++)
617 for(
int j=0;j<mPriv->
nj;j++)
629 for(
int j=0;j<mPriv->
nj;j++)
666 for(
int j=0;j<mPriv->
nj;j++)
678 for(
int j=0;j<mPriv->
nj;j++)
714 for (
int j = 0; j<mPriv->
nj; j++)
725 for (
int j = 0; j<mPriv->
nj; j++)
728 dutycycle[index] = tmp;
760 bemf_user = bemf_raw / mPriv->
bemfToRaws[j_user];
766 ktau_user = ktau_raw / mPriv->
ktauToRaws[j_user];
782 {
return mPriv->
nj; }
788 double output_conversion_factor;
789 switch (mPriv->
pid_units[pidtype][j].out_units)
797 default: output_conversion_factor = mPriv->
helper_ones[j];
break;
799 return output_conversion_factor;
804 double feedback_conversion_factor = 0.0;
805 switch (mPriv->
pid_units[pidtype][j].fbk_units)
817 default: feedback_conversion_factor = mPriv->
helper_ones[j];
break;
819 return (1.0 / feedback_conversion_factor);
824 k_usr = cb_helper->
toUser(j_raw);
829 out_usr.
kp = out_usr.
kp / feedback_conversion_units_user2raw;
830 out_usr.
ki = out_usr.
ki / feedback_conversion_units_user2raw;
831 out_usr.
kd = out_usr.
kd / feedback_conversion_units_user2raw;
835 out_usr.
kp = out_usr.
kp / output_conversion_units_user2raw;
836 out_usr.
ki = out_usr.
ki / output_conversion_units_user2raw;
837 out_usr.
kd = out_usr.
kd / output_conversion_units_user2raw;
839 out_usr.
max_int = out_usr.
max_int / output_conversion_units_user2raw;
842 out_usr.
offset = out_usr.
offset / output_conversion_units_user2raw;
856 k_raw = cb_helper->
toHw(j_usr);
861 out_raw.
kp = out_raw.
kp * feedback_conversion_units_user2raw;
862 out_raw.
ki = out_raw.
ki * feedback_conversion_units_user2raw;
863 out_raw.
kd = out_raw.
kd * feedback_conversion_units_user2raw;
867 out_raw.
kp = out_raw.
kp * output_conversion_units_user2raw;
868 out_raw.
ki = out_raw.
ki * output_conversion_units_user2raw;
869 out_raw.
kd = out_raw.
kd * output_conversion_units_user2raw;
871 out_raw.
max_int = out_raw.
max_int * output_conversion_units_user2raw;
874 out_raw.
offset = out_raw.
offset * output_conversion_units_user2raw;
885 cb_helper->
posA2E(userval, j, machineval, k);
888 cb_helper->
velA2E(userval, j, machineval, k);
891 cb_helper->
trqN2S(userval, j, machineval, k);
894 cb_helper->
ampereA2S(userval, j, machineval, k);
897 yError() <<
"convert_units_to_machine: invalid pidtype";
910 cb_helper->
posA2E(userval, machineval);
913 cb_helper->
velA2E(userval, machineval);
916 cb_helper->
trqN2S(userval, machineval);
919 cb_helper->
ampereA2S(userval, machineval);
922 yError() <<
"convert_units_to_machine: invalid pidtype";
935 *userval = cb_helper->
posE2A(machineval, k);
938 *userval = cb_helper->
velE2A(machineval, k);
941 *userval = cb_helper->
trqS2N(machineval, k);
944 *userval = cb_helper->
ampereS2A(machineval, k);
947 yError() <<
"convert_units_to_machine: invalid pidtype";
960 cb_helper->
posE2A(machineval, userval);
963 cb_helper->
velE2A(machineval, userval);
966 cb_helper->
trqS2N(machineval, userval);
969 cb_helper->
ampereS2A(machineval, userval);
972 yError() <<
"convert_units_to_machine: invalid pidtype";
980 int nj = cb_helper->
axes();
981 for (
int i = 0; i < nj; i++)
983 mPriv->
pid_units[pidtype][i].fbk_units = fbk_conv_units;
984 mPriv->
pid_units[pidtype][i].out_units = out_conv_units;
void checkAndDestroy(T *&p)
double * newtonsToSensors
PrivateUnitsHandler(int size)
PrivateUnitsHandler(const PrivateUnitsHandler &other)
std::map< PidControlTypeEnum, PidUnits * > pid_units
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 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 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)
void velE2A(double enc, int j, double &ang, int &k)
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)
void posE2A(double enc, int j, double &ang, int &k)
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 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
An interface for the device drivers.
PidOutputUnitsEnum out_units
PidFeedbackUnitsEnum fbk_units