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

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

% 清理当前运行环境
% 清除所有变量
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到pi
    Vehicle.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); % 计算四个角点的旋转矩阵,由于是刚体的一部分,旋转矩阵相同,将角度转换为方向余弦矩阵,旋转顺序是ZYX
    
    tvec = 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

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
阿克曼运动学模型是一种用于描述具有前轮转向和后轮驱动的辆运动的模型。与其他转向模型不同,阿克曼转向模型不能实现原地旋转或通过轮胎、履带差速的方式控制辆的转向和速度。相反,它使用了阿克曼几何原理来实现辆的转向。根据阿克曼转向模型,辆的前轮和后轮都会按照一定的半径进行圆弧运动。具体来说,根据公式v = w * R,辆的线速度v由角速度w和转弯半径R决定。这种模型在实验辆和真实辆的无人驾驶实验中起着重要的作用,因为现代民用汽通常采用阿克曼转向模型。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [ROS学习记录(二)阿克曼转向运动学模型及在gazebo中搭建仿真环境](https://blog.csdn.net/m0_55205668/article/details/124072852)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [超简单!!!搭建阿克曼ROS小](https://blog.csdn.net/zhao_ke_xue/article/details/125611011)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值