Advertisement

手把手教你学AUTOSAR(15.6)--自动驾驶场景实例:基于AUTOSAR的自动驾驶车道保持辅助系统(LKA)

阅读量:

目录

项目实例:基于AUTOSAR的自动驾驶车道保持辅助系统(LKA)

项目背景

项目目标

技术选型

项目实施步骤

1. 系统需求分析

2. 系统架构设计

3. 模块开发

4. 系统集成

5. 测试与验证

示例代码

车道线检测模块

车道位置估计模块

转向控制模块

总结


基于AUTOSAR平台开发的自动驾驶系统项目实例

项目实例:基于AUTOSAR的自动驾驶车道保持辅助系统(LKA)

项目背景

该系统是自动驾驶技术中的关键组成部分,在智能驾驶领域发挥着重要作用。具体而言,在摄像头捕捉到车道线的基础上实现对车辆位置的持续监控与精确判断后,在必要时自动调节转向角度以维持行车道内的行驶状态。本项目的主要目标是基于AUTOSAR框架开发一套高效可靠的车道保持辅助系统硬件平台,并致力于实现该系统在各种复杂路况下的良好性能表现。通过实时计算车辆与车道边缘之间的距离差值并据此触发相应的转向动作来保证行车安全与乘坐舒适度方面的提升。

项目目标
  • 车道线检测 :利用摄像头识别车道线的位置。
    • 车道位置估计 :估算车辆在车道线周围的相对位置。
    • 转向控制:根据车辆当前位置进行转向调整。
    • 用户界面部分:提供一个供人机交互的人机交互界面。
    • 标准化开发遵循AUTOSAR标准。
    • 性能优化目标是确保系统具备良好的实时性和可靠性。
技术选型

开发平台:包括 MATLAB/Simulink、Vector CANoe 和 ETAS ASCET; AUTOSAR 工具包括 EB tresos 和 Vector DaVinci Developer; 硬件平台是车载执行单元; 操作系统是 AUTOSAR OS; 通信协议包括 CAN、LIN、FlexRay 和 Ethernet。

项目实施步骤
1. 系统需求分析

需求

  • 车道线检测 :采用摄像头对车道线进行识别。
  • 车道位置估计 :估算车辆在车道线周围的相对位置。
  • 转向控制 :依据车辆当前位置调整转向方向。
  • 用户界面 :设计并实现人机交互界面系统。
  • 安全机制 :构建故障诊断系统并实现安全降级功能。
2. 系统架构设计

模块划分

  • 车道线检测模块:主要处理来自摄像头的数据,并识别出车道线。
    • 车道位置估计模块:评估车辆在车道线周围的相对位置。
    • 转向控制模块:根据车辆所在位置进行转向调整。
    • 用户界面模块:实时显示车道保持状态以及相关的警示信息。
    • 通信模块:与多台ECU进行通信操作,并包括获取车辆运行状态相关信息。

AUTOSAR组件

  • 软件组件单元(SWCU)*:每个模块都包含一个或多个软件组件单元,这些单元负责特定的功能模块。
    • 运行实体单元(RTEU)*:运行实体单元负责建立和维护与各软件组件单元之间的通信链路,并确保数据的实时传输。
    • ECU抽象层(ECU Abstraction Layer)*:该层支持ECU设备与外部系统的接口连接,并为用户提供统一的访问方式。
    • 微控制器抽象层(MCAL)*:该层负责对底层硬件进行精确控制和管理,并确保微控制器能够高效运行所需的指令集。
3. 模块开发

车道线检测模块

  • SWC主要功能:采用计算机视觉技术(如OpenCV库),实现对车道线的识别。
    • 主要功能包括:
      • 摄像头数据处理:通过计算机视觉技术对摄像头获取的数据进行分析和解读。
      • 图像预处理步骤:包括灰度化转换和噪声抑制等基本操作。
    • 具体实现过程包括以下步骤:
      • 采用计算机视觉技术(如OpenCV库)对摄像头采集的数据进行分析。
      • 应用Hough变换算法和边缘检测算法来识别车道线特征。
      • 通过AUTOSAR Real-Time Engineering接口与车道位置估计模块进行通讯连接以获取最终结果信息。

车道位置估计模块

  • SWCLanePositionEstimation_{SWC}
  • 功能模块车辆定位系统(VLD) ,该系统能够对车辆在车道中的位置进行精确估算。
    • 具体而言:
      • 通过几何计算模型以及实际采集的车道边界数据信息对车辆位置进行估算。
      • 系统采用AUTOSAR RTE接口与转向控制模块的数据通信机制进行实时信息交互。

转向控制模块

  • SWC :SteeringControl_SWC
  • 主要功能
    • 方向控制 :根据车辆的位置信息进行方向调整。
    • 方向调节强度计算 :对方向调节强度进行精确计算。
  • 实现方法
    • 采用基于PID算法的方向控制系统。
    • 通过AUTOSAR RTE接口与车道检测模块进行数据传输。

用户界面模块

SWC功能模块:UI模块为SWC功能模块。
该功能主要涉及:
状态显示:使用图形界面库(如Qt for Automotive)进行状态显示。
用户交互:提供触摸屏和语音交互界面以提升用户体验。
实现:
具体使用图形用户界面库(如Qt for Automotive)进行状态显示。
通过AUTOSAR RTE接口与多个关键系统进行通信以实现稳定控制。

通信模块

  • SWC:Communication_SWC
    • 功能模块:包含 CAN 和 Ethernet 两种通信功能。
      • CAN 通信:通过 CAN 总线与其它 ECU 进行数据传输,并采集车辆运行状态数据。
      • Ethernet 通信:通过网络接口连接互联网并实时获取道路信息以及交通动态数据。
    • 实现机制:基于 AUTOSAR 通用车辆架构标准中的通信栈架构设计(包括采用 CAN 系列和 Ethernet 系列的专用栈)。
4. 系统集成

步骤

  1. 软件整合:主要采用AUTOSAR工具(包括EB tresos、Vector DaVinci Developer)对不同功能模块的软件进行整合建设统一的运行环境。
  2. 硬件整合:针对各子系统实施硬件整合方案,在保证各子系统间的实时通信与数据传输的基础上完成硬件搭建。
  3. 配置与管理:借助AUTOSAR配置管理工具(如Vector CANoe)实现系统的配置与管理功能,并通过在线服务与可视化界面提升用户体验。
  4. 功能性测试与性能评估阶段:从单元测试到系统级综合测试全面覆盖各环节的功能特性与性能指标,并通过数据采集分析确保产品达到设计要求。
5. 测试与验证

测试内容

  • 功能核查 :对车道线检测器、位置估算器以及转向控制系统进行功能性核验。
  • 性能考察 :对系统运行效率及能耗表现进行性能分析。
  • 兼容检查 :核实系统与其他电子控制单元(ECU)之间的良好协同配合情况。
  • 安全审查 :确定系统具备足够的防护能力以及稳定运行能力。

测试工具

  • 功能性测试解决方案:采用基于AUTOSAR平台的功能验证软件(如Simulink Real-Time CANoe),实现对系统的功能性需求验证。
  • 系统性能评估模块:通过功能型性能分析平台(如profilers),对系统的运行效率和响应速度进行量化分析。
  • 通信协议兼容性验证框架:基于ISO 11898-1标准构建的汽车通信协议兼容性验证框架,支持多种主流协议间的互操作性检测。
  • 安全风险评估平台:利用安全威胁探测系统(如penetration testing tools)对潜在的安全漏洞进行全面扫描与风险评估。

示例代码

以下是部分模块的MATLAB代码示例:

车道线检测模块
复制代码

matlab

深色版本

复制代码
 % 创建SWC

    
 laneDetection_SWC = createSWC('LaneDetection_SWC');
    
  
    
 % 添加端口
    
 addPort(laneDetection_SWC, 'CameraData', 'in');
    
 addPort(laneDetection_SWC, 'DetectedLanes', 'out');
    
  
    
 % 添加行为
    
 addBehavior(laneDetection_SWC, 'onCameraData', 'detectLanes');
    
  
    
 % 实现行为
    
 function detectLanes(cameraData)
    
     % 处理摄像头数据,检测车道线
    
     fprintf('Detecting lanes...\n');
    
     detectedLanes = processImage(cameraData);
    
     sendToPort(laneDetection_SWC, 'DetectedLanes', detectedLanes);
    
 end
    
  
    
 % 辅助函数:处理摄像头数据
    
 function lanes = processImage(cameraData)
    
     % 使用OpenCV处理摄像头数据
    
     image = cameraData.Image;
    
     grayImage = rgb2gray(image);
    
     edges = edge(grayImage, 'Canny');
    
     lines = houghLines(edges);
    
     lanes = filterLanes(lines);
    
 end
    
  
    
 % 辅助函数:过滤车道线
    
 function lanes = filterLanes(lines)
    
     % 过滤出可能的车道线
    
     lanes = [];
    
     for i = 1:length(lines)
    
     line = lines(i);
    
     if isLaneLine(line)
    
         lanes = [lanes; line];
    
     end
    
     end
    
 end
    
  
    
 % 辅助函数:判断是否为车道线
    
 function isLane = isLaneLine(line)
    
     % 使用角度和长度等特征判断是否为车道线
    
     isLane = false;
    
     % 示例:假设车道线的角度在一定范围内
    
     angle = atan2(line.y2 - line.y1, line.x2 - line.x1);
    
     if abs(angle) > minAngle && abs(angle) < maxAngle
    
     isLane = true;
    
     end
    
 end
车道位置估计模块
复制代码

matlab

深色版本

复制代码
 % 创建SWC

    
 lanePositionEstimation_SWC = createSWC('LanePositionEstimation_SWC');
    
  
    
 % 添加端口
    
 addPort(lanePositionEstimation_SWC, 'DetectedLanes', 'in');
    
 addPort(lanePositionEstimation_SWC, 'VehicleState', 'in');
    
 addPort(lanePositionEstimation_SWC, 'LanePosition', 'out');
    
  
    
 % 添加行为
    
 addBehavior(lanePositionEstimation_SWC, 'onDetectedLanes', 'estimateLanePosition');
    
  
    
 % 实现行为
    
 function estimateLanePosition(detectedLanes, vehicleState)
    
     % 估计车辆相对于车道线的位置
    
     fprintf('Estimating lane position...\n');
    
     lanePosition = calculateLanePosition(detectedLanes, vehicleState);
    
     sendToPort(lanePositionEstimation_SWC, 'LanePosition', lanePosition);
    
 end
    
  
    
 % 辅助函数:计算车道位置
    
 function position = calculateLanePosition(detectedLanes, vehicleState)
    
     % 使用几何计算和车道线数据估计车辆位置
    
     position = [];
    
     % 示例:假设车辆状态包含车辆位置和方向
    
     vehiclePosition = vehicleState.Position;
    
     vehicleHeading = vehicleState.Heading;
    
     
    
     leftLane = findLeftLane(detectedLanes);
    
     rightLane = findRightLane(detectedLanes);
    
     
    
     if ~isempty(leftLane) && ~isempty(rightLane)
    
     leftDistance = calculateDistance(vehiclePosition, leftLane);
    
     rightDistance = calculateDistance(vehiclePosition, rightLane);
    
     position = (leftDistance + rightDistance) / 2;
    
     end
    
 end
    
  
    
 % 辅助函数:查找左侧车道线
    
 function lane = findLeftLane(detectedLanes)
    
     % 查找左侧车道线
    
     lane = [];
    
     for i = 1:length(detectedLanes)
    
     line = detectedLanes(i);
    
     if isLeftLane(line)
    
         lane = line;
    
         break;
    
     end
    
     end
    
 end
    
  
    
 % 辅助函数:查找右侧车道线
    
 function lane = findRightLane(detectedLanes)
    
     % 查找右侧车道线
    
     lane = [];
    
     for i = 1:length(detectedLanes)
    
     line = detectedLanes(i);
    
     if isRightLane(line)
    
         lane = line;
    
         break;
    
     end
    
     end
    
 end
    
  
    
 % 辅助函数:判断是否为左侧车道线
    
 function isLeft = isLeftLane(line)
    
     % 使用角度和位置等特征判断是否为左侧车道线
    
     isLeft = false;
    
     % 示例:假设左侧车道线的角度在一定范围内
    
     angle = atan2(line.y2 - line.y1, line.x2 - line.x1);
    
     if angle > minLeftAngle && angle < maxLeftAngle
    
     isLeft = true;
    
     end
    
 end
    
  
    
 % 辅助函数:判断是否为右侧车道线
    
 function isRight = isRightLane(line)
    
     % 使用角度和位置等特征判断是否为右侧车道线
    
     isRight = false;
    
     % 示例:假设右侧车道线的角度在一定范围内
    
     angle = atan2(line.y2 - line.y1, line.x2 - line.x1);
    
     if angle > minRightAngle && angle < maxRightAngle
    
     isRight = true;
    
     end
    
 end
    
  
    
 % 辅助函数:计算距离
    
 function distance = calculateDistance(point1, point2)
    
     % 计算两点之间的距离
    
     distance = norm([point1.x - point2.x, point1.y - point2.y]);
    
 end
转向控制模块
复制代码

matlab

深色版本

复制代码
 % 创建SWC

    
 steeringControl_SWC = createSWC('SteeringControl_SWC');
    
  
    
 % 添加端口
    
 addPort(steeringControl_SWC, 'LanePosition', 'in');
    
 addPort(steeringControl_SWC, 'ControlCommand', 'out');
    
  
    
 % 添加行为
    
 addBehavior(steeringControl_SWC, 'onLanePosition', 'controlSteering');
    
  
    
 % 实现行为
    
 function controlSteering(lanePosition)
    
     % 根据车辆的位置调整转向
    
     fprintf('Controlling steering...\n');
    
     controlCommand = generateControlCommand(lanePosition);
    
     sendToPort(steeringControl_SWC, 'ControlCommand', controlCommand);
    
 end
    
  
    
 % 辅助函数:生成控制命令
    
 function command = generateControlCommand(lanePosition)
    
     % 使用PID控制器进行转向控制
    
     Kp = 0.1; % 比例系数
    
     Ki = 0.01; % 积分系数
    
     Kd = 0.05; % 微分系数
    
     error = calculateError(lanePosition);
    
     command = Kp * error + Ki * integral(error) + Kd * derivative(error);
    
 end
    
  
    
 % 辅助函数:计算误差
    
 function error = calculateError(lanePosition)
    
     % 计算车辆位置与车道中心线的偏差
    
     error = lanePosition - targetPosition;
    
 end

总结

基于该案例研究,在实现过程中我们顺利完成了一个自动驾驶车道保持辅助系统(LKA)。该系统综合运用了多种技术手段,在涵盖车道线检测功能的同时实现了对车道位置状态的有效估计,并且通过结合先进的转向控制算法提升了整体性能表现。此外,在人机交互界面方面也进行了充分优化。整个项目的实施过程体现了从需求分析到最终交付的一整套完善的技术体系构建思路。特别是在模块化架构的支持下实现了各功能单元的有效协同工作模式,在保证开放性和灵活性的同时提升了系统的稳定性和可靠性

全部评论 (0)

还没有任何评论哟~