BoxToGraspCandidatesWidgetController.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 ARCHES::gui-plugins::BoxToGraspCandidatesWidgetController
17 * \author Raphael Grimm ( raphael dot grimm at kit dot edu )
18 * \date 2020
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 <SimoxUtility/math/convert/pos_mat3f_to_mat4f.h>
28#include <SimoxUtility/math/convert/rpy_to_mat3f.h>
29#include <SimoxUtility/math/distance/angle_between.h>
30#include <SimoxUtility/math/project_to_plane.h>
31#include <SimoxUtility/shapes/OrientedBox.h>
32
36
37// configure
38namespace armarx
39{
40 void
42 {
44 settings->value("rsc", "Armar6StateComponent").toString().toStdString());
45 _gc_topic_name = settings->value("rsc", "GraspCandidatesTopic").toString().toStdString();
46 }
47
48 void
50 {
51 settings->setValue(
52 "rsc",
53 QString::fromStdString(getRobotStateComponentPlugin().getRobotStateComponentName()));
54 settings->setValue("gct", QString::fromStdString(_gc_topic_name));
55 }
56
57 QPointer<QDialog>
59 {
60 if (!_dialog)
61 {
62 _dialog = new SimpleConfigDialog(parent);
63 _dialog->addProxyFinder<RobotStateComponentInterfacePrx>(
64 "rsc", "Robot State Component", "*Component");
65 _dialog->addLineEdit("gct", "Grasp Candidates Topic", "GraspCandidatesTopic");
66 }
67 return qobject_cast<SimpleConfigDialog*>(_dialog);
68 }
69
70 void
72 {
73 getRobotStateComponentPlugin().setRobotStateComponentName(_dialog->getProxyName("rsc"));
74 _gc_topic_name = _dialog->getLineEditText("gct");
75 }
76} // namespace armarx
77
78namespace armarx
79{
81 {
82 _ui.setupUi(getWidget());
83
84 _box_pose.setXYZWidgets(
85 _ui.doubleSpinBoxBoxTX, _ui.doubleSpinBoxBoxTY, _ui.doubleSpinBoxBoxTZ);
86
87 _box_pose.setRPYWidgets(
88 _ui.doubleSpinBoxBoxRX, _ui.doubleSpinBoxBoxRY, _ui.doubleSpinBoxBoxRZ);
89
90 _box_extend.addWidget(_ui.doubleSpinBoxBoxSizeX);
91 _box_extend.addWidget(_ui.doubleSpinBoxBoxSizeY);
92 _box_extend.addWidget(_ui.doubleSpinBoxBoxSizeZ);
93
94 _transversal_l.addWidget(_ui.doubleSpinBoxHandLTransvX);
95 _transversal_l.addWidget(_ui.doubleSpinBoxHandLTransvY);
96 _transversal_l.addWidget(_ui.doubleSpinBoxHandLTransvZ);
97
98 _transversal_r.addWidget(_ui.doubleSpinBoxHandRTransvX);
99 _transversal_r.addWidget(_ui.doubleSpinBoxHandRTransvY);
100 _transversal_r.addWidget(_ui.doubleSpinBoxHandRTransvZ);
101
102 _up_l.addWidget(_ui.doubleSpinBoxHandLUpX);
103 _up_l.addWidget(_ui.doubleSpinBoxHandLUpY);
104 _up_l.addWidget(_ui.doubleSpinBoxHandLUpZ);
105
106 _up_r.addWidget(_ui.doubleSpinBoxHandRUpX);
107 _up_r.addWidget(_ui.doubleSpinBoxHandRUpY);
108 _up_r.addWidget(_ui.doubleSpinBoxHandRUpZ);
109
110 _tcp_shift_l.addWidget(_ui.doubleSpinBoxTCPShiftLX);
111 _tcp_shift_l.addWidget(_ui.doubleSpinBoxTCPShiftLY);
112 _tcp_shift_l.addWidget(_ui.doubleSpinBoxTCPShiftLZ);
113
114 _tcp_shift_r.addWidget(_ui.doubleSpinBoxTCPShiftRX);
115 _tcp_shift_r.addWidget(_ui.doubleSpinBoxTCPShiftRY);
116 _tcp_shift_r.addWidget(_ui.doubleSpinBoxTCPShiftRZ);
117
118 const std::vector spinboxes{
119 _ui.doubleSpinBoxBoundTransvMax, _ui.doubleSpinBoxBoundTransvMin,
120 _ui.doubleSpinBoxBoundWidthMin, _ui.doubleSpinBoxBoundWidthMax,
121 _ui.doubleSpinBoxBoundDepthMin, _ui.doubleSpinBoxBoundDepthMax,
122
123 _ui.doubleSpinBoxBoxTX, _ui.doubleSpinBoxBoxTY,
124 _ui.doubleSpinBoxBoxTZ, _ui.doubleSpinBoxBoxRX,
125 _ui.doubleSpinBoxBoxRY, _ui.doubleSpinBoxBoxRZ,
126 _ui.doubleSpinBoxBoxSizeX, _ui.doubleSpinBoxBoxSizeY,
127 _ui.doubleSpinBoxBoxSizeZ,
128
129 _ui.doubleSpinBoxHandLTransvX, _ui.doubleSpinBoxHandLTransvY,
130 _ui.doubleSpinBoxHandLTransvZ, _ui.doubleSpinBoxHandRTransvX,
131 _ui.doubleSpinBoxHandRTransvY, _ui.doubleSpinBoxHandRTransvZ,
132
133 _ui.doubleSpinBoxHandLUpX, _ui.doubleSpinBoxHandLUpY,
134 _ui.doubleSpinBoxHandLUpZ, _ui.doubleSpinBoxHandRUpX,
135 _ui.doubleSpinBoxHandRUpY, _ui.doubleSpinBoxHandRUpZ,
136
137 _ui.doubleSpinBoxTCPShiftLX, _ui.doubleSpinBoxTCPShiftLY,
138 _ui.doubleSpinBoxTCPShiftLZ, _ui.doubleSpinBoxTCPShiftRX,
139 _ui.doubleSpinBoxTCPShiftRY, _ui.doubleSpinBoxTCPShiftRZ};
140 for (QDoubleSpinBox* ptr : spinboxes)
141 {
142 connect(ptr,
143 qOverload<double>(&QDoubleSpinBox::valueChanged),
144 this,
146 }
147
148 const std::vector checkboxes{//Left
149 _ui.checkBoxGraspLPosXPosY,
150 _ui.checkBoxGraspLPosXPosZ,
151 _ui.checkBoxGraspLPosXNegY,
152 _ui.checkBoxGraspLPosXNegZ,
153
154 _ui.checkBoxGraspLNegXPosY,
155 _ui.checkBoxGraspLNegXPosZ,
156 _ui.checkBoxGraspLNegXNegY,
157 _ui.checkBoxGraspLNegXNegZ,
158
159 _ui.checkBoxGraspLPosYPosX,
160 _ui.checkBoxGraspLPosYPosZ,
161 _ui.checkBoxGraspLPosYNegX,
162 _ui.checkBoxGraspLPosYNegZ,
163
164 _ui.checkBoxGraspLNegYPosX,
165 _ui.checkBoxGraspLNegYPosZ,
166 _ui.checkBoxGraspLNegYNegX,
167 _ui.checkBoxGraspLNegYNegZ,
168
169 _ui.checkBoxGraspLPosZPosX,
170 _ui.checkBoxGraspLPosZPosY,
171 _ui.checkBoxGraspLPosZNegX,
172 _ui.checkBoxGraspLPosZNegY,
173
174 _ui.checkBoxGraspLNegZPosX,
175 _ui.checkBoxGraspLNegZPosY,
176 _ui.checkBoxGraspLNegZNegX,
177 _ui.checkBoxGraspLNegZNegY,
178
179 //Right
180 _ui.checkBoxGraspRPosXPosY,
181 _ui.checkBoxGraspRPosXPosZ,
182 _ui.checkBoxGraspRPosXNegY,
183 _ui.checkBoxGraspRPosXNegZ,
184
185 _ui.checkBoxGraspRNegXPosY,
186 _ui.checkBoxGraspRNegXPosZ,
187 _ui.checkBoxGraspRNegXNegY,
188 _ui.checkBoxGraspRNegXNegZ,
189
190 _ui.checkBoxGraspRPosYPosX,
191 _ui.checkBoxGraspRPosYPosZ,
192 _ui.checkBoxGraspRPosYNegX,
193 _ui.checkBoxGraspRPosYNegZ,
194
195 _ui.checkBoxGraspRNegYPosX,
196 _ui.checkBoxGraspRNegYPosZ,
197 _ui.checkBoxGraspRNegYNegX,
198 _ui.checkBoxGraspRNegYNegZ,
199
200 _ui.checkBoxGraspRPosZPosX,
201 _ui.checkBoxGraspRPosZPosY,
202 _ui.checkBoxGraspRPosZNegX,
203 _ui.checkBoxGraspRPosZNegY,
204
205 _ui.checkBoxGraspRNegZPosX,
206 _ui.checkBoxGraspRNegZPosY,
207 _ui.checkBoxGraspRNegZNegX,
208 _ui.checkBoxGraspRNegZNegY};
209 for (QCheckBox* ptr : checkboxes)
210 {
211 ptr->setChecked(true);
212 connect(ptr, &QCheckBox::clicked, this, &BoxToGraspCandidatesWidgetController::update);
213 }
214 }
215
216 void
218 {
219 {
220 std::lock_guard guard{_mutex};
221 _robot = addRobot("state robot", VirtualRobot::RobotIO::eStructure);
222 getTopic(_gc_topic, _gc_topic_name);
223 }
224 QMetaObject::invokeMethod(this, "update", Qt::QueuedConnection);
225 }
226
227 void
229 {
231 std::lock_guard guard{_mutex};
232 if (!_robot)
233 {
234 return;
235 }
236 synchronizeLocalClone(_robot);
237 const simox::OrientedBox<float> box{_box_pose.getMat4(),
238 _box_extend.get<Eigen::Vector3f>()};
239
242 //sides
243 {
244 auto& l = b2gc.side("Left");
245 auto& r = b2gc.side("Right");
246
247 l.hand_transverse = _transversal_l.get<Eigen::Vector3f>().normalized();
248 r.hand_transverse = _transversal_r.get<Eigen::Vector3f>().normalized();
249 l.hand_up = _up_l.get<Eigen::Vector3f>().normalized();
250 r.hand_up = _up_r.get<Eigen::Vector3f>().normalized();
251 l.tcp_shift = _tcp_shift_l.get<Eigen::Vector3f>().normalized();
252 r.tcp_shift = _tcp_shift_r.get<Eigen::Vector3f>().normalized();
253 }
255 {
256 lim.transverse_length_min = _ui.doubleSpinBoxBoundTransvMin->value();
257 lim.transverse_length_max = _ui.doubleSpinBoxBoundTransvMax->value();
258 lim.upward_length_min = _ui.doubleSpinBoxBoundDepthMin->value();
259 lim.upward_length_max = _ui.doubleSpinBoxBoundDepthMax->value();
260 lim.forward_length_min = _ui.doubleSpinBoxBoundWidthMin->value();
261 lim.forward_length_max = _ui.doubleSpinBoxBoundWidthMax->value();
262 }
264 {
266 side_enabled_l[ba::pos_x_pos_y] = _ui.checkBoxGraspLPosXPosY->isChecked();
267 side_enabled_l[ba::pos_x_pos_z] = _ui.checkBoxGraspLPosXPosZ->isChecked();
268 side_enabled_l[ba::pos_x_neg_y] = _ui.checkBoxGraspLPosXNegY->isChecked();
269 side_enabled_l[ba::pos_x_neg_z] = _ui.checkBoxGraspLPosXNegZ->isChecked();
270
271 side_enabled_l[ba::neg_x_pos_y] = _ui.checkBoxGraspLNegXPosY->isChecked();
272 side_enabled_l[ba::neg_x_pos_z] = _ui.checkBoxGraspLNegXPosZ->isChecked();
273 side_enabled_l[ba::neg_x_neg_y] = _ui.checkBoxGraspLNegXNegY->isChecked();
274 side_enabled_l[ba::neg_x_neg_z] = _ui.checkBoxGraspLNegXNegZ->isChecked();
275
276 side_enabled_l[ba::pos_y_pos_x] = _ui.checkBoxGraspLPosYPosX->isChecked();
277 side_enabled_l[ba::pos_y_pos_z] = _ui.checkBoxGraspLPosYPosZ->isChecked();
278 side_enabled_l[ba::pos_y_neg_x] = _ui.checkBoxGraspLPosYNegX->isChecked();
279 side_enabled_l[ba::pos_y_neg_z] = _ui.checkBoxGraspLPosYNegZ->isChecked();
280
281 side_enabled_l[ba::neg_y_pos_x] = _ui.checkBoxGraspLNegYPosX->isChecked();
282 side_enabled_l[ba::neg_y_pos_z] = _ui.checkBoxGraspLNegYPosZ->isChecked();
283 side_enabled_l[ba::neg_y_neg_x] = _ui.checkBoxGraspLNegYNegX->isChecked();
284 side_enabled_l[ba::neg_y_neg_z] = _ui.checkBoxGraspLNegYNegZ->isChecked();
285
286 side_enabled_l[ba::pos_z_pos_x] = _ui.checkBoxGraspLPosZPosX->isChecked();
287 side_enabled_l[ba::pos_z_pos_y] = _ui.checkBoxGraspLPosZPosY->isChecked();
288 side_enabled_l[ba::pos_z_neg_x] = _ui.checkBoxGraspLPosZNegX->isChecked();
289 side_enabled_l[ba::pos_z_neg_y] = _ui.checkBoxGraspLPosZNegY->isChecked();
290
291 side_enabled_l[ba::neg_z_pos_x] = _ui.checkBoxGraspLNegZPosX->isChecked();
292 side_enabled_l[ba::neg_z_pos_y] = _ui.checkBoxGraspLNegZPosY->isChecked();
293 side_enabled_l[ba::neg_z_neg_x] = _ui.checkBoxGraspLNegZNegX->isChecked();
294 side_enabled_l[ba::neg_z_neg_y] = _ui.checkBoxGraspLNegZNegY->isChecked();
295 }
297 {
299 side_enabled_r[ba::pos_x_pos_y] = _ui.checkBoxGraspRPosXPosY->isChecked();
300 side_enabled_r[ba::pos_x_pos_z] = _ui.checkBoxGraspRPosXPosZ->isChecked();
301 side_enabled_r[ba::pos_x_neg_y] = _ui.checkBoxGraspRPosXNegY->isChecked();
302 side_enabled_r[ba::pos_x_neg_z] = _ui.checkBoxGraspRPosXNegZ->isChecked();
303
304 side_enabled_r[ba::neg_x_pos_y] = _ui.checkBoxGraspRNegXPosY->isChecked();
305 side_enabled_r[ba::neg_x_pos_z] = _ui.checkBoxGraspRNegXPosZ->isChecked();
306 side_enabled_r[ba::neg_x_neg_y] = _ui.checkBoxGraspRNegXNegY->isChecked();
307 side_enabled_r[ba::neg_x_neg_z] = _ui.checkBoxGraspRNegXNegZ->isChecked();
308
309 side_enabled_r[ba::pos_y_pos_x] = _ui.checkBoxGraspRPosYPosX->isChecked();
310 side_enabled_r[ba::pos_y_pos_z] = _ui.checkBoxGraspRPosYPosZ->isChecked();
311 side_enabled_r[ba::pos_y_neg_x] = _ui.checkBoxGraspRPosYNegX->isChecked();
312 side_enabled_r[ba::pos_y_neg_z] = _ui.checkBoxGraspRPosYNegZ->isChecked();
313
314 side_enabled_r[ba::neg_y_pos_x] = _ui.checkBoxGraspRNegYPosX->isChecked();
315 side_enabled_r[ba::neg_y_pos_z] = _ui.checkBoxGraspRNegYPosZ->isChecked();
316 side_enabled_r[ba::neg_y_neg_x] = _ui.checkBoxGraspRNegYNegX->isChecked();
317 side_enabled_r[ba::neg_y_neg_z] = _ui.checkBoxGraspRNegYNegZ->isChecked();
318
319 side_enabled_r[ba::pos_z_pos_x] = _ui.checkBoxGraspRPosZPosX->isChecked();
320 side_enabled_r[ba::pos_z_pos_y] = _ui.checkBoxGraspRPosZPosY->isChecked();
321 side_enabled_r[ba::pos_z_neg_x] = _ui.checkBoxGraspRPosZNegX->isChecked();
322 side_enabled_r[ba::pos_z_neg_y] = _ui.checkBoxGraspRPosZNegY->isChecked();
323
324 side_enabled_r[ba::neg_z_pos_x] = _ui.checkBoxGraspRNegZPosX->isChecked();
325 side_enabled_r[ba::neg_z_pos_y] = _ui.checkBoxGraspRNegZPosY->isChecked();
326 side_enabled_r[ba::neg_z_neg_x] = _ui.checkBoxGraspRNegZNegX->isChecked();
327 side_enabled_r[ba::neg_z_neg_y] = _ui.checkBoxGraspRNegZNegY->isChecked();
328 }
329
330 viz::Layer layer_l = arviz.layer("grasps_l");
331 viz::Layer layer_r = arviz.layer("grasps_r");
332 viz::Layer layer_hand_vec = arviz.layer("hand_vec");
333 viz::Layer layer_box = arviz.layer("box");
334 layer_box.add(viz::Box{"box"}.set(box).transformPose(_robot->getGlobalPose()));
335
336 gc_draw.draw(b2gc.side("Left"), layer_hand_vec);
337 gc_draw.draw(b2gc.side("Right"), layer_hand_vec);
338
339 grasping::GraspCandidateSeq graps;
340 const auto consume_l = [&](const auto& g)
341 {
342 graps.emplace_back(g.make_candidate(getName()));
343 gc_draw.draw(graps.back(), layer_l);
344 };
345 const auto consume_r = [&](const auto& g)
346 {
347 graps.emplace_back(g.make_candidate(getName()));
348 gc_draw.draw(graps.back(), layer_r);
349 };
350 b2gc.center_grasps(box, "Left", lim, consume_l, side_enabled_l);
351 b2gc.center_grasps(box, "Right", lim, consume_r, side_enabled_r);
352
353 arviz.commit({layer_l, layer_r, layer_hand_vec, layer_box});
354
355 _gc_topic->reportGraspCandidates(getName(), graps);
356 }
357} // namespace armarx
virtual QPointer< QWidget > getWidget()
getWidget returns a pointer to the a widget of this controller.
void loadSettings(QSettings *settings) override
Implement to load the settings that are part of the GUI configuration.
void saveSettings(QSettings *settings) override
Implement to save the settings as part of the GUI configuration.
void onConnectComponent() override
Pure virtual hook for the subclass.
QPointer< QDialog > getConfigDialog(QWidget *parent)
getConfigDialog returns a pointer to the a configuration widget of this controller.
void configured() override
This function must be implemented by the user, if he supplies a config dialog.
TopicProxyType getTopic(const std::string &name)
Returns a proxy of the specified topic.
std::string getName() const
Retrieve name of object.
bool synchronizeLocalClone(const VirtualRobot::RobotPtr &robot) const
const RobotStateComponentPlugin & getRobotStateComponentPlugin() const
VirtualRobot::RobotPtr addRobot(const std::string &id, const VirtualRobot::RobotPtr &robot, const VirtualRobot::RobotNodeSetPtr &rns={}, const VirtualRobot::RobotNodePtr &node={})
A config-dialog containing one (or multiple) proxy finders.
This file offers overloads of toIce() and fromIce() functions for STL container types.
::IceInternal::ProxyHandle<::IceProxy::armarx::RobotStateComponentInterface > RobotStateComponentInterfacePrx
Box & set(const simox::OrientedBoxBase< float > &b)
Definition Elements.cpp:79
void add(ElementT const &element)
Definition Layer.h:31
#define ARMARX_TRACE
Definition trace.h:77