激光雷达码盘偏摆角的真假点映射关系
- 一、概要
- 二、完架构流程
- 三、技术细节
- 四、完整代码
一、概要
本代码主要计算激光雷达码盘偏摆角(也可以理解为雷达的零位角)导致的实际slam建图距离的偏差,只取了第一个象限作为分析目标。最终得出的结论是:如图1、2,在15米处,码盘偏摆角或者雷达的零位角偏差为0.28°,对点云图不产生畸变(即直线就是直线,不会出现弯曲等现象),只会出现点云图旋转的情况,旋转角度即为零位角偏差。仅以此文记录当时的分析过程
二、完架构流程
这段代码的主要流程可以分为以下几个部分:
1. 初始化变量:首先,初始化了一些空列表,这些列表将用于存储计算过程中的一些值。同时,也定义了一些初始参数,比如offset_angle
。
2. 计算与存储数据:然后,代码进入一个for循环,以步长为3,从3开始,到45结束。在每次循环中,根据当前的correct_angle
和offset_angle
计算offset_point
和correct_point
,并计算他们的差值,然后将这些值以及correct_angle
添加到相应的列表中。同时,还根据offset_point
和correct_angle
计算了x和y坐标,并将他们添加到相应的列表中。
3. 创建图表:使用matplotlib库创建了一个图表。然后,将图表的canvas的’button_press_event’事件连接到一个名为mouse_event
的函数。
4. 设置图表属性:设置了x轴的刻度范围,然后创建了两个列表,一个用于x轴的刻度间隔,一个用于y轴的刻度间隔。同时,设置了x轴和y轴的刻度格式和范围。
5. 绘制散点图:根据前面计算的数据,使用两种不同的颜色在图表上绘制了两个散点图,一个是理论点云,一个是偏差点云。
6. 设置图表标签和标题:设置了图表的x轴和y轴的标签,以及图表的标题。
7. 显示图表:最后,使用plt.show()
函数显示图表。
8. 这段代码中使用了中文作为图表的标签和标题,因此需要使用plt.rcParams['font.sans-serif'] = ['Simhei']
和plt.rcParams['axes.unicode_minus'] = False
来确保图表能正确显示中文。
三、技术细节
这段代码主要使用了math库和matplotlib库,实现的功能是:
1. 对于一系列的角度值(从3开始,以3为步长,到45结束),计算对应的偏移点和正确点的坐标,以及他们的差值。这些计算基于一个给定的偏移角度(offset_angle = 0.28)。
2. 将这些计算的结果存储在几个列表中:offset_point_list, correct_point_list, value_list, a_list, x_list, y_list, y_correct_list。
3. 使用matplotlib库创建一个散点图,展示“理论点云”和“偏差点云”。其中,“理论点云”的y坐标是y_correct_list,“偏差点云”的y坐标是y_list。x坐标都是15000。
4. 设置了图表的x轴和y轴的刻度间隔,范围,以及标签。同时,设置了图表的标题,以及当鼠标点击图表时的响应函数(mouse_event)。
四、完整代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2023-08-20 9:32
# @Author : Leuanghing Chen
# @Blog : https://blog.csdn.net/weixin_46153372?spm=1010.2135.3001.5421
# @File : 激光雷达码盘偏摆角的真假点映射关系.py
# @Software : PyCharmimport math
from matplotlib import pyplot as plt
from matplotlib.pyplot import MultipleLocator, FormatStrFormatter
import random# 鼠标点击时显示一个点的坐标
def mouse_event(event):print('x: {} and y: {}'.format(event.xdata, event.ydata))if __name__ == '__main__':offset_point_list = []correct_point_list = []value_list = []a_list = []# 偏移点坐标值x_list = []y_list = []# 真实点集y_correct_list = []offset_angle = 0.28 # 偏差角度for correct_angle in range(3, 45, 3):# offset_angle = random.randint(0, 50) / 100 # 随机点,模拟码盘随机角度偏差offset_point = 15000/math.cos(math.radians(correct_angle + offset_angle))correct_point = 15000/math.cos(math.radians(correct_angle))value = float(offset_point) - float(correct_point)a_list.append(correct_angle)offset_point_list.append(float('%.3f' % offset_point))correct_point_list.append(float('%.3f' % correct_point))value_list.append(float('%.3f' % value))# 偏移点映射到真实点延长线上x = offset_point * math.cos(math.radians(correct_angle))y = offset_point * math.sin(math.radians(correct_angle))x_list.append(float('%.3f' % x))y_list.append(float('%.3f' % y))# 真实点集y_correct_list.append(float('%.3f' % (15000*math.tan(math.radians(correct_angle)))))# print("点偏移:", offset_point_list)# print("点实际位置:", correct_point_list)# print("点距离差值:", value_list)# print(x_list, y_list)print("映射点y坐标值:", y_list)print("映射点x坐标值:", x_list)# 绘图fig = plt.figure()cid = fig.canvas.mpl_connect('button_press_event', mouse_event)# plt.xticks(range(14900, 15500)) # 传入range数列# plt.plot(x_list, y_list, 'bo')# plt.plot([15000]*len(y_correct_list), y_correct_list, 'bo')########################################################################## 分图预览# ax1 = fig.add_subplot(311)# ax2 = fig.add_subplot(312)# ax1.plot(x_list, y_list, color='green')# ax1.plot(x_list, y_list, 'bo')# ax2.plot([15000]*len(y_correct_list), y_correct_list, color='red')# ax2.plot([15000]*len(y_correct_list), y_correct_list, 'bo')################################################################################################################################################### 数据合并plt.xticks(range(14900, 15500)) # 传入range数列b_list = []for j in range(len(y_correct_list)):b_list.append(15000)plt.rcParams['font.sans-serif'] = ['Simhei']plt.rcParams['axes.unicode_minus'] = False# 第一个散点图,颜色为红色,透明度50%,图例为散点图1plt.scatter(b_list, y_correct_list, c="r", alpha=0.5, label="理论点云")# 第二个散点图,颜色为蓝色,透明度50%,图例为散点图2plt.scatter(x_list, y_list, c="b", alpha=0.5, label="偏差点云")# settingxmajorLocator = MultipleLocator(10) # x轴刻度间隔 10ymajorLocator = MultipleLocator(500) # y轴刻度间隔 500xmajorFormatter = FormatStrFormatter('%1.2f') # x轴刻度格式为两位小数# 更改X轴和Y轴的范围plt.xlim([14990, 15080])plt.ylim([1000, 15000])plt.xlabel('X')plt.ylabel('Y')plt.tick_params(labelsize=10)plt.gca().xaxis.set_major_locator(xmajorLocator)plt.gca().yaxis.set_major_formatter(xmajorFormatter)plt.gca().yaxis.set_major_locator(ymajorLocator)# 显示图例plt.legend(loc="best")# 给标题plt.title("散点图")# 显示plt.show()