post_processor_widget.cpp
Go to the documentation of this file.
1 #include <QHBoxLayout>
2 #include <QVBoxLayout>
3 #include <QPushButton>
4 #include <QLabel>
5 #include <QLineEdit>
6 #include <QCheckBox>
7 #include <QFuture>
8 #include <QtConcurrent/QtConcurrentRun>
9 #include <QSpinBox>
10 
11 #include "post_processor_widget.h"
12 
14 {
15  setObjectName("PostProcessorWidget_");
16 
17  QLabel* program_name_label = new QLabel("Program name:");
18  program_name_ = new QLineEdit;
19  QHBoxLayout* program_name_layout = new QHBoxLayout;
20  program_name_layout->addWidget(program_name_label);
21  program_name_layout->addWidget(program_name_);
22 
23  QLabel* comment_label = new QLabel("Comment (optional):");
24  comment_ = new QLineEdit;
25  QHBoxLayout* comment_layout_ = new QHBoxLayout();
26  comment_layout_->addWidget(comment_label);
27  comment_layout_->addWidget(comment_);
28 
29  QLabel* machining_speed_label = new QLabel("Machining speed (cm/min): ");
30  machining_speed_ = new QSpinBox;
31  machining_speed_->setRange(1, 1000);
32  QHBoxLayout* machining_speed_layout_ = new QHBoxLayout();
33  machining_speed_layout_->addWidget(machining_speed_label);
34  machining_speed_layout_->addWidget(machining_speed_);
35 
36  QLabel* extrication_speed_label = new QLabel("Extrication speed (cm/min): ");
37  extrication_speed_ = new QSpinBox;
38  extrication_speed_->setRange(1, 1000);
39  QHBoxLayout* extrication_speed_layout_ = new QHBoxLayout();
40  extrication_speed_layout_->addWidget(extrication_speed_label);
41  extrication_speed_layout_->addWidget(extrication_speed_);
42 
43  QLabel* trajectory_z_offset_label = new QLabel("Z offset for trajectory: ");
44  trajectory_z_offset_ = new QSpinBox;
45  trajectory_z_offset_->setRange(-1000, 1000);
46  trajectory_z_offset_->setSuffix(" mm");
47  QHBoxLayout* trajectory_z_offset_layout = new QHBoxLayout();
48  trajectory_z_offset_layout->addWidget(trajectory_z_offset_label);
49  trajectory_z_offset_layout->addWidget(trajectory_z_offset_);
50 
51  QLabel* upload_label = new QLabel("Upload program:");
52  upload_program_ = new QCheckBox;
53  QHBoxLayout* upload_layout_ = new QHBoxLayout();
54  upload_layout_->addWidget(upload_label);
55  upload_layout_->addStretch(1);
56  upload_layout_->addWidget(upload_program_);
57  upload_layout_->addStretch(9);
58 
59  ip_adress_label_ = new QLabel("Robot IP:");
60  ip_address_ = new QLineEdit;
61  ip_address_->setInputMask("000.000.000.000;_");
62  ip_address_->setText("192.168.100.200");
63  QHBoxLayout* ip_adress_layout = new QHBoxLayout;
64  ip_adress_layout->addWidget(ip_adress_label_);
65  ip_adress_layout->addWidget(ip_address_);
66 
67  QLabel* program_location_label = new QLabel("Program location:");
68  program_location_ = new QLineEdit;
69  program_location_->setReadOnly(true);
70  QHBoxLayout* program_location_layout = new QHBoxLayout;
71  program_location_layout->addWidget(program_location_label);
72  program_location_layout->addWidget(program_location_);
73 
74  generate_program_button_ = new QPushButton("Generate TP program");
75  generate_program_button_->setMinimumHeight(90);
76 
77  QVBoxLayout* post_processor_layout = new QVBoxLayout(this);
78  post_processor_layout->addLayout(program_name_layout);
79  post_processor_layout->addLayout(comment_layout_);
80  post_processor_layout->addLayout(machining_speed_layout_);
81  post_processor_layout->addLayout(extrication_speed_layout_);
82  post_processor_layout->addLayout(trajectory_z_offset_layout);
83  post_processor_layout->addLayout(upload_layout_);
84  post_processor_layout->addLayout(ip_adress_layout);
85  post_processor_layout->addLayout(program_location_layout);
86  post_processor_layout->addStretch(2);
87  post_processor_layout->addWidget(generate_program_button_);
88  post_processor_layout->addStretch(8);
89 
90  // Connect Handlers
91  connect(program_name_, SIGNAL(textChanged(QString)), this, SLOT(triggerSave()));
92  connect(comment_, SIGNAL(textChanged(QString)), this, SLOT(triggerSave()));
93  connect(machining_speed_, SIGNAL(valueChanged(int)), this, SLOT(triggerSave()));
94  connect(extrication_speed_, SIGNAL(valueChanged(int)), this, SLOT(triggerSave()));
95  connect(trajectory_z_offset_, SIGNAL(valueChanged(int)), this, SLOT(triggerSave()));
96  connect(upload_program_, SIGNAL(stateChanged(int)), this, SLOT(setIpAddressEnable(int)));
97  connect(upload_program_, SIGNAL(stateChanged(int)), this, SLOT(triggerSave()));
98  connect(ip_address_, SIGNAL(textChanged(QString)), this, SLOT(triggerSave()));
99  connect(generate_program_button_, SIGNAL(released()), this, SLOT(generateProgramButtonHandler()));
100  connect(program_name_, SIGNAL(editingFinished()), this, SLOT(tweakProgramName()));
102 
103  // Program location is hard-coded
104  setProgramLocation(ros::package::getPath("fanuc_grinding_rviz_plugin")+"/tp_programs/");
105 
106  //Setup client
107  post_processor_service_ = nh_.serviceClient<fanuc_grinding_post_processor::PostProcessorService>("post_processor_service");
108 
109  QFuture<void> future = QtConcurrent::run(this, &fanuc_grinding_rviz_plugin::PostProcessorWidget::connectToServices);
110 }
111 
113 {
114  Q_EMIT guiChanged();
116 }
117 
118 void fanuc_grinding_rviz_plugin::PostProcessorWidget::setPostProcessorParams(const fanuc_grinding_post_processor::PostProcessorService::Request &params)
119 {
120  // Copy all BUT trajectory data
121  srv_post_processor_.request.ProgramLocation = params.ProgramLocation;
122  srv_post_processor_.request.ProgramName = params.ProgramName;
123  srv_post_processor_.request.Comment = params.Comment;
124  srv_post_processor_.request.MachiningSpeed = params.MachiningSpeed;
125  srv_post_processor_.request.ExtricationSpeed = params.ExtricationSpeed;
126  srv_post_processor_.request.TrajectoryZOffset = params.TrajectoryZOffset;
127  srv_post_processor_.request.Upload = params.Upload;
128  srv_post_processor_.request.IpAdress = params.IpAdress;
129  // Probably not filled
130  srv_post_processor_.request.RobotPoses = params.RobotPoses;
131  srv_post_processor_.request.IsGrindingPose = params.IsGrindingPose;
132  updateGUI();
133 }
134 
136 {
137  program_name_->setText(QString::fromStdString(srv_post_processor_.request.ProgramName));
138  comment_->setText(QString::fromStdString(srv_post_processor_.request.Comment));
139  machining_speed_->setValue(srv_post_processor_.request.MachiningSpeed);
140  extrication_speed_->setValue(srv_post_processor_.request.ExtricationSpeed);
141  trajectory_z_offset_->setValue(srv_post_processor_.request.TrajectoryZOffset * 1000.0);
142  upload_program_->setChecked(srv_post_processor_.request.Upload);
143  ip_address_->setText(QString::fromStdString(srv_post_processor_.request.IpAdress));
144  program_location_->setText(QString::fromStdString(srv_post_processor_.request.ProgramLocation));
145 }
146 
148 {
149  srv_post_processor_.request.ProgramName = program_name_->text().toStdString();
150  srv_post_processor_.request.Comment = comment_->text().toStdString();
151  srv_post_processor_.request.MachiningSpeed = machining_speed_->value();
152  srv_post_processor_.request.ExtricationSpeed = extrication_speed_->value();
153  srv_post_processor_.request.TrajectoryZOffset = trajectory_z_offset_->value() / 1000.0;
154  srv_post_processor_.request.Upload = upload_program_->isChecked();
155  srv_post_processor_.request.IpAdress = ip_address_->text().toStdString();
156  // program_location_ is read only
157 }
158 
160 {
161  if (program_name_->text().size() == 0)
162  return;
163 
164  // Remove .ls extension
165  QString program_name(program_name_->text());
166  program_name = program_name.remove(".ls", Qt::CaseInsensitive);
167  program_name = program_name.remove(".l", Qt::CaseInsensitive);
168  program_name = program_name.remove(".", Qt::CaseInsensitive);
169  program_name_->setText(program_name);
170 }
171 
173 {
174  ip_address_->setEnabled(state);
175  ip_adress_label_->setEnabled(state);
176 }
177 
179 {
180  srv_post_processor_.request.ProgramLocation = location;
181  updateGUI();
182 }
183 
184 void fanuc_grinding_rviz_plugin::PostProcessorWidget::setRobotPoses(const std::vector<geometry_msgs::Pose> &robot_poses)
185 {
186  srv_post_processor_.request.RobotPoses.clear();
187  for(std::vector<geometry_msgs::Pose>::const_iterator iter (robot_poses.begin());
188  iter != robot_poses.end();
189  ++iter)
190  {
191  srv_post_processor_.request.RobotPoses.push_back(*iter);
192  }
193 }
194 
195 void fanuc_grinding_rviz_plugin::PostProcessorWidget::setIsGrindingPose(const std::vector<bool> &is_grinding_pose)
196 {
197  srv_post_processor_.request.IsGrindingPose.clear();
198  for (std::vector<bool>::const_iterator iter(is_grinding_pose.begin()); iter != is_grinding_pose.end(); ++iter)
199  {
200  srv_post_processor_.request.IsGrindingPose.push_back(*iter);
201  }
202 }
203 
205 {
207  Q_EMIT getRobotTrajectoryData();
208 
209  if (srv_post_processor_.request.ProgramName.empty())
210  {
211  Q_EMIT sendMsgBox("Program name",
212  "The program name cannot be empty", "");
213  Q_EMIT sendStatus("Program name is empty");
214  return;
215  }
216 
217  // Request has been filled with updateInternalValues and getRobotTrajectoryData();
218  // Start client service call in an other thread
219  QFuture<void> future = QtConcurrent::run(this, &PostProcessorWidget::generateProgram);
220 }
221 
223 {
224  // Disable UI
225  Q_EMIT enablePanel(false);
226 
227  // Call client service
229 
230  if(srv_post_processor_.response.ReturnStatus == true)
231  {
232  Q_EMIT sendStatus(QString::fromStdString(srv_post_processor_.response.ReturnMessage));
233  }
234  else
235  {
236  Q_EMIT sendMsgBox("Error in post-processor",
237  QString::fromStdString(srv_post_processor_.response.ReturnMessage),
238  "");
239  }
240 
241  // Re-enable UI
242  Q_EMIT enablePanel(true); // Enable UI
243 }
244 
246 {
247  Q_EMIT enablePanel(false);
248 
249  // Check offset_move_robot_ connection
250  Q_EMIT sendStatus("Connecting to service");
251  while (ros::ok())
252  {
254  {
255  ROS_INFO_STREAM(objectName().toStdString() + " RViz panel connected to the service " << post_processor_service_.getService());
256  Q_EMIT sendStatus(QString::fromStdString("RViz panel connected to the service: " + post_processor_service_.getService()));
257  break;
258  }
259  else
260  {
261  ROS_WARN_STREAM(objectName().toStdString() + " RViz panel could not connect to ROS service:\n\t" << post_processor_service_.getService());
262  Q_EMIT sendStatus(QString::fromStdString("RViz panel could not connect to ROS service: " + post_processor_service_.getService()));
263  sleep(1);
264  }
265  }
266 
267  ROS_INFO_STREAM(objectName().toStdString() + " service connections have been made");
268  Q_EMIT sendStatus("Ready to take commands");
269  Q_EMIT enablePanel(true);
270 }
271 
272 // Save all configuration data from this panel to the given Config object
274 {
275  // Save offset value into the config file
276  config.mapSetValue(objectName() + "program_name", program_name_->text());
277  config.mapSetValue(objectName() + "comment", comment_->text());
278  config.mapSetValue(objectName() + "machining_speed", machining_speed_->value());
279  config.mapSetValue(objectName() + "extrication_speed", extrication_speed_->value());
280  config.mapSetValue(objectName() + "trajectory_z_offset", trajectory_z_offset_->value());
281  config.mapSetValue(objectName() + "upload_program", upload_program_->isChecked());
282  config.mapSetValue(objectName() + "ip_adress", ip_address_->text());
283 }
284 
285 // Load all configuration data for this panel from the given Config object.
287 {
288  QString tmp;
289  float int_tmp;
290  // Load offset value from config file (if it exists)
291  if (config.mapGetString(objectName() + "program_name", &tmp))
292  program_name_->setText(tmp);
293  if (config.mapGetString(objectName() + "comment", &tmp))
294  comment_->setText(tmp);
295 
296  if (config.mapGetFloat(objectName() + "machining_speed", &int_tmp))
297  machining_speed_->setValue(int_tmp);
298  else
299  machining_speed_->setValue(200);
300 
301  if (config.mapGetFloat(objectName() + "extrication_speed", &int_tmp))
302  extrication_speed_->setValue(int_tmp);
303  else
304  extrication_speed_->setValue(500);
305 
306  if (config.mapGetFloat(objectName() + "trajectory_z_offset", &int_tmp))
307  trajectory_z_offset_->setValue(int_tmp);
308  else
309  trajectory_z_offset_->setValue(0);
310 
311  bool state_tmp;
312  if (config.mapGetBool(objectName() + "upload_program", &state_tmp))
313  upload_program_->setChecked(state_tmp);
314  setIpAddressEnable(upload_program_->isChecked());
315 
316  if (config.mapGetString(objectName() + "ip_adress", &tmp))
317  ip_address_->setText(tmp);
318 
321 }
ServiceClient serviceClient(const std::string &service_name, bool persistent=false, const M_string &header_values=M_string())
bool call(MReq &req, MRes &res)
bool mapGetFloat(const QString &key, float *value_out) const
bool mapGetString(const QString &key, QString *value_out) const
void mapSetValue(const QString &key, QVariant value)
bool waitForExistence(ros::Duration timeout=ros::Duration(-1))
void setRobotPoses(const std::vector< geometry_msgs::Pose > &robot_poses)
ROSCPP_DECL bool ok()
void sendMsgBox(const QString title, const QString msg, const QString info_msg)
bool mapGetBool(const QString &key, bool *value_out) const
fanuc_grinding_post_processor::PostProcessorService srv_post_processor_
#define ROS_WARN_STREAM(args)
ROSLIB_DECL std::string getPath(const std::string &package_name)
#define ROS_INFO_STREAM(args)
void setIsGrindingPose(const std::vector< bool > &is_grinding_pose)
std::string getService()
void setProgramLocation(const std::string &location)
void setPostProcessorParams(const fanuc_grinding_post_processor::PostProcessorService::Request &params)


rviz_plugin
Author(s): Kévin Bolloré, Victor Lamoine - Institut Maupertuis
autogenerated on Thu Dec 19 2019 03:38:28