cartographer源码分析(19)-sensor-range_data.h
来源:互联网 发布:c语言函数求最小公倍数 编辑:程序博客网 时间:2024/05/17 09:04
源码可在https://github.com/learnmoreonce/SLAM 下载
文件:sensor/range_data.h#ifndef CARTOGRAPHER_SENSOR_RANGE_DATA_H_#define CARTOGRAPHER_SENSOR_RANGE_DATA_H_#include "cartographer/common/port.h"#include "cartographer/sensor/compressed_point_cloud.h"#include "cartographer/sensor/point_cloud.h"#include "cartographer/sensor/proto/sensor.pb.h"namespace cartographer {namespace sensor {/*RangeData:数据成员包括1),原始位置,{x0,y0,z0}2),返回点云,{x,y,z}3),缺失点云,标识free space.*/// Rays begin at 'origin'. 'returns' are the points where obstructions were// detected. 'misses' are points in the direction of rays for which no return// was detected, and were inserted at a configured distance. It is assumed that// between the 'origin' and 'misses' is free space.struct RangeData { Eigen::Vector3f origin;//{x0,y0,z0},sensor坐标。 PointCloud returns; //反射位置{x,y,z},表征有物体反射。 PointCloud misses; //无反射,自由空间};// Converts 'range_data' to a proto::RangeData. 序列化proto::RangeData ToProto(const RangeData& range_data);// Converts 'proto' to a RangeData. 反序列化RangeData FromProto(const proto::RangeData& proto);//对数据进行3d变换,转换为机器坐标RangeData TransformRangeData(const RangeData& range_data, const transform::Rigid3f& transform);//根据min_z和max_z把不在z轴范围内的点云丢弃,剪裁到给定范围// Crops 'range_data' according to the region defined by 'min_z' and 'max_z'.RangeData CropRangeData(const RangeData& range_data, float min_z, float max_z);//压缩后的点云数据// Like RangeData but with compressed point clouds. The point order changes// when converting from RangeData.struct CompressedRangeData { Eigen::Vector3f origin; CompressedPointCloud returns; CompressedPointCloud misses;};CompressedRangeData Compress(const RangeData& range_data);RangeData Decompress(const CompressedRangeData& compressed_range_Data);} // namespace sensor} // namespace cartographer#endif // CARTOGRAPHER_SENSOR_RANGE_DATA_H_
.
文件:sensor/range_data.cc#include "cartographer/sensor/range_data.h"#include "cartographer/sensor/proto/sensor.pb.h"#include "cartographer/transform/transform.h"namespace cartographer {namespace sensor {/*message PointCloud { repeated float x = 3 [packed = true]; repeated float y = 4 [packed = true]; repeated float z = 5 [packed = true];}message CompressedPointCloud { optional int32 num_points = 1; repeated int32 point_data = 3 [packed = true];}message RangeData { optional transform.proto.Vector3f origin = 1; optional PointCloud point_cloud = 2; optional PointCloud missing_echo_point_cloud = 3;}PointCloud;//vector,元素是3*1f*/proto::RangeData ToProto(const RangeData& range_data) { proto::RangeData proto; *proto.mutable_origin() = transform::ToProto(range_data.origin); *proto.mutable_point_cloud() = ToProto(range_data.returns); *proto.mutable_missing_echo_point_cloud() = ToProto(range_data.misses); return proto;}RangeData FromProto(const proto::RangeData& proto) { auto range_data = RangeData{ transform::ToEigen(proto.origin()), ToPointCloud(proto.point_cloud()), ToPointCloud(proto.missing_echo_point_cloud()), }; return range_data;}/*将sensor坐标变换为机器坐标。*/RangeData TransformRangeData(const RangeData& range_data, const transform::Rigid3f& transform) { return RangeData{ transform * range_data.origin, TransformPointCloud(range_data.returns, transform), TransformPointCloud(range_data.misses, transform), };}/*不在给定的z轴范围内的点云删除。*/RangeData CropRangeData(const RangeData& range_data, const float min_z, const float max_z) { return RangeData{range_data.origin, Crop(range_data.returns, min_z, max_z), Crop(range_data.misses, min_z, max_z)};}/*压缩,有精度丢失。*/CompressedRangeData Compress(const RangeData& range_data) { return CompressedRangeData{ range_data.origin, CompressedPointCloud(range_data.returns), CompressedPointCloud(range_data.misses), };}/*解压缩,有精度丢失*/RangeData Decompress(const CompressedRangeData& compressed_range_data) { return RangeData{compressed_range_data.origin, compressed_range_data.returns.Decompress(), compressed_range_data.misses.Decompress()};}} // namespace sensor} // namespace cartographer
测试代码:sensor/range_data_test.h#include "cartographer/sensor/range_data.h"#include <utility>#include <vector>#include "gmock/gmock.h"namespace cartographer {namespace sensor {namespace {using ::testing::Contains;using ::testing::PrintToString;// Custom matcher for Eigen::Vector3f entries.MATCHER_P(ApproximatelyEquals, expected, string("is equal to ") + PrintToString(expected)) { return (arg - expected).isZero(0.001f);}TEST(RangeDataTest, Compression) { const std::vector<Eigen::Vector3f> returns = {Eigen::Vector3f(0, 1, 2), Eigen::Vector3f(4, 5, 6), Eigen::Vector3f(0, 1, 2)}; //构造一个测量数据 const RangeData range_data = { Eigen::Vector3f(1, 1, 1), returns, {Eigen::Vector3f(7, 8, 9)}}; //压缩再解压,减少空间占用。 const RangeData actual = Decompress(Compress(range_data));//isApprox():true if *this is approximately equal to other, within the precision determined by prec. //压缩前后,精度比较 EXPECT_TRUE(actual.origin.isApprox(Eigen::Vector3f(1, 1, 1), 1e-6)); EXPECT_EQ(3, actual.returns.size()); EXPECT_EQ(1, actual.misses.size()); EXPECT_TRUE(actual.misses[0].isApprox(Eigen::Vector3f(7, 8, 9), 0.001f)); // Returns will be reordered, so we compare in an unordered manner. EXPECT_EQ(3, actual.returns.size()); //是否包含给定值,returns是乱序的。所以使用Contains()函数。 EXPECT_THAT(actual.returns, Contains(ApproximatelyEquals(Eigen::Vector3f(0, 1, 2)))); EXPECT_THAT(actual.returns, Contains(ApproximatelyEquals(Eigen::Vector3f(4, 5, 6))));}} // namespace} // namespace sensor} // namespace cartographer
本文发于:
* http://www.jianshu.com/u/9e38d2febec1
* https://zhuanlan.zhihu.com/learnmoreonce
* http://blog.csdn.net/learnmoreonce
* slam源码分析微信公众号:slamcode
阅读全文
0 0
- cartographer源码分析(19)-sensor-range_data.h
- cartographer源码分析(17)-sensor-point_cloud.h
- cartographer源码分析(20)-sensor-data.h
- cartographer源码分析(21)-sensor-ordered_multi_queue.h
- cartographer源码分析(22)-sensor-collator.h
- cartographer源码分析(23)-sensor-voxel_filter.h
- cartographer源码分析(24)-sensor-configuration.h
- cartographer源码分析(18)-sensor-compressed_point_cloud
- cartographer源码分析(3)-common-port.h
- cartographer源码分析(4)-common-time.h
- cartographer源码分析(5)-common-rate_time.h
- cartographer源码分析(6)-common-histogram.h
- cartographer源码分析(7)-common-math.h
- cartographer源码分析(8)-common-make_unique.h
- cartographer源码分析(5)-common-fixed_ratio_sampler.h
- cartographer源码分析(9)-common-mutex.h
- cartographer源码分析(10)-common-thread_pool.h
- cartographer源码分析(11)-common-blocking_queue.h
- solr学习(1.3)-solr全文检索实现原理
- Laravel安装后访问空白
- poj 1026 Cipher【置换群*循环节】
- CC PRIMEDST(点分治+FFT)
- 使用Unity仿奥日弹射
- cartographer源码分析(19)-sensor-range_data.h
- malloc()与calloc()的区别
- Makefile学习笔记(三)
- Mybatis一对多查询的子对象集合中对象数目不对
- map映射,适配器,算法
- 音视频直播技术漫谈
- 学习笔记
- 英语前缀总结
- Maximum Sequence 贪心 优先队列