Fixed crash with odometryF2F by cloning input images, creating a new map when variance >=9999 is detected, implemented intermediate nodes in ROS

This commit is contained in:
matlabbe
2016-02-18 11:19:35 -05:00
parent b4c0224f06
commit 35639248b9
3 changed files with 40 additions and 9 deletions
+36 -7
View File
@@ -74,6 +74,7 @@ using namespace rtabmap;
CoreWrapper::CoreWrapper(bool deleteDbOnStart) : CoreWrapper::CoreWrapper(bool deleteDbOnStart) :
paused_(false), paused_(false),
lastPose_(Transform::getIdentity()), lastPose_(Transform::getIdentity()),
lastPoseIntermediate_(false),
rotVariance_(0), rotVariance_(0),
transVariance_(0), transVariance_(0),
latestNodeWasReached_(false), latestNodeWasReached_(false),
@@ -103,6 +104,7 @@ CoreWrapper::CoreWrapper(bool deleteDbOnStart) :
stereoExactTFSync_(0), stereoExactTFSync_(0),
transformThread_(0), transformThread_(0),
rate_(Parameters::defaultRtabmapDetectionRate()), rate_(Parameters::defaultRtabmapDetectionRate()),
createIntermediateNodes_(Parameters::defaultRtabmapCreateIntermediateNodes()),
time_(ros::Time::now()), time_(ros::Time::now()),
mbClient_("move_base", true) mbClient_("move_base", true)
{ {
@@ -317,8 +319,16 @@ CoreWrapper::CoreWrapper(bool deleteDbOnStart) :
} }
if(parameters_.find(Parameters::kRtabmapDetectionRate()) != parameters_.end()) if(parameters_.find(Parameters::kRtabmapDetectionRate()) != parameters_.end())
{ {
rate_ = uStr2Float(parameters_.at(Parameters::kRtabmapDetectionRate())); Parameters::parse(parameters_, Parameters::kRtabmapDetectionRate(), rate_);
ROS_INFO("RTAB-Map rate detection = %f Hz", rate_); ROS_INFO("RTAB-Map detection rate = %f Hz", rate_);
}
if(parameters_.find(Parameters::kRtabmapCreateIntermediateNodes()) != parameters_.end())
{
Parameters::parse(parameters_, Parameters::kRtabmapCreateIntermediateNodes(), createIntermediateNodes_);
if(createIntermediateNodes_)
{
ROS_INFO("Create intermediate nodes");
}
} }
bool isRGBD = uStr2Bool(parameters_.at(Parameters::kRGBDEnabled()).c_str()); bool isRGBD = uStr2Bool(parameters_.at(Parameters::kRGBDEnabled()).c_str());
if(isRGBD) if(isRGBD)
@@ -589,14 +599,15 @@ bool CoreWrapper::commonOdomUpdate(const nav_msgs::OdometryConstPtr & odomMsg)
if(!paused_) if(!paused_)
{ {
Transform odom = rtabmap_ros::transformFromPoseMsg(odomMsg->pose.pose); Transform odom = rtabmap_ros::transformFromPoseMsg(odomMsg->pose.pose);
if(!lastPose_.isIdentity() && odom.isIdentity()) if(!lastPose_.isIdentity() && (odom.isIdentity() || odomMsg->pose.covariance[0] >= 9999))
{ {
UWARN("Odometry is reset (identity pose detected). Increment map id!"); UWARN("Odometry is reset (identity pose or high variance (%f) detected). Increment map id!", odomMsg->pose.covariance[0]);
rtabmap_.triggerNewMap(); rtabmap_.triggerNewMap();
rotVariance_ = 0; rotVariance_ = 0;
transVariance_ = 0; transVariance_ = 0;
} }
lastPoseIntermediate_ = false;
lastPose_ = odom; lastPose_ = odom;
lastPoseStamp_ = odomMsg->header.stamp; lastPoseStamp_ = odomMsg->header.stamp;
double transVariance = uMax3(odomMsg->pose.covariance[0], odomMsg->pose.covariance[7], odomMsg->pose.covariance[14]); double transVariance = uMax3(odomMsg->pose.covariance[0], odomMsg->pose.covariance[7], odomMsg->pose.covariance[14]);
@@ -611,14 +622,30 @@ bool CoreWrapper::commonOdomUpdate(const nav_msgs::OdometryConstPtr & odomMsg)
} }
// Throttle // Throttle
bool ignoreFrame = false;
if(rate_>0.0f) if(rate_>0.0f)
{ {
if(ros::Time::now() - time_ < ros::Duration(1.0f/rate_)) if(ros::Time::now() - time_ < ros::Duration(1.0f/rate_))
{
ignoreFrame = true;
}
}
if(ignoreFrame)
{
if(createIntermediateNodes_)
{
lastPoseIntermediate_ = true;
}
else
{ {
return false; return false;
} }
} }
time_ = ros::Time::now(); else if(!ignoreFrame)
{
time_ = ros::Time::now();
}
return true; return true;
} }
return false; return false;
@@ -643,6 +670,7 @@ bool CoreWrapper::commonOdomTFUpdate(const ros::Time & stamp)
transVariance_ = 0; transVariance_ = 0;
} }
lastPoseIntermediate_ = false;
lastPose_ = odom; lastPose_ = odom;
lastPoseStamp_ = stamp; lastPoseStamp_ = stamp;
// Throttle // Throttle
@@ -903,7 +931,7 @@ void CoreWrapper::commonDepthCallback(
rgb, rgb,
depth, depth,
cameraModels, cameraModels,
imageMsgs[0]->header.seq, lastPoseIntermediate_?-1:imageMsgs[0]->header.seq,
rtabmap_ros::timestampFromROS(stamp)); rtabmap_ros::timestampFromROS(stamp));
data.setGroundTruth(groundTruthPose); data.setGroundTruth(groundTruthPose);
@@ -1052,7 +1080,7 @@ void CoreWrapper::commonStereoCallback(
ptrLeftImage->image, ptrLeftImage->image,
ptrRightImage->image, ptrRightImage->image,
stereoModel, stereoModel,
leftImageMsg->header.seq, lastPoseIntermediate_?-1:leftImageMsg->header.seq,
rtabmap_ros::timestampFromROS(stamp)); rtabmap_ros::timestampFromROS(stamp));
data.setGroundTruth(groundTruthPose); data.setGroundTruth(groundTruthPose);
@@ -1593,6 +1621,7 @@ bool CoreWrapper::resetRtabmapCallback(std_srvs::Empty::Request&, std_srvs::Empt
rotVariance_ = 0; rotVariance_ = 0;
transVariance_ = 0; transVariance_ = 0;
lastPose_.setIdentity(); lastPose_.setIdentity();
lastPoseIntermediate_ = false;
currentMetricGoal_.setNull(); currentMetricGoal_.setNull();
latestNodeWasReached_ = false; latestNodeWasReached_ = false;
mapsManager_.clear(); mapsManager_.clear();
+2
View File
@@ -257,6 +257,7 @@ private:
bool paused_; bool paused_;
rtabmap::Transform lastPose_; rtabmap::Transform lastPose_;
ros::Time lastPoseStamp_; ros::Time lastPoseStamp_;
bool lastPoseIntermediate_;
double rotVariance_; double rotVariance_;
double transVariance_; double transVariance_;
rtabmap::Transform currentMetricGoal_; rtabmap::Transform currentMetricGoal_;
@@ -462,6 +463,7 @@ private:
boost::thread* transformThread_; boost::thread* transformThread_;
float rate_; float rate_;
bool createIntermediateNodes_;
ros::Time time_; ros::Time time_;
}; };
+2 -2
View File
@@ -197,8 +197,8 @@ public:
model.cx(), model.cx(),
model.cy(), model.cy(),
localTransform); localTransform);
cv_bridge::CvImageConstPtr ptrImage = cv_bridge::toCvShare(image, image->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1)==0?"":"mono8"); cv_bridge::CvImagePtr ptrImage = cv_bridge::toCvCopy(image, image->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1)==0?"":"mono8");
cv_bridge::CvImageConstPtr ptrDepth = cv_bridge::toCvShare(depth); cv_bridge::CvImagePtr ptrDepth = cv_bridge::toCvCopy(depth);
rtabmap::SensorData data( rtabmap::SensorData data(
ptrImage->image, ptrImage->image,