用Matlab和Simulink搭建纯跟踪控制器实现单移线轨迹跟踪
利用matlab和simulink搭建的纯跟踪控制器用于单移线轨迹跟踪,效果如图。 版本各为2018b和2019 内容包含: 1、simulink模型 2、纯跟踪算法的纯matlab代码,便于理解纯跟踪算法以及如何从代码到simulink模型的搭建。 3、帮助文档
最近在研究车辆轨迹跟踪相关的内容,利用Matlab 2018b和Simulink 2019实现了基于纯跟踪算法的单移线轨迹跟踪,效果还挺不错,给大家分享一下具体的实现过程。
一、Simulink模型
- 整体架构
在Simulink中搭建的模型主要由几个关键部分组成:轨迹生成模块、车辆动力学模型、纯跟踪控制器以及结果显示模块。
- 轨迹生成模块:这个模块负责生成单移线轨迹。我们可以通过简单的数学函数来实现,比如通过设定不同阶段的直线方程来模拟单移线。例如,假设车辆在x - y平面运动,在起始阶段可以是 \(y = 0\),在过渡阶段和最终阶段根据具体的偏移距离和车辆行驶方向设定相应的线性方程。
- 车辆动力学模型:模拟车辆实际运动情况,考虑车辆的速度、转向等因素。虽然Simulink有一些内置的车辆动力学模型库,但为了更贴合本次特定需求,我们可以自己搭建一个简单的模型。例如,通过输入车辆的纵向速度 \(v\) 和前轮转角 \(\delta\),利用运动学关系计算车辆的位置和方向变化。简单的运动学方程如下:
\(\dot{x} = v \cos(\theta)\)
\(\dot{y} = v \sin(\theta)\)

利用matlab和simulink搭建的纯跟踪控制器用于单移线轨迹跟踪,效果如图。 版本各为2018b和2019 内容包含: 1、simulink模型 2、纯跟踪算法的纯matlab代码,便于理解纯跟踪算法以及如何从代码到simulink模型的搭建。 3、帮助文档
\(\dot{\theta} = \frac{v}{L} \tan(\delta)\)
其中 \(x,y\) 是车辆位置,\(\theta\) 是车辆航向角,\(L\) 是车辆轴距。在Simulink中可以使用积分器模块对这些微分方程进行求解。
- 纯跟踪控制器:这是核心部分,它根据车辆当前位置和目标轨迹计算出合适的前轮转角,使车辆跟踪目标轨迹。下面会在纯Matlab代码部分详细介绍其原理。
- 结果显示模块:可以使用Simulink的Scope模块来直观显示车辆实际行驶轨迹与目标单移线轨迹,方便观察跟踪效果。
- 模块连接
将轨迹生成模块输出的目标轨迹点作为纯跟踪控制器的输入,同时车辆动力学模型输出的车辆当前位置也输入到纯跟踪控制器。纯跟踪控制器计算出的前轮转角输入到车辆动力学模型,最后车辆动力学模型输出的车辆位置与轨迹生成模块输出的目标轨迹一起连接到结果显示模块。
二、纯跟踪算法的纯Matlab代码
纯跟踪算法的核心思想是根据车辆当前位置与目标轨迹上某一点的距离,计算出合适的前轮转角,使车辆朝着目标点行驶。下面是简化后的Matlab代码实现:
% 假设已经有目标轨迹点,存储在waypoints矩阵中,每一行是[x,y]坐标
waypoints = [0 0; 10 0; 20 5; 30 5; 40 0; 50 0];
L = 2.5; % 车辆轴距
v = 5; % 车辆速度
% 初始化车辆位置和方向
x = 0;
y = 0;
theta = 0;
% 用于存储车辆行驶轨迹
trajectory = zeros(size(waypoints, 1), 2);
for i = 1:size(waypoints, 1)
lookahead_distance = 5; % 预瞄距离
% 找到目标轨迹上距离车辆当前位置lookahead_distance的点
min_distance = Inf;
target_index = 1;
for j = 1:size(waypoints, 1)
dist = sqrt((waypoints(j, 1) - x)^2 + (waypoints(j, 2) - y)^2);
if dist < min_distance && dist >= lookahead_distance
min_distance = dist;
target_index = j;
end
}
target_point = waypoints(target_index, :);
% 根据纯跟踪算法计算前轮转角
alpha = atan2(target_point(2) - y, target_point(1) - x) - theta;
delta = atan2(2 * L * sin(alpha), lookahead_distance);
% 更新车辆位置和方向
x = x + v * cos(theta);
y = y + v * sin(theta);
theta = theta + v / L * tan(delta);
% 记录车辆轨迹
trajectory(i, :) = [x, y];
}
代码分析:
- 首先定义了目标轨迹点
waypoints,车辆轴距L和速度v,并初始化车辆位置(x, y)和方向theta。 - 在循环中,设定预瞄距离
lookaheaddistance,通过遍历目标轨迹点,找到距离车辆当前位置在预瞄距离附近的目标点targetpoint。 - 根据车辆当前位置、目标点位置和车辆航向角计算出角度偏差
alpha,进而根据纯跟踪算法公式计算前轮转角delta。 - 利用车辆运动学关系更新车辆的位置和方向,并记录车辆行驶轨迹。
三、帮助文档
- 安装与准备
确保你已经安装了Matlab 2018b和Simulink 2019版本。如果没有安装,可以从MathWorks官方网站获取安装包并按照提示进行安装。
- 使用方法
- Simulink模型:打开Simulink,导入搭建好的模型。在模型参数设置中,可以调整车辆相关参数(如轴距、速度等)以及纯跟踪控制器的预瞄距离等参数。运行模型后,在Scope模块中观察车辆跟踪效果。
- Matlab代码:将上述纯跟踪算法的Matlab代码复制到Matlab编辑器中,确保目标轨迹点数据正确设置(如果需要更改轨迹)。运行代码后,会得到车辆行驶轨迹数据trajectory,可以通过绘图函数(如plot)来可视化轨迹。 - 注意事项
- 在Simulink模型搭建过程中,注意模块之间的信号连接和数据类型匹配,避免出现仿真错误。
- 对于Matlab代码,目标轨迹点的格式和数据范围要根据实际需求合理设置,否则可能导致算法计算异常。
希望通过这篇博文,大家对利用Matlab和Simulink搭建纯跟踪控制器实现单移线轨迹跟踪有更清晰的了解,一起探索更多有趣的车辆控制相关内容吧!

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)