3D激光SLAM:ALOAM---后端lasermapping通过Ceres进行帧到地图的位姿优化

简介: 上一篇博客构建了线约束和面约束,添加到了残差模块。[ALOAM:后端 lasermapping构建角点约束与面点约束本片主要介绍通过ceres构建的约束的CostFuction,及后续的通过Ceres进行位姿优化

前言

上一篇博客构建了线约束和面约束,添加到了残差模块。
[ALOAM:后端 lasermapping构建角点约束与面点约束]

本片主要介绍通过ceres构建的约束的CostFuction,及后续的通过Ceres进行位姿优化

角点的约束添加在这个地方
在这里插入图片描述
这里的CostFunction是通过LidarEdgeFactor自定义的结构体建立的
和前端里程计用的角点约束是一样的在这篇[博客]中做了分析
原理就是求当前点到a、b点构成的直线的距离作为残差

面点的约束添加在这个地方
在这里插入图片描述
输入参数有:

  • curr_point 当前点
  • norm 归一化得平面法向量
  • negative_OA_dot_norm 法向量模的倒数

代码分析

然后可以分析 这个 LidarPlaneNormFactor 自定义的结构体了

struct LidarPlaneNormFactor
{
   

    LidarPlaneNormFactor(Eigen::Vector3d curr_point_, Eigen::Vector3d plane_unit_norm_,
                         double negative_OA_dot_norm_) : curr_point(curr_point_), plane_unit_norm(plane_unit_norm_),
                                                         negative_OA_dot_norm(negative_OA_dot_norm_) {
   }

构造函数,通过生成结构体时的参数,初始化三个变量,和上面的三个是一样的

  • curr_point 当前点
  • plane_unit_norm 归一化得平面法向量
  • negative_OA_dot_norm 法向量模的倒数
    template <typename T>
    bool operator()(const T *q, const T *t, T *residual) const
    {
   

在前面说了分析Ceres的costfunction重点就是看这个重载()函数
参数模块在前,残差在后

Eigen::Quaternion<T> q_w_curr{
   q[3], q[0], q[1], q[2]};

把q转成 eigen的形式

Eigen::Matrix<T, 3, 1> t_w_curr{
   t[0], t[1], t[2]};

把t转成 eigen的形式

Eigen::Matrix<T, 3, 1> cp{
   T(curr_point.x()), T(curr_point.y()), T(curr_point.z())};

当前点 转成 eigen 的形式

        Eigen::Matrix<T, 3, 1> point_w;//当前点投影到局部地图坐标系下的点
        point_w = q_w_curr * cp + t_w_curr;//将当前点投影到局部地图坐标系下

q_w_curr和t_w_curr是当前帧到局部地图的位姿变换
上面的操作将当前点投影到局部地图上

        Eigen::Matrix<T, 3, 1> norm(T(plane_unit_norm.x()), T(plane_unit_norm.y()), T(plane_unit_norm.z()));
        residual[0] = norm.dot(point_w) + T(negative_OA_dot_norm);//求点到平面的距离

第一行就是把法向量转成eigen的形式
第二行就是求点到平面的距离
dot就是点乘,求解和前面说的一样
在这里插入图片描述
残差可以不取模,因为在ceres里面会平方的。

        return true;
    }

最后重载函数返回true即可

    static ceres::CostFunction *Create(const Eigen::Vector3d curr_point_, const Eigen::Vector3d plane_unit_norm_,
                                       const double negative_OA_dot_norm_)
    {
   
        return (new ceres::AutoDiffCostFunction<
                LidarPlaneNormFactor, 1, 4, 3>(
            new LidarPlaneNormFactor(curr_point_, plane_unit_norm_, negative_OA_dot_norm_)));
    }

定义一个Creat函数,在里面实现AutoDiffCostFunction的定义,最后返回一个CostFunction

之后可以回到后端处理cpp---lasermapping.cpp中,在前面的博客添加了角点和面点约束,在上面分析了CostFunction,下面就是调用Ceres求解了

                    // 调用Ceres求解
                    TicToc t_solver;
                    ceres::Solver::Options options;
                    options.linear_solver_type = ceres::DENSE_QR;//稠密的问题 用DENSE_QR的求解方式
                    options.max_num_iterations = 4;//最大迭代次数
                    options.minimizer_progress_to_stdout = false;
                    options.check_gradients = false;
                    options.gradient_check_relative_precision = 1e-4;
                    ceres::Solver::Summary summary;
                    ceres::Solve(options, &problem, &summary);//求解
                    printf("mapping solver time %f ms \n", t_solver.toc());//一次ceres求解的时间

就是Ceres的常规操作了, 由于涉及局部地图了,属于稠密问题,所以求解方式使用的DENSE_QR求解。最大迭代次数为4次。在终端打印一次ceres求解的时间。

Ceres优化时间测试

这优化过程中,在终端设置了这些的打印信息
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分别是:

  • 构建角点和面点约束的时间
  • 一次ceres求解的时间
  • 两次迭代优化用的时间

在这篇[ALOAM:gazebo仿真测试场景搭建]中搭建了测试场景,下面来测试下Ceres的优化时间是多少

场景是这样的,角点和面点很丰富
在这里插入图片描述

这个是ALOAM出的地图(AGV没动)
在这里插入图片描述
终端打印的数据(一帧)
在这里插入图片描述
局部地图提取的时间是0.12ms
局部地图中的角点数为1061 面点数是682
建立kd-tree的时间为0.20ms
构建角点和面点约束的时间为 1.59ms
一次ceres求解的时间为 1.75ms
两次迭代优化用的时间 为 7.04ms

相关文章
|
29天前
|
存储 前端开发 安全
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
138 5
|
存储 缓存 负载均衡
高效后端开发中的架构设计与优化策略
在当今快速发展的技术环境中,高效的后端开发不仅仅依赖于编程技能,更需要精心设计的架构和优化策略。本文探讨了如何通过合理的架构设计和优化策略,提升后端系统的性能和可维护性,以应对复杂的业务需求和大规模的用户访问。【7月更文挑战第5天】
179 1
|
存储 NoSQL 数据处理
高效数据处理与后端优化:现代技术实践与挑战
在当今数字化快速发展的环境下,高效的数据处理成为了后端开发的核心挑战之一。本文探讨了现代后端技术中的数据处理方法与优化策略,深入分析了面临的挑战及其解决方案,旨在为开发者提供实用的指导与技术思路。【7月更文挑战第4天】
195 1
|
缓存 开发框架 监控
优化后端服务响应时间的关键策略与实践
在当今数字化时代,优化后端服务响应时间至关重要。本文探讨了几种关键策略和实践方法,帮助开发团队提高系统性能和用户体验。通过合理的资源分配、技术选型和代码优化,可以有效缩短响应时间,提升系统的整体效率和稳定性。【7月更文挑战第5天】
415 0
|
10月前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
717 4
|
10月前
|
机器学习/深度学习 人工智能 算法
【AI系统】AI 编译器后端优化
AI编译器采用多层架构,首先通过前端优化将不同框架的模型转化为统一的Graph IR并进行计算图级别的优化,如图算融合、内存优化等。接着,通过后端优化,将优化后的计算图转换为TensorIR,针对单个算子进行具体实现优化,包括循环优化、算子融合等,以适应不同的硬件架构,最终生成高效执行的机器代码。后端优化是提升算子性能的关键步骤,涉及复杂的优化策略和技术。
364 3
|
11月前
|
弹性计算 运维 开发者
后端架构优化:微服务与容器化的协同进化
在现代软件开发中,后端架构的优化是提高系统性能和可维护性的关键。本文探讨了微服务架构与容器化技术如何相辅相成,共同推动后端系统的高效运行。通过分析两者的优势和挑战,我们提出了一系列最佳实践策略,旨在帮助开发者构建更加灵活、可扩展的后端服务。
|
11月前
|
Kubernetes API Docker
构建高效后端服务:微服务架构的深度实践与优化####
本文深入探讨了微服务架构在现代后端开发中的应用,通过剖析其核心概念、设计原则及实施策略,结合具体案例分析,展示了如何有效提升系统的可扩展性、可靠性和维护性。文章还详细阐述了微服务拆分的方法论、服务间通信的最佳实践、以及容器化与编排工具(如Docker和Kubernetes)的应用技巧,为读者提供了一份全面的微服务架构落地指南。 ####
|
11月前
|
存储 SQL 数据库
深入浅出后端开发之数据库优化实战
【10月更文挑战第35天】在软件开发的世界里,数据库性能直接关系到应用的响应速度和用户体验。本文将带你了解如何通过合理的索引设计、查询优化以及恰当的数据存储策略来提升数据库性能。我们将一起探索这些技巧背后的原理,并通过实际案例感受优化带来的显著效果。
208 4
|
12月前
|
监控 API 开发者
后端开发中的微服务架构实践与优化
【10月更文挑战第17天】 本文深入探讨了微服务架构在后端开发中的应用及其优化策略。通过分析微服务的核心理念、设计原则及实际案例,揭示了如何构建高效、可扩展的微服务系统。文章强调了微服务架构对于提升系统灵活性、降低耦合度的重要性,并提供了实用的优化建议,帮助开发者更好地应对复杂业务场景下的挑战。
160 7

热门文章

最新文章