本次阅读的源码为 release-1.0 版本的代码

https://github.com/googlecartographer/cartographer_ros/tree/release-1.0

https://github.com/googlecartographer/cartographer/tree/release-1.0

也可以下载我上传的 全套工作空间的代码,包括 protobuf, cartographer, cartographer_ros, ceres,

https://download.csdn.net/download/tiancailx/11224156,现在上传资源自己不能选下载需要的积分。。。完全靠系统。

pose_extrapolator.h

std::unique_ptr<PoseExtrapolator> PoseExtrapolator::InitializeWithImu(const common::Duration pose_queue_duration,const double imu_gravity_time_constant, const sensor::ImuData& imu_data) {auto extrapolator = common::make_unique<PoseExtrapolator>(pose_queue_duration, imu_gravity_time_constant);extrapolator->AddImuData(imu_data);extrapolator->imu_tracker_ =common::make_unique<ImuTracker>(imu_gravity_time_constant, imu_data.time);extrapolator->imu_tracker_->AddImuLinearAccelerationObservation(imu_data.linear_acceleration);extrapolator->imu_tracker_->AddImuAngularVelocityObservation(imu_data.angular_velocity);extrapolator->imu_tracker_->Advance(imu_data.time);extrapolator->AddPose(imu_data.time,transform::Rigid3d::Rotation(extrapolator->imu_tracker_->orientation()));return extrapolator;
}void PoseExtrapolator::AddImuData(const sensor::ImuData& imu_data) {CHECK(timed_pose_queue_.empty() ||imu_data.time >= timed_pose_queue_.back().time);imu_data_.push_back(imu_data);TrimImuData();
}// 删除第一个数据(老数据),直到第一个imu数据的时间大于timed_pose_queue_的最后一个时间
void PoseExtrapolator::TrimImuData() {while (imu_data_.size() > 1 && !timed_pose_queue_.empty() &&imu_data_[1].time <= timed_pose_queue_.back().time) {imu_data_.pop_front();}
}// 转到imu_tracker.hvoid PoseExtrapolator::AddPose(const common::Time time,const transform::Rigid3d& pose) {if (imu_tracker_ == nullptr) {common::Time tracker_start = time;if (!imu_data_.empty()) {tracker_start = std::min(tracker_start, imu_data_.front().time);}imu_tracker_ =common::make_unique<ImuTracker>(gravity_time_constant_, tracker_start);}timed_pose_queue_.push_back(TimedPose{time, pose});while (timed_pose_queue_.size() > 2 &&timed_pose_queue_[1].time <= time - pose_queue_duration_) {timed_pose_queue_.pop_front();}UpdateVelocitiesFromPoses();AdvanceImuTracker(time, imu_tracker_.get());TrimImuData();TrimOdometryData();odometry_imu_tracker_ = common::make_unique<ImuTracker>(*imu_tracker_);extrapolation_imu_tracker_ = common::make_unique<ImuTracker>(*imu_tracker_);
}

imu_tracker.h

ImuTracker::ImuTracker(const double imu_gravity_time_constant,const common::Time time): imu_gravity_time_constant_(imu_gravity_time_constant),time_(time),last_linear_acceleration_time_(common::Time::min()),orientation_(Eigen::Quaterniond::Identity()),gravity_vector_(Eigen::Vector3d::UnitZ()),imu_angular_velocity_(Eigen::Vector3d::Zero()) {}void ImuTracker::AddImuLinearAccelerationObservation(const Eigen::Vector3d& imu_linear_acceleration) {// Update the 'gravity_vector_' with an exponential moving average using the// 'imu_gravity_time_constant'.const double delta_t =last_linear_acceleration_time_ > common::Time::min()? common::ToSeconds(time_ - last_linear_acceleration_time_): std::numeric_limits<double>::infinity();last_linear_acceleration_time_ = time_;const double alpha = 1. - std::exp(-delta_t / imu_gravity_time_constant_);gravity_vector_ =(1. - alpha) * gravity_vector_ + alpha * imu_linear_acceleration;// Change the 'orientation_' so that it agrees with the current// 'gravity_vector_'.const Eigen::Quaterniond rotation = Eigen::Quaterniond::FromTwoVectors(gravity_vector_, orientation_.conjugate() * Eigen::Vector3d::UnitZ());orientation_ = (orientation_ * rotation).normalized();CHECK_GT((orientation_ * gravity_vector_).z(), 0.);CHECK_GT((orientation_ * gravity_vector_).normalized().z(), 0.99);
}void ImuTracker::AddImuAngularVelocityObservation(const Eigen::Vector3d& imu_angular_velocity) {imu_angular_velocity_ = imu_angular_velocity;
}void ImuTracker::Advance(const common::Time time) {CHECK_LE(time_, time);const double delta_t = common::ToSeconds(time - time_);const Eigen::Quaterniond rotation =transform::AngleAxisVectorToRotationQuaternion(Eigen::Vector3d(imu_angular_velocity_ * delta_t));orientation_ = (orientation_ * rotation).normalized();gravity_vector_ = rotation.conjugate() * gravity_vector_;time_ = time;
}

cartographer探秘第四章之代码解析(七)--- pose_extrapolator.h 及 imu_tracker.h相关推荐

  1. 学习笔记-第十四章 恶意代码分析实战

    第十四章 恶意代码的网络特征 1.网络应对措施. 网络行为的基本属性包括IP地址,TCP端口,以及流量内容等,网络和安全 设备可以利用它们,来提供网络应对措施.根据IP地址和端口,防火墙和路由器可以限 ...

  2. 第四章 PX4-Pixhawk-MPU6000传感器驱动解析

    第四章MPU6000传感器驱动解析 Mpu6000是一个3轴加速度和3轴陀螺仪传感器,这一章节我们将对MPU6000这个传感器进行解析,依照这个解析步骤同样可以对L3GD20(3轴陀螺仪).HMC58 ...

  3. 第四章MPU6000传感器驱动解析

    版权声明:本文为博主原创文章,未经博主允许不得转载. 第四章MPU6000传感器驱动解析 Mpu6000是一个3轴加速度和3轴陀螺仪传感器,这一章节我们将对MPU6000这个传感器进行解析,依照这个解 ...

  4. CodeCombat代码全记录(Python学习利器)--安息之云山峰(第四章)代码1

    我们已经有了前三章的基础了,到了第四章,你会发现提示少之又少了.这时,我们大都要靠自己了!!!加油!!如果你没有思路,请仔细看下装备的说明,毕竟到了这关,你需要购买好多其他的新装备,而新装备中存在了新 ...

  5. Javascript第四章匿名函数第七课

    匿名函数的作用: 1.用于回调 2.一次性执行函数 Javascript第四章定义函数的形式.回调函数第五课 https://blog.csdn.net/qq_30225725/article/det ...

  6. Paxos算法之旅(四)zookeeper代码解析--转载

    ZooKeeper是近期比较热门的一个类Paxos实现.也是一个逐渐得到广泛应用的开源的分布式锁服务实现.被认为是Chubby的开源版,虽然具体实现有很多差异.ZooKeeper概要的介绍可以看官方文 ...

  7. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(四)example代码解析...

    --------------------更新2018.08.20------------------- 添加http_tunnel_example.cpp作为RtspOverHttp示例程序. --- ...

  8. 视觉SLAM十四讲CH10代码解析及课后习题详解

    g2o_viewer问题解决 在进行位姿图优化时候,如果出现g2o_viewer: command not found,说明你的g2o_viewer并没有安装上,打开你之前安装的g2o文件夹,打开bi ...

  9. 视觉SLAM十四讲CH8代码解析及课后习题详解

    第一版的代码: direct_semidense.cpp #include <iostream> #include <fstream> #include <list> ...

  10. CE教程 第四章 《代码寻找》

    步骤 5: 代码寻找 (密码=888899) 有时一些东西的保存位置在你重新开始游戏时会改变,甚至是在你玩的时候也会变,在这种情况下,你 用2步仍然能做出可以用的内存列表. 在这一步会说明怎样用寻找代 ...

最新文章

  1. httpwatch的timechart 解析
  2. 程序员为这支笔掰头10个月,隔壁小学生都馋哭了
  3. 您能看出这个Double Check里的问题吗?
  4. java 获取注释_Java面试题Java语言有哪些注释的方式?
  5. library not found for -lstdc++.6.0.9
  6. linux tomcat PermGen space
  7. CTO专访:坚守还是追新,开发者如何应对新技术暗潮
  8. 克隆硬盘后进不去系统_升级系统盘,迁移系统其实很简单
  9. 阿里云数据库使用初体验
  10. 2018年通信工程师中级传输与接入无线专业实务真题
  11. Power BI报表常见格式 1 - 报告
  12. Only fullscreen opaque activities can request orientation 最好的解析
  13. html a href 文件下载 IE直接打开 内容乱码
  14. 中国象棋对局软件设计(一)
  15. 书评与摘抄《如何阅读一本书》
  16. VMware虚拟机和主机共享文件夹
  17. 2022年来了,从Python定制一份日历开始吧!
  18. 使用Data URL将图片嵌入到网页中
  19. 优化Windows xp Professional大全
  20. 施耐德 m340 编程手册_施耐德推出开放自动化平台 开启“软件驱动自动化”时代...

热门文章

  1. bzoj1831 逆序对 (dp+树状数组)
  2. javaweb项目静态资源被拦截的解决方法
  3. iOS中Lua脚本应用笔记一:脚本概念相关
  4. 白话数字签名(1)——基本原理
  5. 做了这么久的程序员,你知道为什么会有Lambda表达式吗?
  6. zabbix监控Nginx/Tomcat/MySQL
  7. GDAL查看DEM高程数据(java)
  8. Linux 安装 safe-rm 工具(转载)
  9. Python XML读写(xml.etree.ElementTree模块)(转载)
  10. 01. 仔细区分pointer和references