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.pswp.cn/web/72242.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72242.shtml
英文地址,請注明出處:http://en.pswp.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…