【无人车】用于无人地面车辆的路径跟踪算法(Matlab代码实现)

news2024/11/15 10:08:45

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


💥1 概述

无人驾驶技术是当前社会的热门技术之一,无人驾驶车辆的应用可以很好地解决环境污染和交通拥堵两大主要社会问题。而在无人驾驶车辆的所有技术中,车辆的底层控制技术和路径跟踪技术是无人车的基础技术。本文用于无人地面车辆的路径跟踪算法,详情可见运行结果图。 

📚2 运行结果

运行视频

部分代码:

clear;
clc;
close all;
addpath('Params','TargetCourse');

%% Choose Vehicle Algrithm Course 
Vehicle = 'C-Class-Hatchback'; 
% B-Class-Hatchback C-Class-Hatchback
path_tracking_alg = 'Kinematics MPC V W'; 
% Pure Pursuit,Stanley,Kinematics MPC V Delta,Dynamics MPC,Kinematics MPC V W
roadmap_name = 'eight';
% eight road double

%% Get Params
Reference = getTargetCourseParams(roadmap_name);
Reference = splinfy(Reference);
VehicleParams = getVehicleParams(Vehicle);
AlgParams = getAlgParams(path_tracking_alg,VehicleParams);
Reference.type = roadmap_name;
VehicleParams.type = Vehicle;
AlgParams.type = path_tracking_alg;
time_step = AlgParams.ts;

%% Initialize State
x0 = Reference.cx(1000);y0 = Reference.cy(1000);yaw0 = Reference.cyaw(1000);s0 = Reference.s(1000);
delta0 = 0;v0 = 20;w0 = 0;vy0=0;
desired_velocity = 20;
desired_angular_v = 0;
desired_delta = 0;

i = 0;simulation_time = 0;
Vehicle_State = [x0,y0,yaw0,s0,v0,w0,vy0];
Control_State = delta0;

%% Log
log.i=i;log.time=simulation_time;
log.X=x0;log.Y=y0;log.Yaw=yaw0;log.Odometry=s0;
log.Vx=v0;log.Angular_V=w0;
log.delta=delta0;
log.error=0;log.solvertime=0;

[path_figure,result_figure,delta_line,error_line,solve_time_line]= Visualization_Init(AlgParams, Reference,... 
    VehicleParams, Vehicle_State, Control_State,simulation_time);

isGoal = norm(Vehicle_State(1:2)-[Reference.cx(end),Reference.cy(end)])<1 && (Reference.s(end)-Vehicle_State(4))<1;
disp([path_tracking_alg,' ',roadmap_name,' simulation start!']);

%% path tracking algrithm
while ~isGoal
    tic;
    i = i + 1;
    simulation_time = simulation_time + time_step;
    tic;
    switch AlgParams.type
        case "Pure Pursuit"
            [steer_cmd,error,preview_point] = UGV_PP(Reference,VehicleParams,AlgParams,Vehicle_State,Control_State);
        case "Stanley"
            [steer_cmd,error,preview_point] = UGV_Stanley(Reference,VehicleParams,AlgParams,Vehicle_State,Control_State);
        case "Kinematics MPC V W"
            Control_ref=[desired_velocity,desired_angular_v];
            [control_cmd,error,MPCprediction] = UGV_Kinematics_MPC_V_W(Reference,VehicleParams,AlgParams,Vehicle_State,Control_ref);
        case "Kinematics MPC V Delta"
            Control_ref=[desired_velocity,desired_delta];
            [control_cmd,error,MPCprediction] = UGV_Kinematics_MPC_V_Delta(Reference,VehicleParams,AlgParams,Vehicle_State,Control_ref);
        case "Dynamics MPC"
            Control_State=[delta0,desired_velocity];
            [steer_cmd,error,MPCprediction,update_state] = UGV_Dynamics_MPC(Reference,VehicleParams,AlgParams,Vehicle_State,Control_State);
    end
    toc;
    
%% update vehicle state
    if AlgParams.type == "Pure Pursuit" || AlgParams.type == "Stanley" || AlgParams.type == "Dynamics MPC" || AlgParams.type == "Kinematics MPC V Delta"
        wheel_base = VehicleParams.wheel_base;t=time_step;
        if AlgParams.type ~= "Kinematics MPC V Delta"
            delta=steer_cmd;v1=v0;
        else
            delta=control_cmd(2);v1=control_cmd(1);
        end
        x0=Vehicle_State(1);y0=Vehicle_State(2);yaw0=Vehicle_State(3);s0=Vehicle_State(4);v0=Vehicle_State(5);
        x1=x0+v0*cos(yaw0)*t;y1=y0+v0*sin(yaw0)*t;yaw1=yaw0+v0/wheel_base*tan(delta)*t;s1=s0+v0*t;w1=(yaw1-yaw0)/t;
        Vehicle_State=[x1,y1,yaw1,s1,v1,w1];
        Vehicle_State(3)=wrapTo2Pi(Vehicle_State(3));
        if AlgParams.type == "Dynamics MPC"
            Vehicle_State(7)=update_state(2);
        end
       
    elseif AlgParams.type == "Kinematics MPC V W"
        wheel_base = VehicleParams.wheel_base;t=time_step;
        x0=Vehicle_State(1);y0=Vehicle_State(2);yaw0=Vehicle_State(3);s0=Vehicle_State(4);
        v1=control_cmd(1);w1=control_cmd(2);
        x1=x0+v1*cos(yaw0)*t;y1=y0+v1*sin(yaw0)*t;yaw1=yaw0+w1*t;s1=s0+v1*t;
        Vehicle_State=[x1,y1,yaw1,s1,v1,w1];
        Vehicle_State(3)=wrapTo2Pi(Vehicle_State(3));
        delta = atan(w1*wheel_base/v1);
    end
    
    log.i(end+1)=i;log.time(end+1)=simulation_time;
    log.X(end+1)=x1;log.Y(end+1)=y1;log.Yaw(end+1)=yaw1;log.Odometry(end+1)=s1;
    log.Vx(end+1)=v1;log.Angular_V(end+1)=w1;log.delta(end+1)=delta;
    log.error(end+1)=error;log.solvertime(end+1)=toc;
    
%% show animation
    set(groot, 'CurrentFigure', path_figure);cla;
    switch (Reference.type)
        case {'eight' 'road'}
            axis([x1-40,x1+40,y1-40,y1+40]);
            plot_car(VehicleParams, Vehicle_State, delta);
        case {'double','Emergency'}
            
    end
    h1=plot(Reference.cx, Reference.cy, '-k.','LineWidth',3, 'markersize',3,'DisplayName','Target Trajectory');
    h2=plot(log.X, log.Y, '-b.','LineWidth', 3,'markersize',3,'DisplayName','Real Trajectory');
    h3=plot(Vehicle_State(1),Vehicle_State(2),'Marker','p','MarkerFaceColor','red','MarkerSize',12.0,'DisplayName','CoG');
    switch (AlgParams.type)
        case {"Pure Pursuit","Stanley"}
            h4=plot(preview_point(1),preview_point(2),'d','MarkerFaceColor','yellow','MarkerSize',12,'DisplayName','Preview Point');
            legend([h1 h2 h3 h4],{'Target Trajectory','Real Trajectory','CoG','Preview Point'});
        case {"Kinematics MPC V W","Kinematics MPC V Delta","Dynamics MPC"}
            h4=plot(MPCprediction(1,:),MPCprediction(2,:), '-y.','LineWidth', 3,'markersize',3,'DisplayName','Prediction Trajectory');
            legend([h1 h2 h3 h4],{'Target Trajectory','Real Trajectory','CoG','MPC Prediction Trajectory'});
    end
    title(['Time[s]:',num2str(round(simulation_time,3),3),'s',' Velocity[m/s]:',num2str(round(v1,2))]);
    
    set(groot, 'CurrentFigure', result_figure);
    set(delta_line,'Xdata',log.time,'Ydata',log.delta/pi*180);
    set(error_line,'Xdata',log.time,'Ydata',log.error);
    set(solve_time_line,'Xdata',log.time,'Ydata',log.solvertime);
    pause(0.0001);
    isGoal = norm(Vehicle_State(1:2)-[Reference.cx(end),Reference.cy(end)])<1^2 && (Reference.s(end)-Vehicle_State(4))<1;
end
disp([path_tracking_alg,' Get Goal ! simulation stop!']);


%         syms x(t) y(t) yaw(t) s(t);
%         eqn1 = diff(x,t) == v0*cos(yaw); eqn2 = diff(y,t) == v0*sin(yaw);
%         eqn3 = diff(yaw,t) == v0*tan(steer_cmd)/wheel_base; eqn4 = diff(s,t) == v0;
%         cond1 = x(0) == x0;cond2 = y(0) == y0;cond3 = yaw(0) == yaw0;cond4 = s(0) == s0;
%         Up_State = dsolve(eqn1,eqn2,eqn3,eqn4,cond1,cond2,cond3,cond4);
%         t=time_step;
%         Vehicle_State = [eval([Up_State.x,Up_State.y,Up_State.yaw,eval(Up_State.s)]),v0,(eval(Up_State.yaw)-yaw0)/t];

%         wheel_base = VehicleParams.wheel_base;
%         x0=Vehicle_State(1);y0=Vehicle_State(2);yaw0=Vehicle_State(3);s0=Vehicle_State(4);
%         v0=control_cmd(1);w0=control_cmd(2);
%         syms x(t) y(t) yaw(t) s(t);
%         eqn1 = diff(x,t) == v0*cos(yaw); eqn2 = diff(y,t) == v0*sin(yaw);
%         eqn3 = diff(yaw,t) == w0; eqn4 = diff(s,t) == v0;
%         cond1 = x(0) == x0;cond2 = y(0) == y0;cond3 = yaw(0) == yaw0;cond4 = s(0) == s0;
%         Up_State = dsolve(eqn1,eqn2,eqn3,eqn4,cond1,cond2,cond3,cond4);
%         t=time_step;
%         Vehicle_State = [eval([Up_State.x,Up_State.y,Up_State.yaw,eval(Up_State.s)]),v0,(eval(Up_State.yaw)-yaw0)/t];

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]樊晓楠. 无人观光车底层控制系统改造及路径跟踪算法研究[D].长安大学,2019.

🌈4 Matlab代码实现

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

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

相关文章

CMIP6数据处理:WRF模式动力降尺度、单点降尺度、统计方法区域降尺度、SWAT数据、Biome-BGC数据制备

查看原文>>>WRF模式、CMIP6数据处理、机器学习气象海洋水文应用、python地球科学 目录 CMIP6月数据、日数据、全球VIPPHEN物候数据、ERA5数据 一、CMIP6中的模式比较计划 二、数据下载 三、基础知识 四、单点降尺度 五、统计方法的区域降尺度 六、基于WRF模式…

助力低碳出行 | 基于ACM32 MCU的电动滑板车方案

前言 随着智能科技的快速发展&#xff0c;电动滑板车的驱动系统也得到了长足的发展。国内外的电动滑板车用电机驱动系统分为传统刷式电机和无刷电机两种类型。其中&#xff0c;传统的刷式电机已经逐渐被无刷电机所取代&#xff0c;无刷电机的性能和寿命都更出色&#xff0c;已…

STM32F4 HAL库使用DMA进行ADC采样实时发送波形到串口显示(包含傅里叶变换)

1.总体逻辑 按下STM32F4的KEY0按键&#xff0c;通过外部中断的方式对按键进行检测&#xff0c;然后开启一次带DMA的固定点数的ADC采集&#xff0c;采集完成后在DMA的中断发送采集到的数据&#xff0c;然后清空数据区准备下一次的按键中断。电脑接受到串口数据后对数据进行简单…

大厂齐出海:字节忙种草,网易爱社交

配图来自Canva可画 随着国内移动互联网红利逐渐触顶&#xff0c;互联网市场日趋饱和&#xff0c;国内各互联网企业之间的竞争便愈发激烈起来。在此背景下&#xff0c;广阔的海外市场就成为了腾讯、阿里、字节、京东、拼多多、百度、网易、快手、B站等互联网公司关注和争夺的重…

算法--前缀和技巧 (蓝桥杯123-灵能传输--求和)

文章目录 什么是前缀和用途什么时候用java的前缀和例题[蓝桥杯 2022 省 A] 求和题目描述思路代码 [蓝桥杯 2021 国 ABC] 123题目描述思路代码 [蓝桥杯 2019 省 B] 灵能传输(蓝桥杯96%&#xff0c;洛谷ac)题目描述思路代码 什么是前缀和 如果一个数组a的元素为 a 1 , a 2 , a 3…

Springboot +Flowable,详细解释啥叫流程实例(一)

一.简介 上一篇中学习了Flowable 中的流程模板&#xff08;流程定义&#xff09;的部署问题&#xff0c;这一篇来学习什么叫流程实例。 部署之后的流程模板&#xff0c;还不能直接运行&#xff0c;例如我们部署了一个请假流程&#xff0c;现在 张三想要请假&#xff0c;他就需…

WhatsApp多开攻略,低成本高效率多开账号聊单的方法献上~

WhatsApp多开攻略&#xff01;低成本高效率多开账号聊单的方法献上~ WhatsApp多开是指在同一台设备上同时登录多个WhatsApp账号&#xff0c;这种技术通常被跨境电商从业者用于在不同的WhatsApp账号之间切换&#xff0c;以便更好地管理跨境电商业务。 图中工具&#xff1a; ss客…

lazada按关键字搜索商品API接口

lazada按关键字搜索商品 API接口&#xff0c;在 lazada上搜索产品&#xff0c;如果只需要搜索单个产品的话&#xff0c;那么直接在搜索框输入“关键字”即可&#xff0c;如果需要多个产品&#xff0c;那么则需要进行关键字扩展。 lazada按关键字搜索商品 API接口分为两部分&am…

AI 这是要杀疯啦!

ChatGPT 是基于 GPT 系列大模型开发出来的一个对话场景的 Demo&#xff0c;它已经让我们见识到了大模型的威力。 但有些开发者的胃口不满足于此&#xff0c;已经开始尝试“突破” AI 的边界了&#xff0c;本文推荐 5 个人工智能的开源项目。其中前两个项目&#xff0c;让人细思…

《港联证券》股票必须持仓多久才能卖?股票买入多久显示持仓?

有的新手股民在炒股的时候&#xff0c;对股票的了解是不多的&#xff0c;就会在网上搜索材料来进行学习&#xff0c;那么股票有必要持仓多久才干卖&#xff1f;股票买入多久显现持仓&#xff1f;港联证券为我们预备了相关内容&#xff0c;以供参阅。 股票有必要持仓多久才干卖&…

ADAS辅助驾驶之:BSD盲区监测功能

摘要&#xff1a; 盲点监测系统从技术上主要分为影像和雷达2种&#xff0c;2种技术路线各有优劣。 目录 1、车辆盲区监测系统的定义 2、车辆盲区监测系统原理 3、车辆盲区监测系统硬件安装及标定 4、车辆盲区监测系统发展 1、车辆盲区监测系统的定义 盲区监测系统&#x…

【算法题】2368. 受限条件下可到达节点的数目

题目&#xff1a; 现有一棵由 n 个节点组成的无向树&#xff0c;节点编号从 0 到 n - 1 &#xff0c;共有 n - 1 条边。 给你一个二维整数数组 edges &#xff0c;长度为 n - 1 &#xff0c;其中 edges[i] [ai, bi] 表示树中节点 ai 和 bi 之间存在一条边。另给你一个整数数…

接到“女儿”求救电话 亲妈差点被AI仿声骗了

听到电话里女儿的求救声&#xff0c;慌乱的母亲差点给“绑匪”打钱&#xff0c;但绑匪是假的&#xff0c;女儿的声音也是克隆的。借助最新的AI技术&#xff0c;骗子只要拿到他人3秒的语音&#xff0c;就能快速复制出一模一样的声音&#xff0c;甚至方言和语气也能模仿。 当人们…

vulnhub之AI-Web-1.0

vulnhub之AI-Web-1.0 一、信息收集 1.主机发现 nmap 172.25.0.0-255发现了靶机IP&#xff1a;172.25.0.13 2.端口扫描 nmap -A -sS -sV -Pn -O -p- 172.25.0.13发现80端口是开放的。 3.目录扫描 sudo dirb http://172.25.0.13/发现了robots.txt文件 在对其进行目录二次…

神奇的饼状图:如何用最简单的方式呈现复杂的数据

简介 饼状图顾名思义就是形如圆饼状的图形&#xff0c;它是一种常用的图表类型&#xff0c;通常用于展示数据的占比关系。饼状图通过将一个圆形区域划分为多个子区域&#xff0c;反应出不同子类数据之间的的对比关系以及子类数据在大类中的百分比。饼状图将一个数据集按照每个…

全景丨0基础学习VR全景制作,平台篇第13章:热点功能-总览介绍

全景丨0基础学习VR全景制作&#xff0c;平台篇第13章&#xff1a;热点功能-总览介绍 大家好&#xff0c;欢迎观看蛙色VR官方——后台使用系列课程&#xff01; 一、热点功能概览 热点&#xff0c;指在全景作品中添加各种类型图标的按钮&#xff0c;引导用户通过按钮产生更多的…

你知道C语言函数调用的2种方式吗?传值调用 传址调用

本篇博客会讲解C语言函数调用的2种方式&#xff0c;分别是&#xff1a;传值调用和传址调用。这2种函数调用方式有什么区别呢&#xff1f;为什么会有不同的效果呢&#xff1f;分别有哪些用途呢&#xff1f;下面我会一一展开。 区别 传值调用&#xff0c;即通过传递变量的值来调…

4个python内存性能检测工具:memory_profiler、timeit、line_profiler、heartrate的使用案例

这里总结了4个比较好的python性能检测工具&#xff0c;包括内存使用、运行时间、执行次数等方面。 1、memory_profiler查看内存的使用情况 memory_profiler可以用来测量python进程的内存使用情况。可以按行查看内存的使用情况。 memory_profiler 是一个监控进程内存消耗的模…

基于cv2的手势识别-计算机视觉

闲的无聊做的一个小玩意&#xff0c;可以调用你的计算机相机&#xff0c;识别框内的手势&#xff08;剪刀、石头和布&#xff09;&#xff0c;提供一个判决平台&#xff0c;感兴趣的可以继续完善。 用到的参考小文献&#xff1a; 具体实现结果如下 并且我另写了一个框架平台&…

风雨30年,电子表格惊人跨越,excel用户:表格都能生成软件了

电子表格&#xff0c;绝不是你看到的样子&#xff01; 你知道电子表格的前世今生吗&#xff1f; 它绝不只是你现在看到Excel或者WPS的模样。 不同的时代&#xff0c;有着不同的样子 DOS时代没有什么“可见可得”。什么都是靠想象力的&#xff0c;就是屏幕上文档的显示和打印…