将旭日X3派作为L3自动驾驶的风险计算中间件,上一篇博客已经实现了与旭日X3派的信息传输,所以为了让人机共驾的控制实时性高,需要采用不同的处理器分别进行运算。

在人机共驾中,使用行车风险场来进行控制权的调整可以提高行车的安全性和舒适性。在实现实时控制的过程中,需要考虑以下几个方面: 快速感知和响应:系统需要具备快速感知环境的能力,并能够快速响应风险场的变化。因此,需要选择高效的传感器和处理器,并采用实时响应的算法。 数据处理和分析:行车风险场需要从多种数据来源(例如传感器数据、地图数据、历史数据等)中获取和分析。在处理和分析数据时,需要考虑数据的实时性和准确性。 控制策略:根据风险场的变化,系统需要实时调整控制策略。因此,需要设计灵活、高效的控制算法,并采用实时调整的方法来保证控制的准确性和实时性。 硬件和软件架构:系统的硬件和软件架构需要考虑实时性的需求。例如,需要采用低延迟的通信协议、高速的处理器和存储器等。 

所以一个完整的人机共驾系统中,除去自动驾驶系统,第一部分需要将传感器感知到的信息进行处理,处理成可以简单运算的数据形式。将这些形式的数据传输给下一个处理器进行风险计算以及控制权调整。

本文将旭日X3派作为L3自动驾驶的风险计算中间件,负责风险计算以及控制权调整。

思路 

人机共驾系统:

输入:自动驾驶系统规划,驾驶人控制操作,二者权重

输出:调整后的权重与控制输出

计算道路风险,将行车风险场(Driving Risk Field, DRF)、模型预测控制(Model Predictive Control, MPC)和动态窗口方法(Dynamic Window Approach, DWA)相结合,进行一个轨迹规划的预规划,将此规划结果与原先加权后的轨迹结果进行对比,通过这个轨迹误差进行控制权的调整。

行车风险场是指在行车过程中,由各种因素(例如车辆、道路、天气、交通流量、驾驶员行为等)构成的一个复杂的、动态的、多变的风险场景。行车风险场包括多种类型的风险,例如碰撞、失控、侧翻等。通过对行车风险场的识别、分析和预测,可以帮助驾驶员更好地应对潜在的风险,提高行车的安全性和舒适性。近年来,随着人工智能和物联网技术的发展,行车风险场的识别和预测技术得到了广泛应用,例如智能驾驶、车联网等。行车风险场的识别和预测通常需要基于大量的传感器数据、地图数据、历史数据等信息,采用多种机器学习和数据挖掘技术来进行分析和预测。例如,可以利用深度学习模型对图像、雷达、激光雷达等传感器数据进行处理和分析,预测可能出现的风险场景。同时,还可以采用高精度地图和交通流数据等信息来支持行车风险场的识别和预测。

首先需要做的是将接收到的原始数据进行处理与解析。def parse_data(self, sensor_data): # 将接收到的原始数据解析成坐标、障碍物及其他所需信息 obstacles_raw = sensor_data['obstacles'] lane_lines_raw = sensor_data['lane_lines']

def parse_data(self, sensor_data):
    # 将接收到的原始数据解析成坐标、障碍物及其他所需信息
    obstacles_raw = sensor_data['obstacles']
    lane_lines_raw = sensor_data['lane_lines']

    # 从原始数据中提取坐标、障碍物及其他信息
    obstacles = []
    for data in obstacles_raw.split('\n'):
        fields = data.split()
        if len(fields) > 0:
            id, obj_type, x, y, z, rel_vx, rel_vy, rel_vz, length, width, height = map(float, fields)
            obstacles.append([id, obj_type, x, y, z, rel_vx, rel_vy, rel_vz, length, width, height])

    lane_lines = []
    for data in lane_lines_raw.split('\n'):
        fields = data.split()
        if len(fields) > 0:
            idx, dist_adj, dist_left, dist_right, curvature, a, b, c, d, line_type = map(float, fields)
            lane_lines.append([idx, dist_adj, dist_left, dist_right, curvature, a, b, c, d, line_type])

    return obstacles, lane_lines

def store_data(self, obstacles, lane_lines):
    # 将解析后的数据存储到缓冲区中
    self.obstacles_data = obstacles
    self.lane_lines_data = lane_lines

def store_data(self, obstacles, lane_lines): # 将解析后的数据存储到缓冲区中 self.obstacles_data = obstacles self.lane_lines_data = lane_lines

接下来进行风险场的计算以及预规划。

# 行车风险场 (Driving Risk Field)
def compute_driving_risk_field(vehicle_state, obstacles, goal):
    # 根据车辆状态、障碍物、目标点等信息计算风险场
    risk_field = ...
    return risk_field

# 模型预测控制 (Model Predictive Control)
def optimize_trajectory_with_mpc(vehicle_state, risk_field, goal):
    # 结合行车风险场在预设时间范围内寻找最优轨迹
    optimal_trajectory = ...
    return optimal_trajectory

# 动态窗口方法 (Dynamic Window Approach)
def apply_dynamic_window_approach(vehicle_state, optimal_trajectory, obstacles):
    # 在优化后的轨迹基础上,利用动态窗口方法进一步策略筛选
    filtered_trajectory = ...
    return filtered_trajectory

由于项目涉及到正在开发的项目,所以细节没有写出,只写出框架供参考。

最后进行控制权的调整

            # 获取实时数据
            obstacle_positions, vehicle_position, current_state = self.get_realtime_data()

            # 计算风险场
            risk_field = self.drf.compute_risk(obstacle_positions, vehicle_position)

            # 使用DWA生成预设轨迹集合
            trajectories = self.dwa.generate_trajectories(current_state)

            # 使用MPC优化预设轨迹
            optimal_trajectory = None
            min_cost = float("inf")
            for trajectory in trajectories:
                optimized_trajectory = self.mpc.optimize_trajectory(trajectory, risk_field)
                cost = self.evaluate_cost(optimized_trajectory)
                if cost < min_cost:
                    optimal_trajectory = optimized_trajectory
                    min_cost = cost

            # 获取驾驶员实时输入
            driver_input = self.driver_input.get_driver_input()

            # 融合驾驶员输入与优化轨迹,实现人机共享控制
            shared_control_output = self.shared_control(driver_input, optimal_trajectory)

            # 将人机共享控制器的输出发送到车辆执行系统
            self.execute(shared_control_output)

由于资料中行车风险场为全局风险场,而车辆传感器采集数据为车辆周边局部数据,所以进行风险场修改,为局部车辆相对风险场。

控制权修改后的纵向加速度对比

实验证明,将旭日X3派作为计算中间件是可行的。

参考文献:WANG Jian-qiang, WU Jian, LI Yang. Concept, Principle and Modeling of Driving Risk Field Based on Driver-vehicle-road Interaction[J]. China Journal of Highway and Transport, 2016, 29(1): 105-114.