基于路径长度的样条插补算法(自动驾驶和路径跟踪控制适用)

以前在做车辆跟踪控制的时候发现在针对有多个X和多个Y对应的路径插补时候,总是报错,因为MATLAB里面的interp1插补函数它要求x要唯一对应一个y,当路径以单独的x或者y来求插补时候的时候就报错。由于在使用Matlab的interp1函数进行插值时,采样点必须是唯一的,否则可能会出现问题。如果输入的采样点包含重复的值,interp1函数可能无法确定应该在哪个点进行插值。这会导致函数返回错误或不确定的结果。为了解决这个问题,你可以先对输入的采样点进行处理,确保它们是唯一的。你可以使用Matlab的unique函数来去除重复值,或者通过其他方法确保采样点的唯一性。

针对这个问题,我根据路径的长度来插补,而不是利用单一的x或者单一的y。在遇到类似的情况时候,也可以用范数来插补。具体代码如下

clc,clear
close all
cx = [];
cy= [];
x0 = @(t_step) 15*sin(2 * t_step + 1);
y0 = @(t_step) -20*cos(t_step + 0.5);
for theta=0.9*pi:pi/200:1.8*picx(end + 1) = x0(theta);cy(end + 1) = y0(theta);
end
refer_path_primary= [cx', cy'];
x = refer_path_primary(:, 1)';
y = refer_path_primary(:, 2)';
points = [x; y]';
ds = 0.01 ;%等距插值处理的间隔
distance = [0, cumsum(hypot(diff(x, 1), diff(y, 1)))]';
distance_specific = 0:ds:distance(end);
hypot(diff(x, 1), diff(y, 1));
diff(x, 1);
diff(y, 1);
s = 0:ds:distance(end);
refer_path= interp1(distance, points, distance_specific, 'spline');
len_path = length(refer_path);
refer_path_x = refer_path(:,1);  % x
refer_path_y = refer_path(:,2); % y
for i=1:length(refer_path)if i==1dx = refer_path(i + 1, 1) - refer_path(i, 1);dy = refer_path(i + 1, 2) - refer_path(i, 2);ddx = refer_path(3, 1) + refer_path(1, 1) - 2 * refer_path(2, 1);ddy = refer_path(3, 2) + refer_path(1, 2) - 2 * refer_path(2, 2);elseif  i==length(refer_path)dx = refer_path(i, 1) - refer_path(i - 1, 1);dy = refer_path(i, 2) - refer_path(i - 1, 2);ddx = refer_path(i, 1) + refer_path(i - 2, 1) - 2 * refer_path(i - 1, 1);ddy = refer_path(i, 2) + refer_path(i - 2, 2) - 2 * refer_path(i - 1, 2);elsedx = refer_path(i + 1, 1) - refer_path(i, 1);dy = refer_path(i + 1, 2) - refer_path(i, 2);ddx = refer_path(i + 1, 1) + refer_path(i - 1, 1) - 2 * refer_path(i, 1);ddy = refer_path(i + 1, 2) + refer_path(i - 1, 2) - 2 * refer_path(i, 2);endrefer_path(i,3)=atan2(dy, dx);%refer_path(i,4)=(ddy * dx - ddx * dy) / ((dx ^ 2 + dy ^ 2) ^ (3 / 2));refer_path(i,5) = dx;refer_path(i,6) = dy;
end
for i=1:length(refer_path)if i==1dphai = refer_path(i + 1, 3) - refer_path(i, 3);elseif  i==length(refer_path)dphai = refer_path(i, 3) - refer_path(i - 1, 3);elsedphai = refer_path(i + 1, 3) - refer_path(i, 3);endrefer_path(i, 7) = dphai;%yaw
end
x_d=refer_path_x;
y_d=refer_path_y;
phai_d = refer_path(:, 3);
dx_d = refer_path(:, 5);
dy_d = refer_path(:, 6);
dphai_d = refer_path(:, 7);
figure(1)
plot(refer_path(:, 1), refer_path(:,2), Color='m',LineStyle='--',LineWidth=2)
axis equal
grid on

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重生之算法刷题之路之链表初探(三)

算法刷题之路之链表初探(三) 今天来学习的算法题是leecode2链表相加,是一道简单的入门题,但是原子在做的时候其实是有些抓耳挠腮,看了官解之后才恍然大悟! 条件 项目解释 有题目可以知道,我们需…

C#Modbus专题

1,辅助工具。 1,虚拟串口工具(vspd.exe) 2,Modubus模拟主站(Modbus Poll) 3,Modbus模拟从站(Modbus Slave) 4,OPC服务软件(KEPServerEx V4.0)。 下载链接:https://download.csdn.n…

Redisson框架

1. Redisson锁与Redis订阅与发布模式的联系: Redisson锁中,使用订阅发布模式去通知等待锁的客户端:锁已经释放,可以进行抢锁。 publish channel_name message:将消息发送到指定频道 解锁时,在Lua解锁脚本…

算法思想总结:优先级队列

一、最后一块石头的重量 . - 力扣(LeetCode) 我们每次都要快速找到前两个最大的石头进行抵消,这个时候用优先级队列(建大堆),不断取堆顶元素是最好的!每次删除堆顶元素后,可以自动调整&#xf…

[C++][CMake][CMake基础]详细讲解

目录 1.CMake简介2.大小写?3.注释1.注释行2.注释块 4.日志 1.CMake简介 CMake是一个项目构建工具,并且是跨平台的 问题 – 解决 如果自己动手写Makefile,会发现,Makefile通常依赖于当前的编译平台,而且编写Makefile的…

【动态规划】动态规划一

动态规划一 1.第 N 个泰波那契数2.面试题 08.01. 三步问题3.使用最小花费爬楼梯4.解码方法 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.…

分布式限流:Spring Cloud Gateway 限流

分布式限流:Spring Cloud Gateway 限流 在现代微服务架构中,流量控制是一个至关重要的部分。分布式限流作为一种有效的流量控制手段,能够帮助我们保护系统不被突发的流量冲垮。Spring Cloud Gateway支持多种限流方式。 什么是分布式限流 分…

模拟5亿年自然进化史,全新蛋白质大模型ESM3诞生!前Meta老将力作LeCun转赞

模拟5亿年自然进化史,全新蛋白质大模型ESM3诞生!前Meta老将力作LeCun转赞。 能抗衡AlphaFold 3的生命科学大模型终于出现了。初创公司Evolutionary Scale AI发布了他们最新的98B参数蛋白质语言模型ESM3。不仅支持序列、结构、功能的all-to-all推理&#…

Unreal Engine@Jetson Orin Nano尚不支持

Unreal EngineJetson Orin Nano尚不支持 1. 源由2. Unreal Engine介绍3. 问题4. 编译方法5. 补充6. 其他 1. 源由 最近在看SC-Explorer方面的内容,在模拟方面采用了Unreal Engine。 本打算跑下模拟,因此打算在JetsonOrin的板子上试试看。 2. Unreal En…

opencv实现目标检测功能----20240704

早在 2017 年 8 月,OpenCV 3.3 正式发布,带来了高度改进的“深度神经网络”(dnn)模块。 该模块支持多种深度学习框架,包括 Caffe、TensorFlow 和 Torch/PyTorch。这次我们使用Opencv深度学习的功能实现目标检测的功能,模型选用MobileNetSSD_deploy.caffemodel。 模型加载…

mac视频压缩简单办法,mac如何把视频压缩到指定大小内存

在数字时代,视频已成为我们日常生活和工作的重要交流工具。然而,视频文件体积庞大,给存储和分享带来了不少困扰。本文将为你揭秘视频压缩的秘密,让你轻松减小视频文件体积,提升分享效率! 方法一下载文件压缩…

Python爬虫教程第0篇-写在前面

为什么写这个系列 最近开发了个Python爬虫的脚本,去抢一个名额,结果是程序失败了,中间有各种原因,终究还是准备不足的问题。我想失败的经验或许也可贵,便总结一下当初从0开始学Python,一步步去写Python脚本…

【SpringCloud】Ribbon源码解析

ribbon是一个负载均衡组件,它可以将请求分散到多个服务提供者实例中,提高系统的性能和可用性。本章分析ribbon是如何实现负载均衡的 1、LoadBalanced 消费者在引入ribbon组件后,给http客户端添加LoadBalanced注解就可以启用负载均衡功能。Lo…

Github 2024-07-01开源项目月报 Top15

根据Github Trendings的统计,本月(2024-07-01统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目6JavaScript项目3C++项目2PHP项目1Blade项目1非开发语言项目1C#项目1Lua项目1Go项目1MDX项目1Jupyter Notebook项目1从零开始构建你喜…

Ubuntu 24.04-自动安装-Nvidia驱动

教程 但在安全启动模式下可能会报错。 先在Nvidia官网找到GPU对应的驱动版, 1. 在软件与更新中选择合适的驱动 2. ubuntu自动安装驱动 sudo ubuntu-drivers autoinstall显示驱动 ubuntu-drivers devices3. 安装你想要的驱动 sudo apt install nvidia-driver-ve…

99. 岛屿数量

题目描述:给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。 输入描述&#xff1a…

@amap/amap-jsapi-loader实现高德地图嵌入React项目中,并且做到点击地图任意一处,获得它的经纬度

1.第一步要加入项目package.json中或者直接yarn install它都可以 想必大家应该都会 "amap/amap-jsapi-loader": "0.0.7"2.加入项目中 关于接口获取key的接口 大家改成自己对应的项目请求方法 import React, { PureComponent } from react; import { Input…

GEE计算遥感生态指数RSEI

目录 RESI湿度绿度热度干度源代码归一化函数代码解释整体的代码功能解释:导出RSEI计算结果参考文献RESI RSEI = f (Greenness,Wetness,Heat,Dryness)其遥感定义为: RSEI = f (VI,Wet,LST,SI)式中:Greenness 为绿度;Wetness 为湿度;Thermal为热度;Dryness 为干度;VI 为植被指数…

【CT】LeetCode手撕—4. 寻找两个正序数组的中位数

目录 题目1- 思路2- 实现⭐4. 寻找两个正序数组的中位数——题解思路 3- ACM 实现 题目 原题连接:4. 寻找两个正序数组的中位数 1- 思路 思路 将寻找中位数 ——> 寻找两个合并数组的第 K 大 (K代表中位数) 实现 ① 遍历两个数组 &am…

如何利用AI撰写短文案获客?分享6大平台和3大步骤!

从去年开始,很多大厂都在裁员,原因就是因为AI的火爆,替代了很多机械式的劳动力。以前很多人可以通过机械式的工作来摸鱼,现在AI完成的效率比人工的要高很多倍。 国内好用的AI平台非常多,有时候也可以使用几个AI平台结合…