news 2026/5/14 17:15:08

自动驾驶纵向控制-复现Apollo双pid纵向位置跟踪 复现百度apollo纵向控制 纵向控制...

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
自动驾驶纵向控制-复现Apollo双pid纵向位置跟踪 复现百度apollo纵向控制 纵向控制...

自动驾驶纵向控制-复现Apollo双pid纵向位置跟踪 复现百度apollo纵向控制 纵向控制已经制作好油门刹车标定表,无需自己做标定。

凌晨三点半的显示器蓝光打在脸上,手指机械地敲着键盘。当我第N次看着测试车在Simulink里画出心电图般的速度曲线时,终于决定扒开Apollo的纵向控制黑盒子——不就是双PID吗?今天咱们就手撕这套经典结构。

先看整体架构,Apollo把纵向控制拆成位置和速度两个闭环。就像驾校教练同时管着方向盘和油门,位置PID负责告诉车该跑多快,速度PID实际踩油门刹车。这个结构妙在能处理不同控制模式的无缝切换,后面细说。

位置PID:导航小姐姐的唠叨

class PositionPID: def __init__(self, kp, ki, kd, max_integral): self.kp = kp # 0.3效果拔群 self.ki = ki # 0.01防止积分暴走 self.error_sum = 0.0 self.last_error = 0.0 def calculate(self, target_pos, current_pos, dt): error = target_pos - current_pos self.error_sum += error * dt self.error_sum = np.clip(self.error_sum, -max_integral, max_integral) d_error = (error - self.last_error) / dt output = self.kp*error + self.ki*self.error_sum + self.kd*d_error self.last_error = error return output

这个PID输出的其实是期望速度。注意max_integral这个参数,实测不加的话在长距离误差时会出现"油门踩穿底盘"的灵异现象。建议取期望最大速度的2倍左右。

自动驾驶纵向控制-复现Apollo双pid纵向位置跟踪 复现百度apollo纵向控制 纵向控制已经制作好油门刹车标定表,无需自己做标定。

速度PID:灵魂脚法控制器

当位置PID给出目标速度后,真正的重头戏来了:

double SpeedController::Update(double target_speed, double current_speed) { double error = target_speed - current_speed; // 动态调整积分系数,低速时加强控制 double adaptive_ki = ki * (1 + 2/(current_speed + 0.1)); // 带滤波的微分项 double d_error = LowPassFilter(error - last_error_, 0.2); double accel_cmd = kp_*error + adaptive_ki*integral_ + kd_*d_error; // 刹车油门模式切换 if (accel_cmd > 0) { return CalculateThrottle(accel_cmd); } else { return CalculateBrake(-accel_cmd); } }

这里有几个精妙设计:

  1. 低速时积分增强,解决蠕动工况的稳态误差
  2. 微分项经过低通滤波,避免速度传感器噪声被放大
  3. 根据加速度指令正负自动切换油门刹车,比单独控制更顺滑

模式切换的舞蹈

最让我头秃的是巡航模式与停车模式的切换逻辑。Apollo用状态机管理,这里简化版:

if target_speed < 0.3: # 进入停车模式 if abs(position_error) < 0.05: execute_full_stop() else: use_position_pid_only() elif current_speed < target_speed * 0.8: # 急加速模式 override_pid_with_wot() # 地板油策略 else: # 正常巡航 enable_speed_feedforward() # 预瞄补偿

注意从停车模式切回时要做积分重置,否则残留的积分项会让车像突然被踹一脚。实测加上reset_integral()后,起步顿挫减少了70%。

当我把这些模块拼装完成,看着测试车在弯道前自动降速入弯,出弯时平稳加速,终于理解了Apollo工程师的良苦用心——好的控制就像呼吸,你感觉不到它的存在,但一旦失调就会窒息。下次试试加入坡度补偿,应该能让长上坡路段不再喘得像老拖拉机...(查看GitHub仓库的兄弟们,记得把标定表路径改对,血的教训!)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 23:25:17

CANN分布式训练:从单机到千卡集群的弹性扩展实战

CANN组织链接&#xff1a;https://atomgit.com/cann ops-nn仓库链接&#xff1a;https://atomgit.com/cann/ops-nn 当千亿参数大模型训练因通信瓶颈扩展效率仅38%&#xff0c;当工程师耗费数月调试分布式脚本却频繁遭遇节点故障&#xff0c;当“千卡训练”沦为少数巨头的专属游…

作者头像 李华
网站建设 2026/5/10 2:41:38

红外热成像图像电力设备故障缺陷检测数据集VOC+YOLO格式1729张6类别

注意数据集图片有1/3是原图剩余为增强图片数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数)&#xff1a;1729标注数量(xml文件个数)&#xff1a;1729标注数…

作者头像 李华
网站建设 2026/5/12 23:23:28

4.2 缓存策略与多级缓存:如何减少90%的数据库访问?

4.2 缓存策略与多级缓存:如何减少90%的数据库访问? 在高并发的分布式系统中,数据库往往是性能瓶颈之一。通过合理的缓存策略和多级缓存架构,我们可以显著减少数据库访问次数,提升系统响应速度和吞吐量。本节将深入探讨缓存策略的设计与实现,以及如何构建高效的多级缓存系…

作者头像 李华
网站建设 2026/5/12 23:23:34

PostgreSQL 性能优化:分区表实战

文章目录一、为什么需要分区表&#xff1f;1. 单表瓶颈分析2. 分区表的核心价值二、PostgreSQL 分区类型详解1. 范围分区&#xff08;Range Partitioning&#xff09;——最常用2. 列表分区&#xff08;List Partitioning&#xff09;3. 哈希分区&#xff08;Hash Partitioning…

作者头像 李华