Using TF to get pose when odometry message is used (msg is now used only to get covariance)

This commit is contained in:
matlabbe
2018-06-12 14:56:47 -04:00
parent 728ba7d903
commit 1ffb287af0
2 changed files with 57 additions and 19 deletions
+1 -1
View File
@@ -84,7 +84,7 @@ private:
virtual void onInit(); virtual void onInit();
bool odomUpdate(const nav_msgs::OdometryConstPtr & odomMsg); bool odomUpdate(const nav_msgs::OdometryConstPtr & odomMsg, ros::Time stamp);
bool odomTFUpdate(const ros::Time & stamp); // TF odom bool odomTFUpdate(const ros::Time & stamp); // TF odom
virtual void commonDepthCallback( virtual void commonDepthCallback(
+56 -18
View File
@@ -824,11 +824,26 @@ void CoreWrapper::rgbOdomCallback(
commonSingleDepthCallback(odomMsg, userDataMsg, cv_bridge::toCvShare(imageMsg), depthMsg, *cameraInfoMsg, *cameraInfoMsg, scanMsg, scan3dMsg, odomInfoMsg); commonSingleDepthCallback(odomMsg, userDataMsg, cv_bridge::toCvShare(imageMsg), depthMsg, *cameraInfoMsg, *cameraInfoMsg, scanMsg, scan3dMsg, odomInfoMsg);
} }
bool CoreWrapper::odomUpdate(const nav_msgs::OdometryConstPtr & odomMsg) bool CoreWrapper::odomUpdate(const nav_msgs::OdometryConstPtr & odomMsg, ros::Time stamp)
{ {
if(!paused_) if(!paused_)
{ {
Transform odom = rtabmap_ros::transformFromPoseMsg(odomMsg->pose.pose); Transform odom = rtabmap_ros::getTransform(odomMsg->header.frame_id, frameId_, stamp, tfListener_, waitForTransform_?waitForTransformDuration_:0.0);
if(odom.isNull())
{
static bool shown = false;
if(!shown)
{
NODELET_WARN("We received odometry message, but we cannot get the "
"corresponding TF %s->%s at data stamp %fs (odom msg stamp is %fs). Make sure TF of odometry is "
"also published to get more accurate pose estimation. This "
"warning is only printed once.", odomMsg->header.frame_id.c_str(), frameId_.c_str(), stamp.toSec(), odomMsg->header.stamp.toSec());
shown = true;
}
odom = rtabmap_ros::transformFromPoseMsg(odomMsg->pose.pose);
stamp = odomMsg->header.stamp;
}
if(!lastPose_.isIdentity() && !odom.isNull() && (odom.isIdentity() || (odomMsg->pose.covariance[0] >= BAD_COVARIANCE && odomMsg->twist.covariance[0] >= BAD_COVARIANCE))) if(!lastPose_.isIdentity() && !odom.isNull() && (odom.isIdentity() || (odomMsg->pose.covariance[0] >= BAD_COVARIANCE && odomMsg->twist.covariance[0] >= BAD_COVARIANCE)))
{ {
UWARN("Odometry is reset (identity pose or high variance (%f) detected). Increment map id!", MAX(odomMsg->pose.covariance[0], odomMsg->twist.covariance[0])); UWARN("Odometry is reset (identity pose or high variance (%f) detected). Increment map id!", MAX(odomMsg->pose.covariance[0], odomMsg->twist.covariance[0]));
@@ -838,7 +853,7 @@ bool CoreWrapper::odomUpdate(const nav_msgs::OdometryConstPtr & odomMsg)
lastPoseIntermediate_ = false; lastPoseIntermediate_ = false;
lastPose_ = odom; lastPose_ = odom;
lastPoseStamp_ = odomMsg->header.stamp; lastPoseStamp_ = stamp;
// Only update variance if odom is not null // Only update variance if odom is not null
if(!odom.isNull()) if(!odom.isNull())
@@ -872,8 +887,8 @@ bool CoreWrapper::odomUpdate(const nav_msgs::OdometryConstPtr & odomMsg)
bool ignoreFrame = false; bool ignoreFrame = false;
if(rate_>0.0f) if(rate_>0.0f)
{ {
if((previousStamp_.toSec() > 0.0 && odomMsg->header.stamp.toSec() > previousStamp_.toSec() && odomMsg->header.stamp - previousStamp_ < ros::Duration(1.0f/rate_)) || if((previousStamp_.toSec() > 0.0 && stamp.toSec() > previousStamp_.toSec() && stamp - previousStamp_ < ros::Duration(1.0f/rate_)) ||
((previousStamp_.toSec() <= 0.0 || odomMsg->header.stamp.toSec() <= previousStamp_.toSec()) && ros::Time::now() - time_ < ros::Duration(1.0f/rate_))) ((previousStamp_.toSec() <= 0.0 || stamp.toSec() <= previousStamp_.toSec()) && ros::Time::now() - time_ < ros::Duration(1.0f/rate_)))
{ {
ignoreFrame = true; ignoreFrame = true;
} }
@@ -892,7 +907,7 @@ bool CoreWrapper::odomUpdate(const nav_msgs::OdometryConstPtr & odomMsg)
else if(!ignoreFrame) else if(!ignoreFrame)
{ {
time_ = ros::Time::now(); time_ = ros::Time::now();
previousStamp_ = odomMsg->header.stamp; previousStamp_ = stamp;
} }
return true; return true;
@@ -967,7 +982,21 @@ void CoreWrapper::commonDepthCallback(
if(odomMsg.get()) if(odomMsg.get())
{ {
odomFrameId = odomMsg->header.frame_id; odomFrameId = odomMsg->header.frame_id;
if(!odomUpdate(odomMsg)) if(scan2dMsg.get())
{
if(!odomUpdate(odomMsg, scan2dMsg->header.stamp))
{
return;
}
}
else if(scan3dMsg.get())
{
if(!odomUpdate(odomMsg, scan3dMsg->header.stamp))
{
return;
}
}
else if(imageMsgs.size() == 0 || imageMsgs[0].get() == 0 || !odomUpdate(odomMsg, imageMsgs[0]->header.stamp))
{ {
return; return;
} }
@@ -986,13 +1015,11 @@ void CoreWrapper::commonDepthCallback(
return; return;
} }
} }
else else if(imageMsgs.size() == 0 || imageMsgs[0].get() == 0 || !odomTFUpdate(imageMsgs[0]->header.stamp))
{ {
if(imageMsgs.size() == 0 || imageMsgs[0].get() == 0 || !odomTFUpdate(imageMsgs[0]->header.stamp)) return;
{
return;
}
} }
commonDepthCallbackImpl(odomFrameId, commonDepthCallbackImpl(odomFrameId,
userDataMsg, userDataMsg,
imageMsgs, imageMsgs,
@@ -1213,7 +1240,21 @@ void CoreWrapper::commonStereoCallback(
if(odomMsg.get()) if(odomMsg.get())
{ {
odomFrameId = odomMsg->header.frame_id; odomFrameId = odomMsg->header.frame_id;
if(!odomUpdate(odomMsg)) if(scan2dMsg.get())
{
if(!odomUpdate(odomMsg, scan2dMsg->header.stamp))
{
return;
}
}
else if(scan3dMsg.get())
{
if(!odomUpdate(odomMsg, scan3dMsg->header.stamp))
{
return;
}
}
else if(leftImageMsg.get() == 0 || !odomUpdate(odomMsg, leftImageMsg->header.stamp))
{ {
return; return;
} }
@@ -1232,12 +1273,9 @@ void CoreWrapper::commonStereoCallback(
return; return;
} }
} }
else else if(leftImageMsg.get() == 0 || !odomTFUpdate(leftImageMsg->header.stamp))
{ {
if(leftImageMsg.get() == 0 || !odomTFUpdate(leftImageMsg->header.stamp)) return;
{
return;
}
} }
cv::Mat left; cv::Mat left;