36 #define _MAXRANGE_URG 5.1 37 #define _MAXRANGE_SICK 50.0 42 : QMainWindow(parent), m_scanGraph(NULL),
43 m_trajectoryDrawer(NULL), m_pointcloudDrawer(NULL),
44 m_cameraFollowMode(NULL),
45 m_octreeResolution(0.1), m_laserMaxRange(-1.), m_occupancyThresh(0.5),
46 m_max_tree_depth(initDepth > 0 && initDepth <= 16 ? initDepth : 16),
47 m_laserType(LASERTYPE_SICK),
48 m_cameraStored(false),
59 QDockWidget* settingsDock =
new QDockWidget(
"Octree / Scan graph settings",
this);
60 settingsDock->setWidget(settingsPanel);
61 this->addDockWidget(Qt::RightDockWidgetArea, settingsDock);
62 ui.menuShow->addAction(settingsDock->toggleViewAction());
66 QDockWidget *settingsCameraDock =
new QDockWidget(
"Camera settings",
this);
67 settingsCameraDock->setWidget(settingsCameraPanel);
68 this->addDockWidget(Qt::RightDockWidgetArea, settingsCameraDock);
69 this->tabifyDockWidget(settingsDock, settingsCameraDock);
70 settingsDock->raise();
71 ui.menuShow->addAction(settingsCameraDock->toggleViewAction());
83 connect(
this, SIGNAL(
updateStatusBar(QString,
int)), statusBar(), SLOT(showMessage(QString,
int)));
85 connect(settingsPanel, SIGNAL(treeDepthChanged(
int)),
this, SLOT(
changeTreeDepth(
int)));
89 connect(settingsCameraPanel, SIGNAL(jumpToFrame(
unsigned)),
m_cameraFollowMode, SLOT(jumpToFrame(
unsigned)));
92 connect(settingsCameraPanel, SIGNAL(clearCameraPath()),
m_cameraFollowMode, SLOT(clearCameraPath()));
93 connect(settingsCameraPanel, SIGNAL(saveToCameraPath()),
m_cameraFollowMode, SLOT(saveToCameraPath()));
94 connect(settingsCameraPanel, SIGNAL(removeFromCameraPath()),
m_cameraFollowMode, SLOT(removeFromCameraPath()));
95 connect(settingsCameraPanel, SIGNAL(addToCameraPath()),
m_cameraFollowMode, SLOT(addToCameraPath()));
96 connect(settingsCameraPanel, SIGNAL(followCameraPath()),
m_cameraFollowMode, SLOT(followCameraPath()));
97 connect(settingsCameraPanel, SIGNAL(followRobotPath()),
m_cameraFollowMode, SLOT(followRobotPath()));
99 connect(
m_cameraFollowMode, SIGNAL(changeNumberOfFrames(
unsigned)), settingsCameraPanel, SLOT(setNumberOfFrames(
unsigned)));
100 connect(
m_cameraFollowMode, SIGNAL(frameChanged(
unsigned)), settingsCameraPanel, SLOT(setCurrentFrame(
unsigned)));
101 connect(
m_cameraFollowMode, SIGNAL(stopped()), settingsCameraPanel, SLOT(setStopped()));
102 connect(
m_cameraFollowMode, SIGNAL(scanGraphAvailable(
bool)), settingsCameraPanel, SLOT(setRobotTrajectoryAvailable(
bool)));
116 connect(
this, SIGNAL(
changeNumberOfScans(
unsigned)), settingsPanel, SLOT(setNumberOfScans(
unsigned)));
117 connect(
this, SIGNAL(
changeCurrentScan(
unsigned)), settingsPanel, SLOT(setCurrentScan(
unsigned)));
118 connect(
this, SIGNAL(
changeResolution(
double)), settingsPanel, SLOT(setResolution(
double)));
120 connect(settingsCameraPanel, SIGNAL(
changeCamPosition(
double,
double,
double,
double,
double,
double)),
121 m_glwidget, SLOT(setCamPosition(
double,
double,
double,
double,
double,
double)));
125 connect(
ui.actionReset_view, SIGNAL(triggered()),
m_glwidget, SLOT(resetView()));
146 for (std::map<int, OcTreeRecord>::iterator it =
m_octrees.begin(); it !=
m_octrees.end(); ++it) {
148 delete (it->second.octree_drawer);
149 delete (it->second.octree);
164 std::cerr <<
string.toLocal8Bit().data();
165 if (newline) std::cerr << std::endl;
166 else std::cerr << std::flush;
174 std::map<int, OcTreeRecord>::iterator it =
m_octrees.find(
id);
191 if (dynamic_cast<OcTree*>(tree)) {
195 else if (dynamic_cast<ColorOcTree*>(tree)) {
215 if (dynamic_cast<OcTree*>(tree)) {
219 else if (dynamic_cast<ColorOcTree*>(tree)) {
239 double minX, minY, minZ, maxX, maxY, maxZ;
240 minX = minY = minZ = -10;
241 maxX = maxY = maxZ = 10;
242 double sizeX, sizeY, sizeZ;
243 sizeX = sizeY = sizeZ = 0.;
244 size_t memoryUsage = 0;
245 size_t num_nodes = 0;
246 size_t memorySingleNode = 0;
249 for (std::map<int, OcTreeRecord>::iterator it =
m_octrees.begin(); it !=
m_octrees.end(); ++it) {
251 double lminX, lminY, lminZ, lmaxX, lmaxY, lmaxZ;
252 it->second.octree->getMetricMin(lminX, lminY, lminZ);
253 it->second.octree->getMetricMax(lmaxX, lmaxY, lmaxZ);
257 pmin = it->second.origin.transform(pmin);
258 pmax = it->second.origin.transform(pmax);
259 lminX = pmin.
x(); lminY = pmin.
y(); lminZ = pmin.
z();
260 lmaxX = pmax.
x(); lmaxY = pmax.
y(); lmaxZ = pmax.
z();
262 if (lminX < minX) minX = lminX;
263 if (lminY < minY) minY = lminY;
264 if (lminZ < minZ) minZ = lminZ;
265 if (lmaxX > maxX) maxX = lmaxX;
266 if (lmaxY > maxY) maxY = lmaxY;
267 if (lmaxZ > maxZ) maxZ = lmaxZ;
268 double lsizeX, lsizeY, lsizeZ;
270 it->second.octree->getMetricSize(lsizeX, lsizeY, lsizeZ);
271 if (lsizeX > sizeX) sizeX = lsizeX;
272 if (lsizeY > sizeY) sizeY = lsizeY;
273 if (lsizeZ > sizeZ) sizeZ = lsizeZ;
274 memoryUsage += it->second.octree->memoryUsage();
275 num_nodes += it->second.octree->size();
276 memorySingleNode = std::max(memorySingleNode, it->second.octree->memoryUsageNode());
282 QString size = QString(
"%L1 x %L2 x %L3 m^3; %L4 nodes").arg(sizeX).arg(sizeY).arg(sizeZ).arg(
unsigned(num_nodes));
283 QString memory = QString(
"Single node: %L1 B; ").arg(memorySingleNode)
284 + QString (
"Octree: %L1 B (%L2 MB)").arg(memoryUsage).arg((
double) memoryUsage/(1024.*1024.), 0,
'f', 3);
295 for (std::map<int, OcTreeRecord>::iterator it =
m_octrees.begin(); it !=
m_octrees.end(); ++it) {
297 it->second.octree_drawer->setOcTree(*it->second.octree, it->second.origin, it->second.id);
310 QApplication::setOverrideCursor(Qt::WaitCursor);
313 std::cerr << std::endl;
320 unsigned currentScan = 1;
323 fprintf(stderr,
"generateOctree:: inserting scan node with %d points, origin: %.2f ,%.2f , %.2f.\n",
324 (
unsigned int) (*it)->scan->size(), (*it)->pose.x(), (*it)->pose.y(), (*it)->pose.z() );
326 std::cout <<
" S ("<<currentScan<<
"/"<<numScans<<
") " << std::flush;
334 QApplication::restoreOverrideCursor();
337 std::cerr <<
"generateOctree called but no ScanGraph present!\n";
346 showInfo(
"Inserting first scan node into tree... ",
true);
347 QApplication::setOverrideCursor(Qt::WaitCursor);
358 QApplication::restoreOverrideCursor();
366 showInfo(
"Inserting next scan node into tree... ",
true);
368 QApplication::setOverrideCursor(Qt::WaitCursor);
372 fprintf(stderr,
"ERROR: OctreeRecord for id %d not found!\n",
DEFAULT_OCTREE_ID);
380 QApplication::restoreOverrideCursor();
388 for (
unsigned i = 0; i < scans; ++i){
401 QFileInfo fileinfo(temp);
402 this->setWindowTitle(fileinfo.fileName());
403 if (fileinfo.suffix() ==
"graph"){
405 }
else if (fileinfo.suffix() ==
"bt"){
408 else if (fileinfo.suffix() ==
"ot")
412 else if (fileinfo.suffix() ==
"hot"){
415 else if (fileinfo.suffix() ==
"dat"){
419 QMessageBox::warning(
this,
"Unknown file",
"Cannot open file, unknown extension: "+fileinfo.suffix(), QMessageBox::Ok);
427 QApplication::setOverrideCursor(Qt::WaitCursor);
440 QApplication::setOverrideCursor(Qt::WaitCursor);
452 std::cout <<
"ERROR: could not read " <<
m_filename << std::endl;
458 pose6d laser_pose(0,0,0,0,0,0);
467 ui.actionPointcloud->setChecked(
false);
468 ui.actionPointcloud->setEnabled(
false);
469 ui.actionOctree_cells->setChecked(
true);
470 ui.actionOctree_cells->setEnabled(
true);
471 ui.actionFree->setChecked(
false);
472 ui.actionFree->setEnabled(
true);
473 ui.actionOctree_structure->setEnabled(
true);
474 ui.actionOctree_structure->setChecked(
false);
475 ui.actionTrajectory->setEnabled(
false);
476 ui.actionConvert_ml_tree->setEnabled(
true);
477 ui.actionReload_Octree->setEnabled(
true);
478 ui.actionSettings->setEnabled(
false);
508 ui.actionHeight_map->setText (
"Map color");
510 ui.actionHeight_map->setChecked(
true);
514 QMessageBox::warning(
this,
"File error",
"Cannot open OcTree file", QMessageBox::Ok);
524 std::ifstream infile(
m_filename.c_str(), std::ios_base::in |std::ios_base::binary);
525 if (!infile.is_open()) {
526 QMessageBox::warning(
this,
"File error",
"Cannot open OcTree file", QMessageBox::Ok);
534 it != collection.
end(); ++it) {
535 OCTOMAP_DEBUG(
"Adding hierarchy node %s\n", (*it)->getId().c_str());
536 OcTree* tree = (*it)->getMap();
538 OCTOMAP_ERROR(
"Error while reading node %s\n", (*it)->getId().c_str());
540 OCTOMAP_DEBUG(
"Read tree with %zu tree nodes\n", tree->size());
542 pose6d origin = (*it)->getOrigin();
554 ui.actionSettings->setEnabled(
true);
555 ui.actionPointcloud->setEnabled(
true);
556 ui.actionPointcloud->setChecked(
false);
557 ui.actionTrajectory->setEnabled(
true);
558 ui.actionOctree_cells->setEnabled(
true);
559 ui.actionOctree_cells->setChecked(
true);
560 ui.actionOctree_structure->setEnabled(
true);
561 ui.actionOctree_structure->setChecked(
false);
562 ui.actionFree->setChecked(
false);
563 ui.actionFree->setEnabled(
true);
564 ui.actionReload_Octree->setEnabled(
true);
565 ui.actionConvert_ml_tree->setEnabled(
true);
568 unsigned currentScan;
571 fprintf(stderr,
"loadGraph:: generating octree from complete graph.\n" );
574 currentScan = graphSize;
590 QApplication::restoreOverrideCursor();
594 showInfo(
"Done (" +QString::number(currentScan)+
" of "+ QString::number(graphSize)+
" nodes)",
true);
608 if (
ui.actionTrajectory->isChecked())
611 if (
ui.actionPointcloud->isChecked())
617 if (depth < 1 || depth > 16)
655 bool maxRangeChanged = (std::abs(oldLaserMaxRange -
m_laserMaxRange) > 1e-5);
657 if (resolutionChanged)
662 }
else if (resolutionChanged || maxRangeChanged){
670 QString filename = QFileDialog::getOpenFileName(
this,
671 tr(
"Open data file"),
"",
672 "All supported files (*.graph *.bt *.ot *.dat);;OcTree file (*.ot);;Bonsai tree file (*.bt);;Binary scan graph (*.graph);;Pointcloud (*.dat);;All files (*)");
673 if (!filename.isEmpty()){
675 m_filename = std::string(filename.toLocal8Bit().data());
685 QString filename = QFileDialog::getOpenFileName(
this,
686 tr(
"Open graph file incrementally (at start)"),
"",
687 "Binary scan graph (*.graph)");
688 if (!filename.isEmpty()){
692 m_filename = std::string(filename.toLocal8Bit().data());
705 fprintf(stderr,
"ERROR: OctreeRecord for id %d not found!\n",
DEFAULT_OCTREE_ID);
706 QMessageBox::warning(
this, tr(
"3D Mapping Viewer"),
707 "Error: No OcTree present.",
712 QString filename = QFileDialog::getSaveFileName(
this, tr(
"Save octree file"),
713 "", tr(
"Full OcTree (*.ot);;Bonsai Tree file (*.bt);;"));
716 QApplication::setOverrideCursor(Qt::WaitCursor);
717 showInfo(
"Writing file... ",
false);
719 QFileInfo fileinfo(filename);
720 std::string std_filename;
722 std_filename = filename.toLocal8Bit().data();
724 std_filename = filename.toStdString();
729 if (fileinfo.suffix() ==
"bt") {
734 QMessageBox::warning(
this,
"Unknown tree type",
735 "Could not convert to occupancy tree for writing .bt file",
739 else if (fileinfo.suffix() ==
"ot"){
743 QMessageBox::warning(
this,
"Unknown file",
744 "Cannot write file, unknown extension: "+fileinfo.suffix(),
748 QApplication::restoreOverrideCursor();
808 for (std::map<int, OcTreeRecord>::iterator t_it =
m_octrees.begin(); t_it !=
m_octrees.end(); ++t_it) {
809 OcTree* octree =
dynamic_cast<OcTree*
>(t_it->second.octree);
814 octree->
deleteNode(it.getKey(), it.getDepth());
817 QMessageBox::warning(
this,
"Not implemented",
"Functionality not yet implemented for this octree type",
831 for (std::map<int, OcTreeRecord>::iterator t_it =
m_octrees.begin(); t_it !=
m_octrees.end(); ++t_it) {
832 OcTree* octree =
dynamic_cast<OcTree*
>(t_it->second.octree);
841 for(OcTree::leaf_iterator it = octree->
begin_leafs(),
842 end=octree->
end_leafs(); it!= end; ++it){
845 if (k[0] < minKey[0] || k[1] < minKey[1] || k[2] < minKey[2]
846 || k[0] > maxKey[0] || k[1] > maxKey[1] || k[2] > maxKey[2])
852 QMessageBox::warning(
this,
"Not implemented",
"Functionality not yet implemented for this octree type",
860 for (std::map<int, OcTreeRecord>::iterator t_it =
m_octrees.begin(); t_it !=
m_octrees.end(); ++t_it) {
861 OcTree* octree =
dynamic_cast<OcTree*
>(t_it->second.octree);
874 it->setLogOdds(logodds);
881 QMessageBox::warning(
this,
"Not implemented",
"Functionality not yet implemented for this octree type",
891 for (std::map<int, OcTreeRecord>::iterator t_it =
m_octrees.begin(); t_it !=
m_octrees.end(); ++t_it) {
892 OcTree* octree =
dynamic_cast<OcTree*
>(t_it->second.octree);
904 for (k[0] = minKey[0]; k[0] < maxKey[0]; ++k[0]){
905 for (k[1] = minKey[1]; k[1] < maxKey[1]; ++k[1]){
906 for (k[2] = minKey[2]; k[2] < maxKey[2]; ++k[2]){
919 for (std::map<int, OcTreeRecord>::iterator t_it =
m_octrees.begin(); t_it !=
m_octrees.end(); ++t_it) {
920 OcTree* octree =
dynamic_cast<OcTree*
>(t_it->second.octree);
932 for (k[0] = minKey[0]; k[0] < maxKey[0]; ++k[0]){
933 for (k[1] = minKey[1]; k[1] < maxKey[1]; ++k[1]){
934 for (k[2] = minKey[2]; k[2] < maxKey[2]; ++k[2]){
960 ui.actionExport_sequence->setChecked(
false);
969 ui.actionHeight_map->setChecked(
false);
970 ui.actionSemanticColoring->setChecked(
false);
978 ui.menuDelete_nodes->setEnabled(checked);
979 ui.menuFill_selection->setEnabled(checked);
980 ui.menuChange_nodes_in_selection->setEnabled(checked);
991 ui.actionPrintout_mode->setChecked(
false);
992 ui.actionSemanticColoring->setChecked(
false);
999 ui.actionHeight_map->setChecked(
false);
1000 ui.actionPrintout_mode->setChecked(
false);
1011 ui.actionRestore_camera->setEnabled(
true);
1039 for (std::map<int, OcTreeRecord>::iterator it =
m_octrees.begin();
1041 it->second.octree_drawer->enableAxes(checked);
1056 for (std::map<int, OcTreeRecord>::iterator it =
m_octrees.begin(); it !=
m_octrees.end(); ++it) {
1058 it->second.octree_drawer->setAlternativeDrawing(checked);
1063 for (std::map<int, OcTreeRecord>::iterator it =
m_octrees.begin();
1066 delete (it->second.octree_drawer);
1067 delete (it->second.octree);
1086 QApplication::setOverrideCursor(Qt::WaitCursor);
1088 showInfo(
"Converting OcTree to maximum Likelihood map... ");
1089 for (std::map<int, OcTreeRecord>::iterator it =
m_octrees.begin();
1092 if (dynamic_cast<OcTree*>(t)) {
1093 ((
OcTree*) t)->toMaxLikelihood();
1095 else if (dynamic_cast<OcTree*>(t)) {
1101 QApplication::restoreOverrideCursor();
1107 QApplication::setOverrideCursor(Qt::WaitCursor);
1110 for (std::map<int, OcTreeRecord>::iterator it =
m_octrees.begin();
1112 it->second.octree->prune();
1117 QApplication::restoreOverrideCursor();
1123 QApplication::setOverrideCursor(Qt::WaitCursor);
1128 for (std::map<int, OcTreeRecord>::iterator it =
m_octrees.begin();
1130 it->second.octree->expand();
1136 QApplication::restoreOverrideCursor();
1141 for (std::map<int, OcTreeRecord>::iterator it =
m_octrees.begin();
1143 it->second.octree_drawer->enableOcTreeCells(enabled);
1149 for (std::map<int, OcTreeRecord>::iterator it =
m_octrees.begin();
1151 it->second.octree_drawer->enableOcTree(enabled);
1157 for (std::map<int, OcTreeRecord>::iterator it =
m_octrees.begin();
1159 it->second.octree_drawer->enableFreespace(enabled);
1200 QString filename = QFileDialog::getSaveFileName(
this,
"Save Viewer State",
"camera.xml",
"Camera/State file (*.xml)");
1201 if (!filename.isEmpty()) {
1202 #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) 1204 #else // QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) 1206 #endif // QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) 1211 QString filename = QFileDialog::getOpenFileName(
this,
"Load Viewer State",
"camera.xml",
"Camera/State file (*.xml)");
1212 if (!filename.isEmpty()) {
1213 #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) 1215 #else // QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) 1217 #endif // QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
ScanNode * addNode(Pointcloud *scan, pose6d pose)
void on_actionRestore_camera_triggered()
QLabel * m_mapMemoryStatus
ViewerWidget * m_glwidget
QColor backgroundColor() const
virtual std::string getTreeType() const=0
void updateInnerOccupancy()
ScanGraph::iterator m_nextScanToAdd
void on_actionStore_camera_triggered()
void on_actionOctree_cells_toggled(bool enabled)
std::istream & readBinary(std::ifstream &s)
void openOcTree()
open "regular" file containing an octree
void on_action_bg_black_triggered()
double m_octreeResolution
void on_actionTest_triggered()
void loadGraph(bool completeGraph=true)
void openGraph(bool completeGraph=true)
static AbstractOcTree * read(const std::string &filename)
void changeCurrentScan(unsigned scans)
#define OCTOMAP_DEBUG(...)
virtual OcTreeNode * updateNode(const OcTreeKey &key, float log_odds_update, bool lazy_eval=false)
void getBBXMax(float &x, float &y, float &z) const
octomap::ColorOcTree colortreeTmp(0)
void on_actionClear_selection_triggered()
void addNextScans(unsigned scans)
void on_actionClear_unknown_in_selection_triggered()
void on_action_bg_white_triggered()
void on_actionReload_Octree_triggered()
void on_actionSemanticColoring_toggled(bool checked)
void changeNumberOfScans(unsigned scans)
virtual void saveStateToFile()
void on_actionFill_nodes_in_selection_triggered()
void on_actionSave_file_triggered()
virtual void setScanGraph(const octomap::ScanGraph &graph)
bool deleteNode(double x, double y, double z, unsigned int depth=0)
void on_actionFree_toggled(bool enabled)
std::string m_filename
Filename of last loaded file, in case it is necessary to reload it.
virtual void deletePath(unsigned int i)
void on_actionHideBackground_toggled(bool checked)
void on_actionClear_nodes_in_selection_triggered()
const leaf_bbx_iterator end_leafs_bbx() const
void updateNodesInBBX(const point3d &min, const point3d &max, bool occupied)
unsigned int getLaserType()
void on_actionDelete_nodes_outside_of_selection_triggered()
TrajectoryDrawer * m_trajectoryDrawer
void setTreeDepth(int depth)
void on_actionAxes_toggled(bool checked)
virtual void insertPointCloud(const Pointcloud &scan, const octomap::point3d &sensor_origin, double maxrange=-1., bool lazy_eval=false, bool discretize=false)
void on_actionAlternateRendering_toggled(bool checked)
void showInfo(QString string, bool newline=false)
std::vector< ScanNode *>::iterator iterator
leaf_iterator begin_leafs(unsigned char maxDepth=0) const
void on_actionClear_triggered()
void on_actionFill_selection_triggered()
void addOctree(AbstractOcTree *tree, int id, pose6d origin)
void on_actionExport_view_triggered()
The Vec class represents 3D positions and 3D vectors.
float getClampingThresMaxLog() const
OcTreeNode * search(double x, double y, double z, unsigned int depth=0) const
qglviewer::Camera * camera() const
void on_actionHeight_map_toggled(bool checked)
virtual double getResolution() const=0
void on_action_bg_gray_triggered()
bool openSnapshotFormatDialog()
void changeResolution(double resolution)
bool coordToKeyChecked(const point3d &coord, OcTreeKey &key) const
float getClampingThresMinLog() const
void setLaserType(int type)
void on_savecampose_triggered()
void setScanGraph(octomap::ScanGraph *graph)
double getResolution() const
void on_actionSelection_box_toggled(bool checked)
bool writeBinaryConst(const std::string &filename) const
void setNonNodesInBBX(const point3d &min, const point3d &max, bool occupied)
unsigned int m_max_tree_depth
void on_actionPrune_tree_triggered()
void on_actionExport_sequence_triggered(bool checked)
void on_actionDelete_nodes_in_selection_triggered()
void on_actionTrajectory_toggled(bool checked)
ViewerGui(const std::string &filename="", QWidget *parent=0, unsigned int initTreeDepth=16)
void on_actionOpen_graph_incremental_triggered()
leaf_bbx_iterator begin_leafs_bbx(const OcTreeKey &min, const OcTreeKey &max, unsigned char maxDepth=0) const
void setStateFileName(const QString &name)
void on_actionSettings_triggered()
void saveCameraPosition(const char *filename) const
void on_actionExit_triggered()
CameraFollowMode * m_cameraFollowMode
void getBBXMin(float &x, float &y, float &z) const
void setBackgroundColor(const QColor &color)
const leaf_iterator end_leafs() const
virtual void addKeyFrameToPath(unsigned int i)
void updateStatusBar(QString message, int duration)
void setOcTreeUISwitches()
void on_loadcampose_triggered()
virtual bool restoreStateFromFile()
void setMaxRange(double range)
PointcloudDrawer * m_pointcloudDrawer
void on_actionOpen_file_triggered()
void on_actionSelected_toggled(bool enabled)
void on_actionOctree_structure_toggled(bool enabled)
static const unsigned int DEFAULT_OCTREE_ID
void setNodesInBBX(const point3d &min, const point3d &max, bool occupied)
OcTreeDrawer * octree_drawer
void loadCameraPosition(const char *filename)
std::map< int, OcTreeRecord > m_octrees
void setResolution(double resolution)
float logodds(double probability)
virtual void playPath(unsigned int i)
bool write(const std::string &filename) const
virtual void setScanGraph(const ScanGraph &graph)
#define OCTOMAP_ERROR(...)
void on_actionPrintout_mode_toggled(bool checked)
void on_actionFill_unknown_in_selection_triggered()
void saveSnapshot(bool automatic=true, bool overwrite=false)
void on_actionHelp_triggered()
void setSnapshotCounter(int counter)
void changeTreeDepth(int depth)
bool getOctreeRecord(int id, OcTreeRecord *&otr)
void on_actionConvert_ml_tree_triggered()
void changeCamPosition(double x, double y, double z, double lookX, double lookY, double lookZ)
void on_actionPointcloud_toggled(bool checked)
void on_actionExpand_tree_triggered()
void openTree()
open binary format OcTree