文章目录

  • 前言
  • 一、李代数是什么?
  • 二、源码解析
    • ```1. __init__```
    • ```2. __add__```
    • ```3. magnitude```
    • ```4. exp```
    • ```5. vector```
    • ```6. matrix```
  • 三、二次开发
  • 总结

前言

有好久没更新博客,比较惭愧,这次索性给出一个深入一点的文章——在python中实现李代数。

一、李代数是什么?

简而言之,李代数可以用来描述物体在某个参考系下的状态(姿态或者位姿),可以用一个多维(三维或者六维)矢量来表示。说到李代数,就不得不提到李群,每个李群都有与之对应的李代数。懂的人都懂,我就不详细阐述了,对于做slam的人,这都是基础知识。
在此祭出《视觉slam十四讲》中的一个关系图:

在C++中有专用的sophus库,可以非常方便地调用李代数。在python中,该如何使用李代数呢?笔者在github上搜到了一个开源库,基于numpy定义了李代数,且实现了与李群的转换,使用非常方便,因此在此贡献出来。
https://github.com/franciscodominguezmateos/pySophus

二、源码解析

以旋转矩阵对应的李代数so3为例:

代码如下:

class so3(Algebra):"""3D rotation Lie algebra"""G1 = np.matrix([[0, 0, 0],[0, 0, -1],[0, 1, 0]])G2 = np.matrix([[0, 0, 1],[0, 0, 0],[-1, 0, 0]])G3 = np.matrix([[0, -1, 0],[1, 0, 0],[0, 0, 0]])def __init__(self, **kwargs):"""Algebra element constructor:param kwargs: must be `matrix = ndarray` with dimensions 3x3 or `vector = ndarray` with dimensions 1x3:type kwargs:raises TypeError, if the needed argument (matrix or vector) is not given"""if "vector" in kwargs:self.w = kwargs["vector"]elif "matrix" in kwargs:m = kwargs["matrix"]self.w = np.array([0, 0, 0])self.w[0] = m[2, 1]self.w[1] = m[0, 2]self.w[2] = m[1, 0]else:raise TypeError("Argument must be matrix or vector")def __add__(self, other):"""Returns the algebra element for the equivalent rotation as applying the given ones one after the other:param other: element to add this element to:type other: so3:return: equivalent algebra element:rtype: so3"""R1 = self.exp()R2 = other.exp()R = R1 * R2return R.log()def magnitude(self):"""Given the vector w=(wx,wy,wz) returns its norm, which is how many radians this rotation makes around the normalized vector:return: radians this rotation makes:rtype: float"""return np.linalg.norm(self.w)def exp(self):""":return: group element associated with this algebra element:rtype: SO3"""wx = self.matrix()theta = np.linalg.norm(self.w)cs = np.cos(theta)sn = np.sin(theta)I = np.eye(3)a = (sn / theta) if theta != 0 else 1b = ((1 - cs) / theta ** 2) if theta != 0 else 1 / 2.0R = I + a * wx + b * wx.dot(wx)return SO3(R)def vector(self):""":return: this algebra element represented as vector (1x3):rtype: ndarray"""return self.wdef matrix(self):""":return: this algebra element represented as skew matrix (3x3):rtype: ndarray"""return so3.G1 * self.w[0] + so3.G2 * self.w[1] + so3.G3 * self.w[2]

1. __init__

定义了李代数so3的实现方式:vector或者matrix,分别表示可以通过一个三维向量或者其反对称矩阵来生成李代数。

2. __add__

两个so3相加,等于其对应的李群(exp)相乘,然后再变成李代数(log)。

3. magnitude

给出对应的旋转角度。

4. exp

将李代数变成对应的李群,即:旋转矩阵R。

5. vector

给出李代数的矢量形式。

6. matrix

给出李代数的反对称矩阵形式。

三、二次开发

该库并没有实现李代数或者李群与四元数的转换,在此笔者自己增加了该内容,如下所示:

    def quaternion(self):""":return:  this algebra element represented as quaternion (1x4)"""theta = np.linalg.norm(self.w[:3])u = self.w[:3] / thetaq = np.zeros(4)q[0] = np.cos(0.5 * theta)q[1] = u[0] * np.sin(0.5 * theta)q[2] = u[1] * np.sin(0.5 * theta)q[3] = u[2] * np.sin(0.5 * theta)return q

基于so3给出了其到四元数的转换。方法非常简单,利用旋转向量来定义四元数:
q=[cosθ2,n⃗sinθ2]q=[cos\frac{\theta}{2}, \vec n sin\frac{\theta}{2}] q=[cos2θ​,nsin2θ​]

总结

本文分享了一种在python中实现李代数的方法,源码简单明了,只依赖于numpy库,非常实用,也便于在次基础上做二次开发。

基于python的李代数实现方法相关推荐

  1. python 赋值方法_基于Python List的赋值方法

    Python中关于对象复制有三种类型的使用方式,赋值.浅拷贝与深拷贝.他们既有区别又有联系,刚好最近碰到这一类的问题,研究下. 一.赋值 在python中,对象的赋值就是简单的对象引用,这点和C++不 ...

  2. python中构造方法和析构方法的区别_基于Python构造方法与析构方法的研究

    基于 Python 构造方法与析构方法的研究 林观德 [期刊名称] < <现代职业教育> > [年 ( 卷 ), 期] 2019(000)018 [摘要] Python 语言是 ...

  3. python检索论文_一种基于Python的音乐检索方法的研究

    应用技术 0 前言 最近两年,人们对于流行音乐的追求与需求量日益增 加,但如何保证用户能在不知歌名只知歌词的情况下,完成 自己的全方面多种类的听歌需求呢?于是,电脑工程师就推 出了"听歌识曲 ...

  4. python 矢量数据融合代码_在ArcGIS下基于Python的矢量数据处理方法

    在 ArcGIS 下基于 Python 的矢量数据处理方法 林璐 王爽 李海泉 侯兴泽 马鹏刚 [摘 要] 在 ArcGIS 中地理处理可以通过 Python 脚本语言来具体实现.通过 Python ...

  5. 基于Python的人脸识别方法

    摘要:得益于计算机硬件技术的进步以及软件算法的不断改进,近些年来人工智能技术得到了前所未有的发展,基于深.度学习的人脸识别技术也已经得到了广泛的应用,特别是在安保.金融等需要安全系数较高的领域.提出了 ...

  6. python装饰器实例-基于Python 装饰器装饰类中的方法实例

    title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...

  7. python基于什么语言-一种基于Python语言的EDA开发平台及其使用方法与流程

    本发明涉及EDA开发的技术领域,尤其是指一种基于Python语言的EDA开发平台及其使用方法. 背景技术: 目前,主流的EDA设计语言Verilog HDL能实现完整的芯片硬件逻辑电路开发,但是其代码 ...

  8. python篮球-基于Python/Java的人工智能篮球训练系统的制作方法

    本发明涉及信息技术领域,尤其涉及一种基于Python/Java的人工智能篮球训练系统. 背景技术: 人工智能的发展已经开始渗透到各行各业.经过发明人的研究和检索,发现作为篮球训练,已经有专利申请.其中 ...

  9. python怎么安装pyecharts_基于Python安装pyecharts所遇的问题及解决方法

    最近学习到数据可视化内容,老师推荐安装pyecharts,于是pip install 了一下,结果...掉坑了,下面是我的跳坑经验,如果你有类似问题,希望对你有所帮助. 第一个坑: 这个不难理解,缺少 ...

最新文章

  1. JS的trim()方法
  2. linux 内核位置无关,Linux内核启动阶段虚实地址映射
  3. 从单片机工程师的角度看嵌入式Linux
  4. 计算机专业的吸引力,计算机专业文献翻译-面向对象编程具有多方面的吸引力.doc...
  5. golang 升级到新版本_Scikit-learn新版本发布,一行代码秒升级
  6. abb机器人goto指令用法_ABB机器人指令对照---中文
  7. 全新iPhone“Pro”命名要实锤:新增配色是“原谅色”本色吧?
  8. vim“用sudo写”技巧如何工作?
  9. 从EXCEL中读出数据到数据库中
  10. 表单元素设置disabled后 支持点击事件
  11. 《现代前端技术解析》第七章读书笔记
  12. QAV250四轴穿越机安装全程详解(多图)
  13. 1901~2100年节气表
  14. 手动挡五个档位示意图_捷达档位示意图手动挡
  15. 恶意软件通信协议的应用现状分析
  16. 数据结构-C语言-严蔚敏
  17. 环状二肽,82863-65-8,cyclo(Leu-Tyr)
  18. 近期Java高级开发岗面试总结
  19. win10修改默认文件管理器
  20. 鼻炎舒宁治过敏性鼻炎

热门文章

  1. 最好的EM算法介绍-由例子介绍原理
  2. 算术的逻辑运算与指令详解
  3. 彻底解决文件路径问题
  4. java魔法师_RxJava魔法师app
  5. yum配置代理proxy
  6. 航空专场 | 无人机设计仿真流程讲解与案例实操
  7. python同步远程文件夹_python pyinotify 监控远程文件夹来实现即时全量同步
  8. druid 配置理解及监控界面参数理解
  9. 计算机课堂教学的评价,课堂教学评价表
  10. Python识别身份证号码并检查是否合法(pysseract,dlib,opencv)