網站首頁 編程語言 正文
C++eigen安裝與測試
1、eigen庫安裝
1)方法一:源碼安裝(推薦)
官網下載、或git下載eigen源碼
cd eigen
mkdir build
cd build
cmake ..
sudo make install
#安裝后,頭文件安裝在/usr/local/include/eigen3/
#移動頭文件
sudo cp -r /usr/local/include/eigen3/Eigen /usr/local/include
2)方法二:直接安裝(不推薦)
這種方法安裝eigen庫,比較簡單,但是eigen不一定是最新版本。
sudo apt install libeigen3-dev
//若默認安裝的是/usr/local/include/eigen3/Eigen 下,將Eigen文件夾拷貝一份到/usr/local/include 下
sudo cp -r /usr/local/include/eigen3/Eigen /usr/local/include?
sudo cp -r /usr/local/include/eigen3 /usr/include
2、查看eigen的版本號
pkg-config --modversion eigen3
如果可以正確查看版本號,一般說明eigen庫安裝成功
C++ eigen使用
eigen幾何模塊的使用方法
旋轉向量 R
利用Eigen::AngleAxisd(參數:角度,軸)得到
//沿 Z 軸旋轉 45 度
Eigen::AngleAxisd rotation_vector ( M_PI/4, Eigen::Vector3d ( 0,0,1 ) );?
//由角軸得到旋轉變量
Eigen::Matrix3d R = Eigen::AngleAxisd(M_PI/2, Eigen::Vector3d(0,0,1)).toRotationMatrix()
旋轉矩陣 Eigen::Matrix3d
//在這里插入代碼片`旋轉向量轉換到旋轉矩陣
?rotation_vector.toRotationMatrix();?
歐拉角
//( 2,1,0 )表示ZYX順序,即roll pitch yaw順序,將旋轉矩陣轉換到歐拉角
Eigen::Vector3d rotation_matrix.eulerAngles ( 2,1,0 )
四元數
//定義四元數
Eigen::Quaterniond q = Eigen::Quaterniond (rotation_vector);
//旋轉矩陣定義四元素
q = Eigen::Quaterniond (rotation_matrix);
歐拉角與四元數相互轉換
// 歐拉角轉四元數 R-P-Y
Eigen::Vector3d eulerAngle(yaw,pitch,roll);
Eigen::AngleAxisd rollAngle(AngleAxisd(eulerAngle(2),Vector3d::UnitX()));
Eigen::AngleAxisd pitchAngle(AngleAxisd(eulerAngle(1),Vector3d::UnitY()));
Eigen::AngleAxisd yawAngle(AngleAxisd(eulerAngle(0),Vector3d::UnitZ()));
?
Eigen::Quaterniond quaternion;
quaternion=yawAngle*pitchAngle*rollAngle;
//四元數轉歐拉角 R-P-Y
Eigen::Vector3d eulerAngle=quaternion.matrix().eulerAngles(2,1,0);
四元數、歐拉角轉換實例。
以下代碼在歐拉角出現pi/2時,以及大于pi時會出現問題。
#include <iostream>
#include <cmath>
#include <eigen3/Eigen/Core>
#include <eigen3/Eigen/Geometry>
using namespace std;
int main()
{
? ? Eigen::Vector3d eulerAngle(M_PI/3,M_PI/5,M_PI/4);
? ? cout<<"roll(X) pitch(Y) yaw(Z)=\n"<< eulerAngle.transpose()<<endl<<endl;
? ? Eigen::AngleAxisd rollAngle(Eigen::AngleAxisd(eulerAngle(0),Eigen::Vector3d::UnitX()));
? ? Eigen::AngleAxisd pitchAngle(Eigen::AngleAxisd(eulerAngle(1),Eigen::Vector3d::UnitY()));
? ? Eigen::AngleAxisd yawAngle(Eigen::AngleAxisd(eulerAngle(2),Eigen::Vector3d::UnitZ()));
? ? Eigen::Quaterniond quaternion;
? ? quaternion=rollAngle*pitchAngle*yawAngle;
? ? Eigen::Vector3d eulerAngle_1=quaternion.matrix().eulerAngles(0,1,2);?
? ? cout<<"roll(X) pitch(Y) yaw(Z)=\n"<< eulerAngle_1.transpose()<<endl<<endl;?
?? ?//Eigen::Vector3d eulerAngle(roll,pitch,yaw);
?? ?//Eigen::AngleAxisd rollAngle(AngleAxisd(eulerAngle(0),Vector3d::UnitX()));
?? ?//Eigen::AngleAxisd pitchAngle(AngleAxisd(eulerAngle(1),Vector3d::UnitY()));
?? ?//Eigen::AngleAxisd yawAngle(AngleAxisd(eulerAngle(2),Vector3d::UnitZ()));
?? ?//Eigen::Quaterniond quaternion;
?? ?//quaternion=yawAngle*pitchAngle*rollAngle;
?? ?//Eigen::Vector3d eulerAngle=quaternion.matrix().eulerAngles(2,1,0);
?? ?
? ? Eigen::Quaterniond quaternion2(-0.5,0,0,1);?
? ? Eigen::Vector3d eulerAngle_2=quaternion2.matrix().eulerAngles(2,1,0);
? ? cout<<"yaw(Z) pitch(Y) roll(Z)=\n"<< eulerAngle_2.transpose()<<endl<<endl; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? return 0;
}
g++ test.cpp
tf 實現四元數到歐拉角轉換接口使用及測試
#include <iostream>
#include <tf/transform_datatypes.h>//轉換函數頭文件
#include <nav_msgs/Odometry.h>//里程計信息格式
using namespace std;
int main ()
{
? ? tf::Quaternion quat(0,0,1,-0.5);
? ? double roll, pitch, yaw;//定義存儲r\p\y的容器
? ? tf::Matrix3x3(quat).getRPY(roll, pitch, yaw);//進行轉換
? ? cout << "roll:" << roll << "\npitch:" << pitch << "\nyaw:" << yaw << endl;
? ? return 0;
}
直接編譯命令:
g++ `pkg-config --libs --cflags tf` -ldl tf_test.cpp
歐式變換矩陣(其次坐標包含R,t)
//雖然稱為3d(指3維空間的歐式坐標),實質上是4*4的矩陣, 旋轉R + 平移T
Eigen::Isometry3d T=Eigen::Isometry3d::Identity();
//按照rotation_vector進行旋轉
T.rotate (rotation_vector);
//按四元數表示的旋轉
Eigen::Isometry3d T(q);
//把平移向量設成(1,3,4)
T.pretranslate (Eigen::Vector3d ( 1,3,4 ));?
Eigen::Map 數組、向量及矩陣的引用。
double parameters[7] = {0, 0, 0, 1, 0, 0, 0};
//quaterd為parameters的引用
Eigen::Map<const Quaterniond> quaterd(parameters[0]);
//同Eigen::Map<const Quaterniond> quaterd(parameters);
//quaterd為parameters[4]的引用,由于元素地址連續
Eigen::Map<const Eigen::Vector3d> trans(parameters[0] + 4);
//同Eigen::Map<const Eigen::Vector3d> trans(parameters + 4);
引用:類似于變量的別名,一旦指定,不可改變,與變量值綁定
指針:指針存放變量的地址。可更改
總結
原文鏈接:https://blog.csdn.net/zeye5731/article/details/127495118
相關推薦
- 2022-04-28 WPF使用Grid網格面板布局_實用技巧
- 2022-09-10 PyCharm新建.py文件時默認添加信息的實現_python
- 2023-12-11 使用SSH地址拉取遠程倉庫代碼報下面的錯誤
- 2022-05-10 一文帶你了解中Typescript中type與interface的區別
- 2022-12-01 Redis的數據存儲及String類型的實現_Redis
- 2023-04-02 Python中time庫的使用(日期時間)_python
- 2022-07-29 PyTorch實現手寫數字的識別入門小白教程_python
- 2022-08-28 SpringCloudAlibaba-3.分布式事務(Seata)
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支