CartesianImpedanceControllerConfigWidget.cpp
Go to the documentation of this file.
2
3#include <VirtualRobot/RobotNodeSet.h>
4
5namespace armarx
6{
7 void
8 clearLayout(QLayout* layout)
9 {
10 QLayoutItem* item;
11 while ((item = layout->takeAt(0)))
12 {
13 if (item->layout())
14 {
15 clearLayout(item->layout());
16 delete item->layout();
17 }
18 if (item->widget())
19 {
20 delete item->widget();
21 }
22 delete item;
23 }
24 }
25
27 QWidget* parent) :
28 QWidget(parent)
29 {
30 ui.setupUi(this);
31
32 kxyz.addWidget(ui.doubleSpinBoxKTX);
33 kxyz.addWidget(ui.doubleSpinBoxKTY);
34 kxyz.addWidget(ui.doubleSpinBoxKTZ);
35 kxyz.setMinMax(0, 5000);
36 kxyz.set(1000);
37
38 krpy.addWidget(ui.doubleSpinBoxKRX);
39 krpy.addWidget(ui.doubleSpinBoxKRY);
40 krpy.addWidget(ui.doubleSpinBoxKRZ);
41 krpy.setMinMax(0, 5000);
42 krpy.set(500);
43
44 dxyz.addWidget(ui.doubleSpinBoxDTX);
45 dxyz.addWidget(ui.doubleSpinBoxDTY);
46 dxyz.addWidget(ui.doubleSpinBoxDTZ);
47 dxyz.setMinMax(0, 5000);
48 dxyz.set(250);
49
50 drpy.addWidget(ui.doubleSpinBoxDRX);
51 drpy.addWidget(ui.doubleSpinBoxDRY);
52 drpy.addWidget(ui.doubleSpinBoxDRZ);
53 drpy.setMinMax(0, 5000);
54 drpy.set(100);
55
57 connect(ui.pushButtonNullspaceUpdateJoints,
58 &QPushButton::clicked,
59 this,
60 &T::on_pushButtonNullspaceUpdateJoints_clicked);
61 connect(ui.pushButtonNullspaceSend,
62 &QPushButton::clicked,
63 this,
64 &T::on_pushButtonNullspaceSend_clicked);
65 connect(ui.pushButtonSettingsSend,
66 &QPushButton::clicked,
67 this,
68 &T::on_pushButtonSettingsSend_clicked);
69 }
70
71 void
73 const QString& prefix)
74 {
75 if (prefix.size())
76 {
77 settings->beginGroup(prefix);
78 }
79 ///TODO
80 if (prefix.size())
81 {
82 settings->endGroup();
83 }
84 }
85
86 void
88 const QString& prefix)
89 {
90 if (prefix.size())
91 {
92 settings->beginGroup("layer");
93 }
94 ///TODO
95 if (prefix.size())
96 {
97 settings->endGroup();
98 }
99 }
100
101 NJointTaskSpaceImpedanceControlConfigPtr
103 const Eigen::Quaternionf& targOri) const
104 {
107 NJointTaskSpaceImpedanceControlConfigPtr cfg = new NJointTaskSpaceImpedanceControlConfig;
108 cfg->nodeSetName = _rns->getName();
109
110 cfg->desiredPosition = targPos;
111 cfg->desiredOrientation = targOri;
112
113 kxyz.get(cfg->Kpos);
114 krpy.get(cfg->Kori);
115 dxyz.get(cfg->Dpos);
116 drpy.get(cfg->Dori);
117
118 auto [joint, knull, dnull] = readNullspaceCFG();
119 cfg->desiredJointPositions = joint;
120 cfg->Knull = knull;
121 cfg->Dnull = dnull;
122
123 cfg->torqueLimit = ui.doubleSpinBoxTorqueLim->value();
124 return cfg;
125 }
126
127 NJointTaskSpaceImpedanceControlRuntimeConfig
129 {
132 NJointTaskSpaceImpedanceControlRuntimeConfig cfg;
133
134 kxyz.get(cfg.Kpos);
135 krpy.get(cfg.Kori);
136 dxyz.get(cfg.Dpos);
137 drpy.get(cfg.Dori);
138
139 auto [joint, knull, dnull] = readNullspaceCFG();
140 cfg.desiredJointPositions = joint;
141 cfg.Knull = knull;
142 cfg.Dnull = dnull;
143
144 cfg.torqueLimit = ui.doubleSpinBoxTorqueLim->value();
145 return cfg;
146 }
147
148 std::tuple<Eigen::VectorXf, Eigen::VectorXf, Eigen::VectorXf>
150 {
152 return {jointValues.get<Eigen::VectorXf>(),
153 jointKnull.get<Eigen::VectorXf>(),
154 jointDnull.get<Eigen::VectorXf>()};
155 }
156
157 void
159 {
161 if (!_controller)
162 {
163 return;
164 }
165 auto [joint, knull, dnull] = readNullspaceCFG();
166 _controller->setNullspaceConfig(joint, knull, dnull);
167 }
168
169 void
171 {
173 if (!_rns)
174 {
175 return;
176 }
177 jointValues.set(_rns);
178 }
179
180 void
182 {
184 if (!_controller)
185 {
186 return;
187 }
188 _controller->setConfig(readRuntimeCFG());
189 }
190
191 void
193 const NJointTaskSpaceImpedanceControlInterfacePrx& prx)
194 {
195 _controller = prx;
196 }
197
198 void
199 CartesianImpedanceControllerConfigWidget::setRNS(const VirtualRobot::RobotNodeSetPtr& rns)
200 {
202 _rns = rns;
203 auto lay = ui.gridLayoutNullspace;
204 clearLayout(lay);
205 lay->addWidget(new QLabel{"Joint"}, 0, 0);
206 lay->addWidget(new QLabel{"Target"}, 0, 1);
207 lay->addWidget(new QLabel{"Knull"}, 0, 2);
208 lay->addWidget(new QLabel{"Dnull"}, 0, 3);
209 jointValues.clear();
210 jointKnull.clear();
211 jointDnull.clear();
212
213 if (!_rns)
214 {
215 return;
216 }
217
218 int i = 1;
219 for (const auto& rn : _rns->getAllRobotNodes())
220 {
222 const auto&& n = rn->getName();
223 lay->addWidget(new QLabel{QString::fromStdString(n)}, i, 0);
224 {
225 auto b = new QDoubleSpinBox;
226 jointValues.addWidget(b);
227 lay->addWidget(b, i, 1);
228 const auto lo = rn->getJointLimitLow();
229 const auto hi = rn->getJointLimitHigh();
230 b->setMinimum(lo);
231 b->setMaximum(hi);
232 b->setValue((lo + hi) / 2);
233 }
234 {
235 auto b = new QDoubleSpinBox;
236 jointKnull.addWidget(b);
237 lay->addWidget(b, i, 2);
238 b->setMinimum(0);
239 b->setMaximum(1000);
240 b->setValue(2);
241 }
242 {
243 auto b = new QDoubleSpinBox;
244 jointDnull.addWidget(b);
245 lay->addWidget(b, i, 3);
246 b->setMinimum(0);
247 b->setMaximum(1000);
248 b->setValue(1);
249 }
250 ++i;
251 }
252 jointKnull.set(2);
253 jointDnull.set(1);
254
256 }
257} // namespace armarx
#define lo(x)
#define hi(x)
NJointTaskSpaceImpedanceControlRuntimeConfig readRuntimeCFG() const
void saveSettings(QSettings *settings, const QString &prefix="")
void setController(const NJointTaskSpaceImpedanceControlInterfacePrx &prx)
if null -> send buttons deactivated
std::tuple< Eigen::VectorXf, Eigen::VectorXf, Eigen::VectorXf > readNullspaceCFG() const
void loadSettings(QSettings *settings, const QString &prefix="")
NJointTaskSpaceImpedanceControlConfigPtr readFullCFG(const Eigen::Vector3f &targPos, const Eigen::Quaternionf &targOri) const
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
Quaternion< float, 0 > Quaternionf
This file offers overloads of toIce() and fromIce() functions for STL container types.
void clearLayout(QLayout *layout)
#define ARMARX_TRACE
Definition trace.h:77