1 控制理论基础

1.1 控制模块概述

【备战算法岗】—— 控制模块复习(持续更新!!!)-LMLPHP

输入:轨迹线Reference、地图信息、定位信息、车辆反馈信息
输出:刹车、油门、转向

CANBUS:车辆底盘交互协议
参考博客:Apollo CANBUS模块解析
apollo:canbus模块(1)引言
底盘、速度、四轮转速、健康状况、底盘报错、自动驾驶状态

运动学模型:刚体运动(低速)
动力学模型:力学分析(中高速)
详细推导见:车辆运动学和动力学模型

:让无人车在既定的轨迹上平稳运行,保证车辆行驶的可行性、舒适性、控制实时性

控制模块:

【备战算法岗】—— 控制模块复习(持续更新!!!)-LMLPHP

1.2 控制基础

(1)控制系统:消除物理模型和数学模型差异性的过程

稳定性:对于任何环境都需要稳定(安全)
稳态误差:尽可能小,保证执行上层命令【控制实际运行的偏差范围】
动态误差:在动态工程中也需要保证很多性能
【备战算法岗】—— 控制模块复习(持续更新!!!)-LMLPHP
y(t)表示控制系统的输出;虚线表示控制系统理想状态下达到的位置(我们期望的);t表示时间
图(b)是我们追求的控制效果,(a)比较慢,©波动但是不收敛,(d)波动呈发散属于最不好的控制

(2)控制基础

  1. 时间域
  1. 频率域
  1. 离散域(z变换)

频域、时域、离散域是可以相互转换的;时间函数相对比较常用,Google或百度搜索拉氏变换应该就用了

2 仿真软件的使用

CARLA

3 常见规划控制算法

3.1 横向控制算法对比

(1)是否转弯内切(2)鲁棒性(3)对路径的要求(4)适用场景

LQR vs MPC

3.2 控制算法概述

(1)PID
PID:调试比例增益、积分增益、微分增益来达到想要的控制效果
【备战算法岗】—— 控制模块复习(持续更新!!!)-LMLPHP
调试PID经验参考文章:
阿克曼小车位置式PID调试经验
pid的参数调试方法以及个人理解
【备战算法岗】—— 控制模块复习(持续更新!!!)-LMLPHP

(2)Pure pursuit
预瞄距离:后轴中心到目标路点的距离
α \alpha α:后轴中心到目标路点与车辆纵轴之间的夹角

纯追踪算法:基于自行车模型,以车辆后轴中心为切点,车辆纵向车身为切线。通过控制前轮转角,使车辆可以沿着一条经过目标路点的圆弧行驶
δ ( t ) = a r c t a n ( 2 L s i n α ( t ) L d ) { {\delta (t)=arctan(\frac{2Lsin\alpha (t)}{Ld} )} } δ(t)=arctan(Ld2Lsinα(t))

(3)Stanley
核心思想:基于前轮中心的路径跟踪偏差量对方向盘转向控制量进行计算

前轮转角控制量: δ = θ φ + θ y \delta =\theta _{\varphi }+\theta _{y } δ=θφ+θy
θ φ \theta _{\varphi } θφ:当前车身方向与参考轨迹最近的点的切线方向的夹角
θ y \theta _{y } θy:前轮中心到参考轨迹最近点的横向距离 e y e_{y} ey

控制器设计:
δ ( k ) = θ e ( k ) + a r c t a n k e ( k ) v ( k ) \delta(k)=\theta _{e}(k)+arctan\frac{ke(k)}{v(k)} δ(k)=θe(k)+arctanv(k)ke(k)
其中, θ e ( k ) \theta _{e}(k) θe(k)为k时刻的航向角偏差,e(k)为横向跟踪误差,k为需要调节的参数,v为无人车当前速度。

(4)LQR
离散系统:
x ( K + 1 ) = A x ( k ) + B u ( k ) x(K+1)=Ax(k)+Bu(k) x(K+1)=Ax(k)+Bu(k)
代价函数:
【备战算法岗】—— 控制模块复习(持续更新!!!)-LMLPHP
设计步骤:
① 确定迭代范围N
② 设置迭代初始值 P N = Q P_N=Q PN=Q
t = N , . . . , 1 t=N,...,1 t=N,...,1,从后向前循环迭代求解离散时间的代数Riccati方程
P t − 1 = Q + A T P t A − A T P t B ( R + B T P t + 1 B ) − 1 B T P t A P_{t-1}=Q+A^TP_tA-A^TP_tB(R+B^TP_{t+1}B)^{-1}B^TP_tA Pt1=Q+ATPtAATPtB(R+BTPt+1B)1BTPtA
t = 0 , . . . , N t=0,...,N t=0,...,N循环计算反馈系数 K t = ( R + B T P t + 1 B ) − 1 B T P t + 1 A K_t=(R+B^TP_{t+1}B)^{-1}B^TP_{t+1}A Kt=(R+BTPt+1B)1BTPt+1A 得到控制量 u t = − K t x t u_t=-K_tx_t ut=Ktxt

(5)MPC
:利用三维的空间模型加上时间构成四维时空模型,然后在这个时空模型上求解最优控制器。

模型预测控制在k时刻共有三步:
① 获取系统当前状态
② 基于u(k),u(k+1),u(k+2),…,u(k+m)进行最优化处理
③ 只取u(k)作为控制输入施加在系统上
在下一时刻重复上面三步,在下一步进行预测时使用的就是下一步的状态值,我们将这样的方案称为

4 控制算法面试问题整理

(1)现在企业里的控制都是用什么做呢?

(2)为什么规划需要给控制输出一条尽可能平滑的曲线,控制不也是根据离散点来做的,比如纯跟踪这种做法,不也是选取预瞄点去跟踪?

(3)实车控制问题若采用mpc 做,中间产生无解或是违反约束的情况怎么解决

(4)mpc做控制或者局部路径规划,这两者的区别

(5)MPC在低速场景(0.1m/s),进行路径跟踪,是否无法进行?

(6)基于mpc方法能做泊车场景吗?跟图搜索和随机采样的方法有什么不同?为什么很多泊车场景很少用mpc去做?

(7)经典控制理论:PID、ACC
现代控制理论:LQR、轨迹跟踪

(8)纵向的油门刹车标定表如何建立

参考:(八)实践出真知——apollo刹车油门标定

(9)误差状态方程的右边还有一项关于参考路径的航向角速率,但是 LQR 控制器中并没有考虑他对状态量的影响,那应该如何解决呢

(10)线控转向系统的控制延迟如何处理

(11)讲一讲自动驾驶中的一些坐标系以及转换关系
笛卡尔
Frenet
转换关系见:Apollo基础 - Frenet坐标系
(12)LQR怎么处理非线性目标和约束

(13)自行车模型中具体是如何实现的?
【备战算法岗】—— 控制模块复习(持续更新!!!)-LMLPHP
(14)在实际问题中,应该根据什么去选择不同的控制算法进行控制器的设计?

(15)什么是自动控制?为什么要进行频域和时域的分析?各自的分析方法有哪些?

为什么要进行这两种分析,主要是因为它们各自关注了系统的不同特性:时域分析关注系统响应随时间如何变化、系统能否在有限时间内达到稳定状态频域分析关注系统对不同频率信号的响应特性,使我们能深入理解系统对输入信号的灵敏度以及在不同频率下的系统性能。通过时域和频域分析,可以全面了解系统的动态行为,为系统的设计和调整提供依据。

(16)QP一定是凸问题吗?

(17)车辆是如何进行执行横向或者纵向控制的,如何匹配使得车辆跟踪上目标点?

(18)简述MPC开发过程

(19)简述MPC算法原理

(20)讲一讲LQR和MPC的不同点,以及相应的应用场景

(21)自动驾驶中车辆有哪些模型,是如何建模的?

(22)控制模块的输入输出是什么?和规划是什么关系

(23)你的算法在实际测试中发现的三个头部问题是什么,然后你是怎么解决的

(24)常见的碰撞检测方法
常见的碰撞检测方法
碰撞检测的向量实现
外接圆碰撞检测、AABC、OBB、GJK、EPA、比较面积的方法
(25)自己运用强化学习算法多点还是传统控制算法多点

(26)在巡航控制算法中用的PID算法,如何根据被控对象设计算法,思路是什么

(27)你做的都是时间域上的控制,频域上的控制了解吗

(28)控制算法最看重的指标是什么,如何衡量这个指标

(29)给出一个定义好的类,请用多态调用的方式调用这个类,写出一个PD位置控制算法
(30)在工程上经常会出现电机突然不转的情况,这时候会出现积分饱和,请问如何抵抗积分饱和,说出你的思路,并写代码解决
(31)假设一辆车沿一条直路向前行驶,初始位置为0m,速度为0m/s,每一秒该车都可以选择一次加速度: + 2 m / s 2 +2m/s^2 +2m/s2 − 2 m / s 2 -2m/s^2 2m/s2,或者 0 m / s 2 0m/s^2 0m/s2。该车在1秒内开过的路程是(v(t)+v(t+1))/2m。终点在1000m处, 且到达终点时速度恰好为0m/s。路上有若干处限速,请问如何加减速才能保证最快到达终点且到达终点时速度为0m/s。

#include <iostream>
#include <cstdio>
#include <unordered_map>
#include <math.h>
#include <array>
 
 
int main()
{
    std::unordered_map<int, int> v_limit_vec{ {100,5}, {405,20} ,{1000,2} }; //<speed limit position, speed limit value>
    int pos = 0; //initial position
    int t = 0;//time
    int v = 0;//initial speed
    int v_next = 0; //next step speed
    int p_next = 0; //next step position
    std::array<int,3> a_vec{ 1,0,-1 };// three actions
    while (pos<1000){
        for (int a : a_vec){ //start with +1, then 0, then -1
            v_next = v + a;
            if (v_next < 0) {
                v_next = 0;
            }
            p_next = (v_next + v) / 2 + pos;
 
            bool action_good = true; //once find good action, break action loop
            for (std::pair<int,int> the_pair : v_limit_vec) {//loop over speed limits
                int v_lim_pos=the_pair.first; //get speed limit position
                if (v_lim_pos - pos <= 0)  {
                    continue;
                }
                int v_lim_v=the_pair.second; //get speed limit speed
                if (v_lim_pos - p_next > 0) { //if potential speeding at future step
 
                    //compute the acc of constant deceleration to satisfy speed limit
                    float acc = (static_cast<float>(v_lim_v) * v_lim_v - v_next * v_next) / (2 * (v_lim_pos - p_next));
                    if (acc < -1) {
                        action_good = false;
                    }
                } 
                else { //if speeding at current step
                    if (v_next > v_lim_v) {
                        action_good = false;
                    }
                }
                if (!action_good) { 
                    break; //this action does not satisfy this speed limit, no need to check other speed limits.
                }
            }
            if (action_good) {
                break;
            }
        }
        //simulate one step
        t = t + 1;
        v = v_next;
        pos = p_next;
    }
    std::cout << t <<std::endl;
    std::cout << v << std::endl;
    std::cout << pos << std::endl;
}

(32)轮胎的侧偏特性,侧偏角产生的原因

(33)当车辆上下乘客(车重发生变化时)对模型参数辨识带来的困难

(34)python面试常问的问题
算法工程师面经 —— python 面试常问问题

04-20 16:51