PTPVT 插值说明

news2025/1/2 22:58:14

文章目录

    • 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 = v1
    dt = 1/n
    tt = 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 = t0
	traj = []
	n =  (int)(np.round(((t1 - t0)/0.001)))
	i = 0
	while i < n:
		alpha0 = (1 + 2*((t-t0) / (t1-t0))) * ((t-t1) / (t0-t1))**2
		alpha1 = (1 + 2*((t-t1) / (t0-t1))) * ((t-t0) / (t1-t0))**2
		beta0 =  (t-t0) * ((t-t1) / (t0-t1))**2
		beta1 =  (t-t1) * ((t-t0) / (t1-t0))**2
		traj.append(p0*alpha0 + p1*alpha1 + v0*beta0 + v1*beta1)
		t = t + 0.001
		i = i + 1
	return traj

PVT 三次多项式插值

# 三次多项式
def PVT2(p0,p1,v0,v1,n):
    traj = []
    t = 0
    for i in range((n)):
        T = n * 0.001
        h = p1 - p0
        a0 = p0
        a1 = v0
        a2 = (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.001
    return traj

PT 插值

# 使用 PT插值的形式
def PT(p0,p1,v, n):
    traj = []
    t = 0
    for i in range((n)):
        traj.append(p0 + v * t)
        t = t + 0.001
    return 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 = v1
    dt = 1/n
    tt = 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 = t0
	traj = []
	n =  (int)(np.round(((t1 - t0)/0.001)))
	i = 0
	while i < n:
		alpha0 = (1 + 2*((t-t0) / (t1-t0))) * ((t-t1) / (t0-t1))**2
		alpha1 = (1 + 2*((t-t1) / (t0-t1))) * ((t-t0) / (t1-t0))**2
		beta0 =  (t-t0) * ((t-t1) / (t0-t1))**2
		beta1 =  (t-t1) * ((t-t0) / (t1-t0))**2
		traj.append(p0*alpha0 + p1*alpha1 + v0*beta0 + v1*beta1)
		t = t + 0.001
		i = i + 1
	return traj
    
# 三次多项式
def PVT2(p0,p1,v0,v1,n):
    traj = []
    t = 0
    for i in range((n)):
        T = n * 0.001
        h = p1 - p0
        a0 = p0
        a1 = v0
        a2 = (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.001
    return traj

# 使用 PT插值的形式
def PT(p0,p1,v, n):
    traj = []
    t = 0
    for i in range((n)):
        traj.append(p0 + v * t)
        t = t + 0.001
    return 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 = 0

Xpvt= []
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.001
            count = count + 1

plt.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 = 0

Xpvt= []
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 = v1
        for k in range(len(traj)):
            Xpvt.append(traj[k])
            tpvt.append(time)
            time = time + 0.001
            count = count + 1

plt.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 插值结果

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Mac安装多个版本node、java、python 等开发软件环境,安装、卸载、升级多个数据库

安装多个版本node、java、python 等开发软件环境 使用nvm&#xff08;Node.js Version Manager&#xff09;来管理多个Node.js版本。 使用jenv来管理多个Java版本。 使用pyenv来管理多个Python版本。 以下是安装和使用这些版本管理器的基本步骤&#xff1a; 1. 安装多个版本…

【深度学习】卷积网络代码实战ResNet

ResNet (Residual Network) 是由微软研究院的何凯明等人在2015年提出的一种深度卷积神经网络结构。ResNet的设计目标是解决深层网络训练中的梯度消失和梯度爆炸问题&#xff0c;进一步提高网络的表现。下面是一个ResNet模型实现&#xff0c;使用PyTorch框架来展示如何实现基本的…

添砖java第四更@(+)@

今天的学习内容主要是围绕着实体类来进行的&#xff0c;就是说在java里面我们常常会把数据存放和方法分别存放在不同的类里面。 首先就是关于实体类是什么&#xff0c;实体类就是只提供了get方法,set方法,和默认构造器的类。 接着就是熟悉java与别的语言的不同之处就在于它是…

算法题(19):多数元素

审题&#xff1a; 数组不为空且一定存在众数。需要返回众数的数值 思路&#xff1a; 方法一&#xff1a;哈希映射 先用哈希映射去存储对应数据出现的次数&#xff0c;然后遍历找到众数并输出 当然也可以在第一次映射的过程中就维护一个出现次数最多的数据&#xff0c;这样子就可…

电子商务网站的三层架构的理解和实践

在电子商务领域&#xff0c;网站架构的设计对于系统的稳定性、可扩展性和用户体验至关重要。其中&#xff0c;三层架构作为一种经典的设计模式&#xff0c;被广泛应用于各类电子商务网站中。本文将从理论、理解和实践三个方面&#xff0c;详细探讨电子商务网站的三层架构。 一、…

LVS 负载均衡原理 | 配置示例

注&#xff1a;本文为 “ LVS 负载均衡原理 | 配置” 相关文章合辑。 部分内容已过时&#xff0c;可以看看原理实现。 使用 LVS 实现负载均衡原理及安装配置详解 posted on 2017-02-12 14:35 肖邦 linux 负载均衡集群是 load balance 集群的简写&#xff0c;翻译成中文就是负…

JavaScript甘特图 dhtmlx-gantt

背景 需求是在后台中&#xff0c;需要用甘特图去展示管理任务相关视图&#xff0c;并且不用依赖vue&#xff0c;兼容JavaScript原生开发。最终使用dhtmlx-gantt&#xff0c;一个半开源的库&#xff0c;基础功能免费&#xff0c;更多功能付费。 甘特图需求如图&#xff1a; 调…

领域驱动设计第一篇-DP主题

一&#xff1a;领域驱动设计概述 领域驱动设计。Domain-Driven Design 可以理解为基于领域的工程设计。 1&#xff1a;什么是领域&#xff1f; 初步理解领域&#xff1a;业务问题的范畴。 领域可大可小&#xff0c;对应着大小业务问题的边界。业务上要做的几个事&#xff0…

EMNLP'24 最佳论文解读 | 大语言模型的预训练数据检测:基于散度的校准方法

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 作者简介 张伟超&#xff0c;中国科学院计算所网络数据科学与技术重点实验室三年级直博生 内容简介 近年来&#xff0c;大语言模型&#xff08;LLMs&#xff09;的…

IntelliJ IDEA 远程调试

IntelliJ IDEA 远程调试 在平时开发 JAVA 程序时&#xff0c;在遇到比较棘手的 Bug 或者是线上线下结果不一致的情况下&#xff0c;我们会通过打 Log 或者 Debug 的方式去定位并解决问题&#xff0c;两种方式各有利弊&#xff0c;今天就简要介绍下如何通过远程 Debug 的情况下…

【Webug】攻防实战详情

世界上只有一种真正的英雄主义&#xff0c;那就是认清了生活的真相后&#xff0c;仍然热爱她 显错注入 首先整体浏览网站 注入点&#xff1a; control/sqlinject/manifest_error.php?id1 判断注入类型 输入: and 11 正常, 再输入: and 12 还正常, 排除数字型 输入单引号:…

SpringMVC核心、两种视图解析方法、过滤器拦截器 “ / “ 的意义

SpringMVC的执行流程 1. Spring MVC 的视图解析机制 Spring MVC 的核心职责之一是将数据绑定到视图并呈现给用户。它通过 视图解析器&#xff08;View Resolver&#xff09; 来将逻辑视图名称解析为具体的视图文件&#xff08;如 HTML、JSP&#xff09;。 核心流程 Controlle…

CyclicBarrier线程辅助类的简单使用

文章目录 简述内部机制构造函数使用案例异常处理 简述 CyclicBarrier 是另一个用于协调多个线程之间操作的同步辅助类&#xff0c;它允许一组线程互相等待彼此到达一个共同的屏障点&#xff08;barrier&#xff09;。与 CountDownLatch 不同的是&#xff0c;CyclicBarrier 可以…

B站推荐模型数据流的一致性架构

01 背景 推荐系统的模型&#xff0c;通过学习用户历史行为来达到个性化精准推荐的目的&#xff0c;因此模型训练依赖的样本数据&#xff0c;需要包括用户特征、服务端推荐的视频特征&#xff0c;以及用户在推荐视频上是否有一系列的消费行为。 推荐模型数据流&#xff0c;即为…

无需训练!多提示视频生成最新SOTA!港中文腾讯等发布DiTCtrl:基于MM-DiT架构

文章链接&#xff1a;https://arxiv.org/pdf/2412.18597 项目链接&#xff1a;https://github.com/TencentARC/DiTCtrl 亮点直击 DiTCtrl&#xff0c;这是一种基于MM-DiT架构的、首次无需调优的多提示视频生成方法。本文的方法结合了新颖的KV共享机制和隐混合策略&#xff0c;使…

尔湾市圣诞节文化交流会成功举办,展示多元文化魅力

洛杉矶——12月21日,圣诞节文化交流会在尔湾成功举办。圣诞节文化交流会旨在促进不同文化之间的交流与理解。通过举办舞蹈表演、演讲和互动游戏等,为参与者提供了一个展示和欣赏多元文化艺术的平台。这些活动不仅增加了社区成员之间的互动,也加深了他们对不同文化传统和艺术形式…

适用于项目经理的跨团队协作实践:Atlassian Jira与Confluence集成

适用于项目经理的跨团队协作实践&#xff1a;Atlassian Jira与Confluence集成 现代项目经理的核心职责是提供可视性、保持团队一致&#xff0c;并确保团队拥有交付出色工作所需的资源。在过去几年中&#xff0c;由于分布式团队的需求不断增加&#xff0c;项目经理这一角色已迅速…

Spring Cloud LoadBalancer (负载均衡)

目录 什么是负载均衡 服务端负载均衡 客户端负载均衡 Spring Cloud LoadBalancer快速上手 启动多个product-service实例 测试负载均衡 负载均衡策略 自定义负载均衡策略 什么是负载均衡 负载均衡(Load Balance&#xff0c;简称 LB) , 是高并发, 高可用系统必不可少的关…

探究步进电机与输入脉冲的关系

深入了解步进电机 前言一、 步进电机原理二、 细分三、脉冲数总结 前言 主要是探究以下内容&#xff1a; 1、步进电机的步进角。 2、什么是细分。 3、脉冲的计算。 最后再扩展以下STM32定时器的计算方法。 一、 步进电机原理 其实语言描述怎么样都不直观&#xff0c;我更建议…

HCIA-Access V2.5_7_1_XG(S)原理_系统概述

近年来&#xff0c;随着全球范围内接入市场的飞快发展以及全业务运营的快速开展&#xff0c;已有的PON技术标准在带宽需求&#xff0c;业务支撑能力以及接入节点设备和配套设备的性能提升等方面都面临新的升级需求&#xff0c;而GPON已经向10G GPON演示&#xff0c;本章将介绍1…