下面是基于我们实验室遇到的问题和我的修改案例方法,仅供参考,对于实际问题实际分析。
之前搞得激光雷达不能检测正前方范围,下面是我修改的案例方法,不懂得可以留言问我。
1.遇到问题:激光雷达lidar.cpp代码中,检测角度if( dis_select[i]>0.05&& dis_select[i]<1.0 &&angle_select[i] < 111)只 检测到了左半部分的0度到111度,不能实现正前方的范围角度检测。
已解决:修改代码为int current_angle = i;
if ((current_angle >= 300 && current_angle <= 360) || (current_angle >= 0 && current_angle <= 60)) {
angle_select[i] = current_angle;
实现了激光雷达正前方120度(±60度)的检测。
2.遇到问题:虽然激光雷达实现正前方120度的检测,但是当目标物体正好位于0度到60度和300度到360度之间,那么角度相加除以有效点得到的角度就不准确(比如检测到四个有效点分别是3度,2度,358度,357度,这四个点相加除以4=180度。就不是我们想要的范围内的点。)只有单纯的0度到60度,或者300度到360度,才是准确的。
已解决:修改代码
int current_angle = i;
if ((current_angle >= 300 && current_angle <= 360) || (current_angle >= 0 && current_angle <= 60)) {
angle_select[i] = current_angle;
dis_select[i] = raw_dis[i];
}
}
raw_dis[i] = 0; // 清除原始数据
}
// 计算有效数据的数量和平均值
for (int i = 0; i < CNT; i++) {
if (dis_select[i] > 0.05 && dis_select[i] < 1.0 && angle_select[i] != 0) {
validData++;
float angle_rad = angle_select[i] * M_PI / 180.0;
angle_x_sum += cos(angle_rad);
angle_y_sum += sin(angle_rad); // 为了计算平均角度,代码将每个有效角度的余弦值(x 方向分量)和正弦值(y 方向分量)分别累加到 angle_x_sum 和 angle_y_sum。角度的余弦和正弦通过 cos(angle_rad) 和 sin(angle_rad) 计算,其中 angle_rad 是角度从度数转为弧度的结果。
}
}
printf("有效数据数量: %d\n", validData);
if (validData != 0) {
float avg_angle_x = angle_x_sum / validData;
float avg_angle_y = angle_y_sum / validData;// 使用累加的角度余弦和正弦值,计算出有效角度的 x 和 y 平均分量:
float avg_angle = atan2(avg_angle_y, avg_angle_x) * 180.0 / M_PI;// 通过 atan2 函数计算出平均角度
if (avg_angle < 0) {
avg_angle += 360.0;// 如果计算得到的角度为负,则加 360 度,使其变为正值(确保角度在 0 到 360 度范围内)
将代码修改为每个检测到的有效角度的正弦值和余弦值(X,Y),再它们分别相加后再除以有效点计算出平均值,再通过atan2 函数转换为角度,即可得到我们想要的角度值,问题解决。