faster-lio仿真环境问题及解决
在按照 XTDrone 的文档步骤搭建 faster-lio 的仿真环境后,运行可能会出现各种报错问题,本篇仅就环境搭建的问题提供一些解决思路。
XTDrone 的环境搭建链接:https://www.yuque.com/xtdrone/manual_cn/livox_lio
出现雷达点少或没有点
W0717 14:52:06.377401 27941 laser_mapping.cc:280] No point, skip this scan!
W0717 14:52:06.401652 27941 laser_mapping.cc:454] Too few input point cloud!
W0717 14:52:06.401741 27941 laser_mapping.cc:280] No point, skip this scan!
W0717 14:52:06.511386 27941 laser_mapping.cc:280] No point, skip this scan!
这种情况就是雷达点太少或者特征点太少,一方面可以提高 px4 端的仿真模型的点数:
另一方面,可以减小 faster-lio 中的降采样体素大小的方式来增加特征点数:
需要注意的是,这个参数在 launch 文件中也会设置,两者保留其一即可。
创建容器过大
terminate called after throwing an instance of 'std::length_error'what(): cannot create std::vector larger than max_size()
[laserMapping-1] process has died [pid 71945, exit code -6, cmd /root/catkin_ws/devel/lib/faster_lio/run_mapping_online __name:=laserMapping __log:=/root/.ros/log/0dd4bb6c-62e2-11f0-8292-61405825c766/laserMapping-1.log].
log file: /root/.ros/log/0dd4bb6c-62e2-11f0-8292-61405825c766/laserMapping-1*.log
这个问题也是调试了一会才找到问题出在哪里,原因是在仿真中,使用的是 avia 的仿真模型,有时候会发出来点云数量为 0 的 msg,这样在雷达点云话题的回调函数中,创建相应的容器就会报错,我在avia雷达消息的回调函数中添加了一些打印信息,发现每次都是在点云数量为0时,就会紧接着报错:
于是在回调中做一些保护即可,部分代码如下,其实也就是添加了两句话:
void PointCloudPreprocess::AviaHandler(const livox_ros_driver::CustomMsg::ConstPtr &msg) {cloud_out_.clear();cloud_full_.clear();int plsize = msg->point_num;// ROS_INFO("point_num = %d", (int)msg->point_num);// 添加点云数据量过小时的保护if (plsize <= 10)return;cloud_out_.reserve(plsize);cloud_full_.resize(plsize);std::vector<bool> is_valid_pt(plsize, false);std::vector<uint> index(plsize - 1);for (uint i = 0; i < plsize - 1; ++i) {index[i] = i + 1; // 从1开始}std::for_each(std::execution::par_unseq, index.begin(), index.end(), [&](const uint &i) {if ((msg->points[i].line < num_scans_) &&((msg->points[i].tag & 0x30) == 0x10 || (msg->points[i].tag & 0x30) == 0x00)) {if (i % point_filter_num_ == 0) {cloud_full_[i].x = msg->points[i].x;cloud_full_[i].y = msg->points[i].y;cloud_full_[i].z = msg->points[i].z;cloud_full_[i].intensity = msg->points[i].reflectivity;cloud_full_[i].curvature =msg->points[i].offset_time /float(1000000); // use curvature as time of each laser points, curvature unit: msif ((abs(cloud_full_[i].x - cloud_full_[i - 1].x) > 1e-7) ||(abs(cloud_full_[i].y - cloud_full_[i - 1].y) > 1e-7) ||(abs(cloud_full_[i].z - cloud_full_[i - 1].z) > 1e-7) &&(cloud_full_[i].x * cloud_full_[i].x + cloud_full_[i].y * cloud_full_[i].y +cloud_full_[i].z * cloud_full_[i].z >(blind_ * blind_))) {is_valid_pt[i] = true;}}}});for (uint i = 1; i < plsize; i++) {if (is_valid_pt[i]) {cloud_out_.points.push_back(cloud_full_[i]);}}
}