李代数和旋转矩阵及变换矩阵的转换关系
李代数可以与李群相互转化
Sophus::SO3 SO3; Eigen::Vector3d so3 = SO3.log(); Sophus::SO3 SO3_R = Sophus::SO3::exp( so3 );
但是Sophus::SO3 SO3;不能用于表示旋转矩阵,实际上他是旋转矩阵的向量形式,转化为旋转矩阵要通过
// 使用对数映射获得它的李代数 Eigen::Vector3d so3 = SO3_R.log(); cout<<"so3 = "<<so3.transpose()<<endl; // hat 为向量到反对称矩阵 cout<<"so3 hat=\n"<<Sophus::SO3::hat(so3)<<endl; // 相对的,vee为反对称到向量 cout<<"so3 hat vee= "<<Sophus::SO3::vee( Sophus::SO3::hat(so3) ).transpose()<<endl; // transpose纯粹是为了输出美观一些
同样的对于SE3,
cout<<"SE3 updated = "<<endl<<SE3_updated.matrix()<<endl;
SE3_updated.matrix()并不是变化矩阵T,要通过hat得到
// 对SE(3)操作大同小异 Eigen::Vector3d t(1,0,0); // 沿X轴平移1 Sophus::SE3 SE3_Rt(R, t); // 从R,t构造SE(3) Sophus::SE3 SE3_qt(q,t); // 从q,t构造SE(3) cout<<"SE3 from R,t= "<<endl<<SE3_Rt<<endl; cout<<"SE3 from q,t= "<<endl<<SE3_qt<<endl; // 李代数se(3) 是一个六维向量,方便起见先typedef一下 typedef Eigen::Matrix<double,6,1> Vector6d; Vector6d se3 = SE3_Rt.log(); cout<<"se3 = "<<se3.transpose()<<endl; // 观察输出,会发现在Sophus中,se(3)的平移在前,旋转在后. // 同样的,有hat和vee两个算符 cout<<"se3 hat = "<<endl<<Sophus::SE3::hat(se3)<<endl; cout<<"se3 hat vee = "<<Sophus::SE3::vee( Sophus::SE3::hat(se3) ).transpose()<<endl; // 最后,演示一下更新 Vector6d update_se3; //更新量 update_se3.setZero(); update_se3(0,0) = 1e-4d; Sophus::SE3 SE3_updated = Sophus::SE3::exp(update_se3)*SE3_Rt; cout<<"SE3 updated = "<<endl<<SE3_updated.matrix()<<endl;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义