rplidar ros sdk 无原因挂死情况分析解决

今天在rplidar sdk上遇到个问题,怀疑以前也遇到过,这里记录一下

问题环境

rplidar A3 + ubuntu16.04

问题现象

运行rplidar sdk ,无原因程序死掉,无错误日志

问题定位及解决

  1. 想查看core的堆栈信息,使用命令ulimit -c unlimited ,配置了输出路径,重启,结果还是看不到.
    此路不通,估计需要进一步分析原因

  2. 用代码注释的方法,定位到问题出现在下面代码中

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];
    }

猜你喜欢

转载自blog.csdn.net/sunyoop/article/details/82149647