Matlab类阿克曼车机器人运动学演示

news/2024/9/23 8:33:39/

在这里插入图片描述
在这里插入图片描述
v1是后驱动轮轮速, v2是转向角变化速度, 实际上我们只需要关注XQ, YQ和Phi的变化率。 通过这三项和时间步长, 我们就可以计算出变化量, 再结合初始值就能推断出每个时刻的值。

matlab">% 清理当前运行环境
% 清除所有变量
clear all;
% 关闭所有窗口
close all;% 车辆参数
% 轴距
Vehicle.WheelBase = 3.7;
% 车辆宽度
Vehicle.Width = 2.6;
% 车尾到车头前端的距离
Vehicle.LF = 4.5; 
% 车尾到车尾后端的距离
Vehicle.LB = 1.0;
% 最大转向角, rad
Vehicle.MaxSteer = 0.6;
% 最小转弯半径
Vehicle.MinCircle = Vehicle.WheelBase/tan(Vehicle.MaxSteer);
% 后轮轮速
Vehicle.Velocity = 0.6;
% 转向角
Vehicle.TurnningAngle = 0.3;
% 方位角
Vehicle.Yaw = 0.5;
% 全局X坐标
Vehicle.X = 0.0;
% 全局Y坐标
Vehicle.Y = 0.0;% 后轴中心点
BackAxisCenter = [0.0, 0.0]scatter(BackAxisCenter(1), BackAxisCenter(2), 'r');
% 使x y坐标的比例一致, 避免图像变形%axis equal
xlim([-30, 30])
ylim([-30, 30])
hold on;
dt = 1;
for i=0:dt:1000% 清屏cla% 更新矩阵PosTrans = UpdateTransMatrix(Vehicle);% 计算当前状态:[dX, dY, dYaw]state = PosTrans * Vehicle.Velocity;% 更新后轴中心点位置BackAxisCenter = BackAxisCenter + [state(1), state(2)] * dt;% 更新航向角Vehicle.Yaw = Vehicle.Yaw + state(3) * dt;% 将航向角限制在-pi到piVehicle.Yaw = ConstrainToPi(Vehicle.Yaw);% 更新机器人全局坐标Vehicle.X = BackAxisCenter(1);Vehicle.Y = BackAxisCenter(2);% 可视化车辆轮廓Visulization(Vehicle);% 暂停一段时间pause(0.01)
end% 将angle限制在-pi到pi
function result = ConstrainToPi(angle)result = mod(angle + pi, 2*pi) - pi;
end% 计算状态转移矩阵
function result = UpdateTransMatrix(vehicle)result = [cos(vehicle.Yaw), sin(vehicle.Yaw), (1.0/vehicle.WheelBase) * tan(vehicle.TurnningAngle)]';
end% 可视化
function Visulization(vehicle)px = vehicle.X;py = vehicle.Y;% 根据后轴中心的位姿计算车辆边框的位姿[vehx,vehy] = getVehTran(px,py,vehicle);% 车辆边框h1 = plot(vehx,vehy,'k'); % 车辆后轴中心h2 = plot(px, py,'rx','MarkerSize',10); xlabel('x');ylabel('y');
end% 根据后轴中心的位姿计算车辆边框的位姿
function [x,y] = getVehTran(x,y,vehicle)W = vehicle.Width;LF = vehicle.LF;LB = vehicle.LB;% 车辆的边框由四个角点确定Cornerfl = [LF, W/2]; % 左前方角点Cornerfr = [LF, -W/2]; % 右前方角点Cornerrl = [-LB, W/2]; % 左后方角点Cornerrr = [-LB, -W/2]; % 右后方角点Pos = [x,y]; % 后轴中心坐标dcm = angle2dcm(-vehicle.Yaw, 0, 0); % 计算四个角点的旋转矩阵,由于是刚体的一部分,旋转矩阵相同,将角度转换为方向余弦矩阵,旋转顺序是ZYXtvec = dcm*[Cornerfl';0]; % 旋转变换,Cornerfl旋转后形成的列向量,位置向量3*1,最后一个是z坐标tvec = tvec';Cornerfl = tvec(1:2)+Pos; % 平移变换tvec = dcm*[Cornerfr';0];tvec = tvec';Cornerfr = tvec(1:2)+Pos;tvec = dcm*[Cornerrl';0];tvec = tvec';Cornerrl = tvec(1:2)+Pos;tvec = dcm*[Cornerrr';0];tvec = tvec';Cornerrr = tvec(1:2)+Pos;% 返回车辆边框四个角点的x,y坐标x = [Cornerfl(1),Cornerfr(1),Cornerrr(1),Cornerrl(1),Cornerfl(1)];y = [Cornerfl(2),Cornerfr(2),Cornerrr(2),Cornerrl(2),Cornerfl(2)];
end

在这里插入图片描述


http://www.ppmy.cn/news/1501862.html

相关文章

XSSFWorkbook 和 SXSSFWorkbook 的区别

在现代办公环境中,处理 Excel 文件是一个常见的任务。Apache POI 是一个流行的 Java 库,能够读写 Microsoft Office 文档。对于处理 Excel 文件,Apache POI 提供了 XSSFWorkbook 和 SXSSFWorkbook 两个类。本文将详细介绍这两个类的特点和适用…

Jvm基础(一)

目录 JVM是什么运行时数据区域线程私有1.程序计数器2.虚拟机栈3.本地方法栈 线程共享1.方法区2.堆 二、对象创建1.给对象分配空间(1)指针碰撞(2)空闲列表 2.对象的内存布局对象的组成Mark Word类型指针实例数据:对齐填充 对象的访问定位句柄法 三、垃圾收集器和内存…

C#(asp.net)校园宿舍管理系统-计算机毕业设计源码18150

摘 要 随着高等教育的普及,校园宿舍管理成为学校管理的重要组成部分。传统的宿舍管理方式存在效率低下、信息不透明等问题。同时,在信息技术的不断发展和应用的背景下,校园管理信息化已成为学校管理的重要趋势。因此,研究基于Asp.…

【Python】基础学习技能提升代码样例6:日志logging

logging 模块实现了python的日志能力。本文通过几个示例展示一些重点概念与用法。 一、线程安全介绍 logging 模块的目标是使客户端不必执行任何特殊操作即可确保线程安全。 它通过使用线程锁来达成这个目标;用一个锁来序列化对模块共享数据的访问,并且…

The Llama 3 Herd of Models 第4部分后训练的全文

Llama 3前三部分包括介绍、总体概述和预训练https://blog.csdn.net/qq_51570094/article/details/140682445?spm=1001.2014.3001.5501 4 Post-Training 后训练 我们通过应用几轮后训练6或将模型与人类反馈对齐来生成对齐的Llama 3模型(Ouyang等人,2022;Rafailov等人,2024)在…

设计模式实战:日志系统的设计与实现

问题描述 设计一个日志系统,支持在应用程序中记录日志信息。系统需要确保日志记录器是唯一的实例,支持不同的日志记录方法(如文件、数据库),并且能够适配不同的日志格式(如JSON、XML)。 设计分析 单例模式 单例模式确保一个类只有一个实例,并提供一个全局访问点。日…

智能音箱和普通音箱有什么区别

智能音箱和普通音箱在多个方面存在显著的区别,主要包括设计目的、功能特点、连接方式、音质表现以及交互方式等。 一、设计目的和功能特点 智能音箱:设计目的不仅仅是为了播放音乐,更重要的是集成了语音识别和语音交互功能,成为…

安卓打包apk中加密与不加密的区别与具体设置

在安卓应用开发中,对 APK(Android Package Kit)文件进行加密主要是为了保护应用不受恶意攻击,比如防止应用被反编译、二次打包等。下面我将详细介绍加密与不加密的区别以及具体的设置方法。 加密与不加密的区别 1. 安全性: • 加…