(02)Cartographer源码无死角解析-(22) 传感器数据分发→总体分析
admin
2024-01-28 08:05:59
0

讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下:
(02)Cartographer源码无死角解析- (00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/127350885
 
文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证{\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\color{blue}点击本人照片即可显示WX→官方认证}文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证
 

一、前言

首先对前面的知识做一个回顾,从 node_main.cc 文件中开始;

//根据配置文件,命令行参数与话题重映射,订阅默认话题开始一条轨迹
node.StartTrajectoryWithDefaultTopics(trajectory_options);AddTrajectory(options);//添加一条新轨迹// 调用map_builder_bridge的AddTrajectory, 添加一个轨迹const int trajectory_id =map_builder_bridge_.AddTrajectory(expected_sensor_ids, options);// 订阅话题与注册回调函数LaunchSubscribers(options, trajectory_id);

其上的 map_builder_bridge_.AddTrajectory 与 LaunchSubscribers() 是十分重要的两个函数:

(1):\color{blue}(1):(1): map_builder_bridge_.AddTrajectory 函数主要的核心就是构建CollatedTrajectoryBuilder对象存储于 node::map_builder_bridge_::map_builder_::trajectory_builders_变量之中,然后返回一个 trajectory_id,再根据 trajectory_id 构建一个 SensorBridge对象,创建该对象时代码如下:

  // Step: 2 为这个新轨迹 添加一个SensorBridgesensor_bridges_[trajectory_id] = absl::make_unique(trajectory_options.num_subdivisions_per_laser_scan,trajectory_options.tracking_frame,node_options_.lookup_transform_timeout_sec, tf_buffer_,map_builder_->GetTrajectoryBuilder(trajectory_id)); // CollatedTrajectoryBuilder

注意\color{red}注意注意 其上的 GetTrajectoryBuilder(trajectory_id) 就是获取 trajectory_builders_ 中的 CollatedTrajectoryBuilder 对象。然后作为参数传送给 SensorBridge 的构造函数。

(2):\color{blue}(2):(2): LaunchSubscribers() 会根据 trajectory_id 与其对应的配置 TrajectoryOptions& options,进行话题的订阅,同时出注册回调函数。

 
这里就不在贴代码了,Node::LaunchSubscribers() 主要订阅,注册了如下回调函数:

//位于 src/cartographer_ros/cartographer_ros/cartographer_ros/node.cc 文件之中
void Node::LaunchSubscribers(const TrajectoryOptions& options,const int trajectory_id)&Node::HandleLaserScanMessage//注册的单线雷达回调函数SensorBridge::HandleLaserScanMessage()//根据采样频率评估是否调用该函数&Node::HandleMultiEchoLaserScanMessage//注册的多回声雷达回调函数SensorBridge::HandleMultiEchoLaserScanMessage()//根据采样频率评估是否调用该函数&Node::HandlePointCloud2Message//注册的多线点云雷达回调函数SensorBridge::HandlePointCloud2Message()//根据采样频率评估是否调用该函数&Node::HandleImuMessage//注册的IMU回调函数SensorBridge::HandleImuMessage()//根据采样频率评估是否调用该函数......

还有一些回调函数,就不一一在这里列举了,所有的回调函数,根据查询的tf,对数据完成进行坐标系变换(变换到tracking_frame)之后,最终都会调用类似如下的一段代码:

或: trajectory_builder_->AddSensorData(sensor_id,carto::sensor::OdometryData{odometry_data->time, odometry_data->pose});
或: trajectory_builder_->AddSensorData(sensor_id,carto::sensor::FixedFramePoseData{time, absl::optional()});
或: trajectory_builder_->AddSensorData(sensor_id, carto::sensor::FixedFramePoseData{time, absl::optional(Rigid3d::Translation(ecef_to_local_frame_.value() *LatLongAltToEcef(msg->latitude, msg->longitude, msg->altitude)))});
或: trajectory_builder_->AddSensorData(sensor_id, landmark_data);......

上面只列举了一部分,从上面可以看出,trajectory_builder_->AddSensorData() 函数接收了各种各样的数据类型,那么其定然存在很多重载函数。其上的 trajectory_builder_ 就是 CollatedTrajectoryBuilder 的实例对象指针,每个 trajectory_id 都有一个与之对应的 CollatedTrajectoryBuilder 实例对象指针。
 

二、构造时的传参

根据上面的介绍,可以知道 trajectory_builder_ 就是类CollatedTrajectoryBuilder的实例指针,是在 src/cartographer/cartographer/mapping/map_builder.cc 文件的 MapBuilder::AddTrajectoryBuilder() 函数中实例化,通过上一篇博客了解到,其2D轨迹与3D轨迹的构建过程如下:

	// CollatedTrajectoryBuilder初始化trajectory_builders_.push_back(absl::make_unique(trajectory_options, sensor_collator_.get(), trajectory_id,expected_sensor_ids,// 将3D前端与3D位姿图打包在一起, 传入CollatedTrajectoryBuilderCreateGlobalTrajectoryBuilder3D(std::move(local_trajectory_builder), trajectory_id,static_cast(pose_graph_.get()),local_slam_result_callback, pose_graph_odometry_motion_filter)));// CollatedTrajectoryBuilder初始化trajectory_builders_.push_back(absl::make_unique(trajectory_options, sensor_collator_.get(), trajectory_id,expected_sensor_ids,// 将2D前端与2D位姿图打包在一起, 传入CollatedTrajectoryBuilderCreateGlobalTrajectoryBuilder2D(std::move(local_trajectory_builder), trajectory_id,static_cast(pose_graph_.get()),local_slam_result_callback, pose_graph_odometry_motion_filter)));

 

三、C++多态

CollatedTrajectoryBuilder 是在 src/cartographer/cartographer/mapping/internal/collated_trajectory_builder.cc 文件中定义。这里涉及到一个多态的知识点,创建的实例类型为 CollatedTrajectoryBuilder*,但是在构建 SensorBridge 时, SensorBridge 构造函数需要的类型为 carto::mapping::TrajectoryBuilderInterface*,从 collated_trajectory_builder.h 文件中,可以看到:

class CollatedTrajectoryBuilder : public TrajectoryBuilderInterface 

故 CollatedTrajectoryBuilder 是 TrajectoryBuilderInterface 的派生类。TrajectoryBuilderInterface 在 src/cartographer/cartographer/mapping/trajectory_builder_interface.h 文件中被声明。从类名,以及代码可以很明显的看出,其是一个接口类,定义了很多的纯虚函数。一个接口类可以派生出很多类型的子类,构建 SensorBridge 构造函数需要的参数为基类 TrajectoryBuilderInterface,这样有个好处,也就是由 TrajectoryBuilderInterface 派生出来子类,都可以用于 SensorBridge 的构造函数。

CollatedTrajectoryBuilder 的主要作用就是使用 sensor::CollatorInterface 整理传感器数据, 然后将其传递到2D和3D通用的 mapping::TrajectoryBuilderInterface。

另外再介绍一下 c++11中的std::function 与 using 的模板部分具体化

  c++11: std::function 通用多态函数封装器std::function 的实例能存储、复制及调用任何可调用 (Callable) 目标: 如函数、 lambda表达式、 bind表达式或其他函数对象, 还有指向成员函数指针和指向数据成员指针.它也是对 C++ 中现有的可调用实体的一种类型安全的包裹(相对来说, 函数指针的调用不是类型安全的)

在 trajectory_builder_interface.h 中可以看到如下一段代码:

  // A callback which is called after local SLAM processes an accumulated// 'sensor::RangeData'. If the data was inserted into a submap, reports the// assigned 'NodeId', otherwise 'nullptr' if the data was filtered out.using LocalSlamResultCallback =std::function)>;

其上表示用 LocalSlamResultCallback 表示一个回调函数,该回调函数无返回值,需要传入五个参数。

 
 
 

相关内容

热门资讯

原创 1... 当全世界还沉浸在新年的余温里,79岁的特朗普却像个打了鸡血的斗士,精力旺盛得让人害怕。 他在委内瑞拉...
“科技年货”扎堆上新!华强北开... 新春将至 深圳华强北商业步行街 正掀起一场以 “科技年货”为主角的 消费热潮 记者近日采访获悉,围绕...
原创 中... 2026年1月15日,中国人工智能领域迎来里程碑时刻——由智谱与华为联合研发的多模态图像生成模型GL...
不学抖音学INS,OpenAI... 文 | 字母榜,作者 | 苗正,编辑 | 王靖 一年多以前,奥特曼对AI+广告这件事嗤之以鼻,他在...
真“车厘子自由”!价格近乎腰斩... 本文来源:消费者报道 作者:郑艺阳 “今年车厘子品质和价格达到了一个很好的平衡,不再是高端水果,而是...
阳光乳业大宗交易折价成交278... 阳光乳业01月16日大宗交易平台共发生13笔成交,合计成交量278.42万股,成交金额3872.81...
雷军:新一代SU7已经开始小订 雷军刚刚更新微博:新一代SU7已经开始小订,更多详情登录小米汽车APP。 来源:雷军
欧洲8国集体回应特朗普关税威胁... 据CCTV国际时讯:因丹麦自治领地格陵兰岛问题被美国总统特朗普宣布将加征关税的欧洲8国今天(1月18...
原创 中... 中国一年用的电,比美国、欧盟、俄罗斯、印度和日本加起来还多。当这个数字在2025年初被公之于众时,它...
中国芯片最大IPO,要来了 长鑫科技递交科创板IPO申请已获受理 资料图 作者 黎曼 编辑王庆武 原标题《开年最大IPO要来了》...
实探海南自贸港封关“满月”:国... 2026年1月18日,海南自贸港封关运作迎来“满月”。 走进海口国际免税城,椰风裹着暖融融的阳光,漫...
原创 杰... 财经摆渡人 精研出品 破浪前行,共探财富新局 大家好欢迎收看【古今财鉴】 2026年1月12日,北交...
突发特讯!马克龙回应美国关税威... 一场关税威胁,让美欧盟友关系再度紧绷。当地时间1月18日,法国总统马克龙针对美国的关税胁迫作出首次官...
原创 2... 彩排路透一曝光,镜头扫过那个圆乎乎的身影,弹幕瞬间分成了两派。一边开始吐槽:怎么又是他了?另一边则是...
内部炸锅!追觅员工怒怼CEO“... 来源:21ic电子网 快科技 近日,有员工在追觅科技智能汽车项目的千人大群里,直怼俞浩和陈龙冬的聊天...
兴业银行成功发行首单自贸区主体... 1月15日,兴业银行(601166.SH)在全市场首次以“玉兰债”模式发行银行自贸区主体境外债券,发...
印度对华出口激增67%,对美出... 参考消息网1月16日报道据美国消费者新闻与商业频道网站1月16日报道,随着美国总统特朗普加征的高额关...
投资前瞻(1.19—1.25)... 重点关注: ·央行连续第8个月通过买断式逆回购向市场注入中期流动性。 ·“十五五”期间电网投资计划比...
肿瘤科医生提醒:如果你属于这 ... 在所有常见肿瘤中,结直肠癌(也就是大家常说的“肠癌”)其实是个很“矛盾”的存在。一方面,它的发展速度...
九龙县多维发力激活电商发展新动... 01 “一村一主播”育才强基 紧扣高原农特产品上行需求,构建“基础培训、实战演练、创业孵化”三级体系...