重頭開始學ROS(6)---Eigen庫安裝與使用

Eigen

矩陣運算是一種非常重要的運算方式,在Matlab中,矩陣運算可以輕松的實現,但在C++這種偏底層的語言中,若不借助第三方庫,矩陣運算需要我們進行較為復雜的代碼設計。Eigen庫是一個用于線性運算的C++模板庫,它支持矩陣運算、矢量運算、數值分析以及相關的算法,安裝Eigen庫可以大大提高我們的開發效率。

安裝與配置Eigen

安裝

在ubuntu系統中,安裝Eigen庫較為簡單,只需在命令行中運行

sudo apt-get install libeigen3-dev

之后,我們可以在系統中找到/usr/include/eigen3,這證明我們安裝成功

Vscode配置

使用Vscode可以很方便地配置Eigen庫的編譯,在c_cpp_properties.jsonincludepath中添加"/usr/include/**"即可,如果已經有了那就無需再添加。

{"configurations": [{"browse": {"databaseFilename": "${default}","limitSymbolsToIncludedHeaders": false},"includePath": ["/opt/ros/noetic/include/**","/usr/include/**","/home/aliang/vehicle_sim/devel/include/**"],"name": "ROS","intelliSenseMode": "gcc-x64","compilerPath": "/usr/bin/gcc","cStandard": "gnu11","cppStandard": "c++17"}],"version": 4
}

ROS中配置

ROS中,我們還需在功能包的CMakeList中添加:

include_directories("/usr/include/eigen3")

這樣我們就可以在程序中用這種方法引入包:

    #include <Eigen/Eigen>#include <Eigen/Dense>#include <Eigen/Geometry>#include <Eigen/Eigenvalues>

否則,需要使用這種方法引入包:

    #include <eigen3/Eigen/Eigen>#include <eigen3/Eigen/Dense>#include <eigen3/Eigen/Geometry>#include <eigen3/Eigen/Eigenvalues>

驗證是否可以正常使用

ROS的功能包下新建一個cpp文件

#include <Eigen/Eigen>
#include <Eigen/Dense>
#include <Eigen/Geometry>
#include <Eigen/Eigenvalues>int main(int argc, char *argv[]){// here is an arbitrary normal vector
// initialized to (1,2,3) upon instantiationEigen::Vector3d normal_vec(1,2,3); return 0;
}

CMakeList中加入

add_executable(vec_compute src/compute.cpp)
target_link_libraries(vec_compute ${catkin_LIBRARIES})

編譯通過,證明可以正常使用

基于Eigen庫的RBF徑向基核函數的二維曲線擬合

RBF徑向基核函數的二維曲線擬合

RBF徑向基核函數的二維曲線擬合的核心在于,根據 N N N個擬合點求解出 N N N個徑向基核函數( N N N個徑向基核函數分別對應 N N N個擬合點)的加權數。對于目標二維曲線 F ( x , y ) = 1 F(x,y)=1 F(x,y)=1即優化下列方程:
∑ k = 1 N w k ? f ( r ) = 1 \sum_{k=1}^N w_k*f(r) = 1 k=1N?wk??f(r)=1
展開為向量形式:
( f ( ∣ ∣ q ? q 1 ∣ ∣ ) f ( ∣ ∣ q ? q 2 ∣ ∣ ) ? f ( ∣ ∣ q ? q N ∣ ∣ ) ) ? ( w 1 w 2 ? w N ) = 1 \begin{pmatrix} f(||q-q_1||) & f(||q-q_2||) & \cdots & f(||q-q_N||) \end{pmatrix}* \begin{pmatrix} w_1\\ w_2\\ \vdots\\ w_N \end{pmatrix}=1 (f(∣∣q?q1?∣∣)?f(∣∣q?q2?∣∣)???f(∣∣q?qN?∣∣)?)? ?w1?w2??wN?? ?=1
其中 q N q_N qN?表示被擬合的 N N N個點,由于每個被擬合點都滿足該公式,替換掉 q q q,可以再次展開為:
( f ( ∣ ∣ q 1 ? q 1 ∣ ∣ ) f ( ∣ ∣ q 1 ? q 2 ∣ ∣ ) ? f ( ∣ ∣ q 1 ? q N ∣ ∣ ) f ( ∣ ∣ q 2 ? q 1 ∣ ∣ ) f ( ∣ ∣ q 2 ? q 2 ∣ ∣ ) ? f ( ∣ ∣ q 2 ? q N ∣ ∣ ) ? ? ? ? f ( ∣ ∣ q N ? q 1 ∣ ∣ ) f ( ∣ ∣ q N ? q 2 ∣ ∣ ) ? f ( ∣ ∣ q N ? q N ∣ ∣ ) ) ? ( w 1 w 2 ? w N ) = 1 \begin{pmatrix} f(||q_1-q_1||) & f(||q_1-q_2||) & \cdots & f(||q_1-q_N||)\\ f(||q_2-q_1||) & f(||q_2-q_2||) & \cdots & f(||q_2-q_N||)\\ \vdots & \vdots & \ddots & \vdots\\ f(||q_N-q_1||) & f(||q_N-q_2||) & \cdots & f(||q_N-q_N||)\\ \end{pmatrix}* \begin{pmatrix} w_1\\ w_2\\ \vdots\\ w_N \end{pmatrix}=1 ?f(∣∣q1??q1?∣∣)f(∣∣q2??q1?∣∣)?f(∣∣qN??q1?∣∣)?f(∣∣q1??q2?∣∣)f(∣∣q2??q2?∣∣)?f(∣∣qN??q2?∣∣)??????f(∣∣q1??qN?∣∣)f(∣∣q2??qN?∣∣)?f(∣∣qN??qN?∣∣)? ?? ?w1?w2??wN?? ?=1
左邊的矩陣可以看為一個Gram相關矩陣形式,則可以求出我們想要的 w ? \vec{w} w

w ? = G r a m M a t r i x N × N ? 1 ? 1 N × 1 \vec{w} = GramMatrix^{-1}_{N \times N}*1_{N \times 1} w =GramMatrixN×N?1??1N×1?

選取徑向基核函數為 f ( r ) = r 2 l n ( r + 1 ) f(r)=r^2ln(r+1) f(r)=r2ln(r+1)

基于Eigen庫的實現

#include <Eigen/Eigen>
#include <Eigen/Dense>
#include <Eigen/Geometry>
#include <Eigen/Eigenvalues>
#include <iostream>
#include <cmath>int main(int argc, char *argv[]){int num = 6;Eigen::MatrixXd p_x(1, num);Eigen::MatrixXd dis_x(num, num);Eigen::MatrixXd p_y(1, num);Eigen::MatrixXd dis_y(num, num);Eigen::MatrixXd dis_sqr(num, num);Eigen::MatrixXd dis_r(num, num);Eigen::MatrixXd w(num, 1);p_x << 1.5, 1.5, -0.75, -3, -0.75, 1.5;p_y << 0, 2.6, 1.3, 0, -1.3, -2.6;Eigen::MatrixXd mat_x = p_x.replicate(num, 1); // 該函數將p_x作為一個矩陣元素,填充出n*m的矩陣Eigen::MatrixXd mat_y = p_y.replicate(num, 1);mat_x = mat_x - p_x.transpose().replicate(1, num);mat_y = mat_y - p_y.transpose().replicate(1, num);dis_x = mat_x.cwiseProduct(mat_x); //對應位置相乘dis_y = mat_y.cwiseProduct(mat_y);dis_sqr = dis_x + dis_y;dis_r = dis_sqr.unaryExpr([](double x){return std::sqrt(x);});std::cout << "矩陣:\n" << dis_r << std::endl;dis_r = dis_r.unaryExpr([](double x){return x*x*log(x+1);});dis_r = dis_r.inverse();w = dis_r.rowwise().sum();std::cout << "矩陣:\n" << w << std::endl;return 0;
}

Matlab計算結果相同

w=-0.04752690.0351389-0.04752050.0351453-0.04752050.0351389

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/86850.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86850.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86850.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【STM32】外部中斷

STM32 外部中斷&#xff08;EXTI&#xff09;概述 這篇文章結合示例代碼&#xff0c;系統性地講述 STM32 外部中斷&#xff08;EXTI&#xff09;實驗的原理、以及配置流程。目的在于輔助讀者掌握STM32F1 外部中斷機制。 STM32F1xx官方資料&#xff1a;《STM32中文參考手冊V10》…

LeetCode Hot100 算法題 (矩陣篇)

1、73. 矩陣置零 給定一個 m x n 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 示例 1&#xff1a; 輸入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 輸出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]// 將第一行…

Flutter基礎(項目創建)

一、使用命令行創建項目 1. 確認 Flutter 環境正常 要保證 Flutter SDK 已經正確安裝&#xff0c;并且環境變量配置無誤。可以通過執行以下命令來驗證&#xff1a; flutter doctor 要保證所有檢查項都顯示綠色對勾&#xff0c;要是有問題&#xff0c;可按照提示進行修復。 …

【Actix Web】Rust Web開發實戰:Actix Web框架全面指南(2025企業級應用版)

? 在2025年高并發、低延遲成為Web服務核心指標的背景下&#xff0c;??Actix Web憑借異步Actor模型與零成本抽象??&#xff0c;成為Rust生態中生產環境部署率最高的Web框架。本指南深入解析Actix Web 4.0核心技術&#xff0c;覆蓋??百萬級并發架構設計??、??內存安全…

HTML之常用基礎標簽

HTML之常用基礎標簽 一、HTML文檔基本結構標簽1. <html>標簽2. <head>標簽3. <body>標簽 二、文本相關基礎標簽1. 標題標簽&#xff08;<h1> - <h6>&#xff09;2. 段落標簽&#xff08;<p>&#xff09;3. 換行標簽&#xff08;<br>…

外鍵列索引優化:加速JOIN查詢的關鍵

在使用數據庫時&#xff0c;特別是在執行涉及JOIN操作的查詢時&#xff0c;優化外鍵列的索引是非常重要的。外鍵通常用于建立表之間的關聯&#xff0c;而JOIN操作則是基于這些外鍵列來實現的。下面是一些關鍵步驟和技巧&#xff0c;可以幫助你優化外鍵列的索引&#xff0c;從而…

2025年 UI 自動化框架使用排行

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 </

【軟考高項論文】論信息系統項目的整體管理

摘要 在信息系統項目的管理中&#xff0c;整體管理處于核心地位&#xff0c;對項目全局規劃與協調起著關鍵作用&#xff0c;保障項目各階段目標一致且高效執行。本文結合作者參與的 2024 年 6 月啟動的信息系統項目&#xff0c;深入探討項目整體管理的過程&#xff0c;著重闡述…

(4)Wireshark捕獲設置

1.簡介 WireShark的強大之處就在于不用你再做任何配置就可以抓取http或者https的包。主要是講解和分享如何使用WireShark抓包。 2.運行Wireshark 安裝好 Wireshark 以后&#xff0c;就可以運行它來捕獲數據包了。方法如下&#xff1a; 1.在 Windows 的“開始”菜單中&#…

智慧校園電子班牌系統源碼的開發與應用,基于Java/SpringBoot后端、Vue2前端、MySQL5.7數據庫

智慧校園系統源碼&#xff0c;智慧班牌源碼&#xff0c;java語言 技術棧&#xff1a; ?后端開發?&#xff1a;采用Java語言和Spring Boot框架進行開發。Java是一種廣泛使用的、面向對象的編程語言&#xff0c;而Spring Boot是基于Spring框架的快速應用開發框架&#xff0c;能…

工程優化——WebSocket、WSS(WebSocket Secure)和SSE(Server-Sent Events)通信對比

WebSocket、WSS&#xff08;WebSocket Secure&#xff09;和SSE&#xff08;Server-Sent Events&#xff09;是三種常見的實時通信技術&#xff0c;它們的核心區別在于通信方向、協議實現、數據格式和適用場景。以下是分維度的詳細解釋&#xff0c;并附帶Python示例和應用場景選…

【TiDB 社區智慧合集】 TiDB x 運營商|掌上營業廳、賬務、物聯網等多核心業務場景的實戰應用案例

作者&#xff1a; Billmay表妹 原文來源&#xff1a; https://tidb.net/blog/bb1467af 在信息基礎設施國產化戰略加速落地的背景下&#xff0c;電信及廣電領域正迎來數據庫國產化替代的關鍵轉型期。TiDB 憑借自身技術創新優勢&#xff0c;深度攜手各大運營商&#xff0c;以全…

Java 17 下 Spring Boot 與 Pulsar 隊列集成實戰:生產者與消費者實現指南

Pulsar隊列與Springboot集成有2種模式&#xff1a;官方pulsar-client 或社區Starter&#xff08;如pulsar-spring-boot-starter&#xff09; 如果考慮最新、最快、最齊全的功能&#xff0c;使用官方pulsar-client如果考慮快速低成本接入&#xff0c;使用社區Starter&#xff0…

《Go語言高級編程》RPC 入門

《Go語言高級編程》RPC 入門 一、什么是 RPC&#xff1f; RPC&#xff08;Remote Procedure Call&#xff0c;遠程過程調用&#xff09;是分布式系統中不同節點間的通信方式&#xff0c;允許程序像調用本地函數一樣調用遠程服務的方法。 Go 語言的標準庫 net/rpc 提供了基礎的…

第N5周:Pytorch文本分類入門

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客 &#x1f356; 原作者&#xff1a;K同學啊 一、前期準備 1.加載數據 import torch import torch.nn as nn import torchvision from torchvision import transforms,datasets import os,PIL,p…

uniappx 安卓app項目本地打包運行,騰訊地圖報錯:‘鑒權失敗,請檢查你的key‘

根目錄下添加 AndroidManifest.xml 文件&#xff0c; <application><meta-data android:name"TencentMapSDK" android:value"騰訊地圖申請的key" /> </application> manifest.json 文件中添加&#xff1a; "app": {"…

【向上教育】結構化面試開口秘籍.pdf

向 上 教 育 XI A N G S H A N G E D U C A T I O N 結構化 面試 開口秘笈 目 錄 第一章 自我認知類 ........................................................................................................................... 2 第二章 工作關系處理類 .......…

Webpack 熱更新(HMR)原理詳解

&#x1f525; Webpack 熱更新&#xff08;HMR&#xff09;原理詳解 &#x1f4cc; 本文適用于 Vue、React 等使用 Webpack 的項目開發者&#xff0c;適配 Vue CLI / 自定義 Webpack 項目。 &#x1f3af; 一、什么是 HMR&#xff1f; Hot Module Replacement 是 Webpack 提供的…

MySQL索引完全指南

一、索引是什么&#xff1f;為什么這么重要&#xff1f; 索引就像字典的目錄 想象一下&#xff0c;你要在一本1000頁的字典里找"程序員"這個詞&#xff0c;你會怎么做&#xff1f; 沒有目錄&#xff1a;從第1頁開始一頁一頁翻&#xff0c;可能要翻500頁才能找到有…

學習使用dotnet-dump工具分析.net內存轉儲文件(2)

運行ShenNiusModularity項目&#xff0c;使用createdump工具dump完整的進程內存映射文件&#xff0c;然后運行dotnet-dump analyze命令加載dump文件。 ??可以先使用dumpheap命令顯示有關垃圾回收堆的信息和有關對象的收集統計信息。dumpheap支持多類參數&#xff08;如下所示…