面试准备的问题

一、域控制器开发工程师

25届校招】自动驾驶域控制器开发工程师已投递

广州正式互联网 / 电子 / 网游 - 研发

职位描述

工作职责:(此岗位为系统岗位,不需要开发coding) 1、系统设计与开发:根据自动驾驶技术发展趋势及市场需求,设计并持续优化自动驾驶系统架构,确保系统的高性能、可扩展性和安全性; 2、域控制器开发:负责自动驾驶域控制器的具体开发工作,包括硬件及基础软件软件需求定义和过程管理、推进软件开发及集成测试,确保域控制器满足自动驾驶功能需求和量产交付; 3、平台化设计:参与梳理平台化需求,参与制定平台化方案,学习并尝试解决平台化过程中的共性问题; 4、项目协作:跨部门团队紧密合作,参与管理软硬件需求、测试验证及实施流程,推动项目按计划推进; 5、质量改进:关注域控制器与智能驾驶系统的功能质量,学习并参与解决技术质量问题的过程,培养严谨的质量意识。

任职要求: 1、计算机科学、电子工程、车辆工程或相关专业硕士应届毕业生; 2、具备良好的C/C++编程基础,有学习意愿快速掌握相关知识; 3、对汽车总线协议(如CAN、Ethernet等)、操作系统、通信原理、传感器融合、路径规划、决策控制等自动驾驶关键技术有基础了解或浓厚兴趣; 4、展现出良好的项目管理潜力、沟通协调能力和团队合作精神,能够适应快节奏的工作环境,承受一定的工作压力; 5、有自动驾驶项目实习经历或相关科研项目经验者优先。

1. 你如何理解自动驾驶系统的架构?

自动驾驶系统的架构可以分为感知、规划、决策、控制、执行五个核心模块。

  • 感知:通过传感器(如摄像头、雷达、激光雷达等)获取车辆周围环境的实时数据,并使用数据融合技术生成高精度的环境模型。
  • 规划:规划模块根据感知结果和目标信息生成局部路径。在这个环节,路径规划算法(如A*、RRT、MPC等)起关键作用。
  • 决策:基于当前环境和规划路径,决策模块决定车辆的具体行为,包括超车、避障、跟车等。此环节可能会用到基于规则的方法或强化学习的策略。
  • 控制:最后由控制算法(如PID或LQR)将决策转化为实际的车辆运动控制参数,如加速度、方向盘转角等。通过控制算法保证车辆能够精准跟随规划轨迹。

在实际项目中,我使用ROS和VTD进行联合仿真时,体验到了各个模块的交互和数据流动。在架构设计上,模块化设计确保了系统的灵活性和可扩展性,比如我们可以在控制模块中无缝替换不同的控制算法,以适应不同的车辆模型或场景需求。

2. 如何优化系统的可扩展性和安全性?

在系统设计中,我认为模块化分层架构是确保可扩展性和安全性的关键。模块化设计使得每个模块的功能清晰、独立,同时允许我们在不影响其他模块的情况下进行更新或替换。例如,控制模块可以独立于感知和决策进行优化和升级。

  • 可扩展性:通过定义清晰的接口和协议,例如使用ROS节点来通信,不同模块之间的依赖性被降到最低,从而增强了系统的扩展能力。我们可以根据需求增加更多的传感器或功能,而无需大幅改动原有系统。

  • 安全性:安全性是自动驾驶的核心问题,我倾向于从冗余设计错误检测机制两方面考虑。在仿真项目中,我们会通过多传感器冗余确保感知数据的可靠性,并在决策阶段使用多种算法交叉验证。此外,自动驾驶系统中还需要加入实时监控机制,捕捉可能的系统故障并迅速进行紧急处理。

3. 你对自动驾驶域控制器的理解是什么?它的主要功能是什么?

自动驾驶域控制器相当于汽车的大脑,主要负责整合多个子系统(如感知、规划、控制)的运算和控制信号的传递。它具备高计算能力,用来处理大量来自传感器的数据,并做出实时的驾驶决策。

  • 主要功能:第一,它需要通过CAN或Ethernet等总线协议接收来自传感器的数据。第二,它需要运用这些数据执行实时运算,包括环境感知、路径规划、决策控制等。第三,它会将决策转化为具体的控制指令(如油门、刹车、方向盘角度)并传输给车辆的执行机构。在硬件层面,域控制器需要高性能的处理器以及可靠的操作系统来保证这些计算的实时性和稳定性。

在我的项目中,我曾基于LQR-PID控制器对车辆的运动进行实时控制,其中的每一步运算都是在控制器中完成的。这种实时处理能力和多模块协同能力,正是自动驾驶域控制器的核心价值所在。

4. 自动驾驶域控制器的开发过程有哪些关键步骤?

开发自动驾驶域控制器通常分为以下几步:

  • 需求定义:首先我们要明确系统的软硬件需求,硬件部分通常包括高性能处理器、图形处理单元等,软件部分需要考虑到实时操作系统通信协议(如CAN、Ethernet)的支持
  • 软件集成与开发:开发过程中需要进行软件模块的集成,确保各个模块(感知、规划、控制等)能够在域控制器上平稳运行。举例来说,我在实现控制模块时,需要考虑计算资源的分配和时间片的调度,确保每个周期内控制算法能及时执行。
  • 集成测试:测试环节是最关键的部分,集成测试时要考虑到软硬件的协调,确保传感器数据的传输、控制算法的执行都能达到实时性要求。我在仿真项目中通过VTD测试过控制器性能,重点检查了控制器在不同负载下的反应速度和稳定性。

5. 如何梳理平台化需求,解决平台化过程中的共性问题?

平台化的需求通常指的是要建立一个可以支持不同车型或不同自动驾驶等级的通用架构。梳理需求时需要从多个层面入手:

  • 硬件兼容性:要确保硬件部分能够适应不同车辆的架构。例如,域控制器要能兼容多个不同的传感器类型。
  • 软件可复用性:通过模块化设计,可以确保不同功能模块在不同车型上复用。我参与过的项目中,LQR控制算法模块就是一个可以跨车型使用的模块,确保代码复用。

对于共性问题,通常可以通过建立标准化接口来解决。比如,传感器和控制器的通信可以通过统一的接口协议实现,确保在不同的系统中能够无缝对接。

6. CAN总线协议的基本原理是什么?它如何应用在自动驾驶系统中?

**CAN(Controller Area Network)**总线是车内电子控制单元(ECU)之间通信的标准协议。它是一种多主从协议,允许多个ECU共享同一条通信线路,具有高效的错误检测机制和实时性保障。在自动驾驶系统中,CAN总线通常用于:

  • 传输传感器数据:例如激光雷达、摄像头等数据会通过CAN总线传输到域控制器,域控制器根据这些数据进行处理。
  • 下发控制指令:域控制器计算出控制信号后,通过CAN总线将加速度、转向等控制信号传递给执行机构。

在项目中,我通过ROS的CAN节点实现了传感器数据的传输和车辆控制信号的下发,确保了自动驾驶系统中各模块的实时通信。

7. 在自动驾驶系统中,如何实现路径规划和决策控制?

路径规划通常基于地图信息和实时的感知数据。它的过程分为全局路径规划局部路径规划

  • 全局规划在长距离行驶时,系统需要根据地图规划一个从起点到终点的最优路线,常见的算法有A*、Dijkstra等。
  • 局部规划:在实际驾驶过程中,车辆需要实时处理周围的动态环境,局部路径规划通过避障算法(如MPC、动态窗口法)来规划短期的路径

决策控制则是基于规划路径和当前车辆状态来执行动作。在我的仿真项目中,我实现了LQR控制器来调整车辆的横向运动,确保车辆能够沿着规划的路径精准行驶,同时使用PID算法来控制车辆的纵向速度。

8. 如何定义自动驾驶域控制器的软硬件需求?

域控制器的软硬件需求定义需要从性能、功能性和安全性三个方面考虑:

  • 硬件需求:处理器需要具备高计算能力,尤其是支持并行计算的多核处理器和图形处理单元(GPU),用于处理复杂的传感器数据和控制算法。此外,可靠的供电系统和高冗余设计也非常关键。
  • 软件需求:操作系统需要具备实时性支持(如RTOS),软件模块需要支持感知、规划和控制的高度集成,并且要符合ASIL-D等功能安全标准。

9. 你在项目中是如何进行质量控制和改进的?

质量控制贯穿于整个开发流程,我习惯通过多层次的测试来确保代码质量和系统稳定性:

  • 单元测试:针对每个功能模块进行单元测试,确保算法的正确性。
  • 集成测试:测试各个模块之间的交互,确保传感器数据和控制指令的传递无误。
  • 系统级测试:在仿真环境(如VTD)中进行端到端测试,模拟真实驾驶环境中的各类复杂情况,确保控制器的稳定性和反应速度。

每当发现问题时,我会根据测试报告分析

二、简历中的问题深挖

专业技能:

1. 你理解的车辆动力学模型是什么,运用在ros/c++控制模块具体体现是什么

#include <ros/ros.h>
#include <std_msgs/Float64.h>
#include <geometry_msgs/Twist.h>

// 车辆参数定义
const double L = 2.5;  // 车辆轴距 (m)
const double max_steer_angle = 30.0 * M_PI / 180.0;  // 最大方向盘转角 (rad)
const double steer_ratio = 15.0;  // 转向传动比
const double max_throttle = 1.0;  // 最大油门开度 (0-1)
const double max_brake = 1.0;     // 最大刹车开度 (0-1)

// 订阅控制指令并发布转向与纵向控制输出
class VehicleControl {
public:
    VehicleControl() {
        ros::NodeHandle nh;
        // 订阅控制指令:速度 (m/s) 和前轮转角 (rad)
        cmd_sub = nh.subscribe("/control_cmd", 10, &VehicleControl::controlCallback, this);
        
        // 发布油门、刹车、方向盘转角
        throttle_pub = nh.advertise<std_msgs::Float64>("/throttle_cmd", 10);
        brake_pub = nh.advertise<std_msgs::Float64>("/brake_cmd", 10);
        steer_pub = nh.advertise<std_msgs::Float64>("/steer_cmd", 10);
    }

    // 控制回调函数
    void controlCallback(const geometry_msgs::Twist::ConstPtr& msg) {
        double desired_speed = msg->linear.x;  // 控制模块计算的目标速度 (m/s)
        double desired_steering_angle = msg->angular.z;  // 控制模块计算的前轮转角 (rad)

        // 转换前轮转角为方向盘转角
        double steering_wheel_angle = desired_steering_angle * steer_ratio;
        steering_wheel_angle = std::max(std::min(steering_wheel_angle, max_steer_angle), -max_steer_angle);

        // 控制纵向加速度,转换为油门或刹车开度
        double throttle = 0.0;
        double brake = 0.0;
        if (desired_speed > current_speed) {
            throttle = std::min((desired_speed - current_speed) / max_throttle, max_throttle);
        } else {
            brake = std::min((current_speed - desired_speed) / max_brake, max_brake);
        }

        // 发布方向盘转角指令
        std_msgs::Float64 steer_cmd;
        steer_cmd.data = steering_wheel_angle;
        steer_pub.publish(steer_cmd);

        // 发布油门或刹车指令
        std_msgs::Float64 throttle_cmd;
        throttle_cmd.data = throttle;
        throttle_pub.publish(throttle_cmd);

        std_msgs::Float64 brake_cmd;
        brake_cmd.data = brake;
        brake_pub.publish(brake_cmd);

        ROS_INFO("Steering: %f rad, Throttle: %f, Brake: %f", steering_wheel_angle, throttle, brake);
    }

private:
    ros::Subscriber cmd_sub;
    ros::Publisher throttle_pub;
    ros::Publisher brake_pub;
    ros::Publisher steer_pub;

    double current_speed = 0.0;  // 当前车速,通常从传感器获取并更新
};

int main(int argc, char** argv) {
    ros::init(argc, argv, "vehicle_control_node");
    VehicleControl vc;
    ros::spin();
    return 0;
}

代码解读

  1. 车辆动力学参数: 定义了车辆的轴距、最大方向盘转角和转向传动比等参数,转向传动比用于将前轮转角转换为方向盘转角。
  2. 纵向控制: 根据控制模块给出的目标速度,比较当前车速,决定油门或刹车的开度。
    • 若目标速度大于当前车速,施加油门。
    • 若目标速度小于当前车速,施加刹车。
  3. 转向控制: 根据前轮转角,通过转向传动比计算出方向盘的转角,发布控制信号。

线控电动车的特点

  • 油门控制通常是基于车辆的纵向加速度来调整电机的功率输出。模型可以根据纵向加速度推导出油门开度。
  • 转向控制是通过电动助力转向系统直接根据控制模块输出的前轮转角调整方向盘转角。

你可以根据车辆的具体动力学特性调整这些参数和模型。

max_throttlemax_brake 实际上应该是一些非1的值,用来控制速度差转化为油门或刹车开度的比例。现在除以max_throttlemax_brake 是一种将速度差转换为0到1范围的方式。如果 max_throttlemax_brake 的值为1,则表示代码在计算油门和刹车开度时没有考虑比例,只是将速度差直接作为油门或刹车的开度。

修改建议

你可以根据实际的车辆动力学调整 max_throttlemax_brake,这些值应代表最大可能的油门或刹车开度(即100%时代表1)。比如说,如果你认为油门开度和速度差之间的比例应该是1:10(即1m/s的速度差对应10%的油门开度),则可以将 max_throttle 设置为10。

const double max_throttle = 10.0;  // 油门开度比例
const double max_brake = 10.0;     // 刹车开度比例

这样,速度差会被合理转化为油门或刹车开度。

这个设计意图是为了让速度差在合适的比例下转换为控制信号,而不是简单地除以1。在实际应用中,你应该根据车辆响应的具体情况调整这个比例。

在线控底盘电动车的场景中,油门开度的处理方式会有所不同。线控电动车直接通过电控信号调节电机的功率输出,因此油门开度实际上对应的是对电机输出功率的控制,而不是传统燃油车中的油门开度与发动机进气量的关系。具体考虑包括以下几点:

  1. 油门开度和功率输出
    在电车中,油门开度可以理解为电机功率的百分比调节。比如,油门开度为50%时,电机输出一半功率;开度为100%时,输出最大功率。这种比例关系直接影响车辆的加速性能和能量消耗。油门开度调节直接对应车辆的纵向加速度,通过控制电机转速和扭矩来控制车速。

  2. 速度控制和功率反馈
    电动车常见的控制方式是使用闭环控制系统来确保目标速度和实际车速相匹配。控制模块给出的纵向加速度指令会通过油门开度转换为电机功率的控制指令,电车的控制器会通过反馈电机的转速和扭矩信息,确保车辆按照期望的速度行驶。

  3. 电机效率和功率限制
    由于电动机的功率输出受到电池电压和温度等因素的影响,油门开度和车辆加速度之间的关系并非线性。在某些极限工况下,电机输出功率会受到限制,如电池电量低、温度过高等。

  4. 能量回收制动(再生制动)
    在电车中,刹车不再完全依赖机械刹车,而是通过再生制动来实现。当控制模块发出刹车指令时,油门开度可能是负值,电机会进入能量回收模式,将车辆的动能转换回电能,反映为纵向负加速度。

2. LQR矩阵中,矩阵怎么调节

2.1 QR矩阵

QR 矩阵的调节是 LQR 控制器设计中非常关键的一部分。它们决定了控制器对不同状态变量的重视程度以及控制输入的成本。以下是关于如何调节 QR 矩阵的指导:

2.1.1. Q 矩阵

Q 矩阵是一个权重矩阵,它用于惩罚状态误差Q 矩阵的对角线元素通常用于控制对相应状态变量的重视程度,非对角线元素则通常为零。Q 矩阵的大小与系统状态向量的维数相同。

  • 调节方式
    • 横向误差(e_y)的权重

      • 增大 Q(0,0) 的值:可以更严格地惩罚横向误差,使控制器更积极地纠正车辆偏离轨迹的行为
      • 减小 Q(0,0) 的值:则放松对横向误差的惩罚,使控制器对横向偏差的容忍度更高
    • 横向误差变化率(e_y_dot)的权重

      • 增大 Q(1,1) 的值:使控制器更加关注横向误差的变化速率,平滑控制动作,减少快速横向移动
      • 减小 Q(1,1) 的值:减少对横向误差变化率的关注,可能导致更激进的控制策略
    • 偏航角误差(e_phi)的权重

      • 增大 Q(2,2) 的值:使控制器更加关注车辆的朝向误差,从而减少车辆在转弯时的偏航角误差。
      • 减小 Q(2,2) 的值:则减少对偏航角误差的重视,可能允许更大的偏航角误差。
    • 偏航角误差变化率(e_phi_dot)的权重

      • 增大 Q(3,3) 的值:控制器会更加关注偏航角的变化速率,平滑转向动作
      • 减小 Q(3,3) 的值:控制器会对偏航角变化速率的反应较慢,可能导致转向不够平滑。
MatrixXd Q(4, 4);
Q << q1, 0, 0, 0,
     0, q2, 0, 0,
     0, 0, q3, 0,
     0, 0, 0, q4;

默认建议:可以尝试将 Q 矩阵的对角线元素设为 1.0 开始,然后根据系统响应逐步调整。

2.1.2 R 矩阵

R 矩阵是一个控制输入的权重矩阵R 矩阵的大小与控制输入向量的维数相同R 矩阵的调节用于控制系统在达到目标时的输入成本。

  • 调节方式
    • 增大 R 的值:使控制器对输入信号的变化更加保守,减少控制器的控制幅度,减少系统的控制激烈程度。
    • 减小 R 的值:使控制器更积极,允许更大的控制输入变化可能导致更快速的系统响应,但也可能增加控制信号的振荡
    • MatrixXd R(1, 1);
      R << r1;
      
  • 默认建议可以尝试将 R 矩阵的值设为 0.1,然后根据系统表现逐步调整

2.1.3. 调节策略

  • 增大 Q 或减小 R:可以让控制器更重视状态误差的校正,通常会使系统更快响应,但可能引入更多的控制抖动。
  • 减小 Q 或增大 R:可以让控制器对状态误差更为容忍,系统响应会更为平滑,但误差校正速度可能会下降。

2.1.4. 实验调试

通过反复实验调整 QR 矩阵中的值,观察系统的响应情况,直到找到满足实际需求的组合。这个过程可能需要一些反复迭代,因为不同的权重组合会影响系统的动态行为。

 2.2 AB矩阵

AB 矩阵是系统状态空间模型的重要组成部分,它们描述了系统的动态特性和控制输入如何影响系统状态。在设计 LQR 控制器时,AB 矩阵通常是由系统的物理模型或辨识结果确定的,一般来说,不是直接“调节”的对象,而是根据系统实际情况设定的。但在某些情况下(例如简化模型或控制系统的灵敏度分析),我们可能会通过调整 AB 矩阵来探索系统的不同动态行为。

2.2.1. A 矩阵

A 矩阵定义了系统状态之间的关系,描述了系统在没有输入的情况下如何随时间变化

  • 系统动态特性
    • A 矩阵的元素反映了系统的自然动态特性。例如,在车辆的横向控制模型中,A 矩阵的元素可能包含与车辆速度、转向角度、质量分布等相关的参数。
  • 调节方法
    • 理论调节:通过分析系统的物理模型,对关键参数(如车辆速度、转向角刚度等)进行理论推导和调整,以改变 A 矩阵的具体数值。
    • 敏感性分析:可以通过小范围调整 A 矩阵中的参数,观察系统响应的变化,来进行敏感性分析,以确定系统对不同动态特性的敏感程度。
    • 简化模型:在控制设计初期,有时会使用简化的 A 矩阵来降低系统复杂性。在这种情况下,可以通过增加或减少模型的复杂度来调整 A 矩阵。
MatrixXd A(4, 4);
A << 0, 1, 0, 0,
     0, a22, a23, a24,
     0, 0, 0, 1,
     0, a42, a43, a44;

2.2.2 B 矩阵

B 矩阵定义了系统的输入如何影响系统的状态,描述了控制输入与状态变化之间的关系

  • 输入动态特性

    • B 矩阵的元素反映了控制输入对系统状态的直接影响。例如,在车辆的横向控制中,B 矩阵的元素可能包含与转向角速率、车辆速度等相关的参数。
  • 调节方法

    • 控制权重分析:通过调整 B 矩阵的元素,可以改变控制输入对系统状态的影响程度。通过放大或缩小 B 矩阵的某些元素,可以让控制器对某些输入更加敏感或更不敏感。
    • 控制输入模型的调整:在实际应用中,如果发现系统对控制输入的响应过于敏感或不够敏感,可以通过调整 B 矩阵的值来改变系统对控制输入的响应速度。

MatrixXd B(4, 1);
B << 0,
     b2,
     0,
     b4;

2.2.3. 实例分析

假设你有一个简单的车辆横向控制模型:

  • A 矩阵:

    • 反映了横向速度、偏航角速度对系统的影响。
    • 可以通过调整车辆速度、侧向刚度等参数来改变 A 矩阵的值。
  • B 矩阵:

    • 反映了控制输入(如转向角速率)对系统状态的直接影响。
    • 可以通过改变转向角的响应速度或转向角度的最大限制来调节 B 矩阵的值。

2.2.4. 实际应用

在实际系统中,AB 矩阵往往由系统的物理特性决定。在调整 QR 矩阵之前,通常首先要确保 AB 矩阵已经正确反映了系统的动态特性。如果 AB 矩阵存在较大的不准确性,那么无论如何调节 QR 矩阵,控制器的性能都会受到限制。

5. 总结

AB 矩阵的调节并不像 QR 矩阵那样直接。通常,AB 矩阵是通过系统建模或实验辨识获得的。如果需要调整,通常是通过改变模型中的物理参数或通过敏感性分析来探索不同动态特性的影响。

3.LQR输入输出

LQR(线性二次型调节器)算法的输入和输出如下:

1. LQR的输入

LQR的输入主要包括以下几个部分:

1.1 系统状态向量 X

这是描述系统当前状态的一组变量,通常由系统的动态模型决定状态向量包含系统的重要变量,比如位置、速度、角度等。对于车辆控制,常见的状态变量有:

  • e_y:横向误差。
  • e_y_dot:横向误差的变化率。
  • e_phi:偏航角误差。
  • e_phi_dot:偏航角误差的变化率。

状态向量 X 的维度取决于系统的状态数量

1.2 系统的状态矩阵 A输入矩阵 B
  • A 是系统的状态转移矩阵,它描述了系统状态如何随时间演变。
  • B输入矩阵,它描述了控制输入如何影响系统状态。
1.3 权重矩阵 QR
  • Q 是状态误差的权重矩阵,它决定了对系统状态误差的惩罚。通过调整 Q,可以改变系统对不同状态误差的敏感程度。
  • R 是控制输入的权重矩阵,它决定了对控制输入的惩罚。通过调整 R,可以影响控制输入的使用程度。

2. LQR的输出

LQR 的输出是 控制输入向量 u,它是用于调节系统状态的控制信号。在车辆控制的场景下,这通常是:

  • 方向盘转角(用于调整横向误差)。
  • 加速或刹车(用于调整纵向速度)。

控制输入向量 u 是通过如下公式计算得到的:

                                                         u=−K⋅X

其中,K 是反馈增益矩阵,它是通过优化控制代价函数(最小化状态误差和控制输入的平方和)得到的。K 矩阵的计算依赖于 ABQR 矩阵,并通过求解离散或连续的Riccati方程来确定。

3. LQR的中间计算过程

LQR的中间计算过程主要包括以下步骤:

  1. 系统建模:通过系统的动力学方程确定状态矩阵 A 和输入矩阵 B
  2. 权重选择:根据控制需求选择合适的状态权重矩阵 Q 和控制权重矩阵 R
  3. 求解Riccati方程:基于 ABQR 矩阵求解离散或连续时间的 Riccati 方程。
  4. 计算反馈增益矩阵:通过 Riccati 方程得到最优的反馈增益矩阵 K
  5. 计算控制输入:根据状态向量 X 和反馈增益矩阵 K 计算控制输入 u

总结

  • 输入状态向量 X、系统矩阵 AB、权重矩阵 QR
  • 输出控制输入向量 u,如方向盘转角、油门或刹车。

LQR 的目标是找到最优的控制输入 u,使得系统在误差和控制能量消耗之间达到平衡。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值