今天在rplidar sdk上遇到个问题,怀疑以前也遇到过,这里记录一下
问题环境
rplidar A3 + ubuntu16.04
问题现象
运行rplidar sdk ,无原因程序死掉,无错误日志
问题定位及解决
想查看core的堆栈信息,使用命令
ulimit -c unlimited
,配置了输出路径,重启,结果还是看不到.
此路不通,估计需要进一步分析原因用代码注释的方法,定位到问题出现在下面代码中
for( ; i < count; i++ ) {
if (nodes[i].dist_mm_q2 != 0) {
float angle = getAngle(nodes[i]);
int angle_value = (int)(angle * angle_compensate_multiple);
if ((angle_value - angle_compensate_offset) < 0) angle_compensate_offset = angle_value;
for (j = 0; j < angle_compensate_multiple; j++) {
angle_compensate_nodes[angle_value-angle_compensate_offset+j] = nodes[i];
}
}
}
angle_compensate_nodes 数组大小是1440, A3的,A2只有360,而数组的索引`angle_value-angle_compensate_offset+j`有时的值超过1440,达到1442,或者1443
分析索引:
j 从 0-> 4
angle_compensate_offset 一直是0
angle_value = (int)(angle * angle_compensate_multiple);angle_compensate_multiple一直是4
再跟踪angle,进入一下代码:
static float getAngle(const rplidar_response_measurement_node_hq_t& node)
{
return node.angle_z_q14 * 90.f / 16384.f;
}
来自真正的nodes[i],node[]数据是从驱动中取出来的.
这样我们没有办法限制驱动上传的数据,只能在上层进行限制
最终的办法是:在索引上面进行限制,当要越界时,丢掉该数据.
for (j = 0; j < angle_compensate_multiple; j++) {
if (angle_value-angle_compensate_offset+j > 1439) continue;
angle_compensate_nodes[angle_value-angle_compensate_offset+j] = nodes[i];
}