当前位置: 首页 > 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;…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...