首页 > 编程语言 >(2-5-02)目标检测与分割:SLAM定位与地图构建(02) Deep SLAM算法+图优化算法

(2-5-02)目标检测与分割:SLAM定位与地图构建(02) Deep SLAM算法+图优化算法

时间:2025-01-04 20:58:15浏览次数:7  
标签:02 plt LiDAR 算法 SLAM np data id

2.5.2  Deep SLAM算法

Deep SLAM(Simultaneous Localization and Mapping)是一种结合深度学习技术和SLAM技术的方法,旨在通过使用深度神经网络来改进SLAM系统的性能。SLAM是一种用于在未知环境中同时估计相机(或传感器)的位置和构建地图的技术。

在Deep SLAM中,深度学习模型通常用于处理传感器数据,例如摄像头或深度传感器的数据。这些模型可以用于特征提取、图像配准、深度估计等任务,以改善SLAM系统的精度和鲁棒性。例如下面是一个简化的例子,使用深度学习算法处理LiDAR数据,具体来说是使用PointNet进行点云处理。请注意,这只是一个基本的例子,在实际应用中可能需要更复杂的处理流程和模型。

实例2-21使用PointNet处理LiDAR点云(codes/2/shensl.py

实例文件shensl.py的具体实现代码如下所示。

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras import layers
 
# 生成虚拟的LiDAR数据
def generate_lidar_data(num_points=1000):
    theta = np.linspace(0, 2*np.pi, num_points)
    x = np.cos(theta)
    y = np.sin(theta)
    z = np.zeros(num_points)
 
    # 添加一些高度差模拟不同地形
    z += 0.1 * np.sin(5 * theta)
 
    lidar_data = np.vstack((x, y, z)).T
    return lidar_data
 
# 定义PointNet模型
def create_pointnet_model():
    model = tf.keras.Sequential([
        layers.Input(shape=(3,)),  # 输入是每个点的(x, y, z)坐标
        layers.Dense(64, activation='relu'),
        layers.Dense(128, activation='relu'),
        layers.Dense(3)  # 输出是每个点的新坐标
    ])
    return model
 
# 使用PointNet进行LiDAR数据处理
def process_lidar_data(lidar_data, model):
    # 归一化LiDAR数据
    lidar_data_normalized = lidar_data / np.max(np.abs(lidar_data), axis=0)
 
    # 使用PointNet进行处理
    processed_data = model.predict(np.expand_dims(lidar_data_normalized, axis=0))[0]
 
    return processed_data
 
# 可视化LiDAR数据处理结果
def visualize_results(lidar_data, processed_data):
    plt.figure(figsize=(10, 5))
 
    plt.subplot(1, 2, 1)
    plt.scatter(lidar_data[:, 0], lidar_data[:, 1], c='b', label='Original LiDAR Data')
    plt.title('Original LiDAR Data')
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.legend()
 
    plt.subplot(1, 2, 2)
    plt.scatter(processed_data[:, 0], processed_data[:, 1], c='r', label='Processed LiDAR Data')
    plt.title('Processed LiDAR Data')
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.legend()
 
    plt.tight_layout()
    plt.show()
 
if __name__ == "__main__":
    # 生成虚拟LiDAR数据
    lidar_data = generate_lidar_data()
 
    # 创建PointNet模型
    pointnet_model = create_pointnet_model()
 
    # 处理LiDAR数据
    processed_data = process_lidar_data(lidar_data, pointnet_model)
 
    # 可视化结果
    visualize_results(lidar_data, processed_data)

上述代码的实现流程如下:

  1. 首先,生成了虚拟的LiDAR数据,通过generate_lidar_data函数模拟了LiDAR传感器在平面上扫描得到的一系列点云数据,其中考虑了一些高度变化来模拟不同地形。
  2. 然后,定义了一个基本的PointNet模型。PointNet是一种用于处理点云数据的深度学习模型。在我们的例子中,该模型包括一个输入层(每个点的(x, y, z)坐标)、两个全连接隐藏层(使用ReLU激活函数),最后是一个输出层,输出每个点的新坐标。
  3. 接着,使用生成的LiDAR数据作为输入,通过PointNet模型对LiDAR数据进行处理。这一步在process_lidar_data函数中实现。首先,我们将LiDAR数据进行归一化,然后通过PointNet模型得到处理后的LiDAR数据。
  4. 然后,使用visualize_results函数将原始LiDAR数据和处理后的LiDAR数据进行可视化。在左侧的子图中,我们展示了原始LiDAR数据的分布(蓝色散点图),而右侧的子图中展示了经过PointNet处理后的LiDAR数据的分布(红色散点图)。
  5. 最后,通过plt.show()显示了可视化结果,以便更直观地比较原始LiDAR数据和PointNet处理后的结果,如图2-12所示,这有助于理解PointNet模型对LiDAR数据的影响。

图2-12  比较原始LiDAR数据和PointNet处理后的数据

2.5.3  图优化算法

使用图优化(Graph SLAM)方法,将汽车轨迹和地图表示为图结构,并通过最小化误差来估计轨迹和地图。常见的图优化库包括g2o和Ceres Solver。在智能驾驶中,Graph SLAM算法的主要功能如下所示:

  1. 传感器数据获取:智能驾驶车辆通常配备多种传感器,如激光雷达(LiDAR)、摄像头、惯性测量单元(IMU)、GPS等。这些传感器负责获取车辆周围环境的信息,包括地标、道路结构、其他车辆等。
  2. 建图(Mapping):通过激光雷达等传感器,车辆可以获取到周围环境的点云数据。这些点云数据被用于构建地图,而Graph SLAM中的图就反映了车辆在不同时间步的位置(节点)以及与周围环境的关系(边)。地图构建是一个动态的过程,车辆在行驶过程中不断更新地图。
  3. 运动估计(Localization):通过传感器数据,特别是激光雷达,车辆可以感知自己的运动,例如速度和方向。Graph SLAM利用这些信息来估计车辆的当前位置,也就是节点的位姿。这是通过考虑运动模型和传感器测量之间的关系来实现的。
  4. 图优化:Graph SLAM的核心是通过优化算法来调整图中节点的位置,以最小化传感器测量和运动模型之间的不一致性。这通常采用非线性优化技术,如最小二乘法或非线性最优化方法,以调整节点的位姿,使得图中的所有边都满足测量和运动方程。
  5. 闭环检测(Loop Closure Detection):在行驶过程中,车辆可能经过相同的地点,形成环路。为了提高地图的一致性,Graph SLAM系统需要能够检测闭环,并通过调整节点的位姿来减小闭环引入的误差。闭环检测通常使用特征匹配或相似性测量方法。
  6. 实时性和计算复杂度:在智能驾驶中,实时性对于安全性至关重要。因此,Graph SLAM系统需要在有限的时间内完成图的优化。同时,考虑到大规模的环境和复杂的传感器数据,对计算复杂度的管理也是一个挑战。

在智能驾驶中,Graph SLAM常常涉及到使用传感器数据来估计车辆的轨迹和构建周围环境的地图。请看下面的例子,演示了在智能驾驶中使用Graph SLAM算法的过程。由于智能驾驶系统通常会使用多种传感器,本实例将使用激光雷达(LiDAR)数据作为例子。这个例子中,生成了虚拟的LiDAR数据,包括车辆的轨迹和地图中的点,然后通过LiDAR测量数据构建了Graph SLAM问题。通过使用g2o库执行了图优化。最后,将真实的轨迹、真实地图点、优化后的轨迹和优化后的地图点进行了可视化比较。

实例2-22使用Graph SLAM算法优化轨迹(codes/2/tusl.py

实例文件tusl.py的具体实现代码如下所示。

import numpy as np
import g2o
import matplotlib.pyplot as plt
 
# 生成虚拟的LiDAR数据
np.random.seed(42)
num_poses = 100
true_poses = np.cumsum(np.random.randn(num_poses, 2), axis=0)
 
# 生成虚拟的地图点
num_landmarks = 20
true_landmarks = np.random.randn(num_landmarks, 2) * 5.0
 
# 生成虚拟的LiDAR测量数据
measurements = []
for pose_id, pose in enumerate(true_poses):
    for landmark_id, landmark in enumerate(true_landmarks):
        measurement = np.linalg.norm(pose - landmark) + np.random.randn() * 0.1
        measurements.append((pose_id, landmark_id, measurement))
 
# 定义Graph SLAM优化问题
optimizer = g2o.SparseOptimizer()
solver = g2o.BlockSolverSE2(g2o.LinearSolverEigenSE2())
solver = g2o.OptimizationAlgorithmLevenberg(solver)
optimizer.set_algorithm(solver)
 
# 添加节点(车辆位姿)和边(LiDAR测量)
for pose_id in range(num_poses):
    # 添加节点
    pose = g2o.VertexSE2()
    pose.set_id(pose_id)
    pose.set_estimate(g2o.SE2(true_poses[pose_id][0], true_poses[pose_id][1], 0.0))  # 调整位姿节点的初始化方式
    optimizer.add_vertex(pose)
 
    # 添加边
    for measurement in measurements:
        pose_id, landmark_id, _ = measurement
        pose = optimizer.vertex(pose_id)
        landmark = optimizer.vertex(landmark_id + num_poses)
 
        if pose is not None and landmark is not None:
            edge = g2o.EdgeSE2PointXY()
            edge.set_vertex(0, pose)
            edge.set_vertex(1, landmark)
            # 修改测量的初始化方式
            edge.set_measurement(
                np.array([[measurement[2] - np.linalg.norm(true_poses[pose_id] - true_landmarks[landmark_id])], [0.0]]))
            edge.set_information(np.identity(2) / (0.1 ** 2))  # 设置测量的协方差
            optimizer.add_edge(edge)
 
# 添加节点(地图点)
for landmark_id, landmark in enumerate(true_landmarks):
    landmark_vertex = g2o.VertexPointXY()
    landmark_vertex.set_id(landmark_id + num_poses)
    landmark_vertex.set_estimate(landmark)
    optimizer.add_vertex(landmark_vertex)
 
# 执行图优化
optimizer.initialize_optimization()
optimizer.optimize(1000)
 
# 提取优化后的结果
optimized_poses = np.array([optimizer.vertex(pose_id).estimate().to_vector()[:2] for pose_id in range(num_poses)])
optimized_landmarks = np.array([optimizer.vertex(landmark_id + num_poses).estimate() for landmark_id in range(num_landmarks)])
 
# 可视化结果
plt.figure(figsize=(10, 6))
plt.plot(true_poses[:, 0], true_poses[:, 1], 'b', label='True Poses')
plt.plot(optimized_poses[:, 0], optimized_poses[:, 1], 'r', label='Optimized Poses')
 
# 添加地图点的绘制
true_landmarks = np.array(true_landmarks)
plt.scatter(true_landmarks[:, 0], true_landmarks[:, 1], c='g', marker='o', label='True Landmarks')
plt.scatter(optimized_landmarks[:, 0], optimized_landmarks[:, 1], c='orange', marker='x', label='Optimized Landmarks')
 
plt.title('Graph SLAM Optimization with LiDAR Data')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

上述代码的实现流程如下:

  1. 首先,生成虚拟的LiDAR数据,包括车辆位姿和地图点。车辆的位姿由一系列累积的随机变化组成,地图点是随机生成的二维坐标。
  2. 然后,定义了Graph SLAM优化问题,使用g2o库来构建优化问题,其中包括车辆位姿和地图点的节点,以及LiDAR测量的边。
  3. 接着,遍历车辆位姿,为每个位姿添加一个节点,并为每个测量数据添加一个对应的边。边的信息包括车辆位姿和地图点的关联、测量值以及测量的协方差。这里需要注意的是,我们对测量进行了初始化,使其与真实测量值有一定的差异。
  4. 然后,我们为每个地图点添加一个节点,并设置初始估计值为真实的地图点坐标。
  5. 在优化部分,初始化优化器,并对整个图进行1000次优化迭代。这一步是Graph SLAM的核心,通过迭代优化,优化器尝试找到使得测量误差最小的车辆位姿和地图点坐标。
  6. 最后,提取优化后的结果,包括车辆位姿和地图点的坐标。将真实轨迹、优化后的轨迹以及真实地图点和优化后的地图点进行可视化,可以直观地比较它们之间的差异。

注意:本实例的整个实现流程包括了虚拟数据生成、优化问题的构建、优化过程的执行和结果的可视化。Graph SLAM的核心思想在于通过最小化测量误差,优化车辆位姿和地图点的估计值,从而获得更准确的轨迹和地图。另外,一个真实而功能强大的Graph SLAM系统包括很多细节,例如闭环检测、对运动模型的建模、误差建模、传感器的校准等。下面的例子是一个简化的演示,仅涉及轨迹和地图的优化。

标签:02,plt,LiDAR,算法,SLAM,np,data,id
From: https://blog.csdn.net/asd343442/article/details/144934997

相关文章

  • C语言数据结构与算法(栈和队列)
    1.栈1.栈的概念及结构栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(LastInFirstOut)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除......
  • 带你从入门到精通——机器学习(九. 聚类算法)
    建议先阅读我之前的博客,掌握一定的机器学习前置知识后再阅读本文,链接如下:带你从入门到精通——机器学习(一.机器学习概述)-CSDN博客带你从入门到精通——机器学习(二.KNN算法)-CSDN博客带你从入门到精通——机器学习(三.线性回归)-CSDN博客带你从入门到精通——机器学习(四.逻......
  • Spark职位信息推荐系统 协同过滤推荐算法 Echarts可视化 Django框架 简历投递 大数据
    博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌>......
  • 解决网站出现 502 Bad Gateway 错误
    502BadGateway错误通常是由于后端服务器(如PHP-FPM)无法正确处理请求导致的。以下是详细的排查和解决步骤:1.检查PHP-FPM服务状态检查PHP-FPM服务是否正在运行:使用命令行检查PHP-FPM服务状态:bash sudosystemctlstatusphp7.x-fpm#替换为你的PHP版本,例如......
  • 2025.1 洛谷月赛选练
    众所周知,洛谷月赛的题目质量其实是很高的。会不了一点。应该只会做绿及以上。紫及以上会标上[HardProblem]的标签。题目选自洛谷2023官方题单(1-4月)P8941[DTOI2023]D.Goodbye2022P8966觅光|SearchingforHope(easyver.)P8967追寻|PursuitofDream[HardP......
  • 2025年flask初中毕业生推荐生升学系统 程序+论文 可用于计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景在当前教育信息化的背景下,初中毕业生升学系统的建设已成为提升教育管理效率、优化资源配置的重要手段。关于教育信息化系统的研究,现有文献......
  • 2025年flask滁州市围棋协会 程序+论文 可用于计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景围棋作为中国传统文化的瑰宝,不仅蕴含着深厚的文化底蕴,还以其独特的策略性和艺术性吸引了众多爱好者的参与。滁州市作为文化底蕴丰富的城市......
  • 学期2024-2025-1 学号20241424 《计算机基础与程序设计》第15周学习总结
    学期2024-2025-1学号20241424《计算机基础与程序设计》第15周学习总结作业信息|这个作业属于2024-2025-1-计算机基础与程序设计)||-- |-- ||这个作业要求在2024-2025-1计算机基础与程序设计第15周作业||这个作业的目标|<作业总结>||作业正文|https://www.cnblogs.com/zmws/......
  • ‌2025Mechanical版,设计快人一步!
    对于工程、建筑和设计制造行业的专业人士来说,二维和三维设计、绘图及建模已成为日常工作的重要环节。一款高效的专业软件能够显著提升工作效率,节省设计任务所需的时间。最近,后台有许多关于CAD绘图软件的私信和留言。推荐一款专业的计算机辅助设计软件:AutoCADMechanical2......
  • 02专升本数据结构笔记 第二章:线性表
    专升本数据结构笔记第二章:线性表阿洛学长笔记lovettz线性表任务一线性表的定义和基本操作(阿洛学长)一、线性表的定义线性表是由n(n≥0)个类型相同的数据元素a1,a2,…,an组成的有限序列,数据元素之间是一对一的关系,记作L=(a1,a2,…,ai-1,ai,ai+1,…,an)(由n(n≥0)个......