se2ez
jointwidget.cpp
Go to the documentation of this file.
1 /* Author: Constantinos Chamzas */
2 
3 #include <se2ez/core/log.h>
4 #include <se2ez/core/joint.h>
5 #include <se2ez/core/robot.h>
6 #include <se2ez/core/frame.h>
7 #include <se2ez/core/state.h>
8 #include <se2ez/core/math.h>
9 
10 #include <se2ez/gui/jointpanel.h>
11 #include <se2ez/gui/jointwidget.h>
12 
13 #include "ui_jointwidget.h"
14 
15 using namespace se2ez;
16 
18  : QWidget(parent), state_(state), robot_(robot), ui_(new Ui::JointWidget), panel_(parent)
19 {
20  ui_->setupUi(this);
21 
22  name_ = name;
23  ui_->name->setText(tr(name.c_str()));
24  // vars {x, y, t}
25  value_ = {0, 0, 0};
26  lower_ = {0, 0, 0};
27  upper_ = {0, 0, 0};
28 
29  const auto &frame = robot_->getFrame(name);
30  const auto &joint = frame->getJoint();
31 
32  const auto &bounds = joint.getBounds();
33 
34  switch (joint.type)
35  {
36  case Joint::FLOAT:
37  case Joint::FLYING:
38  lower_ = bounds.first;
39  upper_ = bounds.second;
40  break;
41  case Joint::TRANSLATE:
42  lower_.head(2) = bounds.first;
43  upper_.head(2) = bounds.second;
44  ui_->tWidget->hide();
45  break;
46  case Joint::PRISMATIC:
47  ui_->yWidget->hide();
48  ui_->tWidget->hide();
49  lower_[0] = bounds.first[0];
50  upper_[0] = bounds.second[0];
51  break;
52  case Joint::REVOLUTE:
53  case Joint::CONTINUOUS:
54  ui_->xWidget->hide();
55  ui_->yWidget->hide();
56  lower_[2] = bounds.first[0];
57  upper_[2] = bounds.second[0];
58  break;
59  default:
60  break;
61  }
62 
63  // Connect the slider signals
64  sliders[0] = ui_->xSlider;
65  sliders[1] = ui_->ySlider;
66  sliders[2] = ui_->tSlider;
67  connect(ui_->xSlider, SIGNAL(valueChanged(int)), this, SLOT(xChanged(int)));
68  connect(ui_->ySlider, SIGNAL(valueChanged(int)), this, SLOT(yChanged(int)));
69  connect(ui_->tSlider, SIGNAL(valueChanged(int)), this, SLOT(tChanged(int)));
70 
71  // Connect the box signals
72  boxes[0] = ui_->xSpinBox;
73  boxes[1] = ui_->ySpinBox;
74  boxes[2] = ui_->tSpinBox;
75  connect(ui_->xSpinBox, SIGNAL(valueChanged(double)), this, SLOT(xBoxChanged(double)));
76  connect(ui_->ySpinBox, SIGNAL(valueChanged(double)), this, SLOT(yBoxChanged(double)));
77  connect(ui_->tSpinBox, SIGNAL(valueChanged(double)), this, SLOT(tBoxChanged(double)));
78 
79  // Set limits on the spinBoxes
80  for (unsigned int i = 0; i < 3; ++i)
81  {
82  boxes[i]->setMinimum(lower_[i]);
83  boxes[i]->setMaximum(upper_[i]);
84  }
85 
86  reset();
87 }
88 
89 // TODO:remove or fix to make better
90 void gui::JointWidget::keyPressEvent(QKeyEvent *event)
91 {
92  switch (event->key())
93  {
94  case Qt::Key_D:
95  boxes[0]->setValue(boxes[0]->value() + boxes[0]->singleStep());
96  break;
97  case Qt::Key_A:
98  boxes[0]->setValue(boxes[0]->value() - boxes[0]->singleStep());
99  break;
100  case Qt::Key_S:
101  boxes[1]->setValue(boxes[1]->value() - boxes[1]->singleStep());
102  break;
103  case Qt::Key_W:
104  boxes[1]->setValue(boxes[1]->value() + boxes[1]->singleStep());
105  break;
106  case Qt::Key_J:
107  boxes[2]->setValue(boxes[2]->value() + boxes[2]->singleStep());
108  break;
109  case Qt::Key_K:
110  boxes[2]->setValue(boxes[2]->value() - boxes[2]->singleStep());
111  break;
112  default:
113  QWidget::keyPressEvent(event);
114  }
115 }
116 
118 {
119  for (unsigned int i = 0; i < 3; ++i)
120  {
121  setBox(i, value_[i], false);
122  setSlider(i, sliders[i]->value(), false);
123  }
124 }
125 
126 void gui::JointWidget::setSlider(unsigned int index, int value, bool update)
127 {
128  value_[index] = math::remap(sliders[index]->minimum(), sliders[index]->maximum(), //
129  value, //
130  lower_[index], upper_[index]);
131 
132  boxes[index]->blockSignals(true);
133  boxes[index]->setValue(value_[index]);
134  boxes[index]->blockSignals(false);
135 
136  if (update)
137  updateState();
138 }
139 
140 void gui::JointWidget::setBox(unsigned int index, double value, bool update)
141 {
142  value_[index] = value;
143 
144  sliders[index]->blockSignals(true);
145  sliders[index]->setValue(math::remap(lower_[index], upper_[index], //
146  value_[index], //
147  sliders[index]->minimum(), sliders[index]->maximum() + 0.5));
148  sliders[index]->blockSignals(false);
149 
150  if (update)
151  updateState();
152 }
153 
155 {
156  setSlider(0, value, true);
157 }
158 
160 {
161  setSlider(1, value, true);
162 }
163 
165 {
166  setSlider(2, value, true);
167 }
168 
170 {
171  setBox(0, value, true);
172 }
173 
175 {
176  setBox(1, value, true);
177 }
178 
180 {
181  setBox(2, value, true);
182 }
183 
185 {
187 
188  const auto &value = robot_->getFrameValues(name_, state_->data);
189  switch (robot_->getFrame(name_)->getJoint().type)
190  {
191  case Joint::FLOAT:
192  case Joint::FLYING:
193  value_ = value;
194  break;
195  case Joint::TRANSLATE:
196  value_.head(2) = value;
197  break;
198  case Joint::PRISMATIC:
199  value_[0] = value[0];
200  break;
201  case Joint::REVOLUTE:
202  case Joint::CONTINUOUS:
203  value_[2] = value[0];
204  break;
205  default:
206  break;
207  }
208 
209  setValue();
210 
211  emit stateChanged();
212 }
213 
215 {
217 
218  // Update the state in canvas
219  switch (robot_->getFrame(name_)->getJoint().type)
220  {
221  case Joint::FLOAT:
222  case Joint::FLYING:
223  state_->setFloatJoint(robot_, name_, Eigen::Vector3d(value_[0], value_[1], value_[2]));
224  break;
225  case Joint::TRANSLATE:
226  state_->setTranslateJoint(robot_, name_, Eigen::Vector2d(value_[0], value_[1]));
227  break;
228  case Joint::PRISMATIC:
229  state_->setJoint(robot_, name_, value_[0]);
230  break;
231  case Joint::REVOLUTE:
232  case Joint::CONTINUOUS:
233  state_->setJoint(robot_, name_, value_[2]);
234  break;
235  default:
236  break;
237  }
238 
239  emit stateChanged();
240 }
241 
243 {
244  ui_->xSpinBox->setValue(lower_[0] + fabs(upper_[0] - lower_[0]) / 2.);
245  ui_->ySpinBox->setValue(lower_[1] + fabs(upper_[1] - lower_[1]) / 2.);
246  ui_->tSpinBox->setValue(lower_[2] + fabs(upper_[2] - lower_[2]) / 2.);
247  ui_->xSlider->setValue(50);
248  ui_->ySlider->setValue(50);
249  ui_->tSlider->setValue(50);
250 
251  updateState();
252 }
253 
255 {
256  delete ui_;
257 }
Revolute joint, rotates. Uses Euclidean metric.
Definition: joint.h:45
Eigen::Vector3d lower_
Definition: jointwidget.h:62
A shared pointer wrapper for se2ez::State.
std::recursive_mutex mutex_
Definition: panel.h:47
Definition: cspacepanel.h:22
void yBoxChanged(double value)
Prismatic joint, extends along X-axis.
Definition: joint.h:44
Eigen::Vector3d value_
Definition: jointwidget.h:61
Revolute joint, rotates. Continuous rotation, uses SO(2) metric.
Definition: joint.h:46
Eigen::Vector3d upper_
Definition: jointwidget.h:63
void tChanged(int value)
Floating joint, free movement in SE(2). Continuous rotation, uses SE(2) metric.
Definition: joint.h:42
void tBoxChanged(double value)
Ui::JointWidget * ui_
Definition: jointwidget.h:69
QDoubleSpinBox * boxes[3]
Definition: jointwidget.h:71
void keyPressEvent(QKeyEvent *event)
Definition: jointwidget.cpp:90
void xChanged(int value)
JointWidget(Panel *parent, std::string name, RobotPtr robot, StatePtr state)
Definition: jointwidget.cpp:17
Translating joint, free X- and Y-axis movement.
Definition: joint.h:43
A shared pointer wrapper for se2ez::Robot.
T c_str(T... args)
QSlider * sliders[3]
Definition: jointwidget.h:70
Main namespace.
Definition: collision.h:11
void yChanged(int value)
void setBox(unsigned int index, double value, bool update)
double remap(double a1, double a2, double av, double b1, double b2)
Remap a value av in the interval a1, a2 to the interval b1, b2.
Definition: math.cpp:160
void setSlider(unsigned int index, int value, bool update)
void xBoxChanged(double value)
Floating joint, free movement in SE(2). Uses Euclidean metric.
Definition: joint.h:41