trajectory_utils.cpp
Go to the documentation of this file.
2 
3 namespace ram_qt_guis
4 {
6  rviz::Panel(parent)
7 {
8  setObjectName("Trajectory utilities");
9  setName(objectName());
10 
11  QSizePolicy policy(QSizePolicy::Expanding, QSizePolicy::Expanding);
12  back_button_ = new QPushButton("Back");
13  back_button_->setSizePolicy(policy);
14  forward_button_ = new QPushButton("Forward");
15  forward_button_->setSizePolicy(policy);
16 
17  // Back-forward layout
18  QHBoxLayout* back_forward_layout = new QHBoxLayout;
19  back_forward_layout->addWidget(back_button_);
20  back_forward_layout->addWidget(forward_button_);
21 
22  // Import-Export layout
23  QHBoxLayout *import_export_file_layout = new QHBoxLayout;
24  QPushButton *import_file_explorer = new QPushButton;
25  import_file_explorer->setText("Import");
26  QPushButton *export_file_explorer = new QPushButton;
27  export_file_explorer->setText("Export");
28  import_export_file_layout->addWidget(import_file_explorer);
29  import_export_file_layout->addWidget(export_file_explorer);
30 
31  // Main Layout
32  QVBoxLayout* main_layout = new QVBoxLayout(this);
33  main_layout->addLayout(back_forward_layout);
34  main_layout->addStretch(1);
35  main_layout->addLayout(import_export_file_layout);
36 
37  //Connect buttons
38  connect(back_button_, SIGNAL(clicked()), this, SLOT(backButtonHandler()));
39  connect(forward_button_, SIGNAL(clicked()), this, SLOT(forwardButtonHandler()));
40  connect(export_file_explorer, SIGNAL(released()), this, SLOT(browseFilesToExportTrajectory()));
41  connect(import_file_explorer, SIGNAL(released()), this, SLOT(browseFilesToImportTrajectory()));
42  // Connect message boxes
43  connect(this, SIGNAL(displayErrorMessageBox(const QString, const QString, const QString)), this,
44  SLOT(displayErrorBoxHandler(const QString, const QString, const QString)));
45  connect(this, SIGNAL(displaySuccessMessageBox(const QString,const QString)), this,
46  SLOT(displaySuccessBoxHandler(const QString,const QString)));
47 
48  trajectory_buffer_client_ = nh_.serviceClient<ram_utils::BufferParams>("ram/buffer/get_trajectory");
49 
50  export_trajectory_client_ = nh_.serviceClient<ram_utils::ExportTrajectory>(
51  "ram/buffer/export_trajectory");
52  import_trajectory_client_ = nh_.serviceClient<ram_utils::ImportTrajectory>(
53  "ram/buffer/import_trajectory");
54 
55  // Check connection of client
56  QtConcurrent::run(this, &TrajectoryUtils::connectToServices);
57 }
58 
60 {
61 }
62 
64 {
65  while (nh_.ok())
66  {
67  if (client.waitForExistence(ros::Duration(2)))
68  {
70  "RViz panel " << getName().toStdString() << " connected to the service " << client.getService());
71  break;
72  }
73  else
74  {
76  "RViz panel " << getName().toStdString() << " could not connect to ROS service: " << client.getService());
77  ros::Duration(1).sleep();
78  }
79  }
80 }
81 
83 {
84  Q_EMIT setEnabled(false);
85  // Back/forward button service
87  // Import/export trajectories
90  ROS_INFO_STREAM("RViz panel " << getName().toStdString() << " services connections have been made");
91  Q_EMIT setEnabled(true);
92 }
93 
95 {
96  Q_EMIT configChanged();
97  Q_EMIT setEnabled(false);
98  params_.request.button_id = 1;
99  // Run in a separate thread
100  QtConcurrent::run(this, &TrajectoryUtils::sendButton);
101 }
102 
104 {
105  Q_EMIT configChanged();
106  Q_EMIT setEnabled(false);
107  params_.request.button_id = 2;
108  // Run in a separate thread
109  QtConcurrent::run(this, &TrajectoryUtils::sendButton);
110 }
111 
113 {
114  // Call service
115  bool success(trajectory_buffer_client_.call(params_));
116 
117  if (!success)
118  {
119  Q_EMIT displayErrorMessageBox("Service call failed", QString::fromStdString(trajectory_buffer_client_.getService()),
120  "Check the logs!");
121  }
122  else if (!params_.response.error.empty())
123  {
124  Q_EMIT displayErrorMessageBox(QString::fromStdString(trajectory_buffer_client_.getService()),
125  QString::fromStdString(params_.response.error),
126  "");
127  }
128 
129  Q_EMIT setEnabled(true);
130 }
131 
133 {
134  QString file_dir("");
135  {
136  QFileInfo file(QString::fromStdString(export_filename_.request.file_name));
137  if (export_filename_.request.file_name != "" && file.dir().exists())
138  file_dir = file.dir().path();
139  else
140  {
141  std::string path = ros::package::getPath("ram_path_planning");
142  file_dir = QString::fromStdString(path);
143  }
144  }
145 
146  QFileDialog browser;
147  QString file_path = browser.getSaveFileName(this, "Save trajectory", file_dir, "Bag files (*.bag)");
148 
149  if (file_path != "")
150  {
151  if (!file_path.endsWith(".bag"))
152  file_path += ".bag";
153 
154  Q_EMIT configChanged();
155  Q_EMIT setEnabled(false);
156  export_filename_.request.file_name = file_path.toStdString();
157  // Run in a separate thread
158  QtConcurrent::run(this, &TrajectoryUtils::exportTrajectory);
159  }
160 }
161 
163 {
164  QString file_dir("");
165  {
166  QFileInfo file(QString::fromStdString(import_filename_.request.file_name));
167  if (import_filename_.request.file_name != "" && file.dir().exists())
168  file_dir = file.dir().path();
169  else
170  {
171  std::string path = ros::package::getPath("ram_path_planning");
172  file_dir = QString::fromStdString(path);
173  }
174  }
175 
176  QFileDialog browser;
177  QString file_path = browser.getOpenFileName(this, "Choose Bag file", file_dir, "Bag files (*.bag)");
178 
179  if (file_path != "")
180  {
181  Q_EMIT configChanged();
182  Q_EMIT setEnabled(false);
183  import_filename_.request.file_name = file_path.toStdString();
184  // Run in a separate thread
185  QtConcurrent::run(this, &TrajectoryUtils::importTrajectory);
186  }
187 }
188 
190 {
191  // Call service
193 
194  if (!success)
195  {
196  Q_EMIT displayErrorMessageBox("Service call failed", QString::fromStdString(export_trajectory_client_.getService()),
197  "Check the logs!");
198  }
199  else
200  {
201  if (export_filename_.response.error.empty())
202  {
203  Q_EMIT displaySuccessMessageBox("The trajectory has been exported to ",
204  QString::fromStdString(export_filename_.request.file_name));
205  }
206  else
207  {
208  Q_EMIT displayErrorMessageBox(QString::fromStdString(export_trajectory_client_.getService()),
209  QString::fromStdString(export_filename_.response.error),
210  "");
211  }
212  }
213 
214  Q_EMIT setEnabled(true);
215 }
216 
218 {
219  // Call service
221 
222  if (!success)
223  {
224  Q_EMIT displayErrorMessageBox("Service call failed", QString::fromStdString(import_trajectory_client_.getService()),
225  "Check the logs!");
226  }
227  else
228  {
229  if (import_filename_.response.error.empty())
230  {
231  Q_EMIT displaySuccessMessageBox("The trajectory has been imported from file ",
232  QString::fromStdString(import_filename_.request.file_name));
233  }
234  else
235  {
236  Q_EMIT displayErrorMessageBox(QString::fromStdString(import_trajectory_client_.getService()),
237  QString::fromStdString(import_filename_.response.error),
238  "");
239  }
240  }
241 
242  Q_EMIT setEnabled(true);
243 }
244 
246 {
247  QString tmp_str("");
248  if (config.mapGetString("export_filename", &tmp_str))
249  export_filename_.request.file_name = tmp_str.toStdString();
250  if (config.mapGetString("import_filename", &tmp_str))
251  import_filename_.request.file_name = tmp_str.toStdString();
252  rviz::Panel::load(config);
253 }
254 
256  {
257  config.mapSetValue("export_filename", QString::fromStdString(export_filename_.request.file_name));
258  config.mapSetValue("import_filename", QString::fromStdString(import_filename_.request.file_name));
259  rviz::Panel::save(config);
260 }
261 
263  const QString message,
264  const QString info_msg)
265 {
266  bool old_state(isEnabled());
267  Q_EMIT setEnabled(false);
268  QMessageBox msg_box;
269  msg_box.setWindowTitle(title);
270  msg_box.setText(message);
271  msg_box.setInformativeText(info_msg);
272  msg_box.setIcon(QMessageBox::Critical);
273  msg_box.setStandardButtons(QMessageBox::Ok);
274  msg_box.exec();
275  Q_EMIT setEnabled(old_state);
276 }
277 
278 void TrajectoryUtils::displaySuccessBoxHandler(const QString message,
279  const QString info_msg)
280 {
281  bool old_state(isEnabled());
282  Q_EMIT setEnabled(false);
283  QMessageBox msg_box;
284  msg_box.setText(message);
285  msg_box.setInformativeText(info_msg);
286  msg_box.setIcon(QMessageBox::Information);
287  msg_box.setStandardButtons(QMessageBox::Ok);
288  msg_box.exec();
289  Q_EMIT setEnabled(old_state);
290 }
291 
292 }
293 
ros::ServiceClient export_trajectory_client_
void displaySuccessBoxHandler(const QString message, const QString info_msg)
void connectToService(ros::ServiceClient &client)
ServiceClient serviceClient(const std::string &service_name, bool persistent=false, const M_string &header_values=M_string())
bool sleep() const
bool call(MReq &req, MRes &res)
ram_utils::ExportTrajectory export_filename_
void configChanged()
bool mapGetString(const QString &key, QString *value_out) const
void mapSetValue(const QString &key, QVariant value)
virtual void setName(const QString &name)
void load(const rviz::Config &config)
bool waitForExistence(ros::Duration timeout=ros::Duration(-1))
virtual QString getName() const
ROSLIB_DECL std::string getPath(const std::string &package_name)
TrajectoryUtils(QWidget *parent=NULL)
ros::ServiceClient import_trajectory_client_
#define ROS_INFO_STREAM(args)
ram_utils::BufferParams params_
std::string getService()
ros::ServiceClient trajectory_buffer_client_
virtual void save(Config config) const
bool ok() const
#define ROS_ERROR_STREAM(args)
virtual void load(const Config &config)
void displayErrorMessageBox(const QString, const QString, const QString)
#define PLUGINLIB_EXPORT_CLASS(class_type, base_class_type)
ram_utils::ExportTrajectory import_filename_
void displayErrorBoxHandler(const QString title, const QString message, const QString info_msg)
void displaySuccessMessageBox(const QString, const QString)
void save(rviz::Config config) const


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