Sophus库的使用-程序员宅基地

技术标签: SLAM基础  李代数  李群  

目录

1.基本用法        

2. 使用Sophus库来计算两个相机之间的运动

3.使用Sophus库进行位姿插值和路径生成


1.基本用法        

        Sophus是一个用于求解李群和李代数的C++库,它提供了一组基本操作和数学函数,例如构建、转换、乘法等,可以方便地进行位姿运算和优化。下面是一个使用Sophus库进行位姿运算的简单示例:

#include <iostream>
#include <sophus/so3.h>
#include <sophus/se3.h>

using namespace std;
using namespace Sophus;

int main() {

    // 构建旋转向量和平移向量
    Vector3d w(0.1, 0.2, 0.3);
    Vector3d v(1, 2, 3);

    // 构建SE(3)位姿
    SE3d T1(RotationMatrix3d(SO3d::exp(w)), v);
    cout << "T1 = " << T1.matrix() << endl;

    // 位姿求逆
    SE3d T2 = T1.inverse();
    cout << "T2 = " << T2.matrix() << endl;

    // 位姿相乘
    SE3d T3 = T1 * T2;
    cout << "T3 = " << T3.matrix() << endl;

    // 旋转矩阵和李代数转换
    Matrix3d R = SO3d::exp(w).matrix();
    Vector3d so3 = SO3d::log(SO3d(R));
    cout << "so3 = " << so3.transpose() << endl;

    // 李代数相加
    Vector3d w1(0.1, 0.0, 0.0);
    Vector3d w2(0.0, 0.2, 0.0);
    Vector3d w3 = w1 + w2;
    cout << "w3 = " << w3.transpose() << endl;

    return 0;
}

        在这个例子中,我们首先构建了一个SE(3)位姿T1,然后对其进行逆运算、乘法运算,最后将旋转矩阵和李代数相互转换。此外,还演示了如何将两个李代数相加。总的来说,Sophus库提供了一组简单而强大的工具,可以大大简化位姿运算和优化的过程。


2. 使用Sophus库来计算两个相机之间的运动

#include <iostream>
#include <vector>
#include <Eigen/Core>
#include <Eigen/Geometry>
#include "sophus/se3.hpp"

using namespace std;
using namespace Eigen;

int main(int argc, char **argv) {

  // 构造相机位姿
  // 相机1在原点,朝向z轴正方向
  Matrix3d R1 = Matrix3d::Identity();
  Vector3d t1 = Vector3d::Zero();
  Sophus::SE3d T1(R1, t1);
  cout << "camera 1 pose:\n" << T1.matrix() << endl;

  // 相机2位于(0,0,1)处,朝向与相机1相同
  Matrix3d R2 = Matrix3d::Identity();
  Vector3d t2 = Vector3d(0, 0, 1);
  Sophus::SE3d T2(R2, t2);
  cout << "camera 2 pose:\n" << T2.matrix() << endl;

  // 计算从相机1到相机2的运动
  Sophus::SE3d T12 = T2 * T1.inverse();
  cout << "camera 1 to camera 2 motion:\n" << T12.matrix() << endl;

  return 0;
}

        以上代码假设相机坐标系和世界坐标系重合,可以通过简单的修改坐标系变换来适应其他场景。


3.使用Sophus库进行位姿插值和路径生成

#include <iostream>
#include <cmath>
#include <Eigen/Core>
#include <Eigen/Geometry>
#include "se3.hpp"

using namespace std;
using namespace Eigen;

int main(int argc, char **argv) {

  // 定义起点和终点位姿
  Vector3d t1(1, 0, 0);
  Quaterniond q1(AngleAxisd(M_PI / 4, Vector3d(0, 0, 1)));
  Sophus::SE3d pose1(q1, t1);

  Vector3d t2(0, 1, 0);
  Quaterniond q2(AngleAxisd(M_PI / 2, Vector3d(1, 0, 0)));
  Sophus::SE3d pose2(q2, t2);

  // 演示位姿插值
  for (double t = 0; t <= 1; t += 0.1) {
    Sophus::SE3d interp_pose = Sophus::SE3d::interpolate(pose1, pose2, t);
    cout << "interpolated pose at t=" << t << ":\n" << interp_pose.matrix() << endl;
  }

  // 演示路径生成
  vector<Sophus::SE3d> path;
  for (double x = 0; x <= 1; x += 0.1) {
    for (double y = 0; y <= 1; y += 0.1) {
      Vector3d t(x, y, 0);
      Quaterniond q(AngleAxisd(M_PI / 4, Vector3d(0, 0, 1)));
      Sophus::SE3d pose(q, t);
      path.push_back(pose);
    }
  }

  // 输出路径中的位姿
  for (size_t i = 0; i < path.size(); ++i) {
    cout << "pose " << i << ":\n" << path[i].matrix() << endl;
  }

  return 0;
}

李群和李代数是数学中的两个重要概念,它们在很多领域中都有广泛的应用。在机器人、计算机视觉、自动驾驶、SLAM等领域中,李群和李代数也被广泛地使用。

简单来说,李群和李代数是一种用于描述旋转和平移的数学工具。其中,李群描述的是旋转和平移等连续的运动,李代数描述的是这些连续运动的切空间,即速度和角速度等。

在机器人、计算机视觉等领域中,通常需要对机器人或摄像头进行位姿估计或运动控制,这就需要对旋转和平移进行建模。使用李群和李代数可以将旋转和平移建模成一个数学上的对象,并对其进行运算和优化。

例如,对于机器人或摄像头的位姿估计,通常会使用李群和李代数描述其运动,同时也会使用李代数求解其运动方程。又如,对于自动驾驶中的路径规划和运动控制,也需要使用李群和李代数描述车辆的运动,以及对车辆的运动进行控制和优化。

总之,李群和李代数是描述旋转和平移的数学工具,在机器人、计算机视觉、自动驾驶、SLAM等领域中有广泛的应用。它们能够将旋转和平移等连续的运动建模成一个数学上的对象,并对其进行运算和优化。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40301351/article/details/130098187

智能推荐

搭建Angular并引入NG-ZORRO组件库_导入ng-zorro全部组件代码-程序员宅基地

文章浏览阅读551次,点赞7次,收藏11次。搭建Angular并引入NG-ZORRO组件库_导入ng-zorro全部组件代码

电脑组装笔记:手把手教你如何自己组装电脑_电脑组装教程-程序员宅基地

文章浏览阅读3.5k次,点赞3次,收藏27次。电脑组装基本操作:手把手教你如何自己组装电脑第一步:安装CPU拆开所有包装后的第一步,先把CPU安装到主板的CPU插座上。先要把插座上的保护盖翻开,然后再把CPU放入CPU插座。然后把cp..._电脑组装教程

51单片机实现LCD1602的显示_pz51 lcd1602-程序员宅基地

文章浏览阅读1.3k次。51单片机实现LCD1602的显示_pz51 lcd1602

视频编解码(一):ffmpeg编码H.264帧类型判断_max_b_frames-程序员宅基地

文章浏览阅读1w次,点赞3次,收藏29次。本文主要讲述ffmpeg编码过程中是如何设置I帧,B帧及P帧的,以及如何通过代码判断帧类型。之前看过很多网上的文章,讲述如何判断I帧,B帧,P帧,然而都是停留在H.264官方文档中的定义,如果不结合ffmpeg,就仿佛纸上谈兵,有点不切实际,而且很多文章将I帧与I Slice混为一谈,将I Slice当做I帧,这其实是错的。本文就结合ffmpeg讲解ffmpeg中是如何编码各种帧类型的,并纠正..._max_b_frames

杂谈---2013年,总结?吐槽?灌水?-程序员宅基地

文章浏览阅读678次。引言   最近看到不少猿友都纷纷总结起自己的2013年,LZ也赶赶热潮,对自己一年的收获与失去来个大阅兵,这确实有助于自己来年的规划。如果各位猿友不喜欢写博客,也应该以其它的方式对自己进行总结,相信总是有好处的。至于LZ,已经习惯了博客,因此就暂且采取这种方式了。不过LZ也只是让手指在键盘上随心而动,所以难免是水文一篇,各位猿友尽可一笑而过。 技术方面    既然是一个技术

SpringSecurity自定义登录验证成功与失败的结果处理_在spring security6.0中,如何不走savedrequestawareauthenti-程序员宅基地

文章浏览阅读1.2k次。需要自定义登录结果的场景当我们登录成功的时候,是由AuthenticationSuccessHandler进行登录结果处理,默认跳转到defaultSuccessUrl配置的路径对应的资源页面(一般是首页index.html)。当我们登录失败的时候,是由AuthenticationfailureHandler进行登录结果处理,默认跳转到failureUrl配置的路径对应的资源页面(一般是登录页login.html)。但是在web应用开发过程中需求是千变万化的,有时需要我们针对登录结果做个性化处理,比如_在spring security6.0中,如何不走savedrequestawareauthenticationsuccesshandler

随便推点

当当网商品详情数据接口方法丨当当商品详情API接口文档_当当网图书api接口c#开发实例下载-程序员宅基地

文章浏览阅读350次,点赞6次,收藏7次。获取商品描述信息:通过调用接口方法,可以获取商品的详细描述信息,包括商品的图片、规格参数、包装清单等。获取商品推荐信息:通过调用接口方法,可以获取商品的推荐信息,包括同类别的其他商品推荐、热销商品推荐等。获取商品基本信息:通过调用接口方法,可以获取商品的基本信息,包括商品的标题、价格、销量、评分等。获取商品库存信息:通过调用接口方法,可以获取商品的库存信息,包括商品的库存数量、预计发货时间等。获取商品评论信息:通过调用接口方法,可以获取商品的用户评论信息,包括评论内容、评分、好评率等。_当当网图书api接口c#开发实例下载

实现从oss(阿里云)服务器批量下载文件_oss按照文件夹下载-程序员宅基地

文章浏览阅读2.4w次,点赞6次,收藏28次。参考链接:开放式存储(OSS)Java API手册 1.0 documentation一、OSS上同一路径下文件批量下载假设OSS上Bucket中有四个文件:fun/like/001.avi、fun/like/002.avi、fun/like/003.jpg、fun/like/004.mp3,批量下载四个文件,并将四个文件存储本地路径:“D:/fun/like/”下,即:D:/fun/like/(..._oss按照文件夹下载

MySQL中benchmark_MySQL的benchmark函数-程序员宅基地

文章浏览阅读241次。MySQL实现了很多独特的函数,有时候使用起来是非常的方便,或许这就是开源的好处吧。这里记录一下benchmark函数,一个用于测试MySQL函数性能的函数。benchmark函数只有两个参数,第一个是执行次数,第二个是要测试的函数或者表达式。返回的结果始终是0,执行时间才是我们需要的结果:mysql> select benchmark(1e8,current_date());+——————..._mysql benchmark(

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java小区宠物管理系统k8n96_小区宠物管理源码-程序员宅基地

文章浏览阅读137次。选好题目最起码有方向,接下来找相应的源代码进行参考就行,下面的选题有合适的选题源代码可以在文末尾进行获取参考。做毕业设计的过程也是不断修正的过程要和自己的计划安排进行比对,慢了要赶工,快了可以调整工作量。选题的确定需要查阅大量的资料,要搞清楚自己大概想要研究的方向是什么。可以选择自己感兴趣的学科或者强势的学科进行研究,同时要多和毕业指导老师多交流,征求老师的意见和建议,最后确立选题。ssm基于SSM的社区疫情防控管理信息系统的设计与实现khjit。ssm基于SSM的资产管理平台的设计与实现hx448。_小区宠物管理源码

ArcSDE10.x创建企业级地理数据库报:The geodatabase system table could not be created.GDB_Items : Error (-51)_arcmap建立数据库gdb_tables_last_modified : error (-51)-程序员宅基地

文章浏览阅读8.7k次。环境ArcGIS10.x for Desktop、Oracle11g问题使用ArcGIS 10.x for Desktop的Create Enterprise Geodatabase工具创建企业级地理数据库,出现错误:Executing: EnableEnterpriseGeodatabase "Database Connections\Connection to 10.20.128.230.sd_arcmap建立数据库gdb_tables_last_modified : error (-51)

实践计算机系统要素—编译器(1)_计算机编译器是什么-程序员宅基地

文章浏览阅读898次。 2009.11.08 晚上 于浦东家中 每当有所收获,便欣喜若狂,每每这时都非常渴望能够将这份喜悦与大家一起分享。我读过计算机书籍不能算多,但也不少,给我冲击最大的有三本书,游戏编程大师技巧(3D版),道法自然,计算机系统要素,大师技巧让我感慨怎么能有人将游戏开发讲解的如此透彻,让人感觉直击理论本质;道法自然让我感觉到了软件工程和设计模式在实际中是如何被应用的,计算机系统要_计算机编译器是什么

推荐文章

热门文章

相关标签