G2o顶点与边编程总结

在这里插入图片描述

G2o的顶点与边属于 HyperGraph 抽象类的继承OptimizableGraph 的继承。
BaseVertex<D,T> D是预测点的维度(在流形空间的最小表示)T是待估计vertex的数据类型,比如用四元数表达三维旋转的话,T就是Quaternion 类型

// 顶点的定义
VertexSE2 : public BaseVertex<3, SE2>  //2D pose Vertex, (x,y,theta)
VertexSE3 : public BaseVertex<6, Isometry3>  //6d vector (x,y,z,qx,qy,qz) (note that we leave out the w part of the quaternion)
VertexPointXY : public BaseVertex<2, Vector2>
VertexPointXYZ : public BaseVertex<3, Vector3>
VertexSBAPointXYZ : public BaseVertex<3, Vector3>// SE3 Vertex parameterized internally with a transformation matrix and externally with its exponential map
VertexSE3Expmap : public BaseVertex<6, SE3Quat>// SBACam Vertex, (x,y,z,qw,qx,qy,qz),(x,y,z,qx,qy,qz) (note that we leave out the w part of the quaternion.
// qw is assumed to be positive, otherwise there is an ambiguity in qx,qy,qz as a rotation
VertexCam : public BaseVertex<6, SBACam>// Sim3 Vertex, (x,y,z,qw,qx,qy,qz),7d vector,(x,y,z,qx,qy,qz) (note that we leave out the w part of the quaternion.
VertexSim3Expmap : public BaseVertex<7, Sim3>

顶点的更新

virtual bool read(std::istream& is);  // 输入有数据返回True
virtual bool write(std::ostream& os) const;
virtual void oplusImpl(const number_t* update);
virtual void setToOriginImpl();
  • read,write:分别是读盘、存盘函数,一般情况下不需要进行读/写操作的话,仅仅声明一下就可以

  • setToOriginImpl:顶点重置函数,设定被优化变量的原始值。

  • oplusImpl:顶点更新函数。非常重要的一个函数,主要用于优化过程中增量△x 的计算。我们根据增量方程计算出增量之后,就是通过这个函数对估计值进行调整的,因此这个函数的内容一定要重视。

// 顶点类型是Eigen::Vector3d,属于向量,是可以通过加法来更新
class CurveFittingVertex: public g2o::BaseVertex<3, Eigen::Vector3d>
{
public:EIGEN_MAKE_ALIGNED_OPERATOR_NEWvirtual void setToOriginImpl() // 重置{_estimate << 0,0,0;}virtual void oplusImpl( const double* update ) // 更新{_estimate += Eigen::Vector3d(update);}// 存盘和读盘:留空virtual bool read( istream& in ) {}virtual bool write( ostream& out ) const {}
};
/**\* \brief SE3 Vertex parameterized internally with a transformation matrixand externally with its exponential map*/class G2O_TYPES_SBA_API VertexSE3Expmap : public BaseVertex<6, SE3Quat>{
public:EIGEN_MAKE_ALIGNED_OPERATOR_NEWVertexSE3Expmap();bool read(std::istream& is);bool write(std::ostream& os) const;virtual void setToOriginImpl() {_estimate = SE3Quat();}virtual void oplusImpl(const number_t* update_)  {Eigen::Map<const Vector6> update(update_);setEstimate(SE3Quat::exp(update)*estimate());        //更新方式}
};

SE3Quat是相机位姿类型,它内部使用了四元数表达旋转,然后加上位移来存储位姿,同时支持李代数上的运算,比如对数映射(log函数)、李代数上增量(update函数)等操作,相机位姿顶点类VertexSE3Expmap使用了李代数表示相机位姿,这是因为旋转矩阵是有约束的矩阵,它必须是正交矩阵且行列式为1。使用它作为优化变量就会引入额外的约束条件,从而增大优化的复杂度。而将旋转矩阵通过李群-李代数之间的转换关系转换为李代数表示(使用罗德里格斯公式),就可以把位姿估计变成无约束的优化问题,求解难度降低。

添加顶点

CurveFittingVertex* v = new CurveFittingVertex();
v->setEstimate( Eigen::Vector3d(0,0,0) );
v->setId(0);
optimizer.addVertex( v );
    int index = 1;for ( const Point3f p:points_3d )   // landmarks{g2o::VertexSBAPointXYZ* point = new g2o::VertexSBAPointXYZ();point->setId ( index++ );point->setEstimate ( Eigen::Vector3d ( p.x, p.y, p.z ) );point->setMarginalized ( true ); optimizer.addVertex ( point );}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/72242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【区块链】以太坊

学习视频源链接&#xff1a; https://www.bilibili.com/video/BV1Vt411X7JF/ 本文是根据肖老师的视频进行的笔记记录 bitcoin 1.0 区块链 以太坊 2.0区块链 以太坊 设置了 memory hard mining puzzle &#xff0c;这造成了asic resistance&#xff0c; 后续 proof of work &a…

凸优化算法学习笔记:决策单调性与 wqs二分

文章目录 前言决策单调性单调矩阵&#xff0c;完全单调矩阵&#xff0c;蒙日阵决策单调性优化 d p dp dp线性 d p dp dp分治&#xff08;离线&#xff09;二分队列&#xff08;在线&#xff09;SMAWK 区间 d p dp dp 练习题LOJ6039 w q s wqs wqs 二分&#xff08;蒙日阵最短…

Aop实现简单基于日志记录

目录 一、基础知识&#xff1a; 二、测试记录接口的参数和结果 一、基础知识&#xff1a; Before&#xff1a;用于执行目标方法之前的逻辑。After&#xff1a;用于执行目标方法之后的逻辑。AfterReturning&#xff1a;用于获取目标方法返回值后的逻辑。AfterThrowing&#x…

【Nacos】服务发布之优雅预热上线方案

目录 一、背景二、注册时机2.1、注册机制2.2、分析源码找到注册时机 三、注册前心跳健康检测3.1、方案实施3.2、源码分析3.3、优化代码 四、流量权重配置五、总结5.1、整体完整流程&#xff1a;5.2、流程图&#xff1a;5.1、优化方案完整代码&#xff1a; 一、背景 有些面向广…

接口自动化脚本优化的多个关键维度及具体方法总结

以下是优化接口自动化脚本的多个关键维度及具体方法&#xff0c;帮助提升测试效率、可维护性和可靠性&#xff1a; 1. 测试用例设计优化 维度优化方法参数化使用数据驱动&#xff08;如CSV、Excel、JSON&#xff09;&#xff0c;分离测试数据与逻辑&#xff0c;减少重复代码。…

AI驱动的数字供应链安全情报预警服务:云脉XSBOM

先发制人&#xff0c;精准预警数字供应链中的安全风险 Pre-emptive Strategy, Accurate Warning of Security Risks in Digital Supply Chain 云脉XSBOM数字供应链安全情报预警依托悬镜安全团队强大的供应链管理监测能力和AI安全大数据云端分析能力&#xff0c;对全球数字供应…

8051汇编--条件转移指令

在8051汇编语言中&#xff0c;控制转移指令用于改变程序的执行顺序&#xff0c;主要包括无条件转移、条件转移和调用/返回指令。以下是对这些指令的总结&#xff1a; 一、无条件转移指令 LJMP&#xff08;Long Jump&#xff09; • 功能&#xff1a;长转移&#xff0c;可以跳…

Kubernetes学习笔记-移除Nacos迁移至K8s

项目服务的配置管理和服务注册发现由原先的Nacos全面迁移到Kubernetes上。 一、移除Nacos 移除Nacos组件依赖。 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <…

算法系列之回溯算法求解数独及所有可能解

有没有对数独感兴趣的朋友呢&#xff1f;数独作为一款经典的逻辑游戏&#xff0c;其目标是在一个9x9的方格中填入数字1至9&#xff0c;确保每一行、每一列以及每一个3x3的子网格中都包含这些数字且不重复。尽管数独的规则看似简单&#xff0c;但编写一个能够自动求解数独的程序…

C++ primer plus 类和对象上

目录 前言 一 接口的设计 二 方法的设计和使用 三 构造函数 四 析构函数 五 析构函数和构造函数小结 总结 前言 前面已经描述了很多有关于类和对象的知识了&#xff0c;所以我们直接开始上手操作 一 接口的设计 首先我们要知道什么是接口 接口是一个共享框架&…

css模拟雷达扫描动画

<div class"radar-scan"><div class"radar-container" /></div> 样式&#xff1a; .radar-scan {background-image: linear-gradient(0deg,transparent 24%,rgba(32, 255, 77, 0.15) 25%,rgba(32, 255, 77, 0.15) 26%,transparent 27%,…

AdaLoRA 参数 配置:CAUSAL_LM“ 表示因果语言模型任务

AdaLoRA 参数 配置:CAUSAL_LM" 表示因果语言模型任务 config = AdaLoraConfig( init_r=16, # 增加 LoRA 矩阵的初始秩 lora_alpha=32, target_modules=[“q_proj”, “v_proj”], lora_dropout=0.1, bias=“none”, task_type=“CAUSAL_LM” ) 整体功能概述 AdaLoraCon…

C# 集合

集合 概述集合接口和类型列表(ArrayList, List)队列(Queue)栈(Statck)链表(LinkedList)有序表(SortedList)字典Lookup类其他字典类 HashSet(不重复项的无序列表)位数组BitArrayBitVector32 性能 概述 数组和Array类。数组的大小是固定的。如果元素个数是动态的&#xff0c;就应…

WebSocket与MQTT协议深度对比:选择合适的通信协议

在现代互联网应用中&#xff0c;实时通信变得愈发重要。随着物联网&#xff08;IoT&#xff09;和实时数据流的普及&#xff0c;选择合适的通信协议显得尤为关键。WebSocket和MQTT是当前最为流行的两种协议&#xff0c;它们各自有不同的应用场景、优缺点以及性能特点。在这篇文…

ELK(Elasticsearch、Logstash、Kbana)安装及Spring应用

Elasticsearch安装及Spring应用 一、引言二、基本概念1.索引&#xff08;Index&#xff09;2.类型&#xff08;Type&#xff09;3.文档&#xff08;Document&#xff09;4.分片&#xff08;Shard&#xff09;5.副本&#xff08;Replica&#xff09; 二、ELK搭建1.创建挂载的文件…

MacOS 15.3.1 安装 GPG 提示Error: unknown or unsupported macOS version: :dunno

目录 1. 问题锁定 2. 更新 Homebrew 3. 切换到新的 Homebrew 源 4. 安装 GPG 5. 检查 macOS 版本兼容性 6. 使用 MacPorts 或其他包管理器 7. 创建密钥&#xff08;生成 GPG 签名&#xff09; 往期推荐 1. 问题锁定 通常是因为你的 Homebrew 版本较旧&#xff0c;或者你…

C++:类和对象(从底层编译开始)详解[前篇]

目录 一.inline内联的详细介绍 &#xff08;1&#xff09;为什么在调用内联函数时不需要建立栈帧&#xff1a; &#xff08;2&#xff09;为什么inline声明和定义分离到两个文件会产生链接错误&#xff0c;链接是什么&#xff0c;为什么没有函数地址&#xff1a; 二.类&…

C++中,存储持续性、作用域和链接性

在C++中,存储持续性、作用域和链接性是变量和函数的重要属性,它们共同决定了变量的生命周期、可见性以及跨文件访问能力。以下是详细的总结: 1. 存储持续性(Storage Duration) 存储持续性指变量在内存中的生命周期,分为四类: 自动存储持续性(Automatic) 局部变量(函…

四种 No-SQL

在一个常规的互联网服务中&#xff0c;读取与写入的比例大约是 100:1 到 1000:1。然而&#xff0c;从硬盘读取时&#xff0c;数据库连接操作耗时&#xff0c;99% 的时间花费在磁盘寻址上。 为了优化读取性能&#xff0c;非规范化的设计通过添加冗余数据或分组数据来引入。下述…

【 Manus平替开源项目】

文章目录 Manus平替开源项目1 OpenManus1.1 简介1.2 安装教程1.3 运行 2 OWL2.1 简介2.2 安装教程2.3 运行 3 OpenHands&#xff08;原OpenDevin&#xff09;3.1 简介3.2 安装教程和运行 Manus平替开源项目 1 OpenManus 1.1 简介 开发团队: MetaGPT 核心贡献者&#xff08;5…