mirror of
https://github.com/introlab/rtabmap_ros.git
synced 2026-10-04 00:37:46 +08:00
Updated CameraDatabase : loading also the associated actions with image loaded
Memory : Saving neighbors of looped locations (for a trace in DB) git-svn-id: http://rtabmap.googlecode.com/svn/trunk/rtabmap@313 f169173b-cf89-36c8-b27e-44dbe73f0c83
This commit is contained in:
@@ -406,11 +406,11 @@ int main(int argc, char * argv[])
|
|||||||
std::list<std::vector<float> > actions;
|
std::list<std::vector<float> > actions;
|
||||||
while(loopDataset <= repeat && g_forever)
|
while(loopDataset <= repeat && g_forever)
|
||||||
{
|
{
|
||||||
image = camera->takeImage();
|
SMState * smState = camera->takeImage();
|
||||||
int i=0;
|
int i=0;
|
||||||
while(image && g_forever)
|
while(smState && g_forever)
|
||||||
{
|
{
|
||||||
SMState * smState = imageToSMState.process(image);
|
imageToSMState.process(smState);
|
||||||
++imagesProcessed;
|
++imagesProcessed;
|
||||||
iterationTimer.start();
|
iterationTimer.start();
|
||||||
if(i<maxTeleopActions)
|
if(i<maxTeleopActions)
|
||||||
@@ -435,7 +435,7 @@ int main(int argc, char * argv[])
|
|||||||
{
|
{
|
||||||
++countLoopDetected;
|
++countLoopDetected;
|
||||||
}
|
}
|
||||||
image = camera->takeImage();
|
smState = camera->takeImage();
|
||||||
if(++count % 100 == 0)
|
if(++count % 100 == 0)
|
||||||
{
|
{
|
||||||
printf(" count = %d, loop closures = %d\n", count, countLoopDetected);
|
printf(" count = %d, loop closures = %d\n", count, countLoopDetected);
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ class KeypointDescriptor;
|
|||||||
class SMState;
|
class SMState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Only encapsulate the image in a newly created SMState.
|
* No treatment
|
||||||
*/
|
*/
|
||||||
class RTABMAP_EXP CamPostTreatment
|
class RTABMAP_EXP CamPostTreatment
|
||||||
{
|
{
|
||||||
@@ -47,7 +47,7 @@ public:
|
|||||||
this->parseParameters(parameters);
|
this->parseParameters(parameters);
|
||||||
}
|
}
|
||||||
virtual ~CamPostTreatment() {}
|
virtual ~CamPostTreatment() {}
|
||||||
virtual SMState * process(const IplImage * image) const;
|
virtual void process(SMState * smState) const;
|
||||||
virtual void parseParameters(const ParametersMap & parameters) {}
|
virtual void parseParameters(const ParametersMap & parameters) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -68,7 +68,7 @@ public:
|
|||||||
this->parseParameters(parameters);
|
this->parseParameters(parameters);
|
||||||
}
|
}
|
||||||
virtual ~CamKeypointTreatment();
|
virtual ~CamKeypointTreatment();
|
||||||
virtual SMState * process(const IplImage * image) const;
|
virtual void process(SMState * smState) const;
|
||||||
virtual void parseParameters(const ParametersMap & parameters);
|
virtual void parseParameters(const ParametersMap & parameters);
|
||||||
DetectorStrategy detectorStrategy() const;
|
DetectorStrategy detectorStrategy() const;
|
||||||
private:
|
private:
|
||||||
@@ -90,7 +90,7 @@ public:
|
|||||||
public:
|
public:
|
||||||
virtual ~Camera();
|
virtual ~Camera();
|
||||||
|
|
||||||
virtual IplImage * takeImage() = 0;
|
virtual SMState * takeImage() = 0;
|
||||||
virtual bool init() = 0;
|
virtual bool init() = 0;
|
||||||
bool isPaused() const {return !this->isRunning();}
|
bool isPaused() const {return !this->isRunning();}
|
||||||
bool isCapturing() const {return this->isRunning();}
|
bool isCapturing() const {return this->isRunning();}
|
||||||
@@ -145,7 +145,7 @@ public:
|
|||||||
unsigned int imageHeight = 0);
|
unsigned int imageHeight = 0);
|
||||||
virtual ~CameraImages();
|
virtual ~CameraImages();
|
||||||
|
|
||||||
virtual IplImage * takeImage();
|
virtual SMState * takeImage();
|
||||||
virtual bool init();
|
virtual bool init();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -187,7 +187,7 @@ public:
|
|||||||
unsigned int imageHeight = 0);
|
unsigned int imageHeight = 0);
|
||||||
virtual ~CameraVideo();
|
virtual ~CameraVideo();
|
||||||
|
|
||||||
virtual IplImage * takeImage();
|
virtual SMState * takeImage();
|
||||||
virtual bool init();
|
virtual bool init();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -222,7 +222,7 @@ public:
|
|||||||
unsigned int imageHeight = 0);
|
unsigned int imageHeight = 0);
|
||||||
virtual ~CameraDatabase();
|
virtual ~CameraDatabase();
|
||||||
|
|
||||||
virtual IplImage * takeImage();
|
virtual SMState * takeImage();
|
||||||
virtual bool init();
|
virtual bool init();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -52,7 +52,8 @@ class RTABMAP_EXP Statistics
|
|||||||
RTABMAP_STATS(Loop, Vp_likelihood,);
|
RTABMAP_STATS(Loop, Vp_likelihood,);
|
||||||
RTABMAP_STATS(Loop, ReactivateId,);
|
RTABMAP_STATS(Loop, ReactivateId,);
|
||||||
RTABMAP_STATS(Loop, Hypothesis_ratio,);
|
RTABMAP_STATS(Loop, Hypothesis_ratio,);
|
||||||
RTABMAP_STATS(Loop, Retrieval_margin,)
|
RTABMAP_STATS(Loop, Retrieval_margin,);
|
||||||
|
RTABMAP_STATS(Loop, Actions,);
|
||||||
|
|
||||||
RTABMAP_STATS(Memory, Working_memory_size,);
|
RTABMAP_STATS(Memory, Working_memory_size,);
|
||||||
RTABMAP_STATS(Memory, Short_time_memory_size,);
|
RTABMAP_STATS(Memory, Short_time_memory_size,);
|
||||||
|
|||||||
+71
-26
@@ -36,10 +36,9 @@
|
|||||||
namespace rtabmap
|
namespace rtabmap
|
||||||
{
|
{
|
||||||
|
|
||||||
SMState * CamPostTreatment::process(const IplImage * image) const
|
void CamPostTreatment::process(SMState * smState) const
|
||||||
{
|
{
|
||||||
//no threatment...
|
//no threatment...
|
||||||
return new SMState();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CamKeypointTreatment::~CamKeypointTreatment()
|
CamKeypointTreatment::~CamKeypointTreatment()
|
||||||
@@ -53,17 +52,15 @@ CamKeypointTreatment::~CamKeypointTreatment()
|
|||||||
delete _keypointDescriptor;
|
delete _keypointDescriptor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SMState * CamKeypointTreatment::process(const IplImage * image) const
|
void CamKeypointTreatment::process(SMState * smState) const
|
||||||
{
|
{
|
||||||
if(image)
|
if(smState && smState->getImage() && smState->getKeypoints().size() == 0 && smState->getSensors().size() == 0)
|
||||||
{
|
{
|
||||||
std::list<cv::KeyPoint> keypoints = _keypointDetector->generateKeypoints(image);
|
std::list<cv::KeyPoint> keypoints = _keypointDetector->generateKeypoints(smState->getImage());
|
||||||
std::list<std::vector<float> > descriptors = _keypointDescriptor->generateDescriptors(image, keypoints);
|
std::list<std::vector<float> > descriptors = _keypointDescriptor->generateDescriptors(smState->getImage(), keypoints);
|
||||||
SMState * smState = new SMState(descriptors, std::list<std::vector<float> >());
|
smState->setSensors(descriptors);
|
||||||
smState->setKeypoints(keypoints);
|
smState->setKeypoints(keypoints);
|
||||||
return smState;
|
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CamKeypointTreatment::parseParameters(const ParametersMap & parameters)
|
void CamKeypointTreatment::parseParameters(const ParametersMap & parameters)
|
||||||
@@ -284,15 +281,12 @@ void Camera::process()
|
|||||||
{
|
{
|
||||||
UTimer timer;
|
UTimer timer;
|
||||||
ULOGGER_DEBUG("Camera::process()");
|
ULOGGER_DEBUG("Camera::process()");
|
||||||
IplImage * image = this->takeImage();
|
SMState * smState = this->takeImage();
|
||||||
if(image)
|
if(smState)
|
||||||
{
|
{
|
||||||
SMState * smState = _postThreatement->process(image);
|
_postThreatement->process(smState);
|
||||||
if(smState)
|
this->post(new SMStateEvent(smState));
|
||||||
{
|
|
||||||
smState->setImage(image);
|
|
||||||
this->post(new SMStateEvent(smState));
|
|
||||||
}
|
|
||||||
double elapsed = timer.ticks();
|
double elapsed = timer.ticks();
|
||||||
UDEBUG("Post treatment time = %fs", elapsed);
|
UDEBUG("Post treatment time = %fs", elapsed);
|
||||||
if(_imageRate>0)
|
if(_imageRate>0)
|
||||||
@@ -370,7 +364,7 @@ bool CameraImages::init()
|
|||||||
return _dir != 0;
|
return _dir != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
IplImage * CameraImages::takeImage()
|
SMState * CameraImages::takeImage()
|
||||||
{
|
{
|
||||||
IplImage * img = 0;
|
IplImage * img = 0;
|
||||||
if(_dir)
|
if(_dir)
|
||||||
@@ -428,7 +422,11 @@ IplImage * CameraImages::takeImage()
|
|||||||
cvReleaseImage(&img);
|
cvReleaseImage(&img);
|
||||||
img = resampledImg;
|
img = resampledImg;
|
||||||
}
|
}
|
||||||
return img;
|
if(img)
|
||||||
|
{
|
||||||
|
return new SMState(img);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -505,7 +503,7 @@ bool CameraVideo::init()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
IplImage * CameraVideo::takeImage()
|
SMState * CameraVideo::takeImage()
|
||||||
{
|
{
|
||||||
IplImage * img = 0; // Null image
|
IplImage * img = 0; // Null image
|
||||||
if(_capture)
|
if(_capture)
|
||||||
@@ -543,7 +541,11 @@ IplImage * CameraVideo::takeImage()
|
|||||||
img = cvCloneImage(img);
|
img = cvCloneImage(img);
|
||||||
}
|
}
|
||||||
|
|
||||||
return img;
|
if(img)
|
||||||
|
{
|
||||||
|
return new SMState(img);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -606,20 +608,43 @@ bool CameraDatabase::init()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// TODO load all signatures only if ignoreChildren is false
|
|
||||||
_dbDriver->getAllSignatureIds(_ids);
|
_dbDriver->getAllSignatureIds(_ids);
|
||||||
_indexIter = _ids.begin();
|
_indexIter = _ids.begin();
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
IplImage * CameraDatabase::takeImage()
|
SMState * CameraDatabase::takeImage()
|
||||||
{
|
{
|
||||||
IplImage * img = 0;
|
IplImage * img = 0;
|
||||||
if(_dbDriver && _indexIter != _ids.end())
|
if(_dbDriver && _indexIter != _ids.end())
|
||||||
{
|
{
|
||||||
_dbDriver->getImage(*_indexIter, &img);
|
if(_ignoreChildren)
|
||||||
++_indexIter;
|
{
|
||||||
|
bool ignore = true;
|
||||||
|
while(img == 0 && _indexIter != _ids.end() && ignore)
|
||||||
|
{
|
||||||
|
ignore = false;
|
||||||
|
int loopId = 0;
|
||||||
|
if(_dbDriver->getLoopClosureId(*_indexIter, loopId))
|
||||||
|
{
|
||||||
|
if(loopId == *_indexIter+1)
|
||||||
|
{
|
||||||
|
ignore = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_dbDriver->getImage(*_indexIter, &img);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
++_indexIter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_dbDriver->getImage(*_indexIter, &img);
|
||||||
|
++_indexIter;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if(!_dbDriver)
|
else if(!_dbDriver)
|
||||||
{
|
{
|
||||||
@@ -647,7 +672,27 @@ IplImage * CameraDatabase::takeImage()
|
|||||||
img = resampledImg;
|
img = resampledImg;
|
||||||
}
|
}
|
||||||
|
|
||||||
return img;
|
if(img)
|
||||||
|
{
|
||||||
|
SMState * smState = new SMState(img);
|
||||||
|
if(_dbDriver && _indexIter!=_ids.begin())
|
||||||
|
{
|
||||||
|
std::set<int>::iterator iter = _indexIter;
|
||||||
|
--iter;
|
||||||
|
std::map<int, std::list<std::vector<float> > > neighbors;
|
||||||
|
_dbDriver->loadNeighbors(*iter, neighbors);
|
||||||
|
for(std::map<int, std::list<std::vector<float> > >::iterator i=neighbors.begin(); i!=neighbors.end(); ++i)
|
||||||
|
{
|
||||||
|
if(i->first > *iter && i->second.size())
|
||||||
|
{
|
||||||
|
smState->setActuators(i->second);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return smState;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace rtabmap
|
} // namespace rtabmap
|
||||||
|
|||||||
@@ -955,7 +955,7 @@ void Memory::moveToTrash(Signature * s)
|
|||||||
UDEBUG("A neighbor is not found (%d)", *iter);
|
UDEBUG("A neighbor is not found (%d)", *iter);
|
||||||
_dbDriver->removeNeighbor(*iter, s->id());
|
_dbDriver->removeNeighbor(*iter, s->id());
|
||||||
}
|
}
|
||||||
s->removeNeighbor(*iter);
|
//s->removeNeighbor(*iter); // Commented to keep a trace in db
|
||||||
}
|
}
|
||||||
|
|
||||||
if(s->getWeight() && s->getLoopClosureId() > 0)
|
if(s->getWeight() && s->getLoopClosureId() > 0)
|
||||||
|
|||||||
@@ -1075,6 +1075,7 @@ void Rtabmap::process()
|
|||||||
stat->addStatistic(Statistics::kLoopReactivateId(), _reactivateId);
|
stat->addStatistic(Statistics::kLoopReactivateId(), _reactivateId);
|
||||||
stat->addStatistic(Statistics::kLoopHypothesis_ratio(), hypothesisRatio);
|
stat->addStatistic(Statistics::kLoopHypothesis_ratio(), hypothesisRatio);
|
||||||
stat->addStatistic(Statistics::kLoopRetrieval_margin(), _spreadMargin);
|
stat->addStatistic(Statistics::kLoopRetrieval_margin(), _spreadMargin);
|
||||||
|
stat->addStatistic(Statistics::kLoopActions(), (int)_actions.size());
|
||||||
|
|
||||||
// Child count by parent signature on the root of the memory ... for statistics
|
// Child count by parent signature on the root of the memory ... for statistics
|
||||||
stat->setWeights(_memory->getWeights());
|
stat->setWeights(_memory->getWeights());
|
||||||
|
|||||||
+19
-16
@@ -81,20 +81,21 @@ void Tests::testAvpd()
|
|||||||
|
|
||||||
|
|
||||||
/* Start thread's task */
|
/* Start thread's task */
|
||||||
IplImage * image = 0;
|
SMState * smState = 0;
|
||||||
|
|
||||||
image = camera.takeImage();
|
smState = camera.takeImage();
|
||||||
int imgCount = 0;
|
int imgCount = 0;
|
||||||
while(image)
|
while(smState)
|
||||||
{
|
{
|
||||||
++imgCount;
|
++imgCount;
|
||||||
printf("Processing image %d/84...\n", imgCount);
|
printf("Processing image %d/84...\n", imgCount);
|
||||||
ctabmap.process(new SMState(image));
|
ctabmap.process(smState);
|
||||||
image = camera.takeImage();
|
smState = camera.takeImage();
|
||||||
}
|
}
|
||||||
if(image)
|
if(smState)
|
||||||
{
|
{
|
||||||
cvReleaseImage(&image);
|
delete smState;
|
||||||
|
smState = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
CPPUNIT_ASSERT(imgCount == 84);
|
CPPUNIT_ASSERT(imgCount == 84);
|
||||||
@@ -141,7 +142,7 @@ void Tests::testCamera()
|
|||||||
{
|
{
|
||||||
//Logger::setType(Logger::kTypeFile, "LogTestAvpdCore/testCamera.txt", false);
|
//Logger::setType(Logger::kTypeFile, "LogTestAvpdCore/testCamera.txt", false);
|
||||||
std::string path;
|
std::string path;
|
||||||
IplImage * image = 0;
|
SMState * smState = 0;
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
//CameraVideo class FIXME add a video in svn and reactivate this test
|
//CameraVideo class FIXME add a video in svn and reactivate this test
|
||||||
@@ -171,13 +172,14 @@ void Tests::testCamera()
|
|||||||
CameraImages cameraImages(path, false, 0, false, 80);
|
CameraImages cameraImages(path, false, 0, false, 80);
|
||||||
CPPUNIT_ASSERT( cameraImages.init() );
|
CPPUNIT_ASSERT( cameraImages.init() );
|
||||||
CPPUNIT_ASSERT( cameraImages.isIdle() == true);
|
CPPUNIT_ASSERT( cameraImages.isIdle() == true);
|
||||||
image = cameraImages.takeImage();
|
smState = cameraImages.takeImage();
|
||||||
count = 0;
|
count = 0;
|
||||||
while(image)
|
while(smState)
|
||||||
{
|
{
|
||||||
cvReleaseImage(&image);
|
delete smState;
|
||||||
|
smState = 0;
|
||||||
++count;
|
++count;
|
||||||
image = cameraImages.takeImage();
|
smState = cameraImages.takeImage();
|
||||||
}
|
}
|
||||||
CPPUNIT_ASSERT( count == 5 );
|
CPPUNIT_ASSERT( count == 5 );
|
||||||
|
|
||||||
@@ -186,13 +188,14 @@ void Tests::testCamera()
|
|||||||
CameraDatabase cameraDatabase(path, false); // ignoreChildren=false;
|
CameraDatabase cameraDatabase(path, false); // ignoreChildren=false;
|
||||||
CPPUNIT_ASSERT( cameraDatabase.init() );
|
CPPUNIT_ASSERT( cameraDatabase.init() );
|
||||||
CPPUNIT_ASSERT( cameraDatabase.isIdle() == true);
|
CPPUNIT_ASSERT( cameraDatabase.isIdle() == true);
|
||||||
image = cameraDatabase.takeImage();
|
smState = cameraDatabase.takeImage();
|
||||||
count = 0;
|
count = 0;
|
||||||
while(image)
|
while(smState)
|
||||||
{
|
{
|
||||||
++count;
|
++count;
|
||||||
cvReleaseImage(&image);
|
delete smState;
|
||||||
image = cameraDatabase.takeImage();
|
smState = 0;
|
||||||
|
smState = cameraDatabase.takeImage();
|
||||||
}
|
}
|
||||||
//ULOGGER_INFO("%d", count);
|
//ULOGGER_INFO("%d", count);
|
||||||
CPPUNIT_ASSERT( count == 82 );
|
CPPUNIT_ASSERT( count == 82 );
|
||||||
|
|||||||
@@ -45,22 +45,6 @@
|
|||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_9">
|
<layout class="QHBoxLayout" name="horizontalLayout_9">
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label_22">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Source:</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_refId">
|
<widget class="QLabel" name="label_refId">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
@@ -73,7 +57,7 @@
|
|||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
<property name="alignment">
|
<property name="alignment">
|
||||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
<set>Qt::AlignCenter</set>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -109,22 +93,6 @@
|
|||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label_23">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Match:</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_matchId">
|
<widget class="QLabel" name="label_matchId">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
@@ -137,7 +105,7 @@
|
|||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
<property name="alignment">
|
<property name="alignment">
|
||||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
<set>Qt::AlignCenter</set>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -164,7 +132,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>842</width>
|
<width>842</width>
|
||||||
<height>22</height>
|
<height>25</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QMenu" name="menuFile">
|
<widget class="QMenu" name="menuFile">
|
||||||
|
|||||||
@@ -1026,6 +1026,9 @@ when using the file type, logs are saved in Logrtabmap.txt (located in the worki
|
|||||||
</item>
|
</item>
|
||||||
<item row="9" column="0">
|
<item row="9" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="general_doubleSpinBox_confidenceThr">
|
<widget class="QDoubleSpinBox" name="general_doubleSpinBox_confidenceThr">
|
||||||
|
<property name="decimals">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<double>1.000000000000000</double>
|
<double>1.000000000000000</double>
|
||||||
</property>
|
</property>
|
||||||
@@ -1133,8 +1136,8 @@ We can edit how will like the prediction used in the Bayes filter when there is
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>28</width>
|
<width>98</width>
|
||||||
<height>71</height>
|
<height>64</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
|
|||||||
Reference in New Issue
Block a user