基于python的李代数实现方法
文章目录
- 前言
- 一、李代数是什么?
- 二、源码解析
- ```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的李代数实现方法相关推荐
- python 赋值方法_基于Python List的赋值方法
Python中关于对象复制有三种类型的使用方式,赋值.浅拷贝与深拷贝.他们既有区别又有联系,刚好最近碰到这一类的问题,研究下. 一.赋值 在python中,对象的赋值就是简单的对象引用,这点和C++不 ...
- python中构造方法和析构方法的区别_基于Python构造方法与析构方法的研究
基于 Python 构造方法与析构方法的研究 林观德 [期刊名称] < <现代职业教育> > [年 ( 卷 ), 期] 2019(000)018 [摘要] Python 语言是 ...
- python检索论文_一种基于Python的音乐检索方法的研究
应用技术 0 前言 最近两年,人们对于流行音乐的追求与需求量日益增 加,但如何保证用户能在不知歌名只知歌词的情况下,完成 自己的全方面多种类的听歌需求呢?于是,电脑工程师就推 出了"听歌识曲 ...
- python 矢量数据融合代码_在ArcGIS下基于Python的矢量数据处理方法
在 ArcGIS 下基于 Python 的矢量数据处理方法 林璐 王爽 李海泉 侯兴泽 马鹏刚 [摘 要] 在 ArcGIS 中地理处理可以通过 Python 脚本语言来具体实现.通过 Python ...
- 基于Python的人脸识别方法
摘要:得益于计算机硬件技术的进步以及软件算法的不断改进,近些年来人工智能技术得到了前所未有的发展,基于深.度学习的人脸识别技术也已经得到了广泛的应用,特别是在安保.金融等需要安全系数较高的领域.提出了 ...
- python装饰器实例-基于Python 装饰器装饰类中的方法实例
title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...
- python基于什么语言-一种基于Python语言的EDA开发平台及其使用方法与流程
本发明涉及EDA开发的技术领域,尤其是指一种基于Python语言的EDA开发平台及其使用方法. 背景技术: 目前,主流的EDA设计语言Verilog HDL能实现完整的芯片硬件逻辑电路开发,但是其代码 ...
- python篮球-基于Python/Java的人工智能篮球训练系统的制作方法
本发明涉及信息技术领域,尤其涉及一种基于Python/Java的人工智能篮球训练系统. 背景技术: 人工智能的发展已经开始渗透到各行各业.经过发明人的研究和检索,发现作为篮球训练,已经有专利申请.其中 ...
- python怎么安装pyecharts_基于Python安装pyecharts所遇的问题及解决方法
最近学习到数据可视化内容,老师推荐安装pyecharts,于是pip install 了一下,结果...掉坑了,下面是我的跳坑经验,如果你有类似问题,希望对你有所帮助. 第一个坑: 这个不难理解,缺少 ...
最新文章
- JS的trim()方法
- linux 内核位置无关,Linux内核启动阶段虚实地址映射
- 从单片机工程师的角度看嵌入式Linux
- 计算机专业的吸引力,计算机专业文献翻译-面向对象编程具有多方面的吸引力.doc...
- golang 升级到新版本_Scikit-learn新版本发布,一行代码秒升级
- abb机器人goto指令用法_ABB机器人指令对照---中文
- 全新iPhone“Pro”命名要实锤:新增配色是“原谅色”本色吧?
- vim“用sudo写”技巧如何工作?
- 从EXCEL中读出数据到数据库中
- 表单元素设置disabled后 支持点击事件
- 《现代前端技术解析》第七章读书笔记
- QAV250四轴穿越机安装全程详解(多图)
- 1901~2100年节气表
- 手动挡五个档位示意图_捷达档位示意图手动挡
- 恶意软件通信协议的应用现状分析
- 数据结构-C语言-严蔚敏
- 环状二肽,82863-65-8,cyclo(Leu-Tyr)
- 近期Java高级开发岗面试总结
- win10修改默认文件管理器
- 鼻炎舒宁治过敏性鼻炎