如何在C+中从Scipy重复旋转+;(本征或Qt) 我有一个与Scipy一起完成的旋转,我想用C++来复制它,使用Qt库(或者作为最后的手段)。如何做到这一点?我尝试使用QQuaternion::fromEulerAngles,但输出的Euler角度完全不同。你能告诉我如何重复这个旋转组合吗 从scipy.spatial.transform导入旋转为R r=r.自欧拉('xyz',[84.8715505575325,-18.6072424802551106.28342910934],度=真) 打印(r.as_matrix().transpose()) >>数组([[-0.26573263,0.90971132,0.31907911], [ 0.003305 , -0.33011727, 0.94393414], [ 0.9640411 , 0.25188866, 0.08471633]]) r2=R,从欧拉角度('XYZ',[90,180,90],度=真) r3=r2*r 打印(r3.as_euler('xyz',度=真)) >>阵列([0.19642533,15.41049032,19.32819967])
您可以使用Eigen并从Euler角度轻松创建旋转对象(请参见)。然而,内部/外部系统必须手动处理,需要更多的努力 使用C++11和Eigen的开发/主分支:如何在C+中从Scipy重复旋转+;(本征或Qt) 我有一个与Scipy一起完成的旋转,我想用C++来复制它,使用Qt库(或者作为最后的手段)。如何做到这一点?我尝试使用QQuaternion::fromEulerAngles,但输出的Euler角度完全不同。你能告诉我如何重复这个旋转组合吗 从scipy.spatial.transform导入旋转为R r=r.自欧拉('xyz',[84.8715505575325,-18.6072424802551106.28342910934],度=真) 打印(r.as_matrix().transpose()) >>数组([[-0.26573263,0.90971132,0.31907911], [ 0.003305 , -0.33011727, 0.94393414], [ 0.9640411 , 0.25188866, 0.08471633]]) r2=R,从欧拉角度('XYZ',[90,180,90],度=真) r3=r2*r 打印(r3.as_euler('xyz',度=真)) >>阵列([0.19642533,15.41049032,19.32819967]),c++,qt,scipy,eigen,C++,Qt,Scipy,Eigen,您可以使用Eigen并从Euler角度轻松创建旋转对象(请参见)。然而,内部/外部系统必须手动处理,需要更多的努力 使用C++11和Eigen的开发/主分支: #define _USE_MATH_DEFINES #include "Eigen/Core" #include "Eigen/Geometry" #include <iostream> #include <math.h> long double operator&quo
#define _USE_MATH_DEFINES
#include "Eigen/Core"
#include "Eigen/Geometry"
#include <iostream>
#include <math.h>
long double operator"" _deg(long double x )
{
return M_PI * x / 180;
}
int main()
{
std::cout.precision(8);
Eigen::Quaterniond r, r2, r3;
// 'xyz' - extrinsic rotation -> z*y*x
r = Eigen::AngleAxisd(106.28342910934_deg, Eigen::Vector3d::UnitZ())
* Eigen::AngleAxisd(-18.6072424802551_deg, Eigen::Vector3d::UnitY())
* Eigen::AngleAxisd(84.8715505575325_deg, Eigen::Vector3d::UnitX());
std::cout << r.matrix().transpose() << std::endl << std::endl;
// 'XYZ' - intrinsic rotation -> x*y*z
r2 = Eigen::AngleAxisd(90.0_deg, Eigen::Vector3d::UnitX())
* Eigen::AngleAxisd(180.0_deg, Eigen::Vector3d::UnitY())
* Eigen::AngleAxisd(90.0_deg, Eigen::Vector3d::UnitZ());
r3 = r2 * r;
// 'xyz' - extrinsic rotation -> z,y,x (reversed to obtain x,y,z)
std::cout << (r3.matrix().eulerAngles(2,1,0).reverse() / M_PI) * 180 << std::endl;
return 1;
}
-0.26573263 0.90971132 0.31907911
0.0033050049 -0.33011727 0.94393414
0.9640411 0.25188866 0.08471633
0.19642533
15.41049
19.3282