PTPVT 插值说明
文章目录
- PTPVT 插值说明
- PTPVT 插值说明
- PVT Hermite插值
- PVT 三次多项式插值
- PT 插值
- Sin轨迹测试结果
- PVT Hermite插值结果
- PVT 三次多项式插值结果
- PT 插值结果
- 用户轨迹测试结果
- PVT Hermite插值结果
- PT 插值结果
PTPVT 插值说明
PT模式: 位置-时间路径插值算法。
PVT模式: 位置-速度-时间路径插值算法。可以使用三次多项式或者 Hermite 算法进行插值。
PT算法对于点位距离比较小的运动或者低速度的运动比较合适。由于其很少的计算量,因此计算速度很快。
一般可以直接用在伺服驱动器中,比如说控制器的控制周期是 1ms, 那么伺服驱动器就可以在每 1ms 内的时间间隔内使用 PT 插值,可以 1 ms 内插值16个点位,以使得运动更加的精细。PT 插值的加速度是不连续的,存在突变。
PVT算法对于平滑轨迹和轨迹跟踪比较有用。位置轨迹点可以间隔很近,也可以间隔很大。例如:对于复杂的路径,那么点位需要间隔很近,这是为了防止两个点之间由于插值算法导致波动比较大;对于简单的路径,那么点位可以间隔很大。
PTPVT 插值说明
Hermite 插值满足在节点上等于给定函数值,而且在节点上的导数值也等于给定的导数值。对于高阶导数的情况,Hermite插值多项式比较复杂,在实际情况中,常常遇到的是函数值与一阶导数给定的情况。
当给定一阶导致一样的时候, Hermite 插值就和三次多项式插值得到的结果是一样的。
`
# 该函数只适用于两个点之间的时间间隔是 1 的插值
def PVT(p0,p1,v0,v1,n):# 两点三次Hermite曲线的时间参数方程# t 的范围就是【0, 1】之间,# t = 0, traj = p0, d_traj = v0# t = 1, traj = p1, d_traj = v1dt = 1/ntt = np.linspace(0, 1 - dt, n)traj = []for i in range(len(tt)):t = tt[i]H0 = 1 - 3*np.power(t, 2) + 2*np.power(t, 3)H1 = t - 2*np.power(t, 2)+ np.power(t, 3)H2 = 3*np.power(t, 2) - 2*np.power(t, 3)H3 = np.power(t, 3) - np.power(t, 2)traj.append(H0 * p0 + H1*v0 + H2*p1 + H3*v1)return traj
PVT Hermite插值
# 两点三次Hermite曲线的时间方程
# 当 t0 = 0, t1 = 1 的时候, PVT1 得到的结果和 PVT 的结果是一样的
def PVT1(p0, p1, v0, v1, t0, t1):t = t0traj = []n = (int)(np.round(((t1 - t0)/0.001)))i = 0while i < n:alpha0 = (1 + 2*((t-t0) / (t1-t0))) * ((t-t1) / (t0-t1))**2alpha1 = (1 + 2*((t-t1) / (t0-t1))) * ((t-t0) / (t1-t0))**2beta0 = (t-t0) * ((t-t1) / (t0-t1))**2beta1 = (t-t1) * ((t-t0) / (t1-t0))**2traj.append(p0*alpha0 + p1*alpha1 + v0*beta0 + v1*beta1)t = t + 0.001i = i + 1return traj
PVT 三次多项式插值
# 三次多项式
def PVT2(p0,p1,v0,v1,n):traj = []t = 0for i in range((n)):T = n * 0.001h = p1 - p0a0 = p0a1 = v0a2 = (3*h - (2*v0 + v1)*T) / (T**2)a3 = (-2*h + (v0 + v1)*T) / (T**3)traj.append(a0 + a1*(t) + a2*(t)**2 + a3*(t)**3)t = t + 0.001return traj
PT 插值
# 使用 PT插值的形式
def PT(p0,p1,v, n):traj = []t = 0for i in range((n)):traj.append(p0 + v * t)t = t + 0.001return traj
Sin轨迹测试结果
import numpy as np
import time
import matplotlib
matplotlib.use("tkagg")
import matplotlib.pyplot as plt
from enum import Enum
from IPython import embed# 该函数只适用于两个点之间的时间间隔是 1 的插值
def PVT(p0,p1,v0,v1,n):# 两点三次Hermite曲线的时间参数方程# t 的范围就是【0, 1】之间,# t = 0, traj = p0, d_traj = v0# t = 1, traj = p1, d_traj = v1dt = 1/ntt = np.linspace(0, 1 - dt, n)traj = []for i in range(len(tt)):t = tt[i]H0 = 1 - 3*np.power(t, 2) + 2*np.power(t, 3)H1 = t - 2*np.power(t, 2)+ np.power(t, 3)H2 = 3*np.power(t, 2) - 2*np.power(t, 3)H3 = np.power(t, 3) - np.power(t, 2)traj.append(H0 * p0 + H1*v0 + H2*p1 + H3*v1)return traj# 两点三次Hermite曲线的时间方程
# 当 t0 = 0, t1 = 1 的时候, PVT1 得到的结果和 PVT 的结果是一样的
def PVT1(p0, p1, v0, v1, t0, t1):t = t0traj = []n = (int)(np.round(((t1 - t0)/0.001)))i = 0while i < n:alpha0 = (1 + 2*((t-t0) / (t1-t0))) * ((t-t1) / (t0-t1))**2alpha1 = (1 + 2*((t-t1) / (t0-t1))) * ((t-t0) / (t1-t0))**2beta0 = (t-t0) * ((t-t1) / (t0-t1))**2beta1 = (t-t1) * ((t-t0) / (t1-t0))**2traj.append(p0*alpha0 + p1*alpha1 + v0*beta0 + v1*beta1)t = t + 0.001i = i + 1return traj# 三次多项式
def PVT2(p0,p1,v0,v1,n):traj = []t = 0for i in range((n)):T = n * 0.001h = p1 - p0a0 = p0a1 = v0a2 = (3*h - (2*v0 + v1)*T) / (T**2)a3 = (-2*h + (v0 + v1)*T) / (T**3)traj.append(a0 + a1*(t) + a2*(t)**2 + a3*(t)**3)t = t + 0.001return traj# 使用 PT插值的形式
def PT(p0,p1,v, n):traj = []t = 0for i in range((n)):traj.append(p0 + v * t)t = t + 0.001return traj# dt = 1
# n = 1000
# t = np.linspace(0, 20, 21)# dt = 0.1
# n = 100
# t = np.linspace(0, 20, 201)dt = 0.5
n = 500
t = np.linspace(0, 20, 41)X = 100*np.sin(0.2*np.pi*t)
Vx = 0.2*np.pi*100*np.cos(0.2*np.pi*t)time_list = np.linspace(0, 20, 20 *1000)
pos_list = 100*np.sin(0.2*np.pi*time_list)
Vel_list = 0.2*np.pi*100*np.cos(0.2*np.pi*time_list)count = 1
time = 0Xpvt= []
tpvt = []for i in range(len(X)):if(i>=1):q0 = X[i-1]q1 = X[i]v0 = Vx[i-1]v1 = Vx[i]n = int(round((t[i] - t[i-1]) * 1000))# PVT 是适用于 dt = 1 的测试数据,其他测试数据不适合# traj = PVT(q0,q1,v0,v1, n)# traj = PVT1(q0,q1,v0,v1,t[i-1],t[i])# traj = PVT2(q0,q1,v0,v1,n)v_end = (q1 - q0)/ (t[i] - t[i - 1])traj = PT(q0,q1,v_end,n)for k in range(len(traj)):Xpvt.append(traj[k])tpvt.append(time)time = time + 0.001count = count + 1plt.plot(t,X,"*",label = "give pos")
plt.plot(tpvt,Xpvt, label = "PVT")
plt.plot(time_list,pos_list, label = "sin")
plt.title("position PVT")
plt.legend()
plt.show()plt.plot(t, Vx,'.', label = 'give vel')
plt.plot(tpvt[:-1], np.dot(np.diff(Xpvt), 1000),label = 'PVT')
plt.plot(time_list, Vel_list, label = 'cos')
plt.title("velocity PVT")
plt.legend()
plt.show()
PVT Hermite插值结果
PVT 三次多项式插值结果
从这边的结果也可以看出, 两点三次 Hermite 插值和三次多项式插值得到的结果是一样的。
PT 插值结果
用户轨迹测试结果
data = [[0, 0],[1, 1],[5, 2],[10, 3],[20, 4],[40, 5],[100, 6],[101, 7],[101, 8],[101, 9],[60, 10],[40, 11],[-100, 12],[40, 13],[50, 14],[60, 15],[70, 16],[80, 17],[90, 18],[100, 19],[110, 20],[100, 21],[90, 22],[50, 23],[10, 24],[0, 25]]
X = [row[0] for row in data]
t = [row[1] for row in data]
time_list = np.arange(0, t[-1],0.001) count = 1
time = 0Xpvt= []
tpvt = []
v0 = 0
for i in range(len(X)):if(i>=1):q0 = X[i-1]q1 = X[i]v1 = (q1 - q0)/ (t[i] - t[i - 1])n = int(round((t[i] - t[i-1]) * 1000))# traj = PVT(q0,q1,v0,v1, n)# traj = PVT1(q0,q1,v0,v1,t[i-1],t[i])traj = PVT2(q0,q1,v0,v1,n)# traj = PT(q0,q1,v1,n)v0 = v1for k in range(len(traj)):Xpvt.append(traj[k])tpvt.append(time)time = time + 0.001count = count + 1plt.plot(t,X,"*",label = "give pos")
plt.plot(tpvt,Xpvt, label = "PVT")
plt.title("position PVT")
plt.legend()
plt.show()plt.plot(tpvt[:-1], np.dot(np.diff(Xpvt), 1000),label = 'PVT')
plt.title("velocity PVT")
plt.legend()
plt.show()
PVT Hermite插值结果
从这边可以看出, PT 插值不太适合直接用在控制器中, 更适合用在驱动器中。 而PVT插值的话,则需要用户提供时间间隔更加小一点的轨迹。
PT 插值结果
相关文章:

PTPVT 插值说明
文章目录 PTPVT 插值说明 PTPVT 插值说明PVT Hermite插值PVT 三次多项式插值PT 插值Sin轨迹测试结果PVT Hermite插值结果PVT 三次多项式插值结果PT 插值结果 用户轨迹测试结果PVT Hermite插值结果PT 插值结果 PTPVT 插值说明 PT模式: 位置-时间路径插值算法。 PVT模…...

Spring MVC和servlet
1.Spring MVC是Spring框架的一个扩展 2.Spring MVC工作流程 1、用户发送请求至前端控制器DispatcherServlet。 2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及…...
java下载文件流,不生成中间文件。
java下载文件流,不生成中间文件。 代码设计:代码实现 代码设计: 从前端获取的数据经过后端加工后,生成文件流,并返回前端,(不生成中间文件,注意内存,记得关闭流…...
计算机专业考研 408 学科学习方法
计算机专业考研 408 学科涵盖数据结构、计算机组成原理、操作系统和计算机网络四门核心课程,内容多且难度大。但只要掌握科学的学习方法,便能化繁为简,稳步提升。以下为大家详细介绍 408 学科的学习方法。 一、基础夯实阶段:全面…...
mapper文件的解释
<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"com.ruoyi.system.mapper.Jianai…...
常见协议的高危软件漏洞信息
HTTP 协议 协议 | 软件 | 漏洞编号 | 漏洞描述 Apache Log4j CVE-2021-45105 | Apache Log4j拒绝服务攻击漏洞 XWiki Platform CVE-2023-26477 | XWiki Platform存在安全漏洞,该漏洞源于可以通过URL请求参数结合其他参数注入任意脚本宏 Microsoft Windows CVE-20…...
Mediatek Android13 ROM定制
目录 1、系统签名 2、默认关闭WIFI 3、默认关闭Bluetooth 4、默认关闭NFC 5、移除物理键盘支持 6、禁止 ANR、崩溃等的对话框显示 7、修改默认壁纸 8、取消USB PTP MTP MIDI等支持 9、设置Screen Lock默认为None 10、设置Data&time自动 11、设置特定时区 12、设…...

RedisInsight:企业级 Redis 管理与分析工具
1 介绍 RedisInsight 是一款专为企业级用户设计的 Redis 管理与分析工具,旨在简化 Redis 数据库的管理和优化操作。通过直观的图形化界面和强大的功能集,RedisInsight 提供了全面的监控、诊断、性能优化以及数据管理能力,帮助企业和开发团队更高效地管理和运维 Redis 实例。…...
c# 快捷键模块
文章目录 命名空间和类类成员静态成员 静态方法GenerateHotkeyIdWndProcGetWindowHandleAndSourceRegisterUnregister 静态方法(外部调用)RegisterHotKey 和 UnRegisterHotKey 委托HotKeyCallbackHandler 枚举HotkeyModifiers 应用示例 using System; us…...
【笔记】增值税计算笔记
增值税计算笔记 设 进价为 α \alpha α元 出价为 α τ \alpha\tau ατ元 增值税率为 r r r ∵ { 进 项 税 α 1 r r 销 项 税 α τ 1 r r 增 值 税 销 项 税 − 进 项 税 ∴ 增 值 税 α ( τ − 1 ) r 1 r \because \left\{ \begin{aligned}进项税 &\frac{…...
请解释 JavaScript 中的闭包,以及它的优缺点和常见使用场景?
闭包(Closure)是什么? 闭包是JavaScript中的一个重要概念,指的是一个函数能够记住并访问它的词法作用域,即使这个函数在其词法作用域之外执行。 换句话说,闭包使得函数可以“记住”它被创建时的环境。 闭…...

SpringBoot 集成 Caffeine 实现本地缓存
目录 1、Caffeine 简介 1.1、Caffeine 简介1.2、对比 Guava cache 的性能主要优化项1.3、常见的缓存淘汰算法1.4、SpringBoot 集成 Caffeine 两种方式 2、SpringBoot 集成 Caffeine 方式一 2.1、缓存加载策略 2.1.1、手动加载2.1.2、自动加载【Loading Cache】2.1.3、异步加载…...

druid连接池参数配置
最近发现生产环境经常有数据库连接超时的问题,排查发现是druid连接池参数设置不合理导致 总结问题如下: 为了防止僵尸连接,k8s ipvs做了连接超时限制,如果TCP连接闲置超过900s(15分钟),客户端再尝试通过这个连接去发起…...

【OceanBase】通过 OceanBase 的向量检索技术构建图搜图应用
文章目录 一、向量检索概述1.1 关键概念① 非结构化数据② 向量③ 向量嵌入(Embedding)④ 向量相似性检索 1.2 应用场景 二、向量检索核心功能三、图搜图架构四、操作步骤4.1 使用 Docker 部署 OceanBase 数据库4.2 测试OceanBase数据库连通性4.3 开启数据库向量检索功能4.4 克…...

Linux 安装运行gatk的教程
1.下载安装 wget https://github.com/broadinstitute/gatk/releases/download/4.1.8.1/gatk-4.1.8.1.zip2.解压 unzip *.zip3.查看 gatk --help 如下显示表示安装成功: 注意:仅限在该包所在位置的路径下能使用...

什么是unit l2 norm
1. L2 Norm 定义 L2 norm(或称欧几里得范数)是用来衡量一个向量的“长度”或“大小”的一种方式。在 n 维空间中,给定一个向量V(V1,V2,…,Vn),其 L2 norm 定义为: 也可以理解为该向量与原点之间的欧几里得距离。 2…...

手写顺序流程图组件
效果图 完整代码 <template><div><div class"container" :style"{ width: ${spacingX * (colNum - 1) itemWidth * colNum}px }"><divv-for"(item, i) in recordList":key"i"class"list-box":style&…...
适配器模式概述
大体介绍 适配器模式(Adapter Pattern)是一种结构型设计模式,其核心目的是通过提供一个适配器类来使得原本接口不兼容的类可以一起工作。它通过将一个类的接口转换成客户端所期望的接口,使得原本因接口不兼容而无法一起工作的类可…...

Logo设计免费生成器:轻松设计个性化标志
在当今这个信息爆炸的时代,一个好的Logo标志已经成为品牌和企业的名片。它不仅是品牌的象征,也是企业文化和价值观的体现。然而,很多初创企业或小型团队往往因为预算有限,无法请专业的设计师来打造专属的Logo。这时候,…...

智能停车场车牌识别计费系统
作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...