如果有写的不对的地方欢迎指正,确实写的不对,我给红包。
1 坚持不停的new一个trajectory,在程序/cpu/内存三个方面都会发生什么事情?
回答:每次new一个轨迹的时候,都会在active submap中初始化一个地图,如果new下一个轨迹,首先会将上一个轨迹finished ,但是此时不会将active submap中的内存释放,会残留一个大约几M的内存,超过几百个时,就会产生超过上G的内存增长,cpu方面不会有大的变化,程序的话,如果内存不崩溃,程序也不会崩溃。
2 3d中的高低分辨率点云,都用在哪?
1 在submap中match的时候,高低点云都用到了,会各自进入自己的高低分辨率栅格产生残差
2 计算约束时,在分支定界时,使用的是高分辨率点云放到低分辨率地图栅格地图中评分,得到超过分数的最优解后,再次使用1中的方法
3 2d分支定界中角度分辨率计算原理?
//线性搜索步长=线性搜索距离(x,y,z方向)÷ 分辨率(每个格子的长度)
float max_scan_range = 3.f * resolution;
for (const Eigen::Vector3f& point : point_cloud) {
const float range = point.norm();
max_scan_range = std::max(range, max_scan_range);
}
const float kSafetyMargin = 1.f - 1e-3f;
const float angular_step_size = //采用余弦定理计算角度步长,具体理解见下面图片。
kSafetyMargin * std::acos(1.f - common::Pow2(resolution) /
(2.f * common::Pow2(max_scan_range)));
原文链接:https://blog.csdn.net/weixin_40215443/article/details/109033113
4 3d分支定界中的细节?
5 每张子图分支定界创造分层地图的次数,在哪实现的此功能?
一次,构造函数里
6 3d 子图刷新分辨率的时候使用的是哪个点云?
既不是高分辨率也不是低分辨率,是returns,在插入后就不进入后端了。
7 3d node中保存的是哪个点云
高分辨率和低分辨率点云
8 3D分支定界时点云旋转直方图
node中和submap中都存在一个直方图,node中的是通过returns计算的,submap中的是每个node叠加的。候选评分,采用node中的直方图,经过旋转后得到一个新的直方图向量,求此向量和submap中的直方图向量内积,分数越大,说明越相像,类似求两个向量余弦距离。利用此原理筛选候选角度。
其中生成直方图的过程描述如下,
1)首先将输入点云按照Z轴方向切成n个切片;
2)将每个slice中的点进行排序:
a. 计算该slice中点云的均值;
b. 并求每个point与质心连线与x轴所成的角度;
c. 按照角度排序所有点。
3)将每个slice中的点映射到histogram直方图中:
a. 计算每个slice的质心 c(其实可以理解为laser的位置,因为360°扫描);
b. 设置第一个点为参考点 a,因为排过序,所以第一个点应为与x轴角度最小的点;
c. 连接当前点 b(参考点的下一个点)和参考点 a,并计算它与x轴的夹角,按照夹角映射到直方图;
d. 计算该点的权重,即ab与bc的垂直程度,直方图元素即为权重的累加值。
理解:需要注意,当当前点和参考点超出一定距离时,需要重置参考点,因此当前点可以认为是参考点的临*点,处于一个邻域内;另外,需要格外注意的是,匹配过程中通常需要先将点云按照角分辨率和角度搜索窗口进行旋转,生成所有候选scan,然后在每个角度scan内匹配xyz窗口,而这里的这种匹配方法刚好对距离并不敏感,如对于同一个视角,c点距离ab的远*并不影响ab和bc的角度,同样不影响权重大小的计算,所以我觉得这种计算方法有一定道理,事实上它也是先通过这种方法筛选角度搜索窗口内的一些scan,然后在进行xyz*移的遍历,获得最优的*移;
权重的计算思想,当ab和bc*乎垂直时,说明ab可能是一个垂直于激光扫描线束的*面,这时探测结果应该是比较准确的,相反,如果ab'如何过b‘c*乎*行时,说明扫描线束*乎*行与障碍物,这时可能探测误差较大(可能由传感器引起,也有可能是孔洞、玻璃等),因此权重应该降低。
看代码:
直方图匹配入口,将直方图进行旋转,然后计算两个直方图的余弦距离;(注意:这里仅仅进行了yaw方向的旋转,同时这里没考虑这种直方图的计算方法直接进行旋转是否能保持不变性。)
原文链接:
9 3D分支定界和2D对角度的处理方式一致吗?
答:基本一致,但是3D在处理旋转点云的时候,去除了一些不好的角度,2D无此操作,另外3D仅做了Z周旋转的候选,候选点分数计算是直方图评分。
10 位姿推断器里为啥会有三个imu tracker
std::unique_ptr<ImuTracker> imu_tracker_;
std::unique_ptr<ImuTracker> odometry_imu_tracker_;
std::unique_ptr<ImuTracker> extrapolation_imu_tracker_;
11 如果开启纯定位模式 在后端 保存数据时,imu_data会固定在一定范围么?
不会,imu 频率理论上固定,后端如果保持三张子图,imudata数量会与三张子图所使用时间有关,即产生三张子图中所有node的时间有关系,行走慢时,数据较多,行走快时数据较少
12 不同轨迹间的约束,一定是做full map搜索吗?
不是;