YARP
Yet Another Robot Platform
 
Loading...
Searching...
No Matches
piddlg.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3 * SPDX-FileCopyrightText: 2006-2010 RobotCub Consortium
4 * SPDX-License-Identifier: LGPL-2.1-or-later
5 */
6
7#include "piddlg.h"
8#include "ui_piddlg.h"
9#include <QDebug>
10#include <QPushButton>
11#include <yarp/os/Bottle.h>
12#include <yarp/os/Value.h>
13
14#define TAB_POSITION 0
15#define TAB_VELOCITY 1
16#define TAB_TORQUE 2
17#define TAB_STIFF 3
18#define TAB_PWM 4
19#define TAB_CURRENT 5
20#define TAB_VARIABLES 6
21
22#define POSITION_KP 0
23#define POSITION_KD 1
24#define POSITION_KI 2
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
31
32#define VELOCITY_KP 0
33#define VELOCITY_KD 1
34#define VELOCITY_KI 2
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
41
42#define TORQUE_KP 0
43#define TORQUE_KD 1
44#define TORQUE_KI 2
45#define TORQUE_SCALE 3
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
51#define TORQUE_KFF 9
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
61
62#define CURRENT_KP 0
63#define CURRENT_KD 1
64#define CURRENT_KI 2
65#define CURRENT_SCALE 3
66#define CURRENT_MAXOUTPUT 4
67#define CURRENT_MAXINT 5
68#define CURRENT_OFFSET 6
69
70PidDlg::PidDlg(QString partname, int jointIndex, QString jointName, QWidget *parent) :
71 QDialog(parent),
72 ui(new Ui::PidDlg)
73{
74 ui->setupUi(this);
75
76 this->jointIndex = jointIndex;
77
78 QString title = QString("Pid Control %1 JNT:%2 (%3)").arg(partname).arg(jointIndex).arg(jointName);
79 setWindowTitle(title);
80
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()));
85
86 connect(ui->tableStiffness, &QTableWidget::itemChanged, this, [this](QTableWidgetItem* item)
87 {
88 if (item == ui->tableStiffness->item(2, 3))
89 {
90 onForceOffsetChanged(item->text());
91 }
92 });
93
94 ui->tablePosition->setItemDelegate(new TableDoubleDelegate);
95 ui->tableVelocity->setItemDelegate(new TableDoubleDelegate);
96 ui->tableTorque->setItemDelegate(new TableDoubleDelegate);
97 ui->tableStiffness->setItemDelegate(new TableDoubleDelegate);
98 ui->tablePWM->setItemDelegate(new TableDoubleDelegate);
99 ui->tableCurrent->setItemDelegate(new TableDoubleDelegate);
100 ui->tableCurrent->setItemDelegate(new TableGenericDelegate);
101}
102
103void PidDlg::onForceOffsetChanged(QString forceOffset)
104{
105 forceOffsetChanged = true;
106}
107
108void PidDlg::onDumpRemoteVariables()
109{
110 emit dumpRemoteVariables();
111}
112
114{
115 for (auto& button : buttons)
116 {
117 delete button;
118 button = nullptr;
119 }
120 buttons.clear();
121 delete ui;
122}
123
125{
126 ui->tablePosition->item(POSITION_KP,0)->setText(QString("%1").arg((double)myPid.kp));
127 ui->tablePosition->item(POSITION_KP,1)->setText(QString("%1").arg((double)myPid.kp));
128
129 ui->tablePosition->item(POSITION_KD,0)->setText(QString("%1").arg((double)myPid.kd));
130 ui->tablePosition->item(POSITION_KD,1)->setText(QString("%1").arg((double)myPid.kd));
131
132 ui->tablePosition->item(POSITION_KI,0)->setText(QString("%1").arg((double)myPid.ki));
133 ui->tablePosition->item(POSITION_KI,1)->setText(QString("%1").arg((double)myPid.ki));
134
135 ui->tablePosition->item(POSITION_SCALE,0)->setText(QString("%1").arg((int)myPid.scale));
136 ui->tablePosition->item(POSITION_SCALE,1)->setText(QString("%1").arg((int)myPid.scale));
137
138 ui->tablePosition->item(POSITION_OFFSET,0)->setText(QString("%1").arg((int)myPid.offset));
139 ui->tablePosition->item(POSITION_OFFSET,1)->setText(QString("%1").arg((int)myPid.offset));
140
141 ui->tablePosition->item(POSITION_STICTIONUP,0)->setText(QString("%1").arg((double)myPid.stiction_up_val));
142 ui->tablePosition->item(POSITION_STICTIONUP,1)->setText(QString("%1").arg((double)myPid.stiction_up_val));
143
144 ui->tablePosition->item(POSITION_MAXOUTPUT,0)->setText(QString("%1").arg((int)myPid.max_output));
145 ui->tablePosition->item(POSITION_MAXOUTPUT,1)->setText(QString("%1").arg((int)myPid.max_output));
146
147 ui->tablePosition->item(POSITION_STICTIONDW,0)->setText(QString("%1").arg((double)myPid.stiction_down_val));
148 ui->tablePosition->item(POSITION_STICTIONDW,1)->setText(QString("%1").arg((double)myPid.stiction_down_val));
149
150 ui->tablePosition->item(POSITION_MAXINT,0)->setText(QString("%1").arg((int)myPid.max_int));
151 ui->tablePosition->item(POSITION_MAXINT,1)->setText(QString("%1").arg((int)myPid.max_int));
152}
153
155{
156 ui->tableVelocity->item(VELOCITY_KP, 0)->setText(QString("%1").arg((double)myPid.kp));
157 ui->tableVelocity->item(VELOCITY_KP, 1)->setText(QString("%1").arg((double)myPid.kp));
158
159 ui->tableVelocity->item(VELOCITY_KD, 0)->setText(QString("%1").arg((double)myPid.kd));
160 ui->tableVelocity->item(VELOCITY_KD, 1)->setText(QString("%1").arg((double)myPid.kd));
161
162 ui->tableVelocity->item(VELOCITY_KI, 0)->setText(QString("%1").arg((double)myPid.ki));
163 ui->tableVelocity->item(VELOCITY_KI, 1)->setText(QString("%1").arg((double)myPid.ki));
164
165 ui->tableVelocity->item(VELOCITY_SCALE, 0)->setText(QString("%1").arg((int)myPid.scale));
166 ui->tableVelocity->item(VELOCITY_SCALE, 1)->setText(QString("%1").arg((int)myPid.scale));
167
168 ui->tableVelocity->item(VELOCITY_OFFSET, 0)->setText(QString("%1").arg((int)myPid.offset));
169 ui->tableVelocity->item(VELOCITY_OFFSET, 1)->setText(QString("%1").arg((int)myPid.offset));
170
171 ui->tableVelocity->item(VELOCITY_STICTIONUP, 0)->setText(QString("%1").arg((double)myPid.stiction_up_val));
172 ui->tableVelocity->item(VELOCITY_STICTIONUP, 1)->setText(QString("%1").arg((double)myPid.stiction_up_val));
173
174 ui->tableVelocity->item(VELOCITY_MAXOUTPUT, 0)->setText(QString("%1").arg((int)myPid.max_output));
175 ui->tableVelocity->item(VELOCITY_MAXOUTPUT, 1)->setText(QString("%1").arg((int)myPid.max_output));
176
177 ui->tableVelocity->item(VELOCITY_STICTIONDW, 0)->setText(QString("%1").arg((double)myPid.stiction_down_val));
178 ui->tableVelocity->item(VELOCITY_STICTIONDW, 1)->setText(QString("%1").arg((double)myPid.stiction_down_val));
179
180 ui->tableVelocity->item(VELOCITY_MAXINT, 0)->setText(QString("%1").arg((int)myPid.max_int));
181 ui->tableVelocity->item(VELOCITY_MAXINT, 1)->setText(QString("%1").arg((int)myPid.max_int));
182}
183
185{
186 ui->tableTorque->item(TORQUE_KP,0)->setText(QString("%1").arg((double)myPid.kp));
187 ui->tableTorque->item(TORQUE_KP,1)->setText(QString("%1").arg((double)myPid.kp));
188
189 ui->tableTorque->item(TORQUE_KFF,0)->setText(QString("%1").arg((double)myPid.kff));
190 ui->tableTorque->item(TORQUE_KFF,1)->setText(QString("%1").arg((double)myPid.kff));
191
192 ui->tableTorque->item(TORQUE_KD,0)->setText(QString("%1").arg((double)myPid.kd));
193 ui->tableTorque->item(TORQUE_KD,1)->setText(QString("%1").arg((double)myPid.kd));
194
195 ui->tableTorque->item(TORQUE_BEMFGAIN,0)->setText(QString("%1").arg((double)TrqParam.bemf));
196 ui->tableTorque->item(TORQUE_BEMFGAIN,1)->setText(QString("%1").arg((double)TrqParam.bemf));
197
198 ui->tableTorque->item(TORQUE_BEMFSCALE,0)->setText(QString("%1").arg((int)TrqParam.bemf_scale));
199 ui->tableTorque->item(TORQUE_BEMFSCALE,1)->setText(QString("%1").arg((int)TrqParam.bemf_scale));
200
201 ui->tableTorque->item(TORQUE_KTAUGAIN,0)->setText(QString("%1").arg((double)TrqParam.ktau));
202 ui->tableTorque->item(TORQUE_KTAUGAIN,1)->setText(QString("%1").arg((double)TrqParam.ktau));
203
204 ui->tableTorque->item(TORQUE_KTAUSCALE,0)->setText(QString("%1").arg((int)TrqParam.ktau_scale));
205 ui->tableTorque->item(TORQUE_KTAUSCALE,1)->setText(QString("%1").arg((int)TrqParam.ktau_scale));
206
207 ui->tableTorque->item(TORQUE_VISCOUSPOS, 0)->setText(QString("%1").arg((double)TrqParam.viscousPos));
208 ui->tableTorque->item(TORQUE_VISCOUSPOS, 1)->setText(QString("%1").arg((double)TrqParam.viscousPos));
209 ui->tableTorque->item(TORQUE_VISCOUSNEG, 0)->setText(QString("%1").arg((double)TrqParam.viscousNeg));
210 ui->tableTorque->item(TORQUE_VISCOUSNEG, 1)->setText(QString("%1").arg((double)TrqParam.viscousNeg));
211
212 ui->tableTorque->item(TORQUE_COULOMBPOS, 0)->setText(QString("%1").arg((double)TrqParam.coulombPos));
213 ui->tableTorque->item(TORQUE_COULOMBPOS, 1)->setText(QString("%1").arg((double)TrqParam.coulombPos));
214 ui->tableTorque->item(TORQUE_COULOMBNEG, 0)->setText(QString("%1").arg((double)TrqParam.coulombNeg));
215 ui->tableTorque->item(TORQUE_COULOMBNEG, 1)->setText(QString("%1").arg((double)TrqParam.coulombNeg));
216
217 ui->tableTorque->item(VELOCITY_THRESHOLD, 0)->setText(QString("%1").arg((double)TrqParam.velocityThres));
218 ui->tableTorque->item(VELOCITY_THRESHOLD, 1)->setText(QString("%1").arg((double)TrqParam.velocityThres));
219
220 ui->tableTorque->item(TORQUE_KI,0)->setText(QString("%1").arg((double)myPid.ki));
221 ui->tableTorque->item(TORQUE_KI,1)->setText(QString("%1").arg((double)myPid.ki));
222
223 ui->tableTorque->item(TORQUE_SCALE,0)->setText(QString("%1").arg((int)myPid.scale));
224 ui->tableTorque->item(TORQUE_SCALE,1)->setText(QString("%1").arg((int)myPid.scale));
225
226 ui->tableTorque->item(TORQUE_OFFSET,0)->setText(QString("%1").arg((int)myPid.offset));
227 ui->tableTorque->item(TORQUE_OFFSET,1)->setText(QString("%1").arg((int)myPid.offset));
228
229 ui->tableTorque->item(TORQUE_STITCTIONUP,0)->setText(QString("%1").arg((double)myPid.stiction_up_val));
230 ui->tableTorque->item(TORQUE_STITCTIONUP,1)->setText(QString("%1").arg((double)myPid.stiction_up_val));
231
232 ui->tableTorque->item(TORQUE_MAXOUTPUT,0)->setText(QString("%1").arg((int)myPid.max_output));
233 ui->tableTorque->item(TORQUE_MAXOUTPUT,1)->setText(QString("%1").arg((int)myPid.max_output));
234
235 ui->tableTorque->item(TORQUE_STICTIONDW,0)->setText(QString("%1").arg((double)myPid.stiction_down_val));
236 ui->tableTorque->item(TORQUE_STICTIONDW,1)->setText(QString("%1").arg((double)myPid.stiction_down_val));
237
238 ui->tableTorque->item(TORQUE_MAXINT,0)->setText(QString("%1").arg((int)myPid.max_int));
239 ui->tableTorque->item(TORQUE_MAXINT,1)->setText(QString("%1").arg((int)myPid.max_int));
240}
241
242void PidDlg::onSendRemoteVariable()
243{
244 int i = -1;
245 for (size_t elem = 0; elem < buttons.size(); elem++)
246 {
247 if (sender() == buttons[elem])
248 {
249 i = elem;
250 break;
251 }
252 }
253 if (i == -1) {
254 return;
255 }
256
257 std::string key = ui->tableVariables->item(i, 0)->text().toStdString();
258 std::string val = ui->tableVariables->item(i, 1)->text().toStdString();
259 yarp::os::Bottle valb(val);
260 emit sendSingleRemoteVariable(key, valb);
262}
263
265{
266 // Remote Variables
267 if (iVar)
268 {
269 ui->tableVariables->clear();
270 ui->tableVariables->clearContents();
271 ui->tableVariables->setRowCount(0);
272 ui->tableVariables->setColumnCount(0);
273 ui->tableVariables->insertColumn(0);
274 ui->tableVariables->insertColumn(0);
275 ui->tableVariables->insertColumn(0);
276 ui->tableVariables->setMinimumWidth(500);
277 ui->tableVariables->setHorizontalHeaderItem(0, new QTableWidgetItem(QString("Key")));
278 ui->tableVariables->setHorizontalHeaderItem(1, new QTableWidgetItem(QString("Values")));
279 ui->tableVariables->setHorizontalHeaderItem(2, new QTableWidgetItem(QString("")));
280
281 yarp::os::Bottle keys;
282 if (iVar->getRemoteVariablesList(&keys))
283 {
284 std::string s = keys.toString();
285 int keys_size = keys.size();
286 for (auto& button : buttons)
287 {
288 delete button;
289 button = nullptr;
290 }
291 buttons.clear();
292 buttons.resize(keys_size);
293
294 for (int i = 0; i < keys_size; i++)
295 {
296 buttons[i] = new QPushButton("Send");
297 connect(buttons[i], SIGNAL(clicked()), this, SLOT(onSendRemoteVariable()));
298
299 std::string v;
300 if (keys.get(i).isString())
301 {
303 v = keys.get(i).asString();
304 iVar->getRemoteVariable(v, val);
305 ui->tableVariables->insertRow(i);
306 ui->tableVariables->setItem(i, 0, new QTableWidgetItem(QString(v.c_str())));
307 ui->tableVariables->item(i, 0)->setFlags(Qt::NoItemFlags);
308 ui->tableVariables->setItem(i, 1, new QTableWidgetItem(QString(val.toString().c_str())));
309 ui->tableVariables->item(i, 1)->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled );
310 ui->tableVariables->setColumnWidth(1, 500);
311 ui->tableVariables->setCellWidget(i, 2, (QWidget*)buttons[i]);
312
313 /*yarp::os::Bottle val;
314 v = keys.get(i).asString();
315 iVar->getRemoteVariable(v, val);
316 int valsize = val.get(0).size();
317 ui->tableVariables->insertRow(i);
318 ui->tableVariables->setItem(i, 0, new QTableWidgetItem(QString(v.c_str())));
319 ui->tableVariables->item(i, 0)->setFlags(Qt::NoItemFlags);
320 for (int j = 0; j < valsize; j++)
321 {
322 ui->tableVariables->setItem(i, j+1, new QTableWidgetItem(QString(val.get(j).toString().c_str())));
323 }*/
324 }
325 }
326 }
327 }
328}
329
330void PidDlg::initStiffness(double curStiffVal, double minStiff, double maxStiff,
331 double curDampVal, double minDamp, double maxDamp)
332{
333 ui->tableStiffness->item(0,0)->setText(QString("%L1").arg(curStiffVal,0,'f',3));
334 ui->tableStiffness->item(0,1)->setText(QString("%L1").arg(minStiff,0,'f',3));
335 ui->tableStiffness->item(0,2)->setText(QString("%L1").arg(maxStiff,0,'f',3));
336 ui->tableStiffness->item(0,3)->setText(QString("%L1").arg(curStiffVal,0,'f',3));
337
338 ui->tableStiffness->item(1,0)->setText(QString("%L1").arg(curDampVal,0,'f',3));
339 ui->tableStiffness->item(1,1)->setText(QString("%L1").arg(minDamp,0,'f',3));
340 ui->tableStiffness->item(1,2)->setText(QString("%L1").arg(maxDamp,0,'f',3));
341 ui->tableStiffness->item(1,3)->setText(QString("%L1").arg(curDampVal,0,'f',3));
342}
343
344void PidDlg::initTorqueOffset(double curForceVal, double minForce, double maxForce)
345{
346 ui->tableStiffness->item(2,0)->setText(QString("%L1").arg(curForceVal,0,'f',3));
347 ui->tableStiffness->item(2,1)->setText(QString("%L1").arg(minForce,0,'f',3));
348 ui->tableStiffness->item(2,2)->setText(QString("%L1").arg(maxForce,0,'f',3));
349 ui->tableStiffness->item(2,3)->setText(QString("%L1").arg(curForceVal,0,'f',3));
350 forceOffsetChanged=false;
351}
352
353
354void PidDlg::initPWM(double PWMVal, double pwm)
355{
356 ui->tablePWM->item(0, 0)->setText(QString("%1").arg((double)PWMVal));
357 ui->tablePWM->item(0, 1)->setText(QString("%1").arg((double)PWMVal));
358
359 ui->tablePWM->item(1,0)->setText(QString("%1").arg(pwm));
360}
361
363{
364 ui->tableCurrent->item(CURRENT_KP, 0)->setText(QString("%1").arg((double)myPid.kp));
365 ui->tableCurrent->item(CURRENT_KP, 1)->setText(QString("%1").arg((double)myPid.kp));
366
367 ui->tableCurrent->item(CURRENT_KD, 0)->setText(QString("%1").arg((double)myPid.kd));
368 ui->tableCurrent->item(CURRENT_KD, 1)->setText(QString("%1").arg((double)myPid.kd));
369
370 ui->tableCurrent->item(CURRENT_KI, 0)->setText(QString("%1").arg((double)myPid.ki));
371 ui->tableCurrent->item(CURRENT_KI, 1)->setText(QString("%1").arg((double)myPid.ki));
372
373 ui->tableCurrent->item(CURRENT_SCALE, 0)->setText(QString("%1").arg((int)myPid.scale));
374 ui->tableCurrent->item(CURRENT_SCALE, 1)->setText(QString("%1").arg((int)myPid.scale));
375
376 ui->tableCurrent->item(CURRENT_OFFSET, 0)->setText(QString("%1").arg((int)myPid.offset));
377 ui->tableCurrent->item(CURRENT_OFFSET, 1)->setText(QString("%1").arg((int)myPid.offset));
378
379 ui->tableCurrent->item(CURRENT_MAXOUTPUT, 0)->setText(QString("%1").arg((int)myPid.max_output));
380 ui->tableCurrent->item(CURRENT_MAXOUTPUT, 1)->setText(QString("%1").arg((int)myPid.max_output));
381
382 ui->tableCurrent->item(CURRENT_MAXINT, 0)->setText(QString("%1").arg((int)myPid.max_int));
383 ui->tableCurrent->item(CURRENT_MAXINT, 1)->setText(QString("%1").arg((int)myPid.max_int));
384}
385
386void PidDlg::onRefresh()
387{
388 emit refreshPids(jointIndex);
389}
390
391void PidDlg::onSend()
392{
393 Pid newPid;
394 MotorTorqueParameters newMotorTorqueParams;
395
396 switch (ui->tabMain->currentIndex()) {
397 case TAB_POSITION:
398 newPid.kp = ui->tablePosition->item(POSITION_KP,1)->text().toDouble();
399 newPid.kd = ui->tablePosition->item(POSITION_KD,1)->text().toDouble();
400 newPid.ki = ui->tablePosition->item(POSITION_KI,1)->text().toDouble();
401 newPid.scale = ui->tablePosition->item(POSITION_SCALE,1)->text().toDouble();
402 newPid.offset = ui->tablePosition->item(POSITION_OFFSET,1)->text().toDouble();
403 newPid.stiction_up_val = ui->tablePosition->item(POSITION_STICTIONUP,1)->text().toDouble();
404 newPid.max_output = ui->tablePosition->item(POSITION_MAXOUTPUT,1)->text().toDouble();
405 newPid.stiction_down_val = ui->tablePosition->item(POSITION_STICTIONDW,1)->text().toDouble();
406 newPid.max_int = ui->tablePosition->item(POSITION_MAXINT,1)->text().toDouble();
407 emit sendPositionPid(jointIndex,newPid);
408 break;
409 case TAB_VELOCITY:
410 newPid.kp = ui->tableVelocity->item(VELOCITY_KP, 1)->text().toDouble();
411 newPid.kd = ui->tableVelocity->item(VELOCITY_KD, 1)->text().toDouble();
412 newPid.ki = ui->tableVelocity->item(VELOCITY_KI, 1)->text().toDouble();
413 newPid.scale = ui->tableVelocity->item(VELOCITY_SCALE, 1)->text().toDouble();
414 newPid.offset = ui->tableVelocity->item(VELOCITY_OFFSET, 1)->text().toDouble();
415 newPid.stiction_up_val = ui->tableVelocity->item(VELOCITY_STICTIONUP, 1)->text().toDouble();
416 newPid.max_output = ui->tableVelocity->item(VELOCITY_MAXOUTPUT, 1)->text().toDouble();
417 newPid.stiction_down_val = ui->tableVelocity->item(VELOCITY_STICTIONDW, 1)->text().toDouble();
418 newPid.max_int = ui->tableVelocity->item(VELOCITY_MAXINT, 1)->text().toDouble();
419 emit sendVelocityPid(jointIndex, newPid);
420 break;
421 case TAB_TORQUE:
422 newPid.kp = ui->tableTorque->item(TORQUE_KP,1)->text().toDouble();
423 newPid.kff = ui->tableTorque->item(TORQUE_KFF,1)->text().toDouble();
424 newPid.kd = ui->tableTorque->item(TORQUE_KD,1)->text().toDouble();
425 newMotorTorqueParams.bemf = ui->tableTorque->item(TORQUE_BEMFGAIN,1)->text().toDouble();
426 newMotorTorqueParams.bemf_scale = ui->tableTorque->item(TORQUE_BEMFSCALE,1)->text().toDouble();
427 newMotorTorqueParams.ktau = ui->tableTorque->item(TORQUE_KTAUGAIN,1)->text().toDouble();
428 newMotorTorqueParams.ktau_scale = ui->tableTorque->item(TORQUE_KTAUSCALE,1)->text().toDouble();
429 newMotorTorqueParams.viscousPos = ui->tableTorque->item(TORQUE_VISCOUSPOS,1)->text().toDouble();
430 newMotorTorqueParams.viscousNeg = ui->tableTorque->item(TORQUE_VISCOUSNEG,1)->text().toDouble();
431 newMotorTorqueParams.coulombPos = ui->tableTorque->item(TORQUE_COULOMBPOS,1)->text().toDouble();
432 newMotorTorqueParams.coulombNeg = ui->tableTorque->item(TORQUE_COULOMBNEG,1)->text().toDouble();
433 newMotorTorqueParams.velocityThres = ui->tableTorque->item(VELOCITY_THRESHOLD,1)->text().toDouble();
434 newPid.ki = ui->tableTorque->item(TORQUE_KI,1)->text().toDouble();
435 newPid.scale = ui->tableTorque->item(TORQUE_SCALE,1)->text().toDouble();
436 newPid.offset = ui->tableTorque->item(TORQUE_OFFSET,1)->text().toDouble();
437 newPid.stiction_up_val = ui->tableTorque->item(TORQUE_STITCTIONUP,1)->text().toDouble();
438 newPid.max_output = ui->tableTorque->item(TORQUE_MAXOUTPUT,1)->text().toDouble();
439 newPid.stiction_down_val = ui->tableTorque->item(TORQUE_STICTIONDW,1)->text().toDouble();
440 newPid.max_int = ui->tableTorque->item(TORQUE_MAXINT,1)->text().toDouble();
441 emit sendTorquePid(jointIndex,newPid,newMotorTorqueParams);
442 break;
443 case TAB_STIFF:{
444 double desiredStiff = ui->tableStiffness->item(0,3)->text().toDouble();
445 double desiredDamp = ui->tableStiffness->item(1,3)->text().toDouble();
446 double desiredForce = ui->tableStiffness->item(2,3)->text().toDouble();
447 emit sendStiffness(jointIndex,desiredStiff,desiredDamp);
448 if (forceOffsetChanged)
449 {
450 emit sendForceOffset(jointIndex, desiredForce);
451 forceOffsetChanged = false;
452 }
453 break;
454 }
455 case TAB_PWM:{
456 int desiredDuty = ui->tablePWM->item(0,1)->text().toDouble();
457 emit sendPWM(jointIndex,desiredDuty);
458 break;
459 }
460 case TAB_CURRENT:{
461 newPid.kp = ui->tableCurrent->item(CURRENT_KP, 1)->text().toDouble();
462 newPid.kd = ui->tableCurrent->item(CURRENT_KD, 1)->text().toDouble();
463 newPid.ki = ui->tableCurrent->item(CURRENT_KI, 1)->text().toDouble();
464 newPid.scale = ui->tableCurrent->item(CURRENT_SCALE, 1)->text().toDouble();
465 newPid.offset = ui->tableCurrent->item(CURRENT_OFFSET, 1)->text().toDouble();
466 newPid.max_output = ui->tableCurrent->item(CURRENT_MAXOUTPUT, 1)->text().toDouble();
467 newPid.max_int = ui->tableCurrent->item(CURRENT_MAXINT, 1)->text().toDouble();
468 emit sendCurrentPid(jointIndex, newPid);
469 break;
470 }
471 case TAB_VARIABLES:{
472 // Remote Variables
473 int rows = ui->tableVariables->rowCount();
474 for (int i = 0; i < rows; i++)
475 {
476 std::string key = ui->tableVariables->item(i, 0)->text().toStdString();
477 std::string val = ui->tableVariables->item(i, 1)->text().toStdString();
478 yarp::os::Bottle valb(val);
479 emit sendSingleRemoteVariable(key, valb);
480 }
482 break;
483 }
484 default:
485 break;
486 }
487
488
489}
490
491void PidDlg::onCancel()
492{
493 reject();
494}
int SIGNAL(int pid, int signum)
void sendTorquePid(int jointIndex, Pid, MotorTorqueParameters newTorqueParam)
void initVelocity(Pid myPid)
Definition piddlg.cpp:154
void sendForceOffset(int, double)
~PidDlg()
Definition piddlg.cpp:113
void sendVelocityPid(int jointIndex, Pid pid)
void refreshPids(int jointIndex)
void initPosition(Pid myPid)
Definition piddlg.cpp:124
void sendSingleRemoteVariable(std::string key, yarp::os::Bottle val)
void sendPWM(int jointIndex, double dutyVal)
void updateAllRemoteVariables()
void initTorque(Pid myPid, MotorTorqueParameters TorqueParam)
Definition piddlg.cpp:184
void initTorqueOffset(double curForceVal, double minForce, double maxForce)
Definition piddlg.cpp:344
void initCurrent(Pid myPid)
Definition piddlg.cpp:362
void sendStiffness(int, double, double)
void initStiffness(double curStiffVal, double minStiff, double maxStiff, double curDampVal, double minDamp, double maxDamp)
Definition piddlg.cpp:330
void initRemoteVariables(IRemoteVariables *iVar)
Definition piddlg.cpp:264
PidDlg(QString partname, int jointIndex, QString jointName, QWidget *parent=0)
Definition piddlg.cpp:70
void dumpRemoteVariables()
void initPWM(double pwmVal, double pwm)
Definition piddlg.cpp:354
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 kd
derivative gain
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.
Definition Bottle.h:64
size_type size() const
Gets the number of elements in the bottle.
Definition Bottle.cpp:251
Value & get(size_type index) const
Reads a Value v from a certain part of the list.
Definition Bottle.cpp:246
std::string toString() const override
Gives a human-readable textual representation of the bottle.
Definition Bottle.cpp:211
virtual bool isString() const
Checks if value is a string.
Definition Value.cpp:156
virtual std::string asString() const
Get string value.
Definition Value.cpp:234
Definition aboutdlg.h:11
#define POSITION_KP
Definition piddlg.cpp:22
#define TAB_POSITION
Definition piddlg.cpp:14
#define VELOCITY_STICTIONUP
Definition piddlg.cpp:39
#define TAB_TORQUE
Definition piddlg.cpp:16
#define TORQUE_STITCTIONUP
Definition piddlg.cpp:49
#define TORQUE_BEMFGAIN
Definition piddlg.cpp:52
#define TORQUE_KTAUSCALE
Definition piddlg.cpp:55
#define POSITION_KD
Definition piddlg.cpp:23
#define CURRENT_KD
Definition piddlg.cpp:63
#define TAB_CURRENT
Definition piddlg.cpp:19
#define CURRENT_KP
Definition piddlg.cpp:62
#define VELOCITY_KD
Definition piddlg.cpp:33
#define VELOCITY_MAXOUTPUT
Definition piddlg.cpp:36
#define VELOCITY_THRESHOLD
Definition piddlg.cpp:60
#define TAB_PWM
Definition piddlg.cpp:18
#define TORQUE_OFFSET
Definition piddlg.cpp:48
#define VELOCITY_OFFSET
Definition piddlg.cpp:38
#define TORQUE_KFF
Definition piddlg.cpp:51
#define VELOCITY_STICTIONDW
Definition piddlg.cpp:40
#define CURRENT_KI
Definition piddlg.cpp:64
#define TAB_VELOCITY
Definition piddlg.cpp:15
#define TAB_VARIABLES
Definition piddlg.cpp:20
#define CURRENT_MAXOUTPUT
Definition piddlg.cpp:66
#define VELOCITY_KP
Definition piddlg.cpp:32
#define CURRENT_MAXINT
Definition piddlg.cpp:67
#define POSITION_OFFSET
Definition piddlg.cpp:28
#define TORQUE_STICTIONDW
Definition piddlg.cpp:50
#define TORQUE_MAXINT
Definition piddlg.cpp:47
#define VELOCITY_SCALE
Definition piddlg.cpp:35
#define CURRENT_OFFSET
Definition piddlg.cpp:68
#define TAB_STIFF
Definition piddlg.cpp:17
#define TORQUE_BEMFSCALE
Definition piddlg.cpp:53
#define TORQUE_KD
Definition piddlg.cpp:43
#define TORQUE_KP
Definition piddlg.cpp:42
#define POSITION_STICTIONDW
Definition piddlg.cpp:30
#define TORQUE_KI
Definition piddlg.cpp:44
#define TORQUE_VISCOUSNEG
Definition piddlg.cpp:57
#define TORQUE_KTAUGAIN
Definition piddlg.cpp:54
#define POSITION_STICTIONUP
Definition piddlg.cpp:29
#define TORQUE_SCALE
Definition piddlg.cpp:45
#define VELOCITY_MAXINT
Definition piddlg.cpp:37
#define POSITION_SCALE
Definition piddlg.cpp:25
#define POSITION_MAXOUTPUT
Definition piddlg.cpp:26
#define TORQUE_COULOMBNEG
Definition piddlg.cpp:59
#define POSITION_KI
Definition piddlg.cpp:24
#define CURRENT_SCALE
Definition piddlg.cpp:65
#define POSITION_MAXINT
Definition piddlg.cpp:27
#define TORQUE_MAXOUTPUT
Definition piddlg.cpp:46
#define TORQUE_COULOMBPOS
Definition piddlg.cpp:58
#define VELOCITY_KI
Definition piddlg.cpp:34
#define TORQUE_VISCOUSPOS
Definition piddlg.cpp:56