添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
首发于 cartographer学习

cartographer目录结构

cartographer 整个源码分为两部分 cartographer cartographer_ros 两部分

cartographer 主要负责处理来自Laser、IMU、Odometry等传感器的数据并基于这些数据进行地图的构建。所以这一部分应该说是cartographer代码的核心部分。

cartographer_ros 是基于ros的通信机制获取传感器的数据并将他们转换成cartographer中定义的格式传递给cartographer处理,与此同时也将cartographer的处理发布用于显示或保存。是基于cartographer的上层应用。所以,cartographer_ros相当于是对cartographer进行了一层ROS接口的封装。


A cartographer 部分源码分为以下几个文件夹 cloud, common, ground_truth, io, mapping, metrics, sensor, transform

位置:/src/cartographer/cartographer

1 cloud 云服务相关功能

2 common 定义基本的数据结构 以及一些工具的使用接口

3 ground_truth

4 io 定义一些与io相关的工具 存读取数据 记录日志

5 mapping 定义上层调用接口以及局部submap 构建和基于闭环检测得位姿优化等接口,里面的2d和3d是对mapping接口的不同实现

6 metrics

7 sensor 定义雷达和点云的数据结构

8 transform 定义位姿的相关结构和相关转换

没找到?(kalman_filter 通过卡尔曼滤波对 IUM 里程计 雷达 等位姿数据进行融合 ,进而估计新的laser scan的位姿)


/src/cartographer/configuration_flles

对算法参数的配置文件




B cartographer_ros 部分目录分为以下几个文件夹

1 cartographer_ros 里launch目录中存放的是各个launch脚本文件,有之前运行过的demo "demo_backpack_2d.launch"。urdf目录中则是用 URDF文件 描述的机器人模型,再下一级的cartographer_ros目录下才是官方ROS封装的源码

CHANGELOG.rst是修改日志。CMakeLists.txt和package.xml是标准的ROS包中的标配文件,package.xml描述了包的作者、依赖、版权等信息,CMakeLists.txt则定义了包的编译规则


2 cartographer_ros_msgs 定义了msg和srv 文件,为carto定义各种消息类型

3 cartogpher_rviz 是可视化相关工程


Common文件夹

1 port.h

int RoundToInt(const float x); //四舍五入取整

FastGzipString(const string& uncompressed, string* compressed); //压缩字符串string

FastGunzipString(const string& compressed, string* decompressed); //解压缩字符串


2 time.h

时间转换函数

两个别名?

using duration = std::chrono::duration<rep, period>;/*微秒*/

using time_point = std::chrono::time_point<UniversalTimeScaleClock>;/*时间点*/


FromSeconds(double seconds); //秒数seconds转为c++的duration实例对象:

ToSeconds(Duration duration); //将duration实例对象转为秒数s

ToUniversal(Time time);将c++的time_point对象转为TUC时间,单位是0.1us


3 fixed_ratio_sampler.h

频率固定的采样器类,目的是从数据流中均匀的按照固定频率采样数据

Pulse()产生一个事件pulses,并且:如果计入采样samples,返回true

DebugString():以string形式输出采样率


4 internal/rate_timer.h

explicit RateTimer(const common::Duration window_duration)构造函数提供时间段Duration

ComputeRate()返回事件脉冲率,单位hz

ComputeWallTimeRateRatio()返回真实时间与墙上挂钟时间的比率

内部类Event封装了某个事件发生的时间点?

调用一次Pulse()即产生了一次事件

DebugString() 以字符串形式输出

ComputeDeltasInSeconds() 计算以秒计的delta序列?

DeltasDebugString()计算delta序列的均值和方差


5 histogram.h

Histogram:直方图类

Add()//添加value,可乱序

ToString(int buckets )以字符串的形式输出buckets个直方图信息,bin大小是篮子个数,表示分为几块统计


6 thread_pool.h

对c++11 thread的封装,线程数量固定的线程池类?

构造函数ThreadPool(int num_threads) 初始化一个线程数量固定的线程池


7 internal/blocking_queue.h

构造函数BlockingQueue()初始化队列大小,kInfiniteQueueSize=0默认不限制容量。queue_size限制容量:通过条件变量做到

Push()添加元素,容量不够时,阻塞等待

PushWithTimeout(),添加元素,若超时则返回false

Pop()删除元素,没有元素时,阻塞等待

PopWithTimeout(),删除元素,若超时则返回false

Peek()返回下一个应该弹出的元素

PeekWithTimeout()像Peek, 但是会timeout


Sensor文件夹

点云数据是指在一个三维坐标系统中的一组向量的集合。

PointCloud是由Vector3f(x,y,z)组成的vector即std::vector(std???)


1 point_cloud.h

PointCloudWithIntensities则是由点云和光线强度组成的struct类。

timedPointCloud是存储点的三维位置和它们的相对测量时间

根据transform参数转换点云

转换timedPointCloud

PointCloud CropPointCloud(const PointCloud& point_cloud, float min_z,float max_z);去掉z轴区域外的点云,返回一个新的


2 compressed_point_cloud.h

点云的压缩表示一个没有时间信息的点(Vector3f)的集合

点是按块分组的。每个区块编码一点元数据(区块中的点的数量,区块的坐标),每个点编码一点在block内的位置信息


3 range_data.h

RangeData定义激光雷达传感器测量数据的存储结构Struct:

Eigen::Vector3f origin; {x0,y0,z0},原点坐标。

PointCloud returns; “return”障碍物位置{x,y,z},表示有反射。

PointCloud misses; 无反射,自由空间


RangeData TransformRangeData(const RangeData& range_data,const transform::Rigid3f& transform);对数据进行3d变换,转换为 机器坐标

RangeData CropRangeData(const RangeData& range_data, float min_z, float max_z);根据min_z和max_z去除不在z轴范围内的点云,返回一个新的

proto::RangeData ToProto(const RangeData& range_data);将'range_data'转换为一个proto::RangeData, 序列化

RangeData FromProto(const proto::RangeData& proto);反序列化,如上相反


4 Data.h \imu_data.h \odometry_data.h \range_data.h \landmark_data.h

根据传感器设置数据分装,都带有变成proto类下的属性( proto?

Data是 Dispatchable的基类?

构造函数Data(const std::string &sensor_id) : sensor_id_(sensor_id)

imu_data 有struct时间,线加速度,角速度

Landmark_data 分为observation观测数据和直接data(observation+time)

odometry_data 就是time和位姿(pose)

Range_data.h 分为原点,障碍点,然后如果miss了(这个应该是红外测距类?)

多一个transformRangeData方法(不重要)和一个 cropRangeData去除z轴区域


5Timed_Point_Cloud_Data

两个转换方法

timed_point_cloud_data ? 到proto::TimedPointCloudData

proto到TimedPointCloudData










git rm -r --cached . 之后修改ignore才有用

Carto测试:

source catkin_ws/devel_isolated/setup.bash

roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag

发布于 2022-07-07 13:16

文章被以下专栏收录

    cartographer学习

    cartographer学习

    carto学习笔记