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 <RobotAPI/gui-plugins/HomogeneousMatrixCalculator/ui_HomogeneousMatrixCalculatorWidget.h>
26
27#include <string>
28
29#include <QDoubleValidator>
30#include <QLineEdit>
31
32#include <Eigen/Dense>
33
34using namespace armarx;
35
37{
38 widget = std::make_unique<Ui::HomogeneousMatrixCalculatorWidget>();
39 widget->setupUi(getWidget());
40
41 std::vector<QLineEdit*> edits{
42 widget->lineEdit00, widget->lineEdit01, widget->lineEdit02,
43 widget->lineEdit03, widget->lineEdit10, widget->lineEdit11,
44 widget->lineEdit12, widget->lineEdit13, widget->lineEdit20,
45 widget->lineEdit21, widget->lineEdit22, widget->lineEdit23,
46 widget->lineEdit30, widget->lineEdit31, widget->lineEdit32,
47 widget->lineEdit33,
48
49 widget->lineEditI00, widget->lineEditI01, widget->lineEditI02,
50 widget->lineEditI03, widget->lineEditI10, widget->lineEditI11,
51 widget->lineEditI12, widget->lineEditI13, widget->lineEditI20,
52 widget->lineEditI21, widget->lineEditI22, widget->lineEditI23,
53 widget->lineEditI30, widget->lineEditI31, widget->lineEditI32,
54 widget->lineEditI33,
55
56 widget->lineEditICheck00, widget->lineEditICheck01, widget->lineEditICheck02,
57 widget->lineEditICheck03, widget->lineEditICheck10, widget->lineEditICheck11,
58 widget->lineEditICheck12, widget->lineEditICheck13, widget->lineEditICheck20,
59 widget->lineEditICheck21, widget->lineEditICheck22, widget->lineEditICheck23,
60 widget->lineEditICheck30, widget->lineEditICheck31, widget->lineEditICheck32,
61 widget->lineEditICheck33,
62
63 widget->lineEditX, widget->lineEditY, widget->lineEditZ,
64 widget->lineEditRX, widget->lineEditRY, widget->lineEditRZ,
65
66 widget->lineEditM00, widget->lineEditM01, widget->lineEditM02,
67 widget->lineEditM03, widget->lineEditM10, widget->lineEditM11,
68 widget->lineEditM12, widget->lineEditM13, widget->lineEditM20,
69 widget->lineEditM21, widget->lineEditM22, widget->lineEditM23,
70 widget->lineEditM30, widget->lineEditM31, widget->lineEditM32,
71 widget->lineEditM33,
72
73 widget->lineEditR00, widget->lineEditR01, widget->lineEditR02,
74 widget->lineEditR03, widget->lineEditR10, widget->lineEditR11,
75 widget->lineEditR12, widget->lineEditR13, widget->lineEditR20,
76 widget->lineEditR21, widget->lineEditR22, widget->lineEditR23,
77 widget->lineEditR30, widget->lineEditR31, widget->lineEditR32,
78 widget->lineEditR33,
79 };
80
81 for (auto edit : edits)
82 {
83 edit->setValidator(new QDoubleValidator(this));
84 edit->setFixedWidth(100);
85 edit->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
86 }
87 connect(widget->lineEdit00, SIGNAL(textEdited(QString)), this, SLOT(changed4f()));
88 connect(widget->lineEdit01, SIGNAL(textEdited(QString)), this, SLOT(changed4f()));
89 connect(widget->lineEdit02, SIGNAL(textEdited(QString)), this, SLOT(changed4f()));
90 connect(widget->lineEdit10, SIGNAL(textEdited(QString)), this, SLOT(changed4f()));
91 connect(widget->lineEdit11, SIGNAL(textEdited(QString)), this, SLOT(changed4f()));
92 connect(widget->lineEdit12, SIGNAL(textEdited(QString)), this, SLOT(changed4f()));
93 connect(widget->lineEdit20, SIGNAL(textEdited(QString)), this, SLOT(changed4f()));
94 connect(widget->lineEdit21, SIGNAL(textEdited(QString)), this, SLOT(changed4f()));
95 connect(widget->lineEdit22, SIGNAL(textEdited(QString)), this, SLOT(changed4f()));
96
97 connect(widget->lineEditRX, SIGNAL(textEdited(QString)), this, SLOT(changedrpy()));
98 connect(widget->lineEditRY, SIGNAL(textEdited(QString)), this, SLOT(changedrpy()));
99 connect(widget->lineEditRZ, SIGNAL(textEdited(QString)), this, SLOT(changedrpy()));
100
101 connect(widget->lineEditM00, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
102 connect(widget->lineEditM01, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
103 connect(widget->lineEditM02, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
104 connect(widget->lineEditM03, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
105 connect(widget->lineEditM10, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
106 connect(widget->lineEditM11, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
107 connect(widget->lineEditM12, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
108 connect(widget->lineEditM13, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
109 connect(widget->lineEditM20, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
110 connect(widget->lineEditM21, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
111 connect(widget->lineEditM22, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
112 connect(widget->lineEditM23, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
113 connect(widget->lineEditM30, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
114 connect(widget->lineEditM31, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
115 connect(widget->lineEditM32, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
116 connect(widget->lineEditM33, SIGNAL(textEdited(QString)), this, SLOT(recalcProd()));
117
118 connect(widget->lineEdit03, SIGNAL(textChanged(QString)), this, SLOT(recalcInvAndProd()));
119 connect(widget->lineEdit13, SIGNAL(textChanged(QString)), this, SLOT(recalcInvAndProd()));
120 connect(widget->lineEdit23, SIGNAL(textChanged(QString)), this, SLOT(recalcInvAndProd()));
121}
122
124 default;
125
126void
130
131void
135
136void
140
141void
145
146Eigen::Matrix4d
148{
149 Eigen::Matrix4d m;
150 m << widget->lineEdit00->text().toDouble(), widget->lineEdit01->text().toDouble(),
151 widget->lineEdit02->text().toDouble(), widget->lineEdit03->text().toDouble(),
152 widget->lineEdit10->text().toDouble(), widget->lineEdit11->text().toDouble(),
153 widget->lineEdit12->text().toDouble(), widget->lineEdit13->text().toDouble(),
154 widget->lineEdit20->text().toDouble(), widget->lineEdit21->text().toDouble(),
155 widget->lineEdit22->text().toDouble(), widget->lineEdit23->text().toDouble(),
156 widget->lineEdit30->text().toDouble(), widget->lineEdit31->text().toDouble(),
157 widget->lineEdit32->text().toDouble(), widget->lineEdit33->text().toDouble();
158 return m;
159}
160
161void
162armarx::HomogeneousMatrixCalculatorWidgetController::changed4f()
163{
164 Eigen::Matrix4d m = getMatrix();
165 Eigen::Vector3f rpy = VirtualRobot::MathTools::eigen4f2rpy(m.cast<float>());
166 widget->lineEditRX->setText(QString::number(rpy(0)));
167 widget->lineEditRY->setText(QString::number(rpy(1)));
168 widget->lineEditRZ->setText(QString::number(rpy(2)));
169 recalcInvAndProd();
170}
171
172void
173armarx::HomogeneousMatrixCalculatorWidgetController::changedrpy()
174{
175 float r = static_cast<float>(widget->lineEditRX->text().toDouble());
176 float p = static_cast<float>(widget->lineEditRY->text().toDouble());
177 float y = static_cast<float>(widget->lineEditRZ->text().toDouble());
178 Eigen::Matrix4f m = VirtualRobot::MathTools::rpy2eigen4f(r, p, y);
179 widget->lineEdit00->setText(QString::number(m(0, 0)));
180 widget->lineEdit01->setText(QString::number(m(0, 1)));
181 widget->lineEdit02->setText(QString::number(m(0, 2)));
182 widget->lineEdit10->setText(QString::number(m(1, 0)));
183 widget->lineEdit11->setText(QString::number(m(1, 1)));
184 widget->lineEdit12->setText(QString::number(m(1, 2)));
185 widget->lineEdit20->setText(QString::number(m(2, 0)));
186 widget->lineEdit21->setText(QString::number(m(2, 1)));
187 widget->lineEdit22->setText(QString::number(m(2, 2)));
188 recalcInvAndProd();
189}
190
191void
192HomogeneousMatrixCalculatorWidgetController::recalcInv()
193{
194 Eigen::Matrix4d om = getMatrix();
195 Eigen::Matrix4d m = om.inverse();
196 widget->lineEditI00->setText(QString::number(m(0, 0)));
197 widget->lineEditI01->setText(QString::number(m(0, 1)));
198 widget->lineEditI02->setText(QString::number(m(0, 2)));
199 widget->lineEditI03->setText(QString::number(m(0, 3)));
200 widget->lineEditI10->setText(QString::number(m(1, 0)));
201 widget->lineEditI11->setText(QString::number(m(1, 1)));
202 widget->lineEditI12->setText(QString::number(m(1, 2)));
203 widget->lineEditI13->setText(QString::number(m(1, 3)));
204 widget->lineEditI20->setText(QString::number(m(2, 0)));
205 widget->lineEditI21->setText(QString::number(m(2, 1)));
206 widget->lineEditI22->setText(QString::number(m(2, 2)));
207 widget->lineEditI23->setText(QString::number(m(2, 3)));
208 widget->lineEditI30->setText(QString::number(m(3, 0)));
209 widget->lineEditI31->setText(QString::number(m(3, 1)));
210 widget->lineEditI32->setText(QString::number(m(3, 2)));
211 widget->lineEditI33->setText(QString::number(m(3, 3)));
212 Eigen::Matrix4d check = om * m;
213 widget->lineEditICheck00->setText(QString::number(check(0, 0)));
214 widget->lineEditICheck01->setText(QString::number(check(0, 1)));
215 widget->lineEditICheck02->setText(QString::number(check(0, 2)));
216 widget->lineEditICheck03->setText(QString::number(check(0, 3)));
217 widget->lineEditICheck10->setText(QString::number(check(1, 0)));
218 widget->lineEditICheck11->setText(QString::number(check(1, 1)));
219 widget->lineEditICheck12->setText(QString::number(check(1, 2)));
220 widget->lineEditICheck13->setText(QString::number(check(1, 3)));
221 widget->lineEditICheck20->setText(QString::number(check(2, 0)));
222 widget->lineEditICheck21->setText(QString::number(check(2, 1)));
223 widget->lineEditICheck22->setText(QString::number(check(2, 2)));
224 widget->lineEditICheck23->setText(QString::number(check(2, 3)));
225 widget->lineEditICheck30->setText(QString::number(check(3, 0)));
226 widget->lineEditICheck31->setText(QString::number(check(3, 1)));
227 widget->lineEditICheck32->setText(QString::number(check(3, 2)));
228 widget->lineEditICheck33->setText(QString::number(check(3, 3)));
229}
230
231void
232HomogeneousMatrixCalculatorWidgetController::recalcProd()
233{
234 Eigen::Matrix4d m;
235 m << widget->lineEditM00->text().toDouble(), widget->lineEditM01->text().toDouble(),
236 widget->lineEditM02->text().toDouble(), widget->lineEditM03->text().toDouble(),
237 widget->lineEditM10->text().toDouble(), widget->lineEditM11->text().toDouble(),
238 widget->lineEditM12->text().toDouble(), widget->lineEditM13->text().toDouble(),
239 widget->lineEditM20->text().toDouble(), widget->lineEditM21->text().toDouble(),
240 widget->lineEditM22->text().toDouble(), widget->lineEditM23->text().toDouble(),
241 widget->lineEditM30->text().toDouble(), widget->lineEditM31->text().toDouble(),
242 widget->lineEditM32->text().toDouble(), widget->lineEditM33->text().toDouble();
243 Eigen::Matrix4d r = getMatrix() * m;
244 widget->lineEditR00->setText(QString::number(r(0, 0)));
245 widget->lineEditR01->setText(QString::number(r(0, 1)));
246 widget->lineEditR02->setText(QString::number(r(0, 2)));
247 widget->lineEditR03->setText(QString::number(r(0, 3)));
248 widget->lineEditR10->setText(QString::number(r(1, 0)));
249 widget->lineEditR11->setText(QString::number(r(1, 1)));
250 widget->lineEditR12->setText(QString::number(r(1, 2)));
251 widget->lineEditR13->setText(QString::number(r(1, 3)));
252 widget->lineEditR20->setText(QString::number(r(2, 0)));
253 widget->lineEditR21->setText(QString::number(r(2, 1)));
254 widget->lineEditR22->setText(QString::number(r(2, 2)));
255 widget->lineEditR23->setText(QString::number(r(2, 3)));
256 widget->lineEditR30->setText(QString::number(r(3, 0)));
257 widget->lineEditR31->setText(QString::number(r(3, 1)));
258 widget->lineEditR32->setText(QString::number(r(3, 2)));
259 widget->lineEditR33->setText(QString::number(r(3, 3)));
260}
261
262void
263HomogeneousMatrixCalculatorWidgetController::recalcInvAndProd()
264{
265 recalcInv();
266 recalcProd();
267}
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.