路径跟踪算法之PID路径跟踪与PP跟踪

本文探讨了路径跟踪的原理,介绍了纯跟踪(Pure Pursuit, PP)和PID控制在路径跟踪中的应用。PP算法常用于低速简单路径,而PID控制因其结构简单,被广泛用于无人驾驶路径跟踪。文章详细解释了这两种算法的工作机制,并提供了仿真案例和相关代码链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1路径跟踪原理

在运用好的路径规划算法,规划好一条从起点到目标点最优的路径后,如何
让机器人来寻着这条最优的路径走,便是路径跟踪(Path tracking)需要解决的问题。基于平面坐标系下设定一条理想的几何路径,然后要求机器人从某一处出发,按照某种控制规律到达该路径上,并实现其跟踪运动。
1.1 路径跟踪示意图

路径跟踪的实质是通过控制车辆的运动来减少车辆与参考轨迹之间的空间
误差,如果考虑轨迹的话,那么还包含了时间上的误差。

2 常见的路径跟踪算法

常见的路径跟踪算法可分为几何跟踪和模型跟踪:
几何跟踪是基于车辆的运动学几何结构,推导出控制量实现跟踪,常见的几何跟踪算法有纯跟踪算法(purePuresuit)、Stanley method 前轴控制、Rear_wheel_feedback 后轴控制等,其中后两者都是基于阿克曼模型实现的,而 pp 跟踪是在双轮乃至四轮差速模型和阿克曼模型中都相应的应用。

模型跟踪则是基于算法求解模型,结合机器人运动学与动力学的控制规律,通过最优解或稳定性调节等方式计算得到跟踪控制量的跟踪控制方式,常见的模型跟踪算法有很多,比如经典的 PID 控制、滑膜控制、线性二次型调节器控制、模型预测控制(MPC)等,不同的控制方式对应着不同的模型系统,可以

### 实现GNSS小车路径跟踪的纯跟踪模型和模糊控制 #### 纯跟踪模型简介 纯跟踪(Pure Pursuit)是一种用于移动机器人导航的经典算法,特别适用于车辆运动学建模。该方法通过寻找轨迹上最接近当前车辆位置的一个目标点,并计算转向角度使得车辆朝向此目标点前进。 对于GNSS小车而言,在已知全局坐标系下的期望路径时,可以采用如下方式实现: 1. **定义参数** - 设定前视距离 \( L_d \),即从当前位置到追踪的目标点的距离。 - 获取当前车辆的位置 (x, y) 和航向角 θ。 2. **查找最近点** 计算路径上的每一个点当前车辆之间的欧氏距离,找到离得最近的那个点作为起始参考点 P_ref(x_ref,y_ref)[^3]。 3. **确定目标点** 从前述P_ref出发沿路径方向选取一个满足条件 |PP_target| = Ld 的新点作为实际要追逐的目标点 Target(x_targt,y_target) 。如果路径终点更近,则取之为目标点[^3]。 4. **计算曲率/转角指令** 利用车辆几何关系求解出为了达到Target所需调整的方向变化量δ: ```python delta = atan((2 * wheelbase * cross_track_error) / lookahead_distance) ``` 其中 `cross_track_error` 是横向误差;`wheelbase` 表示轴距长度;`lookahead_distance` 即为设定好的前瞻距离Ld[^3]。 #### 模糊控制系统的设计 当环境存在不确定性因素如路面摩擦力波动、风阻等外部干扰源时,传统的PID调节难以获得理想效果。此时引入模糊逻辑控制器(Fuzzy Logic Controller, FLC), 可有效提升系统的抗噪能力和适应性能。 具体来说: - 输入变量可以选择为偏差 e(t)=y_desired-y_actual 和偏差的变化率 de/dt; - 输出则是对输入信号进行修正后的PWM占空比或者其他形式的速度命令u(k); - 建立隶属度函数表征各物理量所属程度; - 根据专家经验制定一系列IF-THEN规则映射不同状态组合下应采取的动作策略; 最终形成闭环反馈结构完成整个过程自动化管理。 ```matlab % 定义模糊推理系统并设置输入输出范围 fis = mamfis('Name','FuzzyController'); fis = addInput(fis,[min_e max_e],'Name','Error'); fis = addInput(fis,[min_de_dt max_de_dt],'Name','Delta_Error'); fis = addOutput(fis,[min_u max_u],'Name','Control_Action'); % 添加隶属度函数... for i=1:length(membership_functions_names) fis = addMF(fis,'Error',membership_functions_types{i},parameters_for_mfs{i},'Name',... membership_functions_names{i}); end % 构造if then规则库... ruleList = [ 'If Error is Negative_Big And Delta_Error is Decreasing Then Control_Action is Positive_Large'; ... ]; rules = readfisRules(ruleList); fis = setfis(fis,'Rule',rules); % 使用evalfis评估给定条件下应该产生的动作大小 output = evalfis([current_error current_delta_error],fis); ```
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

>_<!

码字不易,如有帮助,欢迎鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值