上一节(https://blog.csdn.net/weixin_44684139/article/details/118279360)我们介绍了系统各个模块的初始化,加载了许多的参数,创建了许多的发布者,构建了因子图、初始八叉树地图等。本节介绍激光数据回调以后的相关内容。
激光雷达数据订阅者建立于src\blam_slam\src\BlamSlam.cc的
pcld_sub_ = nl.subscribe("pcld", 100, &BlamSlam::PointCloudCallback, this);
回调函数为BlamSlam::PointCloudCallback
void BlamSlam::PointCloudCallback(const PointCloud::ConstPtr& msg) {
synchronizer_.AddPCLPointCloudMessage(msg);
}
寥寥一句,将激光数据加入系统。首先明确synchronizer_的含义。看名字就知道和时间同步有关,其定义位于src\blam_slam\include\blam_slam\BlamSlam.h中,类型为MeasurementSynchronizer,关注其AddPCLPointCloudMessage成员函数的作用,在文件src\measurement_synchronizer\include\measurement_synchronizer\MeasurementSynchronizer.h中:
void AddPCLPointCloudMessage(
const pcl::PointCloud<pcl::PointXYZ>::ConstPtr& msg,
const std::string& tag = std::string());
其实现位于src\measurement_synchronizer\src\MeasurementSynchronizer.cc文件中,
void MeasurementSynchronizer::AddPCLPointCloudMessage(
const pcl::PointCloud<pcl::PointXYZ>::ConstPtr& msg,
const std::string& tag) {
Message<pcl::PointCloud<pcl::PointXYZ>>::Ptr p(
new Message<pcl::PointCloud<pcl::PointXYZ>>(msg, tag));
pending_pcl_pclds_.push_back(p);
}
创建了一个Message的指针,将数据传入做初始化,然后将这个Message推入容器pending_pcl_pclds_,其定义为:
pcl_pcld_queue pending_pcl_pclds_;
类型为
typedef std::vector<Message<pcl::PointCloud<pcl::PointXYZ>>::ConstPtr>
pcl_pcld_queue;
激光回调到此为止。那么你可能纳闷,激光数据进来以后毛线都没做呀?怎么进行接下来的SLAM呀?还有什么能主动开启SLAM的地方呢?有,还记得第一节讲述“总回调注册”时介绍的定时器吗?
下一节,让我们从定时器入手。