前言
文章目的是为了求出目标轨迹方程而使用pchip函数来运算,在运行代码后,记录所出现的问题,并且寻找解决方法,最后求出预期轨迹方曲线。
1. 发现问题 :
使用 pchip 进行插值,发现在起点 y=-464 而不是预期的y= -360 ,查找资料发现是因为 pchip 插值在处理边界条件时的自然边界效应。pchip 插值会尝试在数据点之间创建一个平滑的曲线,并且在两端点处,曲线的一阶和二阶导数会被设置为零,这可能会导致曲线在起点或终点处下沉或上升,从而产生非预期的值。
matlab代码如下
% 定义各点的坐标
M = [-154, -360];
A = [-154, -280];
B = [-134, -260];
C = [134, -260];
D = [154, -280];
N = [154, -360];
% 将所有点按照移动顺序排列
points = [M; A; B; C; D; N];
% 时间向量,确保轨迹平滑过渡
T = 5; % 总时间
t = 0:0.01:T;
% 初始化x和y轨迹向量
x_traj = zeros(size(t));
y_traj = zeros(size(t));
% 设置起点和终点的坐标
x_traj(1) = points(1, 1); % M点的x坐标
y_traj(1) = points(1, 2); % M点的y坐标
x_traj(end) = points(end, 1); % N点的x坐标
y_traj(end) = points(end, 2); % N点的y坐标
% 为pchip插值准备,将点分为x和y两部分
x_points = points(:, 1);
y_points = points(:, 2);
% 使用pchip进行插值,确保在t=0和t=T时,插值结果与初始和结束点匹配
x_traj(2:end-1) = pchip(1:length(x_points)-1, x_points(1:end-1), t(2:end-1))
y_traj(2:end-1) = pchip(1:length(y_points)-1, y_points(1:end-1), t(2:end-1))
%更换插值方法,还是
pchip()
% 绘制轨迹曲线
figure;
plot(x_traj, y_traj, 'b-', 'LineWidth', 2);
hold on;
% 绘制控制点
plot(x_points, y_points, 'ro', 'MarkerSize', 6);
title('Mechanical Arm Endpoint Trajectory');
xlabel('X Position');
ylabel('Y Position');
axis equal; % 保持x和y轴的刻度一致
legend('Trajectory', 'Control Points');
hold off;
代码运行结果如图
左边出现曲线起点下沉
2.寻找解决方法
- 更换插值算法
比如同pchip插值算法中还有spline、makima两种插值方法,使用两种插值算法,其效果会比pchip插值效果差,
图1 makima算法效果 图2 spline算法效果
- 人为控制起点
在上图红框位置中加入下面四句代码,进人为控制起点、终点坐标。
x_traj(1) = x_points(1); % 第一个时间点的x值设置为第一个点的x坐标
x_traj(end) = x_points(end); % 最后一个时间点的x值设置为最后一个点的x坐标
y_traj(1) = y_points(1); % 第一个时间点的y值设置为第一个点的y坐标
y_traj(end) = y_points(end); % 最后一个时间点的y值设置为最后一个点的y坐标
运算结果如下
还是不能解决起点下沉问题
(目前还未找到解决的方法,若博客们能提供解决问题,鄙人万分感激 )
(文章若有问题,请指正)