HomogeneousMatrixCalculatorWidgetController.cpp
Go to the documentation of this file.
1/*
2 * This file is part of ArmarX.
3 *
4 * ArmarX is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 * ArmarX is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * \package RobotAPI::gui-plugins::HomogeneousMatrixCalculatorWidgetController
17 * \author Raphael Grimm ( raphael dot grimm at kit dot edu )
18 * \date 2017
19 * \copyright http://www.gnu.org/licenses/gpl-2.0.txt
20 * GNU General Public License
21 */
22
24
25#include <string>
26
27#include <QDoubleValidator>
28#include <QLineEdit>
29
30#include <Eigen/Dense>
31
32using namespace armarx;
33
35{
36 widget.setupUi(getWidget());
37
38 std::vector<QLineEdit*> edits{
39 widget.lineEdit00, widget.lineEdit01, widget.lineEdit02,
40 widget.lineEdit03, widget.lineEdit10, widget.lineEdit11,
41 widget.lineEdit12, widget.lineEdit13, widget.lineEdit20,
42 widget.lineEdit21, widget.lineEdit22, widget.lineEdit23,
43 widget.lineEdit30, widget.lineEdit31, widget.lineEdit32,
44 widget.lineEdit33,
45
46 widget.lineEditI00, widget.lineEditI01, widget.lineEditI02,
47 widget.lineEditI03, widget.lineEditI10, widget.lineEditI11,
48 widget.lineEditI12, widget.lineEditI13, widget.lineEditI20,
49 widget.lineEditI21, widget.lineEditI22, widget.lineEditI23,
50 widget.lineEditI30, widget.lineEditI31, widget.lineEditI32,
51 widget.lineEditI33,
52
53 widget.lineEditICheck00, widget.lineEditICheck01, widget.lineEditICheck02,
54 widget.lineEditICheck03, widget.lineEditICheck10, widget.lineEditICheck11,
55 widget.lineEditICheck12, widget.lineEditICheck13, widget.lineEditICheck20,
56 widget.lineEditICheck21, widget.lineEditICheck22, widget.lineEditICheck23,
57 widget.lineEditICheck30, widget.lineEditICheck31, widget.lineEditICheck32,
58 widget.lineEditICheck33,
59
60 widget.lineEditX, widget.lineEditY, widget.lineEditZ,
61 widget.lineEditRX, widget.lineEditRY, widget.lineEditRZ,
62
63 widget.lineEditM00, widget.lineEditM01, widget.lineEditM02,
64 widget.lineEditM03, widget.lineEditM10, widget.lineEditM11,
65 widget.lineEditM12, widget.lineEditM13, widget.lineEditM20,
66 widget.lineEditM21, widget.lineEditM22, widget.lineEditM23,
67 widget.lineEditM30, widget.lineEditM31, widget.lineEditM32,
68 widget.lineEditM33,
69
70 widget.lineEditR00, widget.lineEditR01, widget.lineEditR02,
71 widget.lineEditR03, widget.lineEditR10, widget.lineEditR11,
72 widget.lineEditR12, widget.lineEditR13, widget.lineEditR20,
73 widget.lineEditR21, widget.lineEditR22, widget.lineEditR23,
74 widget.lineEditR30, widget.lineEditR31, widget.lineEditR32,
75 widget.lineEditR33,
76 };
77
78 for (auto edit : edits)
79 {
80 edit->setValidator(new QDoubleValidator(this));
81 edit->setFixedWidth(100);
82 edit->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
83 }
84 connect(widget.lineEdit00, SIGNAL(textEdited(QString)), this, SLOT(changed4f()));
85 connect(widget.lineEdit01, SIGNAL(textEdited(QString)), this, SLOT(changed4f()));
86 connect(widget.lineEdit02, SIGNAL(textEdited(QString)), this, SLOT(changed4f()));
87 connect(widget.lineEdit10, SIGNAL(textEdited(QString)), this, SLOT(changed4f()));
88 connect(widget.lineEdit11, SIGNAL(textEdited(QString)), this, SLOT(changed4f()));
89 connect(widget.lineEdit12, SIGNAL(textEdited(QString)), this, SLOT(changed4f()));
90 connect(widget.lineEdit20, SIGNAL(textEdited(QString)), this, SLOT(changed4f()));
91 connect(widget.lineEdit21, SIGNAL(textEdited(QString)), this, SLOT(changed4f()));
92 connect(widget.lineEdit22, SIGNAL(textEdited(QString)), this, SLOT(changed4f()));
93
94 connect(widget.lineEditRX, SIGNAL(textEdited(QString)), this, SLOT(changedrpy()));
95 connect(widget.lineEditRY, SIGNAL(textEdited(QString)), this, SLOT(changedrpy()));
96 connect(widget.lineEditRZ, SIGNAL(textEdited(QString)), this, SLOT(changedrpy()));
97
98 connect(widget.lineEditM00, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
99 connect(widget.lineEditM01, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
100 connect(widget.lineEditM02, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
101 connect(widget.lineEditM03, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
102 connect(widget.lineEditM10, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
103 connect(widget.lineEditM11, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
104 connect(widget.lineEditM12, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
105 connect(widget.lineEditM13, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
106 connect(widget.lineEditM20, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
107 connect(widget.lineEditM21, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
108 connect(widget.lineEditM22, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
109 connect(widget.lineEditM23, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
110 connect(widget.lineEditM30, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
111 connect(widget.lineEditM31, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
112 connect(widget.lineEditM32, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
113 connect(widget.lineEditM33, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
114
115 connect(widget.lineEdit03, SIGNAL(textChanged(QString)), this, SLOT(recalcInvAndProd()));
116 connect(widget.lineEdit13, SIGNAL(textChanged(QString)), this, SLOT(recalcInvAndProd()));
117 connect(widget.lineEdit23, SIGNAL(textChanged(QString)), this, SLOT(recalcInvAndProd()));
118}
119
121 default;
122
123void
127
128void
132
133void
137
138void
142
143Eigen::Matrix4d
145{
146 Eigen::Matrix4d m;
147 m << widget.lineEdit00->text().toDouble(), widget.lineEdit01->text().toDouble(),
148 widget.lineEdit02->text().toDouble(), widget.lineEdit03->text().toDouble(),
149 widget.lineEdit10->text().toDouble(), widget.lineEdit11->text().toDouble(),
150 widget.lineEdit12->text().toDouble(), widget.lineEdit13->text().toDouble(),
151 widget.lineEdit20->text().toDouble(), widget.lineEdit21->text().toDouble(),
152 widget.lineEdit22->text().toDouble(), widget.lineEdit23->text().toDouble(),
153 widget.lineEdit30->text().toDouble(), widget.lineEdit31->text().toDouble(),
154 widget.lineEdit32->text().toDouble(), widget.lineEdit33->text().toDouble();
155 return m;
156}
157
158void
159armarx::HomogeneousMatrixCalculatorWidgetController::changed4f()
160{
161 Eigen::Matrix4d m = getMatrix();
162 Eigen::Vector3f rpy = VirtualRobot::MathTools::eigen4f2rpy(m.cast<float>());
163 widget.lineEditRX->setText(QString::number(rpy(0)));
164 widget.lineEditRY->setText(QString::number(rpy(1)));
165 widget.lineEditRZ->setText(QString::number(rpy(2)));
166 recalcInvAndProd();
167}
168
169void
170armarx::HomogeneousMatrixCalculatorWidgetController::changedrpy()
171{
172 float r = static_cast<float>(widget.lineEditRX->text().toDouble());
173 float p = static_cast<float>(widget.lineEditRY->text().toDouble());
174 float y = static_cast<float>(widget.lineEditRZ->text().toDouble());
175 Eigen::Matrix4f m = VirtualRobot::MathTools::rpy2eigen4f(r, p, y);
176 widget.lineEdit00->setText(QString::number(m(0, 0)));
177 widget.lineEdit01->setText(QString::number(m(0, 1)));
178 widget.lineEdit02->setText(QString::number(m(0, 2)));
179 widget.lineEdit10->setText(QString::number(m(1, 0)));
180 widget.lineEdit11->setText(QString::number(m(1, 1)));
181 widget.lineEdit12->setText(QString::number(m(1, 2)));
182 widget.lineEdit20->setText(QString::number(m(2, 0)));
183 widget.lineEdit21->setText(QString::number(m(2, 1)));
184 widget.lineEdit22->setText(QString::number(m(2, 2)));
185 recalcInvAndProd();
186}
187
188void
189HomogeneousMatrixCalculatorWidgetController::recalcInv()
190{
191 Eigen::Matrix4d om = getMatrix();
192 Eigen::Matrix4d m = om.inverse();
193 widget.lineEditI00->setText(QString::number(m(0, 0)));
194 widget.lineEditI01->setText(QString::number(m(0, 1)));
195 widget.lineEditI02->setText(QString::number(m(0, 2)));
196 widget.lineEditI03->setText(QString::number(m(0, 3)));
197 widget.lineEditI10->setText(QString::number(m(1, 0)));
198 widget.lineEditI11->setText(QString::number(m(1, 1)));
199 widget.lineEditI12->setText(QString::number(m(1, 2)));
200 widget.lineEditI13->setText(QString::number(m(1, 3)));
201 widget.lineEditI20->setText(QString::number(m(2, 0)));
202 widget.lineEditI21->setText(QString::number(m(2, 1)));
203 widget.lineEditI22->setText(QString::number(m(2, 2)));
204 widget.lineEditI23->setText(QString::number(m(2, 3)));
205 widget.lineEditI30->setText(QString::number(m(3, 0)));
206 widget.lineEditI31->setText(QString::number(m(3, 1)));
207 widget.lineEditI32->setText(QString::number(m(3, 2)));
208 widget.lineEditI33->setText(QString::number(m(3, 3)));
209 Eigen::Matrix4d check = om * m;
210 widget.lineEditICheck00->setText(QString::number(check(0, 0)));
211 widget.lineEditICheck01->setText(QString::number(check(0, 1)));
212 widget.lineEditICheck02->setText(QString::number(check(0, 2)));
213 widget.lineEditICheck03->setText(QString::number(check(0, 3)));
214 widget.lineEditICheck10->setText(QString::number(check(1, 0)));
215 widget.lineEditICheck11->setText(QString::number(check(1, 1)));
216 widget.lineEditICheck12->setText(QString::number(check(1, 2)));
217 widget.lineEditICheck13->setText(QString::number(check(1, 3)));
218 widget.lineEditICheck20->setText(QString::number(check(2, 0)));
219 widget.lineEditICheck21->setText(QString::number(check(2, 1)));
220 widget.lineEditICheck22->setText(QString::number(check(2, 2)));
221 widget.lineEditICheck23->setText(QString::number(check(2, 3)));
222 widget.lineEditICheck30->setText(QString::number(check(3, 0)));
223 widget.lineEditICheck31->setText(QString::number(check(3, 1)));
224 widget.lineEditICheck32->setText(QString::number(check(3, 2)));
225 widget.lineEditICheck33->setText(QString::number(check(3, 3)));
226}
227
228void
229HomogeneousMatrixCalculatorWidgetController::recalcProd()
230{
231 Eigen::Matrix4d m;
232 m << widget.lineEditM00->text().toDouble(), widget.lineEditM01->text().toDouble(),
233 widget.lineEditM02->text().toDouble(), widget.lineEditM03->text().toDouble(),
234 widget.lineEditM10->text().toDouble(), widget.lineEditM11->text().toDouble(),
235 widget.lineEditM12->text().toDouble(), widget.lineEditM13->text().toDouble(),
236 widget.lineEditM20->text().toDouble(), widget.lineEditM21->text().toDouble(),
237 widget.lineEditM22->text().toDouble(), widget.lineEditM23->text().toDouble(),
238 widget.lineEditM30->text().toDouble(), widget.lineEditM31->text().toDouble(),
239 widget.lineEditM32->text().toDouble(), widget.lineEditM33->text().toDouble();
240 Eigen::Matrix4d r = getMatrix() * m;
241 widget.lineEditR00->setText(QString::number(r(0, 0)));
242 widget.lineEditR01->setText(QString::number(r(0, 1)));
243 widget.lineEditR02->setText(QString::number(r(0, 2)));
244 widget.lineEditR03->setText(QString::number(r(0, 3)));
245 widget.lineEditR10->setText(QString::number(r(1, 0)));
246 widget.lineEditR11->setText(QString::number(r(1, 1)));
247 widget.lineEditR12->setText(QString::number(r(1, 2)));
248 widget.lineEditR13->setText(QString::number(r(1, 3)));
249 widget.lineEditR20->setText(QString::number(r(2, 0)));
250 widget.lineEditR21->setText(QString::number(r(2, 1)));
251 widget.lineEditR22->setText(QString::number(r(2, 2)));
252 widget.lineEditR23->setText(QString::number(r(2, 3)));
253 widget.lineEditR30->setText(QString::number(r(3, 0)));
254 widget.lineEditR31->setText(QString::number(r(3, 1)));
255 widget.lineEditR32->setText(QString::number(r(3, 2)));
256 widget.lineEditR33->setText(QString::number(r(3, 3)));
257}
258
259void
260HomogeneousMatrixCalculatorWidgetController::recalcInvAndProd()
261{
262 recalcInv();
263 recalcProd();
264}
virtual QPointer< QWidget > getWidget()
getWidget returns a pointer to the a widget of this controller.
~HomogeneousMatrixCalculatorWidgetController() override
Controller destructor.
This file offers overloads of toIce() and fromIce() functions for STL container types.