• 【激光雷达码盘偏摆角的真假点映射关系】


    激光雷达码盘偏摆角的真假点映射关系

    一、概要

      本代码主要计算激光雷达码盘偏摆角(也可以理解为雷达的零位角)导致的实际slam建图距离的偏差,只取了第一个象限作为分析目标。最终得出的结论是:如图1、2,在15米处,码盘偏摆角或者雷达的零位角偏差为0.28°,对点云图不产生畸变(即直线就是直线,不会出现弯曲等现象),只会出现点云图旋转的情况,旋转角度即为零位角偏差。仅以此文记录当时的分析过程
    在这里插入图片描述

    图1 实际点云偏差散点图

    在这里插入图片描述

    图2 点云偏转示意图

    二、完架构流程

      这段代码的主要流程可以分为以下几个部分:

      1. 初始化变量:首先,初始化了一些空列表,这些列表将用于存储计算过程中的一些值。同时,也定义了一些初始参数,比如offset_angle
      2. 计算与存储数据:然后,代码进入一个for循环,以步长为3,从3开始,到45结束。在每次循环中,根据当前的correct_angleoffset_angle计算offset_pointcorrect_point,并计算他们的差值,然后将这些值以及correct_angle添加到相应的列表中。同时,还根据offset_pointcorrect_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 : PyCharm
    
    import 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%,图例为散点图1
        plt.scatter(b_list, y_correct_list, c="r", alpha=0.5, label="理论点云")
        # 第二个散点图,颜色为蓝色,透明度50%,图例为散点图2
        plt.scatter(x_list, y_list, c="b", alpha=0.5, label="偏差点云")
    
        # setting
        xmajorLocator = MultipleLocator(10)  # x轴刻度间隔 10
        ymajorLocator = MultipleLocator(500)  # y轴刻度间隔 500
        xmajorFormatter = 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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
  • 相关阅读:
    基于深度学习YOLOv8\YOLOv5的花卉识别鲜花识别检测分类系统设计
    java-php-net-python-房产交易资金管理系统计算机毕业设计程序
    PyQt5安装以及使用
    机器学习从0到1
    MYSQL练习题:报告系统状态的连续日期
    PTA 7-71 sdut-C语言实验——逆置正整数
    etcd中version,revision,mod_revision,create_revision的区别
    MySQL数据库安装步骤(图文)
    C++学习——构造函数、析构函数
    【HTML】表格行和列的合并
  • 原文地址:https://blog.csdn.net/weixin_46153372/article/details/132501510