当前位置: 首页 > news >正文

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模式&#xff1a; 位置-时间路径插值算法。 PVT模…...

Spring MVC和servlet

1.Spring MVC是Spring框架的一个扩展 2.Spring MVC工作流程 1、用户发送请求至前端控制器DispatcherServlet。 2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找)&#xff0c;生成处理器对象及…...

java下载文件流,不生成中间文件。

java下载文件流&#xff0c;不生成中间文件。 代码设计&#xff1a;代码实现 代码设计&#xff1a; 从前端获取的数据经过后端加工后&#xff0c;生成文件流&#xff0c;并返回前端&#xff0c;&#xff08;不生成中间文件&#xff0c;注意内存&#xff0c;记得关闭流&#xf…...

计算机专业考研 408 学科学习方法

计算机专业考研 408 学科涵盖数据结构、计算机组成原理、操作系统和计算机网络四门核心课程&#xff0c;内容多且难度大。但只要掌握科学的学习方法&#xff0c;便能化繁为简&#xff0c;稳步提升。以下为大家详细介绍 408 学科的学习方法。 一、基础夯实阶段&#xff1a;全面…...

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存在安全漏洞&#xff0c;该漏洞源于可以通过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 静态方法&#xff08;外部调用&#xff09;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 中的闭包,以及它的优缺点和常见使用场景?

闭包&#xff08;Closure&#xff09;是什么&#xff1f; 闭包是JavaScript中的一个重要概念&#xff0c;指的是一个函数能够记住并访问它的词法作用域&#xff0c;即使这个函数在其词法作用域之外执行。 换句话说&#xff0c;闭包使得函数可以“记住”它被创建时的环境。 闭…...

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连接池参数配置

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

【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 如下显示表示安装成功&#xff1a; 注意&#xff1a;仅限在该包所在位置的路径下能使用...

什么是unit l2 norm

1. L2 Norm 定义 L2 norm&#xff08;或称欧几里得范数&#xff09;是用来衡量一个向量的“长度”或“大小”的一种方式。在 n 维空间中&#xff0c;给定一个向量V(V1,V2,…,Vn)&#xff0c;其 L2 norm 定义为&#xff1a; 也可以理解为该向量与原点之间的欧几里得距离。 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&…...

适配器模式概述

大体介绍 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;其核心目的是通过提供一个适配器类来使得原本接口不兼容的类可以一起工作。它通过将一个类的接口转换成客户端所期望的接口&#xff0c;使得原本因接口不兼容而无法一起工作的类可…...

Logo设计免费生成器:轻松设计个性化标志

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

智能停车场车牌识别计费系统

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…...

电脑桌面太单调,用Python写一个桌面小宠物应用。

下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡&#xff0c;可以响应鼠标点击&#xff0c;并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...