diff --git a/homer_mapping/include/homer_mapping/slam_node.h b/homer_mapping/include/homer_mapping/slam_node.h index 7e6b6da93886ef631cca20e094dc986484b66402..cd4a6ff22b0b246f8092e04ceed8ca56e9185f08 100644 --- a/homer_mapping/include/homer_mapping/slam_node.h +++ b/homer_mapping/include/homer_mapping/slam_node.h @@ -93,7 +93,7 @@ private: */ void sendMapDataMessage(ros::Time mapTime = ros::Time::now()); - void sendTfAndPose(Pose pose); + void sendTfAndPose(Pose pose, ros::Time stamp); void sendPoseArray(std::vector<Pose> poses); @@ -110,14 +110,6 @@ private: Pose m_LastLikeliestPose; - /** - * This variable stores the time of the last odometry measurement as - * reference - * which is used to compute the pose of the robot during a specific - * laserscan. - */ - ros::Time m_ReferenceOdometryTime; - /** * This variable stores the time the last map message was sent to be able to * compute the time for the next map send. diff --git a/homer_mapping/src/slam_node.cpp b/homer_mapping/src/slam_node.cpp index 7820e0640fa65a440c4904b62f53d4df09ab5467..64c99eede061a5a4119db3fecdff0ddb137449d6 100644 --- a/homer_mapping/src/slam_node.cpp +++ b/homer_mapping/src/slam_node.cpp @@ -33,7 +33,7 @@ SlamNode::SlamNode(ros::NodeHandle* nh) : m_HyperSlamFilter(0) m_SLAMMapPublisher = nh->advertise<nav_msgs::OccupancyGrid>("/homer_mapping/slam_map", 1); - sendTfAndPose(Pose(0, 0, 0)); + sendTfAndPose(Pose(0, 0, 0), ros::Time::now()); m_HyperSlamFilter->setRobotPose(Pose(0, 0, 0), m_ScatterVarXY, m_ScatterVarTheta); } @@ -55,7 +55,6 @@ void SlamNode::init() particleFilterNum); m_HyperSlamFilter = new HyperSlamFilter(particleFilterNum, particleNum); - m_ReferenceOdometryTime = ros::Time(0); m_LastMapSendTime = ros::Time(0); m_laser_queue.clear(); @@ -75,7 +74,7 @@ void SlamNode::resetMaps() m_HyperSlamFilter = 0; init(); - sendTfAndPose(Pose(0, 0, 0)); + sendTfAndPose(Pose(0, 0, 0), ros::Time::now()); m_LastLikeliestPose.set(0.0, 0.0); m_LastLikeliestPose.setTheta(0.0f); @@ -137,25 +136,24 @@ void SlamNode::callbackLaserScan(const sensor_msgs::LaserScan::ConstPtr& msg) } } -void SlamNode::sendTfAndPose(Pose pose) +void SlamNode::sendTfAndPose(Pose pose, ros::Time stamp) { geometry_msgs::PoseStamped poseMsg; - poseMsg.header.stamp = ros::Time(0); + poseMsg.header.stamp = stamp; poseMsg.header.frame_id = "map"; poseMsg.pose.position.x = pose.x(); poseMsg.pose.position.y = pose.y(); poseMsg.pose.position.z = 0.0; tf::Quaternion quatTF = tf::createQuaternionFromYaw(pose.theta()); geometry_msgs::Quaternion quatMsg; - tf::quaternionTFToMsg(quatTF, quatMsg); // conversion from tf::Quaternion - // to + tf::quaternionTFToMsg(quatTF, quatMsg); + poseMsg.pose.orientation = quatMsg; m_PoseStampedPublisher.publish(poseMsg); - //// //broadcast transform map -> base_link tf::Transform transform(quatTF, tf::Vector3(pose.x(), pose.y(), 0.0)); m_tfBroadcaster.sendTransform(tf::StampedTransform( - transform, poseMsg.header.stamp, "map", "base_link")); + transform, stamp, "map", "base_link")); } void SlamNode::sendPoseArray(std::vector<Pose> poses) @@ -182,19 +180,11 @@ void SlamNode::sendPoseArray(std::vector<Pose> poses) void SlamNode::callbackOdometry(const nav_msgs::Odometry::ConstPtr& msg) { m_odom_queue.push_back(msg); - static int last_i = 0; if (m_odom_queue.size() > 5) // Todo param { - last_i--; - if (last_i < 0) - { - last_i = 0; - } m_odom_queue.erase(m_odom_queue.begin()); } - static Pose last_interpolatedPose(0.0, 0.0, 0.0); - ros::Time currentOdometryTime = msg->header.stamp; if (m_odom_queue.size() > 1 && m_laser_queue.size() > 0) { int i, j; @@ -202,13 +192,6 @@ void SlamNode::callbackOdometry(const nav_msgs::Odometry::ConstPtr& msg) for (i = m_odom_queue.size() - 1; i > 0; i--) { - // Check if we would repeat a calculation which is already done but - // still in the queue - if (m_odom_queue.at(i - 1)->header.stamp == m_ReferenceOdometryTime) - { - break; - } - for (j = m_laser_queue.size() - 1; j > -1; j--) { // find a laserscan in between two odometry readings (or at @@ -230,10 +213,9 @@ void SlamNode::callbackOdometry(const nav_msgs::Odometry::ConstPtr& msg) if (got_match) { - last_i = i; sensor_msgs::LaserScan::ConstPtr laserData = m_laser_queue.at(j); - last_interpolatedPose = getInterpolatedPose( + Pose last_interpolatedPose = getInterpolatedPose( m_odom_queue.at(i - 1), m_odom_queue.at(i), laserData->header.stamp); Transformation2D trans = last_interpolatedPose - m_lastUsedPose; @@ -244,16 +226,16 @@ void SlamNode::callbackOdometry(const nav_msgs::Odometry::ConstPtr& msg) float y = trans.y() * cos(-last_interpolatedPose.theta()) + trans.x() * sin(-last_interpolatedPose.theta()); - Transformation2D newTrans(x, y, trans.theta()); + Transformation2D rotTrans(x, y, trans.theta()); // SLAM STEP - m_HyperSlamFilter->filter(newTrans, laserData); + m_HyperSlamFilter->filter(rotTrans, laserData); m_lastUsedPose = last_interpolatedPose; m_LastLikeliestPose = m_HyperSlamFilter->getBestSlamFilter()->getLikeliestPose(); - sendTfAndPose(m_LastLikeliestPose); + sendTfAndPose(m_LastLikeliestPose, laserData->header.stamp); // send map max. every 500 ms if ((laserData->header.stamp - m_LastMapSendTime).toSec() > 0.5) @@ -262,6 +244,12 @@ void SlamNode::callbackOdometry(const nav_msgs::Odometry::ConstPtr& msg) m_LastMapSendTime = laserData->header.stamp; } sendPoseArray(m_HyperSlamFilter->getBestSlamFilter()->getParticlePoses()); + + + //Remove already used data from queues + + m_odom_queue.erase(m_odom_queue.begin(), m_odom_queue.begin() + (i - 1)); + m_laser_queue.erase(m_laser_queue.begin(), m_laser_queue.begin() + j); } } } @@ -281,7 +269,6 @@ Pose SlamNode::getInterpolatedPose(nav_msgs::Odometry::ConstPtr pose1, pose2->pose.pose.position.y, tf::getYaw(pose2->pose.pose.orientation)); - m_ReferenceOdometryTime = pose1->header.stamp; ros::Duration d1 = laserTime - lastOdometryTime; ros::Duration d2 = currentOdometryTime - lastOdometryTime;