Python版本PathPlanning运动规划库中RotationToWorldFrame函数内部计算过程分析

news2024/9/29 7:17:24

   本文主要对Python版本PathPlanning运动规划库中RotationToWorldFrame函数的内部计算过程分析,包括相关必备python基础和计算过程分析两部分,并给出了等效的MATLAB版本计算过程程序,方便分析对比。

   (注:RotationToWorldFrame函数内部应用的SVD分解(奇异值分解)求旋转矩阵的原理,本文并不进行介绍,在本文最后给出了相关资料,本文仅分析其计算过程)

   一、相关Python基础

   1、python中的行向量、列向量、矩阵,示例程序如下:

import numpy as np

# 行向量示例
a1=np.array([[1,2,3]])
# 列向量示例
a2=np.array([[40],[50],[60]])
# 矩阵示例
a3=np.array([[1,2,3],[40,50,60]])

print(np.shape(a1))
print(np.shape(a2))
print(np.shape(a3))

   运行结果,即例子中a1、a2和a3的维数如下:

(1, 3)
(3, 1)
(2, 3)

   2 、@可用于矩阵乘法,.T表示对矩阵进行转置转置,示例程序如下:

e1 = np.array([[1.0] , [2.0] ,[3.0]])
e2 = np.array([[100.0] , [200.0] ,[300.0]])
# @表示矩阵乘法,.T表示转置
c=e1 @ e2.T

print(e1)
print(e2)
print(c)

   运行结果如下:

[[1.]
 [2.]
 [3.]]
 
[[100.]
 [200.]
 [300.]]
 
[[100. 200. 300.]
 [200. 400. 600.]
 [300. 600. 900.]]
 

   3 、奇异值分解函数SVD

   python中的奇异值分解函数如下所示,奇异值分解的相关知识在矩阵论中有介绍,这里不进行解释。

np.linalg.svd(a, full_matrices=True, compute_uv=True)

   其中:

   (1) a : 是一个形如(M,N)矩阵

   (2)full_matrices:的取值是为0或者1,默认值为1,此时u的大小为(M,M),v的大小为(N,N) 。否则u的大小为(M,K),v的大小为(K,N) ,K=min(M,N)。

   (3)compute_uv:取值是为0或者1,默认值为1,表示计算u,s,v。为0的时候只计算s。



   4、python中可以用det()函数求取矩阵求行列式(标量),如下所示,其中a是要求行列式的矩阵

np.linalg.det(a)

   5、python中可以用 np.diag(a)来构建对角矩阵 中,当a是一个1维数组/向量时, np.diag(a)输出一个以一维数组为对角线元素的矩阵,当a是一个二维矩阵时, np.diag(a)输出该矩阵的对角线元素。

np.linalg.det(a)

   二、RotationToWorldFrame函数内部计算过程分析

   PathPlanning运动规划库中给出的RotationToWorldFrame函数程序如下所示:

  # RotationToWorldFrame函数用于旋转到世界坐标系
    def RotationToWorldFrame(x_start, x_goal, L):

        a1 = np.array([[(x_goal.x - x_start.x) / L],           # numpy.array用于创建一个数组
                       [(x_goal.y - x_start.y) / L], [0.0]])
        e1 = np.array([[1.0], [0.0], [0.0]])
        M = a1 @ e1.T
        U, _, V_T = np.linalg.svd(M, True, True)
        C = U @ np.diag([1.0, 1.0, np.linalg.det(U) * np.linalg.det(V_T.T)]) @ V_T

        return C

   其实,以上函数的运用了SVD分解(奇异值分解)求旋转矩阵的方法,本文对该方法的原理不进行介绍,仅分析其计算过程。

   为方便对以上程序进行分析,我绘制了以下简图

   结合以上图示容易看出,上面程序中的(x_goal.x - x_start.x) / L即为cos(a),(x_goal.y - x_start.y) / L即为sin(a),因此,容易求得M的取值如下所示:

[cos(a), 0, 0]
[sin(a), 0, 0]
[     0, 0, 0]

   当a取π/4时,M的取值如下:

    0.7070         0         0
    0.7070         0         0
         0         0         0

   此时,使用svd函数进行奇异值分解得到的U、 S 、V_T,如下所示:

U =

   -0.7071         0   -0.7071
   -0.7071         0    0.7071
         0    1.0000         0


S =

    0.9998         0         0
         0         0         0
         0         0         0


V_T =

    -1     0     0
     0     0     1
     0     1     0

   此时,容易得到det(U)和det(V)的值均为1,从而此时:


np.diag([1.0, 1.0, np.linalg.det(U) * np.linalg.det(V_T.T)]) 

=

 1.0000         0         0
         0    1.0000         0
         0         0    1.0000


C =  U @ np.diag([1.0, 1.0, np.linalg.det(U) * np.linalg.det(V_T.T)]) @ V_T 
  =


0.7071   -0.7071         0
    0.7071    0.7071         0
         0         0    1.0000



   接下来,我们用MATLAB来复现一下以上RotationToWorldFrame(x_start, x_goal, L)函数的计算过程,程序如下,并设旋转角度a=π/6

% 设定选择角度a
a=pi/6;

b=[cos(a); sin(a); 0];
c=[1 0 0];

M=b*c

[U, S ,V_T]=svd(M)

V=V_T';

N=diag([1.0, 1.0, det(U) * det(V)])

C=U*N*V

% 绕Z轴旋转a度的坐标旋转矩阵计算结果

C2=[cos(a),-sin(a),0;sin(a),cos(a),0;0,0,1]

   通过以上程序,我们在MATLAB的实时脚本中可以很方便的得到各个变量的值,如下图所示:


   因此,容易得出,以上函数的计算结果C,通过机器人学当中介绍的三维空间下绕z轴旋转a度的坐标旋转矩阵也可以得到,如下图所示(下图标的为旋转θ度的情况)

   所以,看起来好像直接用三维空间下绕z轴旋转a度的坐标旋转矩阵计算,就可以得到跟RotationToWorldFrame函数经过复杂且不容易理解的内部计算相同的计算结果。


   最后,放一下SVD分解(奇异值分解)求旋转矩阵原理介绍的一些资料,有兴趣的可以去看一下

   1、相关论文 Least-Squares Rigid Motion Using SVD【点击可跳转】

   2、上述论文的相关笔记 SVD求解旋转矩阵【点击可跳转】

   3、相关博客 SVD计算旋转,平移矩阵【点击可跳转】


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/174650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【春节旅游攻略】南京周边出发,小众又好玩的景点推荐

【写在前面】 过年了,今天咱不谈技术,聊聊轻松的话题,旅游,其实博主很喜欢去外面走走看的,特汇总了一个4天3晚的旅行攻略,说走就走,带上自己的亲人多看看外面的锦世繁华。 三人行,…

使用最小二乘法和最大似然法估计非线性模型

专注系列化、高质量的R语言教程推文索引 | 联系小编 | 付费合集本文是年前的最后一篇推文,我们来学习一下使用最小二乘法和最大似然法进行非线性模型估计。模型估计是指,在模型形式已知的情况下,求解出可以使已有数据与模型形式最大程度上相符…

【日常系列】LeetCode《28·动态规划3》

数据规模->时间复杂度 <10^4 &#x1f62e;(n^2) <10^7:o(nlogn) <10^8:o(n) 10^8<:o(logn),o(1) 内容 二维数组中的路径问题 买卖股票的最佳时机 lc 62【剑指 098】【top100】&#xff1a;不同路径 https://leetcode.cn/problems/unique-paths/ 提示&#x…

分享优秀的视频地址

【2022 RISC-V中国峰会-芯来演讲合集】https://www.bilibili.com/video/BV1mV4y1W785?vd_source733efcf14020a43e7dac58e4c28ca0c8【计算机组成与设计&#xff1a;RISC-V【浙江大学】】https://www.bilibili.com/video/BV1tz411z7GN?vd_source733efcf14020a43e7dac58e4c28ca0…

【Dat图片的位异或解密】

文章目录 异或一、图片字节标识二、开始异或计算异或 异或(eor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为"⊕"&#xff0c;计算机符号为"eor"。其运算法则为: a⊕b (a ∧ b) ∨ (a ∧b) 如果a、b两个值不相同&#xff0c;则异或结果为1。…

Tkinter的Label与Button

Tkinter是Python的一个内置包&#xff0c;主要用于简单的界面设计&#xff0c;使用起来非常方便。 目录 一、创建界面 1. 具体步骤 1.1 导入tkinter包 1.2 tk.Tk()函数&#xff1a;创建一个主界面&#xff0c;并命名为root 1.3 root.title()函数&#xff1a;给root界面设置…

API 接口案例--基于 MySQL 数据库 + Express对外提供用户列表的 API 接口服务

API 接口案例1. 案例需求2. 主要的实现步骤3. 搭建项目的基本结构4. 创建基本的服务器5. 创建 db 数据库操作模块6. 创建 user_ctrl 模块7. 创建 user_router 模块8. 导入并挂载路由模块9. 使用 try…catch 捕获异常1. 案例需求 基于 MySQL 数据库 Express 对外提供用户列表的…

【论文速递】WACV2022 - 基于小样本分割的多尺度Non-Novel片段消除方法

【论文速递】WACV2022 - 基于小样本分割的多尺度Non-Novel片段消除方法 【论文原文】&#xff1a;Elimination of Non-Novel Segments at Multi-Scale for Few-Shot Segmentation 获取地址&#xff1a;https://openaccess.thecvf.com/content/WACV2023/papers/Kayabasi_Elimi…

【睿睿的2022年度总结和2023的目标】

博客主页&#xff1a;张栩睿的博客主页欢迎关注&#xff1a;点赞收藏留言系列专栏&#xff1a;c语言学习家人们写博客真的很花时间的&#xff0c;你们的点赞和关注对我真的很重要&#xff0c;希望各位路过的朋友们能多多点赞并关注我&#xff0c;我会随时互关的&#xff0c;欢迎…

畅捷通T+与道一云对接集成报销凭证

畅捷通T与道一云对接集成获取报销信息列表连通凭证创建(报销保险费&#xff08;甘肃&#xff09;)数据源系统:道一云在道一云坚实的技术基础上&#xff0c;道一云推出全新升级的2.0产品矩阵&#xff0c;分别是低码平台、智能门户、场景应用。基于云原生底座&#xff0c;为企业提…

Allegro如何设置等长规则操作指导

Allegro如何设置等长规则操作指导 PCB设计需要给某一组信号做组间等长的时候,需要给这个组设置等长规则,如下图 以给以下两个网络设置等长规则为例 具体操作如下 打开规则管理器

【华为上机真题 2023】寻找相同子串

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

(17)go-micro微服务Prometheus监控

文章目录一 Prometheus监控介绍1.微服务监控系统promethues介绍2.微服务监控系统promethues工作流程二 Prometheus监控重要组件和重要概念1.微服务监控系统promethues重要组件2.微服务监控系统promethues重要概念三 微服务监控系统grafana看板四 Prometheus监控Grafana看板安装…

【LeetCode每日一题:1817. 查找用户活跃分钟数~~~读懂题目意思+HashMap】

题目描述 给你用户在 LeetCode 的操作日志&#xff0c;和一个整数 k 。日志用一个二维整数数组 logs 表示&#xff0c;其中每个 logs[i] [IDi, timei] 表示 ID 为 IDi 的用户在 timei 分钟时执行了某个操作。 多个用户 可以同时执行操作&#xff0c;单个用户可以在同一分钟内…

数据库 | 事务相关知识点总结

本专栏收录了数据库的知识点&#xff0c;而从本文起&#xff0c;将讲述有关于数据库设计有关知识点&#xff0c;提供给有需要的小伙伴进行学习&#xff0c;本专栏地址可以戳下面链接查看 &#x1f388; 数据库知识点总结&#xff08;持续更新中&#xff09;&#xff1a;【数据库…

LeetCode101_101. 对称二叉树

LeetCode101_101. 对称二叉树 一、描述 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1…

多表查询与7种JOINS的实现

文章目录1.案例多表连接案例说明笛卡尔积&#xff08;或交叉连接&#xff09;2. 多表查询分类讲解角度1&#xff1a;等值连接与非等值连接角度2&#xff1a;自连接与非自连接角度3&#xff1a;内连接与外连接SQL92&#xff1a;使用()创建连接3. SQL99语法实现多表查询内连接(IN…

分类回归树简单理解总结

CART 决策树 CART决策树&#xff08;Classification And Regression Tree&#xff09;&#xff0c;可以做为分类树也可以作为回归树。 什么是回归树&#xff1f; 在分类树中我们可以处理离散的数据&#xff08;数据种类有限的数据&#xff09;它输出的数据样本是数据的类别&…

E. Arithmetic Operations 根号分治

题意&#xff1a;1e5长的数组&#xff0c;ai<1e5&#xff0c;问要将其变成等差数列的最小次数&#xff1b; 分析&#xff1a; 简单分析可得 —— 显然这个答案是固定的&#xff0c;就是原数列本来就能成为等差数列的最大个数。 但是最直接的想法是 的&#xff0c;一维枚举…

java继承2023022

继承 Java的继承具有单继承的特点&#xff0c;每个子类只有一个直接父类。但是可以有无限多个间接父类注意一点&#xff1a;子类能继承过来啥&#xff1f;子类只能从被扩展的父类获得成员变量、方法和内部类&#xff08;包括内部接口、枚举&#xff09;&#xff0c;不能获得构造…