cartographer源码分析(15)-transform-transform_interpolation_buffer.h
2017-07-26 22:04
375 查看
源码可在https://github.com/learnmoreonce/SLAM 下载
.
本文发于:
* http://www.jianshu.com/u/9e38d2febec1
* https://zhuanlan.zhihu.com/learnmoreonce
* http://blog.csdn.net/learnmoreonce
* slam源码分析微信公众号:slamcode
文件:transform/transform_interpolation_buffer.h: #ifndef CARTOGRAPHER_TRANSFORM_TRANSFORM_INTERPOLATION_BUFFER_H_ #define CARTOGRAPHER_TRANSFORM_TRANSFORM_INTERPOLATION_BUFFER_H_ #include <deque> #include <memory> #include "cartographer/common/time.h" #include "cartographer/mapping/proto/trajectory.pb.h" #include "cartographer/transform/rigid_transform.h" namespace cartographer { namespace transform { /* 基于时间有序的变换,支持在队列中按时间顺序查找,即使变换不存在于队列中,任然支持相邻时间内的插值变换进行近似。 作用与ROS的tf2函数族类似。 数据成员: 1,deque_; 成员函数: 1,Push() 2,Has() 3,Lookup() 4,earliest_time() 5,latest_time() 6,empty() */ // A time-ordered buffer of transforms that supports interpolated lookups. class TransformInterpolationBuffer { public: //函数,返回智能指针 static std::unique_ptr<TransformInterpolationBuffer> FromTrajectory( const mapping::proto::Trajectory& trajectory); /* 添加变换到队列尾部,当缓冲区已满时,删除队首元素 */ // Adds a new transform to the buffer and removes the oldest transform if the // buffer size limit is exceeded. void Push(common::Time time, const transform::Rigid3d& transform); //返回能否在给定时间内计算的插值变换。time应在early-old之间,可以插值。 // Returns true if an interpolated transfrom can be computed at 'time' bool Has(common::Time time) const; //返回time处的变换,可插值 // Returns an interpolated transform at 'time'. CHECK()s that a transform at // 'time' is available. transform::Rigid3d Lookup(common::Time time) const; /* 返回队列缓冲区内变换的最早时间,也就是队首元素。 */ // Returns the timestamp of the earliest transform in the buffer or 0 if the // buffer is empty. common::Time earliest_time() const; /* 最晚时间,也就是队尾元素 */ // Returns the timestamp of the earliest transform in the buffer or 0 if the // buffer is empty. common::Time latest_time() const; // Returns true if the buffer is empty. bool empty() const; private: struct TimestampedTransform { common::Time time; //发生时间 transform::Rigid3d transform;//变换矩阵 }; std::deque<TimestampedTransform> deque_; //队列,元素是带时间戳的变换,存储了一段时间内的变换矩阵信息 }; } // namespace transform } // namespace cartographer #endif // CARTOGRAPHER_TRANSFORM_TRANSFORM_INTERPOLATION_BUFFER_H_
.
测试代码:transform_interpolation_buffer_test.cc #include "cartographer/transform/transform_interpolation_buffer.h" #include "Eigen/Core" #include "Eigen/Geometry" #include "cartographer/transform/rigid_transform.h" #include "cartographer/transform/rigid_transform_test_helpers.h" #include "gtest/gtest.h" namespace cartographer { namespace transform { namespace { TEST(TransformInterpolationBufferTest, testHas) { TransformInterpolationBuffer buffer; EXPECT_FALSE(buffer.Has(common::FromUniversal(50)));//false 50us buffer.Push(common::FromUniversal(50), transform::Rigid3d::Identity());// EXPECT_FALSE(buffer.Has(common::FromUniversal(25)));//false,只有1个元素。 EXPECT_TRUE(buffer.Has(common::FromUniversal(50)));//true,1个元素 EXPECT_FALSE(buffer.Has(common::FromUniversal(75))); //false buffer.Push(common::FromUniversal(100), transform::Rigid3d::Identity()); EXPECT_FALSE(buffer.Has(common::FromUniversal(25)));//false,50-100才是true EXPECT_TRUE(buffer.Has(common::FromUniversal(50))); EXPECT_TRUE(buffer.Has(common::FromUniversal(75)));//在50-100之间 EXPECT_TRUE(buffer.Has(common::FromUniversal(100))); EXPECT_FALSE(buffer.Has(common::FromUniversal(125)));//不在 EXPECT_EQ(common::FromUniversal(50), buffer.earliest_time()); EXPECT_EQ(common::FromUniversal(100), buffer.latest_time()); } TEST(TransformInterpolationBufferTest, testLookup) { TransformInterpolationBuffer buffer; buffer.Push(common::FromUniversal(50), transform::Rigid3d::Identity()); // The rotation needs to be relatively small in order for the // interpolation to remain a z-axis rotation. buffer.Push(common::FromUniversal(100), transform::Rigid3d::Translation(Eigen::Vector3d(10., 10., 10.)) * transform::Rigid3d::Rotation( Eigen::AngleAxisd(2., Eigen::Vector3d::UnitZ()))); const common::Time time = common::FromUniversal(75); //75在50-100之间,可以使用插值计算。 const transform::Rigid3d interpolated = buffer.Lookup(time); EXPECT_THAT( interpolated, IsNearly(transform::Rigid3d::Translation(Eigen::Vector3d(5., 5., 5.)) * transform::Rigid3d::Rotation( Eigen::AngleAxisd(1., Eigen::Vector3d::UnitZ())), 1e-6)); } } // namespace } // namespace transform } // namespace cartographer
本文发于:
* http://www.jianshu.com/u/9e38d2febec1
* https://zhuanlan.zhihu.com/learnmoreonce
* http://blog.csdn.net/learnmoreonce
* slam源码分析微信公众号:slamcode
相关文章推荐
- [置顶] 16 -总结-【cartographer源码分析】系列的第二部分【transform源码分析】
- netty4 buffer源码分析
- PostgreSQL源码分析之shared buffer与磁盘文件
- MyBatis-3.4.2-源码分析15:XML解析之buildStatementFromContext(context.evalNodes(‘select|insert|update|delete’
- cartographer源码分析(23)-sensor-voxel_filter.h
- Java源码分析--StringBuffer/StringBuilder
- OpenStack建立实例完整过程源码详细分析(15)----依据AMQP通信架构实现消息接收机制解析之二
- libevent源码分析--evbuffer和bufferevent的关系
- Leveldb源码分析--15
- spark core源码分析15 Shuffle详解-写流程
- Apache Spark源码走读之15 -- Standalone部署模式下的容错性分析
- Raw-OS源码分析之消息系统-Queue_Buffer
- cartographer源码分析(24)-sensor-configuration.h
- cartographer源码分析(26)-io-file_writer.h
- cartographer源码分析(36)-io- outlier_removing_points_processor.h
- Mangos源码分析(15):游戏对象的实现
- Babel插件源码分析与babel.transform和babylon.parse操作AST实现效果
- StringBuilder StringBuffer String的区别(源码分析)-java
- Java并发框架Disruptor实现原理与源码分析(三) RingBuffer原理模型与源码分析
- cartogapher 源码分析 (transform)