pose_info.cpp
Go to the documentation of this file.
2 
3 namespace ram_qt_guis
4 {
5 
6 PoseInfo::PoseInfo(QWidget* parent) :
7  rviz::Panel(parent),
8  trajectory_size_(0)
9 {
10  setObjectName("Pose info");
11  pose_index_ = new QSpinBox;
12 
13  QGridLayout* geometric_pose_layout = new QGridLayout;
14  x_ = new QLabel;
15  geometric_pose_layout->addWidget(new QLabel("X"), 0, 0);
16  geometric_pose_layout->addWidget(x_, 0, 1);
17  w_ = new QLabel;
18  geometric_pose_layout->addWidget(new QLabel("W"), 0, 2);
19  geometric_pose_layout->addWidget(w_, 0, 3);
20  y_ = new QLabel;
21  geometric_pose_layout->addWidget(new QLabel("Y"));
22  geometric_pose_layout->addWidget(y_);
23  p_ = new QLabel;
24  geometric_pose_layout->addWidget(new QLabel("P"));
25  geometric_pose_layout->addWidget(p_);
26  z_ = new QLabel;
27  geometric_pose_layout->addWidget(new QLabel("Z"));
28  geometric_pose_layout->addWidget(z_);
29  r_ = new QLabel;
30  geometric_pose_layout->addWidget(new QLabel("R"));
31  geometric_pose_layout->addWidget(r_);
32 
33  QGridLayout* info_layout = new QGridLayout;
34  layers_level_ = new QLabel;
35  info_layout->addWidget(new QLabel("Layer level:"), 0, 0);
36  info_layout->addWidget(layers_level_, 0, 1);
37  layer_index_ = new QLabel;
38  info_layout->addWidget(new QLabel("Layer index:"));
39  info_layout->addWidget(layer_index_);
40  polygon_start_ = new QLabel;
41  info_layout->addWidget(new QLabel("Polygon start:"));
42  info_layout->addWidget(polygon_start_);
43  polygon_end_ = new QLabel;
44  info_layout->addWidget(new QLabel("Polygon end:"));
45  info_layout->addWidget(polygon_end_);
46  entry_pose_ = new QLabel;
47  info_layout->addWidget(new QLabel("Entry pose:"));
48  info_layout->addWidget(entry_pose_);
49  exit_pose_ = new QLabel;
50  info_layout->addWidget(new QLabel("Exit pose:"));
51  info_layout->addWidget(exit_pose_);
52 
53  QGridLayout* params_layout = new QGridLayout;
54  movement_type_ = new QLabel;
55  params_layout->addWidget(new QLabel("Movement type:"), 0, 0);
56  params_layout->addWidget(movement_type_, 0, 1);
57  approach_type_ = new QLabel;
58  params_layout->addWidget(new QLabel("Approach type:"));
59  params_layout->addWidget(approach_type_);
60  blend_radius_ = new QLabel;
61  params_layout->addWidget(new QLabel("Blend radius:"));
62  params_layout->addWidget(blend_radius_);
63  speed_ = new QLabel;
64  params_layout->addWidget(new QLabel("Speed:"));
65  params_layout->addWidget(speed_);
66  laser_power_ = new QLabel;
67  params_layout->addWidget(new QLabel("Laser power:"));
68  params_layout->addWidget(laser_power_);
69  feed_rate_ = new QLabel;
70  params_layout->addWidget(new QLabel("Feed rate:"));
71  params_layout->addWidget(feed_rate_);
72 
73  QHBoxLayout* get_pose_layout = new QHBoxLayout;
74  pose_index_ = new QSpinBox;
75  pose_index_->setRange(0, trajectory_size_ - 1);
76  get_pose_layout->addWidget(new QLabel("Pose index:"));
77  get_pose_layout->addWidget(pose_index_);
78 
79  QHBoxLayout* buttons_layout = new QHBoxLayout;
80  first_pose_button_ = new QPushButton("<<");
81  first_pose_button_->setMinimumWidth(5);
82  buttons_layout->addWidget(first_pose_button_);
83  back_button_ = new QPushButton("<");
84  back_button_->setMinimumWidth(5);
85  buttons_layout->addWidget(back_button_);
86  forward_button_ = new QPushButton(">");
87  back_button_->setMinimumWidth(5);
88  buttons_layout->addWidget(forward_button_);
89  last_pose_button_ = new QPushButton(">>");
90  last_pose_button_->setMinimumWidth(5);
91  buttons_layout->addWidget(last_pose_button_);
92 
93  QVBoxLayout *scroll_widget_layout = new QVBoxLayout();
94  QWidget *scroll_widget = new QWidget;
95  scroll_widget->setLayout(scroll_widget_layout);
96  QScrollArea *scroll_area = new QScrollArea;
97  scroll_area->setWidget(scroll_widget);
98  scroll_area->setWidgetResizable(true);
99  scroll_area->setFrameShape(QFrame::NoFrame);
100  QVBoxLayout* main_layout = new QVBoxLayout(this);
101  main_layout->addWidget(scroll_area);
102 
103  scroll_widget_layout->addWidget(new QLabel("<b>Geometric pose</b>"));
104  scroll_widget_layout->addLayout(geometric_pose_layout);
105  scroll_widget_layout->addStretch(1);
106  scroll_widget_layout->addWidget(new QLabel("<b>Information</b>"));
107  scroll_widget_layout->addLayout(info_layout);
108  scroll_widget_layout->addStretch(1);
109 
110  scroll_widget_layout->addWidget(new QLabel("<b>Parameters</b>"));
111  scroll_widget_layout->addLayout(params_layout);
112  scroll_widget_layout->addStretch(2);
113  scroll_widget_layout->addLayout(get_pose_layout);
114  scroll_widget_layout->addLayout(buttons_layout);
115 
116  connect(pose_index_, SIGNAL(valueChanged(int)), this, SLOT(getPoseInformation()));
117 
118  connect(back_button_, SIGNAL(clicked()), this, SLOT(backButtonHandler()));
119  connect(forward_button_, SIGNAL(clicked()), this, SLOT(forwardButtonHandler()));
120  connect(first_pose_button_, SIGNAL(clicked()), this, SLOT(firstPoseButtonHandler()));
121  connect(last_pose_button_, SIGNAL(clicked()), this, SLOT(lastPoseButtonHandler()));
122 
123  trajectory_sub_ = nh_.subscribe("ram/trajectory", 1, &PoseInfo::trajectoryCallback, this);
124  QtConcurrent::run(this, &PoseInfo::checkForPublishers);
125 
126  get_poses_from_trajectory_client_ = nh_.serviceClient<ram_modify_trajectory::GetPosesFromTrajectory>(
127  "ram/pose_selector/get_poses_from_trajectory");
128  QtConcurrent::run(this, &PoseInfo::connectToServices);
129 
130  Q_EMIT setEnabled(false);
131 }
132 
134 {
135 }
136 
138 {
139  while (nh_.ok())
140  {
141  ros::Duration(1).sleep();
142 
144  {
146  "RViz panel " << getName().toStdString() << " topic " << trajectory_sub_.getTopic() << " has at least one publisher");
147  break;
148  }
149  else
150  {
152  "RViz panel " << getName().toStdString() << " topic " << trajectory_sub_.getTopic() << " has zero publishers!");
153  }
154  }
155 }
156 
157 void PoseInfo::trajectoryCallback(const ram_msgs::AdditiveManufacturingTrajectoryConstPtr& msg)
158 {
159  trajectory_size_ = msg->poses.size();
160 
161  if (trajectory_size_ == 0)
162  {
163  Q_EMIT setEnabled(false);
164  return;
165  }
166 
167  Q_EMIT setEnabled(true);
168  pose_index_->setRange(0, trajectory_size_ - 1);
169  pose_index_->setValue(pose_index_->minimum());
170  // Force update in case current value is zero
171  Q_EMIT pose_index_->valueChanged(pose_index_->value());
172 }
173 
175 {
176  while (nh_.ok())
177  {
179  {
181  "RViz panel " << getName().toStdString() << " connected to the service " << get_poses_from_trajectory_client_.getService());
182  break;
183  }
184  else
185  {
187  "RViz panel " << getName().toStdString() << " could not connect to ROS service: " << get_poses_from_trajectory_client_.getService());
188  ros::Duration(1).sleep();
189  }
190  }
191  ROS_INFO_STREAM("RViz panel " << getName().toStdString() << " services connections have been made");
192 
193 }
194 
196 {
197  pose_index_->setValue(pose_index_->value() + 1);
198 }
199 
201 {
202  pose_index_->setValue(pose_index_->value() - 1);
203 }
204 
206 {
207  pose_index_->setValue(pose_index_->minimum());
208 }
209 
211 {
212  pose_index_->setValue(pose_index_->maximum());
213 }
214 
216 {
217  std::lock_guard<std::recursive_mutex> lock(pose_params_mutex_);
218 
219  Q_EMIT configChanged();
220 
221  pose_params_.request.pose_index_list.clear();
222  pose_params_.request.pose_index_list.push_back(pose_index_->value());
223 
225  if (success && (pose_params_.response.poses.size() == 1))
226  Q_EMIT updateGUIparameters();
227 }
228 
230 {
231  std::lock_guard<std::recursive_mutex> lock(pose_params_mutex_);
232 
233  layers_level_->setText(QString::number(pose_params_.response.poses[0].layer_level));
234  layer_index_->setText(QString::number(pose_params_.response.poses[0].layer_index));
235  polygon_start_->setText((pose_params_.response.poses[0].polygon_start) ? "True" : "False");
236  polygon_end_->setText((pose_params_.response.poses[0].polygon_end) ? "True" : "False");
237  entry_pose_->setText((pose_params_.response.poses[0].entry_pose) ? "True" : "False");
238  exit_pose_->setText((pose_params_.response.poses[0].exit_pose) ? "True" : "False");
239  // Geometric pose
240  Eigen::Affine3d current_pose_affine;
241  tf::poseMsgToEigen(pose_params_.response.poses[0].pose, current_pose_affine);
242 
243  // euler_angles[0] = yaW
244  // euler_angles[1] = Pitch
245  // euler_angles[2] = Roll
246  Eigen::Vector3d euler_angles = current_pose_affine.linear().eulerAngles(0, 1, 2);
247 
248  x_->setText(QString::number(current_pose_affine.translation().x() * 1000.0) + " mm");
249  y_->setText(QString::number(current_pose_affine.translation().y() * 1000.0) + " mm");
250  z_->setText(QString::number(current_pose_affine.translation().z() * 1000.0) + " mm");
251 
252  const double rad_to_deg(57.2957795131);
253  w_->setText(QString::number(euler_angles[0] * rad_to_deg) + " deg");
254  p_->setText(QString::number(euler_angles[1] * rad_to_deg) + " deg");
255  r_->setText(QString::number(euler_angles[2] * rad_to_deg) + " deg");
256 
257  // Others parameters
258  QString movement_type_str;
259  QString speed_unit_str = "";
260  double speed_conversion_factor;
261  switch (pose_params_.response.poses[0].params.movement_type)
262  {
263  case 0:
264  movement_type_str = "Joint";
265  speed_conversion_factor = 1.0;
266  break;
267  case 1:
268  movement_type_str = "Linear";
269  speed_unit_str = " meters/min";
270  speed_conversion_factor = 60.0; // meters/sec --> meters/min
271  break;
272  default:
273  movement_type_str = "";
274  speed_conversion_factor = 0;
275  break;
276  }
277  movement_type_->setText(movement_type_str);
278 
279  QString approach_type_str;
280  switch (pose_params_.response.poses[0].params.approach_type)
281  {
282  case 0:
283  approach_type_str = "Stop/go";
284  break;
285  case 1:
286  approach_type_str = "Blend radius";
287  break;
288  default:
289  approach_type_str = "-";
290  break;
291  }
292  approach_type_->setText(approach_type_str);
293 
294  blend_radius_->setText(QString::number(pose_params_.response.poses[0].params.blend_radius) + "%");
295  speed_->setText(
296  QString::number(pose_params_.response.poses[0].params.speed * speed_conversion_factor) + speed_unit_str);
297  laser_power_->setText(QString::number(pose_params_.response.poses[0].params.laser_power) + " W");
298  feed_rate_->setText(
299  QString::number(pose_params_.response.poses[0].params.feed_rate * 60.0) + " meters/min"); // meters/sec --> meters/min
300 }
301 
302 void PoseInfo::load(const rviz::Config& config)
303 {
304  int tmp_int(0);
305  Q_EMIT configChanged();
306 
307  if (config.mapGetInt("pose_index_box", &tmp_int))
308  pose_index_->setValue(tmp_int);
309 
310  rviz::Panel::load(config);
311 }
312 
313 void PoseInfo::save(rviz::Config config) const
314  {
315  config.mapSetValue("pose_index_box", pose_index_->value());
316  rviz::Panel::save(config);
317 }
318 
319 }
320 
ServiceClient serviceClient(const std::string &service_name, bool persistent=false, const M_string &header_values=M_string())
QSpinBox * pose_index_
Definition: pose_info.hpp:81
ram_modify_trajectory::GetPosesFromTrajectory pose_params_
Definition: pose_info.hpp:88
ros::Subscriber trajectory_sub_
Definition: pose_info.hpp:86
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
void poseMsgToEigen(const geometry_msgs::Pose &m, Eigen::Affine3d &e)
bool sleep() const
PoseInfo(QWidget *parent=NULL)
Definition: pose_info.cpp:6
void save(rviz::Config config) const
Definition: pose_info.cpp:313
bool call(MReq &req, MRes &res)
QPushButton * last_pose_button_
Definition: pose_info.hpp:78
void configChanged()
ros::NodeHandle nh_
Definition: pose_info.hpp:84
std::recursive_mutex pose_params_mutex_
Definition: pose_info.hpp:87
void mapSetValue(const QString &key, QVariant value)
ros::ServiceClient get_poses_from_trajectory_client_
Definition: pose_info.hpp:85
bool waitForExistence(ros::Duration timeout=ros::Duration(-1))
uint32_t getNumPublishers() const
std::string getTopic() const
virtual QString getName() const
QPushButton * first_pose_button_
Definition: pose_info.hpp:77
unsigned trajectory_size_
Definition: pose_info.hpp:48
bool mapGetInt(const QString &key, int *value_out) const
void trajectoryCallback(const ram_msgs::AdditiveManufacturingTrajectoryConstPtr &)
Definition: pose_info.cpp:157
#define ROS_INFO_STREAM(args)
QPushButton * forward_button_
Definition: pose_info.hpp:76
void load(const rviz::Config &config)
Definition: pose_info.cpp:302
std::string getService()
virtual void save(Config config) const
bool ok() const
#define ROS_ERROR_STREAM(args)
virtual void load(const Config &config)
#define PLUGINLIB_EXPORT_CLASS(class_type, base_class_type)
QPushButton * back_button_
Definition: pose_info.hpp:75


ram_qt_guis
Author(s): Victor Lamoine - Institut Maupertuis
autogenerated on Mon Jun 10 2019 14:50:11