20#define TAB_VARIABLES 6
25#define POSITION_SCALE 3
26#define POSITION_MAXOUTPUT 4
27#define POSITION_MAXINT 5
28#define POSITION_OFFSET 6
29#define POSITION_STICTIONUP 7
30#define POSITION_STICTIONDW 8
35#define VELOCITY_SCALE 3
36#define VELOCITY_MAXOUTPUT 4
37#define VELOCITY_MAXINT 5
38#define VELOCITY_OFFSET 6
39#define VELOCITY_STICTIONUP 7
40#define VELOCITY_STICTIONDW 8
46#define TORQUE_MAXOUTPUT 4
47#define TORQUE_MAXINT 5
48#define TORQUE_OFFSET 6
49#define TORQUE_STITCTIONUP 7
50#define TORQUE_STICTIONDW 8
52#define TORQUE_BEMFGAIN 10
53#define TORQUE_BEMFSCALE 11
54#define TORQUE_KTAUGAIN 12
55#define TORQUE_KTAUSCALE 13
56#define TORQUE_VISCOUSPOS 14
57#define TORQUE_VISCOUSNEG 15
58#define TORQUE_COULOMBPOS 16
59#define TORQUE_COULOMBNEG 17
60#define VELOCITY_THRESHOLD 18
65#define CURRENT_SCALE 3
66#define CURRENT_MAXOUTPUT 4
67#define CURRENT_MAXINT 5
68#define CURRENT_OFFSET 6
70PidDlg::PidDlg(QString partname,
int jointIndex, QString jointName, QWidget *parent) :
76 this->jointIndex = jointIndex;
78 QString title = QString(
"Pid Control %1 JNT:%2 (%3)").arg(partname).arg(jointIndex).arg(jointName);
79 setWindowTitle(title);
81 connect(ui->btnRefresh,
SIGNAL(clicked()),
this, SLOT(onRefresh()));
82 connect(ui->btnSend,
SIGNAL(clicked()),
this,SLOT(onSend()));
83 connect(ui->btnCancel,
SIGNAL(clicked()),
this,SLOT(onCancel()));
84 connect(ui->btnDump,
SIGNAL(clicked()),
this, SLOT(onDumpRemoteVariables()));
95void PidDlg::onDumpRemoteVariables()
102 for (
auto& button : buttons)
113 ui->tablePosition->item(
POSITION_KP,0)->setText(QString(
"%1").arg((
double)myPid.
kp));
114 ui->tablePosition->item(
POSITION_KP,1)->setText(QString(
"%1").arg((
double)myPid.
kp));
116 ui->tablePosition->item(
POSITION_KD,0)->setText(QString(
"%1").arg((
double)myPid.
kd));
117 ui->tablePosition->item(
POSITION_KD,1)->setText(QString(
"%1").arg((
double)myPid.
kd));
119 ui->tablePosition->item(
POSITION_KI,0)->setText(QString(
"%1").arg((
double)myPid.
ki));
120 ui->tablePosition->item(
POSITION_KI,1)->setText(QString(
"%1").arg((
double)myPid.
ki));
143 ui->tableVelocity->item(
VELOCITY_KP, 0)->setText(QString(
"%1").arg((
double)myPid.
kp));
144 ui->tableVelocity->item(
VELOCITY_KP, 1)->setText(QString(
"%1").arg((
double)myPid.
kp));
146 ui->tableVelocity->item(
VELOCITY_KD, 0)->setText(QString(
"%1").arg((
double)myPid.
kd));
147 ui->tableVelocity->item(
VELOCITY_KD, 1)->setText(QString(
"%1").arg((
double)myPid.
kd));
149 ui->tableVelocity->item(
VELOCITY_KI, 0)->setText(QString(
"%1").arg((
double)myPid.
ki));
150 ui->tableVelocity->item(
VELOCITY_KI, 1)->setText(QString(
"%1").arg((
double)myPid.
ki));
173 ui->tableTorque->item(
TORQUE_KP,0)->setText(QString(
"%1").arg((
double)myPid.
kp));
174 ui->tableTorque->item(
TORQUE_KP,1)->setText(QString(
"%1").arg((
double)myPid.
kp));
176 ui->tableTorque->item(
TORQUE_KFF,0)->setText(QString(
"%1").arg((
double)myPid.
kff));
177 ui->tableTorque->item(
TORQUE_KFF,1)->setText(QString(
"%1").arg((
double)myPid.
kff));
179 ui->tableTorque->item(
TORQUE_KD,0)->setText(QString(
"%1").arg((
double)myPid.
kd));
180 ui->tableTorque->item(
TORQUE_KD,1)->setText(QString(
"%1").arg((
double)myPid.
kd));
182 ui->tableTorque->item(
TORQUE_BEMFGAIN,0)->setText(QString(
"%1").arg((
double)TrqParam.
bemf));
183 ui->tableTorque->item(
TORQUE_BEMFGAIN,1)->setText(QString(
"%1").arg((
double)TrqParam.
bemf));
188 ui->tableTorque->item(
TORQUE_KTAUGAIN,0)->setText(QString(
"%1").arg((
double)TrqParam.
ktau));
189 ui->tableTorque->item(
TORQUE_KTAUGAIN,1)->setText(QString(
"%1").arg((
double)TrqParam.
ktau));
207 ui->tableTorque->item(
TORQUE_KI,0)->setText(QString(
"%1").arg((
double)myPid.
ki));
208 ui->tableTorque->item(
TORQUE_KI,1)->setText(QString(
"%1").arg((
double)myPid.
ki));
210 ui->tableTorque->item(
TORQUE_SCALE,0)->setText(QString(
"%1").arg((
int)myPid.
scale));
211 ui->tableTorque->item(
TORQUE_SCALE,1)->setText(QString(
"%1").arg((
int)myPid.
scale));
229void PidDlg::onSendRemoteVariable()
232 for (
size_t elem = 0; elem < buttons.size(); elem++)
234 if (sender() == buttons[elem])
244 std::string key = ui->tableVariables->item(i, 0)->text().toStdString();
245 std::string val = ui->tableVariables->item(i, 1)->text().toStdString();
256 ui->tableVariables->clear();
257 ui->tableVariables->clearContents();
258 ui->tableVariables->setRowCount(0);
259 ui->tableVariables->setColumnCount(0);
260 ui->tableVariables->insertColumn(0);
261 ui->tableVariables->insertColumn(0);
262 ui->tableVariables->insertColumn(0);
263 ui->tableVariables->setMinimumWidth(500);
264 ui->tableVariables->setHorizontalHeaderItem(0,
new QTableWidgetItem(QString(
"Key")));
265 ui->tableVariables->setHorizontalHeaderItem(1,
new QTableWidgetItem(QString(
"Values")));
266 ui->tableVariables->setHorizontalHeaderItem(2,
new QTableWidgetItem(QString(
"")));
272 int keys_size = keys.
size();
273 for (
auto& button : buttons)
279 buttons.resize(keys_size);
281 for (
int i = 0; i < keys_size; i++)
283 buttons[i] =
new QPushButton(
"Send");
284 connect(buttons[i],
SIGNAL(clicked()),
this, SLOT(onSendRemoteVariable()));
292 ui->tableVariables->insertRow(i);
293 ui->tableVariables->setItem(i, 0,
new QTableWidgetItem(QString(v.c_str())));
294 ui->tableVariables->item(i, 0)->setFlags(Qt::NoItemFlags);
295 ui->tableVariables->setItem(i, 1,
new QTableWidgetItem(QString(val.
toString().c_str())));
296 ui->tableVariables->item(i, 1)->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled );
297 ui->tableVariables->setColumnWidth(1, 500);
298 ui->tableVariables->setCellWidget(i, 2, (QWidget*)buttons[i]);
318 double curDampVal,
double minDamp,
double maxDamp,
319 double curForceVal,
double minForce,
double maxForce)
321 ui->tableStiffness->item(0,0)->setText(QString(
"%L1").arg(curStiffVal,0,
'f',3));
322 ui->tableStiffness->item(0,1)->setText(QString(
"%L1").arg(minStiff,0,
'f',3));
323 ui->tableStiffness->item(0,2)->setText(QString(
"%L1").arg(maxStiff,0,
'f',3));
324 ui->tableStiffness->item(0,3)->setText(QString(
"%L1").arg(curStiffVal,0,
'f',3));
326 ui->tableStiffness->item(1,0)->setText(QString(
"%L1").arg(curDampVal,0,
'f',3));
327 ui->tableStiffness->item(1,1)->setText(QString(
"%L1").arg(minDamp,0,
'f',3));
328 ui->tableStiffness->item(1,2)->setText(QString(
"%L1").arg(maxDamp,0,
'f',3));
329 ui->tableStiffness->item(1,3)->setText(QString(
"%L1").arg(curDampVal,0,
'f',3));
331 ui->tableStiffness->item(2,0)->setText(QString(
"%L1").arg(curForceVal,0,
'f',3));
332 ui->tableStiffness->item(2,1)->setText(QString(
"%L1").arg(minForce,0,
'f',3));
333 ui->tableStiffness->item(2,2)->setText(QString(
"%L1").arg(maxForce,0,
'f',3));
334 ui->tableStiffness->item(2,3)->setText(QString(
"%L1").arg(curForceVal,0,
'f',3));
340 ui->tablePWM->item(0, 0)->setText(QString(
"%1").arg((
double)PWMVal));
341 ui->tablePWM->item(0, 1)->setText(QString(
"%1").arg((
double)PWMVal));
343 ui->tablePWM->item(1,0)->setText(QString(
"%1").arg(pwm));
348 ui->tableCurrent->item(
CURRENT_KP, 0)->setText(QString(
"%1").arg((
double)myPid.
kp));
349 ui->tableCurrent->item(
CURRENT_KP, 1)->setText(QString(
"%1").arg((
double)myPid.
kp));
351 ui->tableCurrent->item(
CURRENT_KD, 0)->setText(QString(
"%1").arg((
double)myPid.
kd));
352 ui->tableCurrent->item(
CURRENT_KD, 1)->setText(QString(
"%1").arg((
double)myPid.
kd));
354 ui->tableCurrent->item(
CURRENT_KI, 0)->setText(QString(
"%1").arg((
double)myPid.
ki));
355 ui->tableCurrent->item(
CURRENT_KI, 1)->setText(QString(
"%1").arg((
double)myPid.
ki));
357 ui->tableCurrent->item(
CURRENT_SCALE, 0)->setText(QString(
"%1").arg((
int)myPid.
scale));
358 ui->tableCurrent->item(
CURRENT_SCALE, 1)->setText(QString(
"%1").arg((
int)myPid.
scale));
370void PidDlg::onRefresh()
380 switch (ui->tabMain->currentIndex()) {
382 newPid.
kp = ui->tablePosition->item(
POSITION_KP,1)->text().toDouble();
383 newPid.
kd = ui->tablePosition->item(
POSITION_KD,1)->text().toDouble();
384 newPid.
ki = ui->tablePosition->item(
POSITION_KI,1)->text().toDouble();
394 newPid.
kp = ui->tableVelocity->item(
VELOCITY_KP, 1)->text().toDouble();
395 newPid.
kd = ui->tableVelocity->item(
VELOCITY_KD, 1)->text().toDouble();
396 newPid.
ki = ui->tableVelocity->item(
VELOCITY_KI, 1)->text().toDouble();
406 newPid.
kp = ui->tableTorque->item(
TORQUE_KP,1)->text().toDouble();
407 newPid.
kff = ui->tableTorque->item(
TORQUE_KFF,1)->text().toDouble();
408 newPid.
kd = ui->tableTorque->item(
TORQUE_KD,1)->text().toDouble();
418 newPid.
ki = ui->tableTorque->item(
TORQUE_KI,1)->text().toDouble();
428 double desiredStiff = ui->tableStiffness->item(0,3)->text().toDouble();
429 double desiredDamp = ui->tableStiffness->item(1,3)->text().toDouble();
430 double desiredForce = ui->tableStiffness->item(2,3)->text().toDouble();
431 emit
sendStiffness(jointIndex,desiredStiff,desiredDamp,desiredForce);
435 int desiredDuty = ui->tablePWM->item(0,1)->text().toDouble();
436 emit
sendPWM(jointIndex,desiredDuty);
440 newPid.
kp = ui->tableCurrent->item(
CURRENT_KP, 1)->text().toDouble();
441 newPid.
kd = ui->tableCurrent->item(
CURRENT_KD, 1)->text().toDouble();
442 newPid.
ki = ui->tableCurrent->item(
CURRENT_KI, 1)->text().toDouble();
452 int rows = ui->tableVariables->rowCount();
453 for (
int i = 0; i < rows; i++)
455 std::string key = ui->tableVariables->item(i, 0)->text().toStdString();
456 std::string val = ui->tableVariables->item(i, 1)->text().toStdString();
470void PidDlg::onCancel()
int SIGNAL(int pid, int signum)
void sendTorquePid(int jointIndex, Pid, MotorTorqueParameters newTorqueParam)
void initVelocity(Pid myPid)
void sendVelocityPid(int jointIndex, Pid pid)
void refreshPids(int jointIndex)
void initPosition(Pid myPid)
void sendSingleRemoteVariable(std::string key, yarp::os::Bottle val)
void sendPWM(int jointIndex, double dutyVal)
void updateAllRemoteVariables()
void initStiffness(double curStiffVal, double minStiff, double maxStiff, double curDampVal, double minDamp, double maxDamp, double curForceVal, double minForce, double maxForce)
void initTorque(Pid myPid, MotorTorqueParameters TorqueParam)
void sendStiffness(int, double, double, double)
void initCurrent(Pid myPid)
void initRemoteVariables(IRemoteVariables *iVar)
PidDlg(QString partname, int jointIndex, QString jointName, QWidget *parent=0)
void dumpRemoteVariables()
void initPWM(double pwmVal, double pwm)
void sendPositionPid(int jointIndex, Pid pid)
void sendCurrentPid(int jointIndex, Pid pid)
IRemoteVariables interface.
virtual bool getRemoteVariable(std::string key, yarp::os::Bottle &val)=0
virtual bool getRemoteVariablesList(yarp::os::Bottle *listOfKeys)=0
Contains the parameters for a PID.
double scale
scale for the pid output
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 kff
feedforward gain
double ki
integrative gain
double max_int
saturation threshold for the integrator
double kp
proportional gain
A simple collection of objects that can be described and transmitted in a portable way.
size_type size() const
Gets the number of elements in the bottle.
Value & get(size_type index) const
Reads a Value v from a certain part of the list.
std::string toString() const override
Gives a human-readable textual representation of the bottle.
virtual bool isString() const
Checks if value is a string.
virtual std::string asString() const
Get string value.
#define VELOCITY_STICTIONUP
#define TORQUE_STITCTIONUP
#define VELOCITY_MAXOUTPUT
#define VELOCITY_THRESHOLD
#define VELOCITY_STICTIONDW
#define CURRENT_MAXOUTPUT
#define TORQUE_STICTIONDW
#define POSITION_STICTIONDW
#define TORQUE_VISCOUSNEG
#define POSITION_STICTIONUP
#define POSITION_MAXOUTPUT
#define TORQUE_COULOMBNEG
#define TORQUE_COULOMBPOS
#define TORQUE_VISCOUSPOS