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

news/2024/11/29 3:54:02/

   本文主要对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.Tprint(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.TU, _, 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_Treturn 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         00.7070         0         00         0         0

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

U =-0.7071         0   -0.7071-0.7071         0    0.70710    1.0000         0S =0.9998         0         00         0         00         0         0V_T =-1     0     00     0     10     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         00    1.0000         00         0    1.0000C =  U @ np.diag([1.0, 1.0, np.linalg.det(U) * np.linalg.det(V_T.T)]) @ V_T =0.7071   -0.7071         00.7071    0.7071         00         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.ppmy.cn/news/18589.html

相关文章

模拟实现一个简单的命令行解释器(shell)

目录 前言 环境变量与本地变量 和环境变量相关的命令 获取环境变量的三种方法 第一种 第二种 第三种 进程地址空间 页表 为什么存在进程地址空间 第一 第二 第三 进程控制 进程的产生 进程终止 进程等待 进程替换 模拟实现一个shell 前言 我们通过各种指令来实现…

Java 23种设计模式(2.创建者模式-单例设计模式)

1. 创建者模式 创建型模式分为: 单例模式工厂方法模式抽象工程模式原型模式建造者模式 什么是创建者模式? 创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。 这样可以降低系统的耦合度…

CSDN竞赛24期题解

总结 本次竞赛的主要考点在于模拟,而且需要考虑的情况还蛮多,平时复杂点的模拟很少做,这次AC也花了挺长时间,后面还是需要夯实一下基础啊。 题目列表 1.计数问题 题目描述 试计算在区间 1 到 n 的所有整数中,数字…

【Linux_】环境变量

【Linux_】环境变量 心有所向,日复一日,必有精进专栏:《Linux_》作者:沂沐沐目录 【Linux_】环境变量 什么是环境变量 常见变量 查看环境变量方法 环境变量相关的命令 通过系统调用获取或设置环境变量 环境变量通常是具有全…

LeetCode 1802. 有界数组中指定下标处的最大值(C++)

思路: 首先根据题目要求,相邻数字的差距不能大于1,所以数组中的元素分布一定是以最大元素位置为塔顶,向两边发散的金字塔状,最小值为1,这样的结构能保证数组元素和一定是最小的(只有1是重复元素…

Allegro如何输出第三方网表操作指导

Allegro如何输出第三方网表操作指导 在做PCB设计的时候,会需要输第三方网表,Allegro支持快速输出第三方网表,如下图 具体操作如下 选择File选择Export

TVM: End-to-End Optimization Stack for Deep Learning论文阅读

摘要 很多目前最为流行的深度学习框架,如 TensorFlow、MXNet、Caffe 和 PyTorch,支持在有限类型的服务器级 GPU 设备上获得加速,这种支持依赖于高度特化、供应商特定的 GPU 库。然而,专用深度学习加速器的种类越来越多&#xff0…

「数组」简析

前言 前言:研究一个数据结构的时候,首先讲的是增删改查。 文章目录前言一、一维数组1. 简介1)定义2)优点3)缺点4)使用数组的4个步骤2. 操作1)访问2)数组下标为什么从0开始&#xff1…