设线性方程 Ax = b,在 A 为方阵的前提下,请回答以下问题:
#include
#include
using namespace std;
//eigen部分
#include
//稠密矩阵的代数运算
#include
//包含QR分解
#include
//包含 Cholesky 分解
#include
/*************************************************************
*本程序实现 A 为 100 × 100 随机矩阵时,用 QR 和 Cholesky 分解求 x
*************************************************************/
int main(int argc, char** argv)
{
time_t time,start,end;
//声明一个100*100的随机矩阵m_11
Eigen::Matrix m_11=Eigen::Matrix::Random(100,100);
//产生对称矩阵,因为cholesky分解需要对正定对称矩阵进行
m_11 = m_11.transpose() * m_11;
//计算行列式
cout<<"Matrix determination:"< v_11=Eigen::Matrix::Random(100,1);
//声明未知的x
Eigen::Matrix x;
cout<<"A="<
使用 Eigen/Geometry 计算一个具体的例子。
设有小萝卜一号和小萝卜二号位于世界坐标系中。小萝卜一号的位姿为: q 1 = [0.55, 0.3, 0.2, 0.2], t 1 =
[0.7, 1.1, 0.2] T (q 的第一项为实部)
。这里的 q 和 t 表达的是 Tcw ,也就是世界到相机的变换关系。小萝卜
二号的位姿为 q 2 = [−0.1, 0.3, −0.7, 0.2], t 2 = [−0.1, 0.4, 0.8] T 。现在,小萝卜一号看到某个点在自身的坐
标系下,坐标为 p 1 = [0.5, −0.1, 0.2] T ,求该向量在小萝卜二号坐标系下的坐标。请编程实现此事,并提交
你的程序。
提示:
#include
#include
#include
#include
using namespace std;
int main() {
//输入小萝卜一号和二号的位姿
Eigen::Quaterniond q1(0.55,0.3,0.2,0.2);
q1 = q1.normalized();
Eigen::Quaterniond q2(-0.1,0.3,-0.7,0.2);
q2 = q2.normalized();
Eigen::Matrix transfor1;
transfor1<<0.7,1.1,0.2;
Eigen::Matrix transfor2;
transfor2<<-0.1,0.4,0.8;
Eigen::Matrix p1;
p1<<0.5,-0.1,0.2;
//T1是欧式变换矩阵4*4
Eigen::Isometry3d T1 = Eigen::Isometry3d::Identity();
//按照q1进行旋转
T1.rotate(q1.toRotationMatrix());
//将平移向量设成小萝卜一号的t1
T1.pretranslate(transfor1);
//根据p1在小萝卜一号坐标系中的坐标计算出世界坐标系中的坐标
p1 = T1.inverse()*p1;
//T2是小萝卜二号坐标系和世界坐标系的欧式变换矩阵
Eigen::Isometry3d T2 = Eigen::Isometry3d::Identity();
T2.rotate(q2.toRotationMatrix());
T2.pretranslate(transfor2);
p1 = T2*p1;
cout<
课程中介绍了单位四元数可以表达旋转。其中,在谈论用四元数 q 旋转点 p 时,结果为:p ′ = qpq −1 .
我们说,此时 p ′ 必定为虚四元数(实部为零)。请你验证上述说法。
此外,上式亦可写成矩阵运算:p ′ = Qp。请根据你的推导,给出矩阵 Q。注意此时 p 和 p ′ 都是四元数形式的变量,所以 Q 为 4 × 4 的矩阵。
p ′ = qpq-1 = q + p + q −1 = q + q−1⊕v.
四元数至旋转矩阵的转换方式:
R = q + q−1 ⊕.