Python库中各种插值函数的使用

news2024/12/30 21:44:30

文章目录

  • Python库中各种插值函数的使用
    • 数据1: 随机的数据
    • 数据2: 从 cos轨迹中取值
    • B样条
    • 三次样条
    • Akmia
    • 画图显示
    • 数据1 的比较结果
      • 位置比较示意图
      • 速度比较示意图
      • 加速度比较示意图
    • 数据2 的比较结果
      • 位置比较示意图
      • 速度比较示意图
      • 加速度比较示意图
    • 全部代码如下

Python库中各种插值函数的使用

为了比较不同的插值函数,这边使用了两种数据来进行验证,一种是随机的数据,一种是从 cos 轨迹上取点进行插值。

import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate as spi
from scipy.interpolate import BSpline
from IPython import embed

数据1: 随机的数据

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]]
Y = [row[0] for row in data]
X = [row[1] for row in data]
time_list = np.arange(0, X[-1],0.001) 

数据2: 从 cos轨迹中取值

X = np.linspace(0, 2*np.pi, 10)
Y = np.cos(X)
time_list = np.linspace(0, 2*np.pi, int(2*np.pi * 1000))

B样条


## B样条曲线: BSpline(t, c, k, extrapolate=True, axis=0)
## t:  B样条节点
## c: B样条系数
## k 表示 B样条曲线的阶次
## 该函数需要用户自己定义好 c 才能使用,没有下面的函数来的方便
# i_f = BSpline(X,Y, k = 2)

## 一维曲线的 B样条 表示,XY 是 Y = F(X) 的数据点
i_f = spi.splrep(X,Y, k=3) 
pos = spi.splev(time_list, i_f) 
vel = np.dot(np.diff(pos), 1000)
acc = np.dot(np.diff(vel), 1000)

三次样条

# 1:三次样条: 自然边界,边界点的二阶导数为0
# 2:三次样条: 固定边界,边界点导数给定为0
# 3:三次样条: 非节点边界,使边界点的三阶导与这两边界端点的邻近点的三阶导相等
## 自然边界
i_f = spi.CubicSpline(X, Y, bc_type= 'natural')
## 固定边界
# i_f = spi.CubicSpline(X, Y, bc_type= 'clamped')
## 非节点边界
# i_f = spi.CubicSpline(X, Y, bc_type= 'not-a-knot')
pos = i_f(time_list)
vel = np.dot(np.diff(pos), 1000)
acc = np.dot(np.diff(vel), 1000)

Akmia

i_f = spi.Akima1DInterpolator(X, Y)
pos = i_f(time_list)
vel = np.dot(np.diff(pos), 1000)
acc = np.dot(np.diff(vel), 1000)

画图显示

	plt.figure()
	plt.plot(t_given, q_given, 'ro', label='given pos')
	plt.plot(time_list, pos, 'r', label='pos')
	plt.plot(time_list[:-1], vel, 'b', label='vel')
	plt.plot(time_list[:-2], acc,  label='acc')
	plt.grid('on')
	plt.legend(loc='upper right')
	plt.xlabel('time[s]')
	plt.show()


	plt.figure()
	plt.plot(t_given, q_given, 'ro', label='given pos')
	plt.plot(time_list, pos, 'r', label='pos')
	plt.grid('on')
	plt.legend(loc='upper right')
	plt.xlabel('time[s]')
	plt.show()


	plt.figure()
	plt.plot(time_list[:-1], vel, 'b', label='vel')
	plt.grid('on')
	plt.legend(loc='upper right')
	plt.xlabel('time[s]')
	plt.show()

	plt.figure()
	plt.plot(time_list[:-2], acc, 'b', label='acc')
	plt.grid('on')
	plt.legend(loc='upper right')
	plt.xlabel('time[s]')
	plt.show()

数据1 的比较结果

位置比较示意图

从下面两个位置图中,可以很明显的看出, Akima 的插值能比较好的拟合给定的插值点,不会出现两个插值点之间有一个很大的波动。
这种轨迹波动的特性在实际应用的时候有可能会出现不好的结果,比如说引发机器人自身的碰撞。举例来说,对于一般的工业机器人而言, 2轴的关节极限是【50, -130】,当用户2轴的插值点为【48, 47】,两个点之间的时间间隔为1s,那么当出现图中这种数据波动的时候,那么就有可能会规划出超出关节极限的轨迹,或者说在运动过程中出现2轴和3轴发生自碰撞的现象。这种在实际应用的时候可以考虑限制用户下发的点位的时间间隔,或者轨迹规划完成之后,对轨迹进行检查以避免该问题。

位置示意图
位置示意图1

速度比较示意图

从速度曲线中来,Akima的速度曲线没有其他插值曲线那么平滑。三次样条的固定边界的插值曲线起点和终点速度为0,其他插值曲线的起点和终点速度不为0。
速度示意图

加速度比较示意图

从加速度曲线中来,Akima的加速度曲线并不连续,存在突变,当加速度比较大的时候,有可能会引起机器人运动过程中的异响,或者引发机器人的速度保护。
三次样条的自然边界的插值曲线起点和终点加速度为0,其他插值曲线的起点和终点加速度不为0。
加速度示意图

数据2 的比较结果

位置比较示意图

在这里插入图片描述

速度比较示意图

在这里插入图片描述

加速度比较示意图

在这里插入图片描述

全部代码如下

import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate as spi
from IPython import embed

use_data = 2
if use_data == 1:
	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]]
	Y = [row[0] for row in data]
	X = [row[1] for row in data]
	time_list = np.arange(0, X[-1],0.001) 

if use_data == 2:
	X = np.linspace(0, 2*np.pi, 10)
	Y = np.cos(X)
	time_list = np.linspace(0, 2*np.pi, int(2*np.pi * 1000))


b_i_f = spi.splrep(X,Y, k=3) 
b_pos = spi.splev(time_list, b_i_f) 
b_vel = np.dot(np.diff(b_pos), 1000)
b_acc = np.dot(np.diff(b_vel), 1000)


c1_i_f = spi.CubicSpline(X, Y, bc_type= 'natural')
c1_pos = c1_i_f(time_list)
c1_vel = np.dot(np.diff(c1_pos), 1000)
c1_acc = np.dot(np.diff(c1_vel), 1000)


c2_i_f = spi.CubicSpline(X, Y, bc_type= 'clamped')
c2_pos = c2_i_f(time_list)
c2_vel = np.dot(np.diff(c2_pos), 1000)
c2_acc = np.dot(np.diff(c2_vel), 1000)


c3_i_f = spi.CubicSpline(X, Y, bc_type= 'not-a-knot')
c3_pos = c3_i_f(time_list)
c3_vel = np.dot(np.diff(c3_pos), 1000)
c3_acc = np.dot(np.diff(c3_vel), 1000)

a_i_f = spi.Akima1DInterpolator(X, Y)
a_pos = a_i_f(time_list)
a_vel = np.dot(np.diff(a_pos), 1000)
a_acc = np.dot(np.diff(a_vel), 1000)


plt.figure()
plt.plot(X, Y, 'ro', label='given pos')
plt.plot(time_list, b_pos, label='B spline')
plt.plot(time_list, c1_pos, label='cubic natural')
plt.plot(time_list, c2_pos, label='cubic clamped')
plt.plot(time_list, c3_pos, label='cubic not-a-knot')
plt.plot(time_list, a_pos, label='Akima')
plt.grid('on')
plt.legend(loc='upper right')
plt.xlabel('time[s]')
plt.show()

plt.figure()
plt.plot(time_list[:-1], b_vel, label='B spline')
plt.plot(time_list[:-1], c1_vel, label='cubic natural')
plt.plot(time_list[:-1], c2_vel, label='cubic clamped')
plt.plot(time_list[:-1], c3_vel, label='cubic not-a-knot')
plt.plot(time_list[:-1], a_vel, label='Akima')
plt.grid('on')
plt.legend(loc='upper right')
plt.xlabel('time[s]')
plt.show()

plt.figure()
plt.plot(time_list[:-2], b_acc, label='B spline')
plt.plot(time_list[:-2], c1_acc, label='cubic natural')
plt.plot(time_list[:-2], c2_acc, label='cubic clamped')
plt.plot(time_list[:-2], c3_acc, label='cubic not-a-knot')
plt.plot(time_list[:-2], a_acc, label='Akima')
plt.grid('on')
plt.legend(loc='upper right')
plt.xlabel('time[s]')
plt.show()

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

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

相关文章

ip归属地怎么判定?如何查看自己ip属地

在当今数字化时代,IP地址作为互联网通信的基础,扮演着至关重要的角色。而IP归属地的判定与查看,不仅关乎网络安全、隐私保护,还直接影响到社交平台的信任机制与信息传播的真实性。本文将深入探讨IP归属地的判定原理以及如何查看自…

soular使用教程

用 soular 配置你的组织,工作更高效!以下是快速上手的简单步骤:  1. 账号管理 可以对账号信息进行多方面管理,包括分配不同的部门、用户组等,从而确保账号权限和职责的清晰分配。  1.1 用…

JS媒体查询之matchMedia API 实现跟随系统主题色切换效果

📊写在前面 在网页设计中,跟随系统主题切换可以通过CSS和JavaScript实现。可以通过定义两套CSS变量,根据系统主题的颜色来切换变量的生效,从而实现不同主题下的页面样式变化。 例如,可以使用媒体查询API来获取系统主题…

客户案例:基于慧集通的致远OA与海康威视智能会议设备集成方案

一、引言 本案例原型公司是我国生产纺织原料的大型上市企业,主导产品为再生纤维素长丝、氨纶等系列产品。公司产品不仅得到国内客户认可,还远销海外,合作伙伴遍布德国、意大利、日本、韩国、土耳其、印度等30多个国家和地区。 二、简介 &am…

【Leetcode】3046. 分割数组

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果 题目 题目链接🔗 给你一个长度为 偶数 的整数数组 n u m s nums nums 。你需要将这个数组分割成 n u m s 1 nums1 nums1 和 n u m s 2 nums2 nums2 两部分,要求: n u m s 1. l…

掌握软件工程基础:知识点全面解析【chap07、chap10】

chap07 软件设计基础 1.信息隐藏、内聚度和耦合度(在七种级别里应该注意什么原则)的概念 1.信息隐藏 模块独立的概念 o 模块应该设计得使其所含信息(过程和数据)对于那些不需要这些信息的模块不可访问; o 每个模块只完成一个相对独立的特定功能; o 模…

操作系统实验三 存储管理

实验三 存储管理 一、实验目的 通过实验使学生了解可变式分区管理使用的主要数据结构,分配、回收的主要技术,了解最优适应分配、最坏适应分配、最先适应分配和循环适应分配等分配算法。基本能达到下列具体的目标: 掌握初步进程在内存中的映…

40.2 预聚合和prometheus-record使用

本节重点介绍 : downsample降采样可以降低查询数据量 prometheus原生不支持downsample 实时查询/聚合 VS 预查询/聚合的优缺点 实时查询/聚合条件随意组合,性能差预查询/聚合 性能好,聚合条件需要提前定义 prometheus的预查询/聚合配置举例 downsample…

win11中win加方向键失效的原因

1、可能是你把win键锁了: 解决办法:先按Fn键,再按win键 2、可能是可能是 贴靠窗口设置 中将贴靠窗口关闭了,只需要将其打开就好了

【Rust自学】7.4. use关键字 Pt.2 :重导入与换国内镜像源教程

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 7.4.1. 使用pub use重新导入名称 使用use将路径导入作用域内后。该名称在词作用域内是私有的。 以上一篇文章的代码为例: m…

算法练习——模拟题

前言:模拟题的特点在于没有什么固定的技巧,完全考验自己的代码能力,因此有助于提升自己的代码水平。如果说一定有什么技巧的话,那就是有的模拟题能够通过找规律来简化算法。 一:替换所有问号 题目要求: 解…

三层交换机配置

✍作者:柒烨带你飞 💪格言:生活的情况越艰难,我越感到自己更坚强;我这个人走得很慢,但我从不后退。 📜系列专栏:网路安全入门系列 目录 一,三层交换二,实验案…

TCP-UDP调试工具推荐:Socket通信测试教程(附详细图解)

前言 在网络编程与应用开发中,调试始终是一项不可忽视的重要环节。尤其是在涉及TCP/IP、UDP等底层网络通信协议时,如何确保数据能够准确无误地在不同节点间传输,是许多开发者关注的核心问题。 调试的难点不仅在于定位连接建立、数据流控制及…

登录时的校验Token接口开发(Interceptor)

// 拦截器校验所有非登录请求时的token,校验成功之后解析出用户信息存入ThreadLocal中便于本次请求中共享该用户的信息,这个信息只能在本线程中拿到 一、需求分析 在用户登录后的请求交互中,Token 的校验是保障用户身份合法性和数据安全的重…

Hyper-V如何将文件复制到虚拟机

创建Hyper-V共享文件夹 通过创建共享文件夹的方式,能够帮助我们在主机与虚拟机之间轻松地进行数据交换共享,那么具体该如何通过网络共享来将文件复制到虚拟机呢?请您接着往下看。 步骤1. 在Hyper-V主机中创建一个文件夹,并将您想…

Linux(Centos 7.6)yum源配置

yum是rpm包的管理工具,可以自动安装、升级、删除软件包的功能,可以自动解决软件包之间的依赖关系,使得用户更方便软件包的管理。要使用yum必须要进行配置,个人将其分为三类,本地yum源、局域网yum源、第三方yum源&#…

go语言中zero框架项目日志收集与配置

在 GoZero 项目中,日志收集和配置是非常重要的,尤其是在分布式系统中,日志可以帮助开发人员追踪和排查问题。GoZero 提供了灵活的日志系统,能够方便地进行日志的配置和管理。 以下是如何在 GoZero 项目中进行日志收集与配置的基本…

第4章 共享内存范式:基于R(Rdsm)的简单介绍

第4章 4.1 是什么被共享了? 4.1.1 全局变量 4.1.2 局部变量:栈结构 4.3 共享内存编程的高级介绍:Rdsm包 4.3.1 使用共享内存 4.4 示例:矩阵乘法 4.4.1 代码 4.4.2 分析 4.4.3 代码 4.4.4 详解我们数据的共享本质 4.4.5 计时…

optuna和 lightgbm

文章目录 optuna使用1.导入相关包2.定义模型可选参数3.定义训练代码和评估代码4.定义目标函数5.运行程序6.可视化7.超参数的重要性8.查看相关信息9.可视化的一个完整示例10.lightgbm实验 optuna使用 1.导入相关包 import torch import torch.nn as nn import torch.nn.functi…

SD ComfyUI工作流 对人物图像进行抠图并替换背景

文章目录 人物抠图与换背景SD模型Node节点工作流程工作流下载效果展示人物抠图与换背景 此工作流旨在通过深度学习模型完成精确的人物抠图及背景替换操作。整个流程包括图像加载、遮罩生成、抠图处理、背景替换以及最终的图像优化。其核心基于 SAM(Segment Anything Model)与…