c++学习【20】slam中的PnP问题

news2024/11/19 10:25:04

考虑n个三维空间点P和它们的投影p_{1}p_{2}

\begin{bmatrix} u_{1}\\ v_{1}\\ 1\\ \end{bmatrix}=\frac{1}{Z_{w}}K\begin{bmatrix} X_{w}\\ Y_{w}\\ Z_{w}\\ \end{bmatrix}

\begin{bmatrix} X_{c}\\ Y_{c}\\ Z_{c}\\ 1 \end{bmatrix}=T\begin{bmatrix} X_{w}\\ Y_{w}\\ Z_{w}\\ 1 \end{bmatrix}第二个相机相对于第一个相机转换

\begin{bmatrix} u_{2}\\ v_{2}\\ 1 \end{bmatrix}=\frac{1}{Z_{c}}K\begin{bmatrix} X_{c}\\ Y_{c}\\ Z_{c} \end{bmatrix}现在已知\begin{bmatrix} u_{2}\\ v_{2} \end{bmatrix}\begin{bmatrix} X_{w}\\ Y_{w}\\ Z_{w} \end{bmatrix},求第二个相机相对于第一个相机转换T

K=\begin{bmatrix} f_{x} & 0& c_{x}\\ 0& f_{y}& c_{y}\\ 0& 0& 1\end{bmatrix},T=\begin{bmatrix} r_{11}& r_{12}& r_{13}& t_{1}\\ r_{21}& r_{22}& r_{23}& t_{2}\\ r_{31}& r_{32}& r_{33}& t_{3}\\ 0& 0& 0& 1\end{bmatrix}

下面随机初始化一个T,由\begin{bmatrix} X_{w}\\ Y_{w}\\ Z_{w} \end{bmatrix}可以推导出\begin{bmatrix} u_{2}\\ v_{2} \end{bmatrix},但是有误差。

 : public 表示 CurveFittingVertex 类从 g2o::BaseVertex<3, Eigen::Vector3d> 类中继承了所有的公有成员和保护成员。

class CurveFittingEdge : public g2o::BaseUnaryEdge<1, double, CurveFittingVertex> {CurveFittingEdge(double x) : BaseUnaryEdge(), _x(x) {}
这段代码中 CurveFittingEdge 类的构造函数,在创建 CurveFittingEdge 对象时会被自动调用。它接收一个 double 类型的参数 x,并使用 x 的值初始化成员变量 _x。同时,在初始化列表中调用父类 BaseUnaryEdge 的构造函数,确保 BaseUnaryEdge 成员变量正确地初始化。_x(x) 表示将传入的参数 x 赋值给类成员变量 _x。
 

// 误差模型 模板参数:观测值维度,类型,连接顶点类型
class CurveFittingEdge : public g2o::BaseUnaryEdge<1, double, CurveFittingVertex> {
public:
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW

  CurveFittingEdge(double x) : BaseUnaryEdge(), _x(x) {}

  // 计算曲线模型误差
  virtual void computeError() override {
    const CurveFittingVertex *v = static_cast<const CurveFittingVertex *> (_vertices[0]);
    const Eigen::Vector3d abc = v->estimate();
    _error(0, 0) = _measurement - std::exp(abc(0, 0) * _x * _x + abc(1, 0) * _x + abc(2, 0));
  }

  // 计算雅可比矩阵
  virtual void linearizeOplus() override {
    const CurveFittingVertex *v = static_cast<const CurveFittingVertex *> (_vertices[0]);
    const Eigen::Vector3d abc = v->estimate();
    double y = exp(abc[0] * _x * _x + abc[1] * _x + abc[2]);
    _jacobianOplusXi[0] = -_x * _x * y;
    _jacobianOplusXi[1] = -_x * y;
    _jacobianOplusXi[2] = -y;
  }

  virtual bool read(std::istream &in) {}

  virtual bool write(std::ostream &out) const {}

public:
  double _x;  // x 值, y 值为 _measurement
};

使用 override 关键字可以强制让编译器检查是否正确地覆盖了基类中的虚函数。

在 C++11 中,virtualoverride 是两个关键字,
virtual 关键字用于实现多态。
override 关键字用于标识对基类虚函数的覆盖。

#include <iostream>

class Animal {
public:
  virtual void speak() {
    std::cout << "I'm an animal" << std::endl;
  }
};

class Dog : public Animal {
public:
  virtual void speak() override {
    std::cout << "I'm a dog" << std::endl;
  }

  void bark() {
    std::cout << "Woof!" << std::endl;
  }
};

int main() {
  Dog d;
  d.speak(); // "I'm a dog"
  d.bark(); // "Woof!"
  return 0;
}

CurveFittingEdge 继承自 BaseUnaryEdge 类,而 CurveFittingVertex 没有继承自其他类。在 C++ 中,继承自其他类的子类在构造时需要先调用父类的构造函数,以保证父类的数据成员和函数成员可以正确初始化。而没有继承自其他类的类,则可以省略构造函数初始化列表,使用默认的无参构造函数完成初始化。

CurveFittingEdge::CurveFittingEdge(double x) : BaseUnaryEdge(), _x(x) {}

这里使用了模板和类型别名来定义 BlockSolver 和 LinearSolver 的类型。
其中,BlockSolverType 定义了误差项的优化变量维度为 3,误差值的维度为 1,而 LinearSolverType 定义了使用 BlockSolverType 的 PoseMatrixType 作为矩阵类型的线性求解器。PoseMatrixType 是用于描述优化变量的矩阵类型,它的大小和 BlockSolverTraits 模板参数中的维度有关。

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

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

相关文章

知识速递(六)|ChIP-seq分析要点集锦

书接上文组学知识速递&#xff08;五&#xff09;|ChIP-seq知多少&#xff1f;&#xff0c;当我们实验完成&#xff0c;拿到下机数据之后&#xff0c;我们最关心的就是&#xff0c;这个数据能不能用&#xff1f;所谓数据能不能用&#xff0c;其实我们会重点关注以下问题&#x…

预防缓存穿透工具类

1. 前言 缓存穿透大家都知道&#xff0c;这里简单过一下 缓存和数据库中都没有的数据&#xff0c;而用户不断发起请求。比如查询id -1 的值 想着很多面向C端的查询接口&#xff0c;可能都需要做一下缓存操作&#xff0c;这里简单写了个自定义注解&#xff0c;将查询结果(包含…

黄金现货价格强弱怎么看?

相对强弱指标RSI由韦尔斯.怀尔德(Welles Wilder)提出&#xff0c;最初被用于期货交易之中&#xff0c;后来人们发现该指标用在现货黄金市场上的效果也十分不错&#xff0c;并对它的特点不断进行归纳和总结&#xff0c;如今已经成为市场上被应用得最为广泛的技术指标之一。 我们…

【C++】GCC对应C++的版本支持

1、查看当前GCC的版本 pffNUC12WSKi7:~$ gcc -v Using built-in specs. COLLECT_GCCgcc COLLECT_LTO_WRAPPER/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper OFFLOAD_TARGET_NAMESnvptx-none:hsa OFFLOAD_TARGET_DEFAULT1 Target: x86_64-linux-gnu Configured with: ../src/co…

高忆管理股市资讯:保持合理息差水平 新一轮存款利率下调可期

1年期借款商场报价利率(LPR)日前再度下调&#xff0c;意味着实体经济融资本钱将随之下行。业内人士以为&#xff0c;当时商业银行负债端本钱仍显刚性&#xff0c;净息差已降至近年来低位&#xff0c;为保持合理息差水平&#xff0c;商业银行存款挂牌利率或许迎来新一轮下调。 上…

实训笔记8.25

实训笔记8.25 8.25笔记一、Flume数据采集技术1.1 Flume实现数据采集主要借助Flume的组成架构1.2 Flume采集数据的时候&#xff0c;核心是编写Flume的采集脚本xxx.conf1.2.1 脚本文件主要由五部分组成 二、Flume案例实操2.1 采集一个网络端口的数据到控制台2.1.1 分析案例的组件…

NFT Insider #104:The Sandbox:全新土地销售活动 Turkishverse 来袭

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members、BeepCrypto联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟世界类&#…

校园供水系统智能管理

import pandas as pd data1pd.read_excel("C://Users//JJH//Desktop//E//附件_一季度.xlsx") data2pd.read_excel("C://Users//JJH//Desktop//E//附件_二季度.xlsx") data3pd.read_excel("C://Users//JJH//Desktop//E//附件_三季度.xlsx") data4…

Unity3D Pico VR 手势识别 二

Unity3D Pico VR 手势识别_Cool-浩的博客-CSDN博客 此篇主要讲解怎么手势追踪&#xff0c;手势姿态自定义预制识别&#xff0c;不会导入SDK和配置环境的请看上一章节 环境要求 SDK 版本&#xff1a;2.3.0 及以上PICO 设备型号&#xff1a;PICO Neo3 和 PICO 4 系列PICO 设备系…

Elasticsearch 集成---Spark Streaming 框架集成

一.Spark Streaming 框架介绍 Spark Streaming 是 Spark core API 的扩展&#xff0c;支持实时数据流的处理&#xff0c;并且具有可扩展&#xff0c; 高吞吐量&#xff0c;容错的特点。 数据可以从许多来源获取&#xff0c;如 Kafka &#xff0c; Flume &#xff0c; Kin…

网络地址转换NAT-动态NAT的使用范围和配置-思科EI,华为数通

网络地址转换NAT-动态NAT的使用范围和配置 什么是动态NAT&#xff1f; 使用公有地址池&#xff0c;并以先到先得的原则分配这些地址。当具有私有 IP 地址的主机请求访问 Internet 时&#xff0c;动态 NAT 从地址池中选择一个未被其它主机占用的 IP 地址一对一的转化。当数据会话…

操作无法完成错误0x0000709的解决方法分享,教你快速修复错误代码问题

在使用计算机时&#xff0c;我们有时会遇到各种错误代码。其中之一是错误代码0x0000709&#xff0c;表示操作无法完成。这个错误代码可能由多种原因引起&#xff0c;但幸运的是&#xff0c;我们可以采取一些措施来解决它。本文将介绍错误代码0x0000709的含义&#xff0c;提供几…

使用vlc在线播放rtsp视频url

1. 2. 3. 工具链接&#xff1a; https://download.csdn.net/download/qq_43560721/88249440

人效九宫格城市沙龙暨《人效九宫格白皮书》发布会 —上海站,圆满结束

8月11日&#xff0c;在上海龙之梦万丽酒店&#xff0c;由盖雅工场主办的人效九宫格城市沙龙暨《人效九宫格白皮书》发布会 —上海站&#xff0c;圆满结束。 近百位来自多个行业的企业管理者及人力资源从业者汇聚一堂&#xff0c;共同探讨企业如何将盈利模式从数量增长转为质量增…

生成式 AI 在 Gartner 的 2023 年炒作周期中备受关注

原创 | 文 BFT机器人 01 背景 Gartner&#xff0c; Inc. 在其最新的 2023 年新兴技术炒作周期中&#xff0c;将生成人工智能(AI)定位于膨胀期望的顶峰&#xff0c;预计它将在未来两到五年内带来转型效益。这种人工智能变体是更广泛的新兴人工智能趋势的一部分&#xff0c;预示…

挂耳式运动耳机哪个款式戴着跑步舒服、挂耳式运动耳机推荐

对于和我一样热爱健身和运动的人来说&#xff0c;音乐就像一种调动情绪的"兴奋剂"&#xff0c;在戴上耳机、聆听着动感的音乐时&#xff0c;我们能够感受到肌肉的收缩&#xff0c;完全沉浸在自己的世界中。这种状态让我们的训练状态达到巅峰&#xff0c;快乐倍增。因…

暖手宝方案

充电暖手宝因为它的便携性&#xff0c;既能供暖又能当充电宝使用而备受人们喜爱。航誉微推出充电暖手宝方案&#xff0c;主控芯片为航誉微单片机HU系列&#xff0c;具有智能温控功能&#xff0c;可定制冷光显示屏。一、暖手宝方案原理 目前&#xff0c;市场常见的暖手宝大致有三…

大数据领域都有什么发展方向

近年来越来越多的人选择大数据行业&#xff0c;大数据行业前景不错薪资待遇好&#xff0c;各大名企对于大数据人才需求不断上涨。 大数据从业领域很宽广&#xff0c;不管是科技领域还是食品产业&#xff0c;零售业等都是需要大数据人才进行大数据的处理&#xff0c;以提供更好…

钡铼技术BL102 PLC网关案例:远程调试西门子PLC程序

网口PLC 远程下载 1、打开网关配置软件&#xff0c;点击“搜索”&#xff0c;搜索局内网网关BL102 ​2、搜索到的网关设备&#xff0c;选择要配置的设备&#xff0c;双击登录 ​3、输入登录密码登录&#xff0c;默认是123456 ​4、配置网关网口采集PLC&#xff0c;远程下载暂…

行业首家·合规典范|昂首资本携手菲律宾警察局,树立经纪商合规经营典范

Anzo Capital 昂首资本携手菲律宾达沃市警察局长阿尔贝托P卢帕兹受邀参加由 AFP-PNP Southern Mindanao Press Corps( 菲律宾武装部队(AFP)和菲律宾国家警察(PNP)南部棉兰老岛记者团)举办的新闻发布会。 本次新闻发布会在菲律宾达沃市皇家曼达亚酒店举行&#xff0c;Anzo Cap…