速腾聚创16线激光雷达使用过程中,第一步是数据的采集和存储。由于厂家提供了基于ROS的示例程序,而使用过程中需要在C++环境下进行程序开发。
根据厂家的建议,依据基于ROS的示例程序进行改写,第一版程序改写之后,出现了数据出现了严重的延迟。无奈在github上寻找大神们提供的程序代码,找到了一个robosense-kobi的示例程序,解决了点云信息采集延迟的问题。在这这里表示感谢。
主要函数如下
回调函数
void pointcloudCallback(const PointcloudMsgpcl::PointXYZI& msg)
{
if(mex_pointcloud.try_lock()){
pcl_pointcloud->points.assign(msg.pointcloud_ptr->begin(), msg.pointcloud_ptr->end());
pcl_pointcloud->height = msg.height;
pcl_pointcloud->width = msg.width;
pcl_pointcloud->is_dense = false;
mex_pointcloud.unlock();
}
PointCloudColorHandlerGenericFieldpcl::PointXYZI point_color_handle(pcl_pointcloud, “intensity”);
{
const std::lock_guardstd::mutex lock(mex_viewer);
pcl_viewer->updatePointCloudpcl::PointXYZI(pcl_pointcloud, point_color_handle, “rslidar”);
}
}
这里需要注意的是回调函数中,有两处互斥锁的加锁,mex_pointcloud.try_lock()是对输出点云加锁,在后续对点云操作后是需要进行解锁。
const std::lock_guardstd::mutex lock(mex_viewer);是用于实时显示点云的互斥锁。在程序其他位置显示点云时,也要有解锁的过程。
我们遇到的一个问题是,程序调试通过后,把显示部分注视了,回调函数中涉及显示的加锁部分没有相应注释,导致有加锁无解锁,雷达数据会被锁死。