【轨迹生成】曲线插值法

文章目录

曲线插值法

clc
clear
close all

%% 场景定义
% 换道场景路段与车辆相关参数的定义
d = 3.5;          % 道路标准宽度
len_line = 30;    % 直线段长度
W = 1.75;         % 车宽
L = 4.7;          % 车长
x1 = 20;          %1号车x坐标

% 车辆换道初始状态与终点期望状态
t0 = 0;
t1 = 3;
state_t0 = [0, -d/2; 5, 0; 0, 0];  % x,y; vx,vy; ax,ay
state_t1 = [20, d/2; 5, 0; 0, 0];
x2 = state_t0(1);

%% 画场景示意图
figure(1)
% 画灰色路面图
GreyZone = [-5,-d-0.5; -5,d+0.5; len_line,d+0.5; len_line,-d-0.5];
fill(GreyZone(:,1),GreyZone(:,2),[0.5 0.5 0.5]);
hold on

% 画小车
fill([x1,x1,x1+L,x1+L],[-d/2-W/2,-d/2+W/2,-d/2+W/2,-d/2-W/2],'b')  %1号车
fill([x2,x2,x2-L,x2-L],[-d/2-W/2,-d/2+W/2,-d/2+W/2,-d/2-W/2],'y')  %2号车

% 画分界线
plot([-5, len_line],[0, 0], 'w--', 'linewidth',2);  %分界线
plot([-5,len_line],[d,d],'w','linewidth',2);  %左边界线
plot([-5,len_line],[-d,-d],'w','linewidth',2);  %左边界线

% 设置坐标轴显示范围
axis equal
set(gca, 'XLim',[-5 len_line]); 
set(gca, 'YLim',[-4 4]); 

%% 五次多项式轨迹生成

% 计算A和B两个系数矩阵
X = [state_t0(:,1); state_t1(:,1)];
Y = [state_t0(:,2); state_t1(:,2)];
T = [ t0^5      t0^4      t0^3     t0^2    t0   1;
      5*t0^4    4*t0^3    3*t0^2   2*t0    1    0;
      20*t0^3   12*t0^2   6*t0     1       0    0;
      t1^5      t1^4      t1^3     t1^2    t1   1;
      5*t1^4    4*t1^3    3*t1^2   2*t1    1    0;
      20*t1^3   12*t1^2   6*t1     1       0    0];
A = T \ X;
B = T \ Y;

% 将时间从t0到t1离散化,获得离散时刻的轨迹坐标
t=(t0:0.05:t1)';
path=zeros(length(t),4);%1-4列分别存放x,y,vx,vy 
for i = 1:length(t)
    % 纵向位置坐标
    path(i,1) = [t(i)^5, t(i)^4, t(i)^3, t(i)^2, t(i), 1] * A;
    
    % 横向位置坐标
    path(i,2) = [t(i)^5, t(i)^4, t(i)^3, t(i)^2, t(i), 1] * B;
    
    % 纵向速度
    path(i,3) = [5*t(i)^4,  4*t(i)^3,  3*t(i)^2,  2*t(i), 1, 0] * A;
    
    % 横向速度
    path(i,4) = [5*t(i)^4,  4*t(i)^3,  3*t(i)^2,  2*t(i), 1, 0] * B;
end

% 画换道轨迹
plot(path(:,1),path(:,2),'r--','linewidth',1.5); 

%% 分析速度

% 横向速度
figure 
plot(t, path(:,4), 'k'); 
xlabel('时间 / s ');
ylabel('横向速度 / m/s ');

% 纵向速度
figure 
plot(t, path(:,3), 'k'); 
xlabel('时间 / s ');
ylabel('纵向速度 / m/s ');


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 是的,有很多关于 Kalman 滤波、和折线算的例子和开源库。 Kalman 滤波: - 一个简单的例子: https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python - scikit-learn 库中的 Kalman 滤波实现: https://github.com/scikit-learn/scikit-learn : - scipy 库中的函数:https://docs.scipy.org/doc/scipy/reference/interpolate.html - 一个简单的例子: https://github.com/scipy/scipy/blob/master/scipy/interpolate/interpolate.py 折线算: - matplotlib 库中的折线图函数: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html - 一个简单的例子: https://github.com/rougier/matplotlib-tutorial 希望这些信息对你有所帮助! ### 回答2: 是的,有许多Kalman滤波、和折线算的例子和开源库可供使用。 对于Kalman滤波器,常见的应用包括目标跟踪、传感器融合和姿态估计。开源库中最流行的是Kalman滤波器的C++实现,如OpenCV和Eigen。 在信号处理和图像处理中广泛应用,常用于填充丢失的数据或估计未知点的。开源库中常用的有线性、二次和三次样条。Python中的scipy库和MATLAB都提供了各种的实现。 折线算是一种用于形状近似和数据压缩的技术。最常见的折线算是Ramer-Douglas-Peucker算,它可以通过删除冗余的折线点来减少数据存储空间并保持形状的近似程度。这个算在很多地方都有应用,比如地理信息系统(GIS)和轨迹压缩。开源库中,常用的折线算实现包括Python中的shapely库和Java中的JTS库。 综上所述,Kalman滤波、和折线算在许多领域都有例子和开源库可供使用,可以根据具体需求选择适合的实现。 ### 回答3: 有关Kalman滤波、和折线算的例子或者开源库有很多,以下是其中一些例子和开源库: 1. Kalman滤波例子:一个常见的使用Kalman滤波的例子是在无人机导航中的位置估计。Kalman滤波可以通过融合惯性导航传感器(如加速度计和陀螺仪)的测量和GPS定位的测量,提供更准确的位置估计。 2. 例子:一个常见的例子是图像处理中的图像放大。通过将原始图像中的像素进行计算,可以生成更高分辨率的图像。常用的有最近邻、双线性和双立方等。 3. 折线算例子:一种常用的折线算是Ramer-Douglas-Peucker算,用于曲线简化。它通过递归的方式,根据给定的抽稀误差阈,在曲线上选择尽可能少的折线点,从而实现曲线的近似表示。 4. 关于开源库,Kalman滤波相关的开源库有Kalman.jl(用于Julia语言)、filterpy(用于Python语言)等。而相关的开源库有scipy.interpolate(用于Python语言)等。折线算相关的开源库有D3.js(用于JavaScript语言)等。 通过使用这些开源库,可以方便地实现Kalman滤波、和折线算等功能,应用于各种不同的领域和项目中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇光_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值