filter_frames.cpp
Go to the documentation of this file.
1 #include "filter_frames.h"
2 #include <tf/tfMessage.h>
3 #include <tf2_msgs/TFMessage.h>
4 #include <QCheckBox>
5 #include <QProgressDialog>
6 #include <QTableWidget>
7 #include <QTableWidgetItem>
8 #include "ui_filter_frames.h"
9 
11  FilterFrames::FramesSet& filtered_frames,
12  QWidget* parent)
13  : QDialog(parent), ui(new Ui::FilterFrames), _bag(bag), _frames_to_filter(filtered_frames)
14 {
15  ui->setupUi(this);
16 
17  std::vector<std::string> topics = {"/tf"};
18  rosbag::View bag_view(bag, rosbag::TopicQuery(topics));
19 
20  QProgressDialog progress_dialog;
21  progress_dialog.setLabelText("Loading... please wait");
22  progress_dialog.setWindowModality(Qt::ApplicationModal);
23  progress_dialog.show();
24 
25  int msg_count = 0;
26  progress_dialog.setRange(0, bag_view.size() - 1);
27 
28  FramesSet frames;
29 
30  for (const rosbag::MessageInstance& msg : bag_view)
31  {
32  if (msg_count++ % 100 == 0)
33  {
34  progress_dialog.setValue(msg_count);
35  QApplication::processEvents();
36  }
37 
38 
39  tf::tfMessage::ConstPtr tf = msg.instantiate<tf::tfMessage>();
40  if (tf)
41  {
42  for (const auto& transform : tf->transforms)
43  {
44  frames.insert(std::make_pair(transform.header.frame_id,
45  transform.child_frame_id));
46  }
47  }
48 
49  tf2_msgs::TFMessage::ConstPtr tf2 = msg.instantiate<tf2_msgs::TFMessage>();
50  if (tf2)
51  {
52  for (const auto& transform : tf2->transforms)
53  {
54  frames.insert(std::make_pair(transform.header.frame_id,
55  transform.child_frame_id));
56  }
57  }
58  }
59 
60  for (const auto& frame : frames)
61  {
62  int row = ui->tableWidget->rowCount();
63  ui->tableWidget->setRowCount(row + 1);
64  ui->tableWidget->setItem(
65  row, 1, new QTableWidgetItem(QString::fromStdString(frame.first)));
66  ui->tableWidget->setItem(
67  row, 2, new QTableWidgetItem(QString::fromStdString(frame.second)));
68  QCheckBox* check = new QCheckBox(ui->tableWidget);
69  check->setChecked( _frames_to_filter.count(frame) == 0 );
70  ui->tableWidget->setCellWidget(row, 0, check);
71  }
72 
73  ui->tableWidget->resizeColumnsToContents();
74 }
75 
77 {
78  delete ui;
79 }
80 
82 {
83  for (int row = 0; row < ui->tableWidget->rowCount(); row++) {
84  QCheckBox* check =
85  qobject_cast<QCheckBox*>(ui->tableWidget->cellWidget(row, 0));
86 
87  if (check->isChecked() == false) {
88  std::string parent = ui->tableWidget->item(row, 1)->text().toStdString();
89  std::string child = ui->tableWidget->item(row, 2)->text().toStdString();
90  _frames_to_filter.insert(std::make_pair(parent, child));
91  }
92  }
93 }
ROSCPP_DECL bool check()
FilterFrames(const rosbag::Bag &bag, FramesSet &filtered_frames, QWidget *parent=nullptr)
uint32_t size()
Ui::FilterFrames * ui
Definition: filter_frames.h:30
FramesSet & _frames_to_filter
Definition: filter_frames.h:32
std::set< std::pair< std::string, std::string >> FramesSet
Definition: filter_frames.h:17
void on_buttonBox_accepted()


rosbag_editor
Author(s):
autogenerated on Fri Jan 22 2021 03:48:10