mirror of
https://github.com/introlab/rtabmap_ros.git
synced 2026-10-04 16:57:46 +08:00
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:
+36
-7
@@ -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();
|
||||||
|
|||||||
@@ -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_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user