数据预处理与特征工程
在自动驾驶系统中,数据是驱动决策的核心。从传感器(如摄像头、激光雷达、毫米波雷达)收集的原始数据通常包含噪声、缺失值和异常值,需要进行系统的预处理。Python的pandas
库提供了强大的数据处理能力,而scikit-learn
则支持特征提取与转换。
示例:激光雷达点云数据预处理
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
# 假设加载点云数据为DataFrame格式
def preprocess_lidar_data(df):
# 去除无效点(如距离为0或超出传感器范围)
df = df[(df['range'] > 0) & (df['range'] < 150)]
# 处理缺失值,使用中位数填充
df.fillna(df.median(), inplace=True)
# 标准化坐标系
scaler = StandardScaler()
df[['x', 'y', 'z']] = scaler.fit_transform(df[['x', 'y', 'z']])
return df
时间序列特征构建
自动驾驶场景中的时间连续性至关重要。通过滑动窗口或光流法,可将连续帧数据转化为时空特征。例如,计算目标物体的速度和加速度:
def compute_velocity_features(df, time_col='timestamp', coords=['x', 'y']):
df = df.sort_values(by=time_col)
df['delta_time'] = df[time_col].diff().fillna(0)
for coord in coords:
df[f'{coord}_speed'] = df[coord].diff() / df['delta_time']
df[f'{coord}_accel'] = df[f'{coord}_speed'].diff() / df['delta_time']
return df.dropna()
目标检测与跟踪
基于YOLOv5的实时目标检测
YOLO系列算法因其高效性成为自动驾驶目标检测的主流选择。Python通过PyTorch
实现轻量化部署:
import torch
from torchvision import transforms
# 加载预训练模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
# 图像预处理管道
preprocess = transforms.Compose([
transforms.Resize((640, 640)),
transforms.ToTensor(),
])
def detect_objects(image):
input_tensor = preprocess(image).unsqueeze(0)
results = model(input_tensor)
return results.xyxy[0] # 返回边界框坐标
Kalman滤波器实现目标跟踪
对于连续帧中的目标跟踪,Kalman滤波器能有效平滑轨迹:
from filterpy.kalman import KalmanFilter
kf = KalmanFilter(dim_x=4, dim_z=2)
kf.x = np.array([0, 0, 0, 0]) # 初始状态 [x, y, vx, vy]
kf.F = np.array([[1, 0, 1, 0],
[0, 1, 0, 1],
[0, 0, 1, 0],
[0, 0, 0, 1]])
kf.H = np.array([[1, 0, 0, 0],
[0, 1, 0, 0]])
kf.P *= 1000 # 初始协方差
def update_track(z):
kf.predict()
kf.update(z)
return kf.x[:2] # 返回修正后的位置
路径规划与决策控制
基于A*算法的全局路径规划
在已知地图中,A*算法可计算最优行驶路径。Python的networkx
库简化了图搜索实现:
import networkx as nx
def astar_path(graph, start, goal):
return nx.astar_path(graph, start, goal)
# 示例:网格化地图建模
G = nx.grid_2d_graph(10, 10)
path = astar_path(G, (0, 0), (9, 9))
print("Optimal Path:", path)
动态避障的局部规划(RRT*)
快速扩展随机树(RRT*)适用于未知环境下的实时避障:
from rrt_star import RRTStar
# 定义障碍物区域和车辆动力学约束
obstacles = [(3, 3, 5, 5), (7, 7, 8, 8)]
rrt = RRTStar(start=(0, 0), goal=(10, 10), obstacles=obstacles)
# 生成路径
path = rrt.plan()
print("RRT* Path:", path)
行为预测与风险评估
基于LSTM的驾驶行为预测
长短期记忆网络(LSTM)可建模驾驶员或周围车辆的历史轨迹,预测未来行为:
from keras.models import Sequential
from keras.layers import LSTM, Dense
# 构建模型
model = Sequential([
LSTM(32, input_shape=(10, 2)), # 输入10个时间步的二维坐标
Dense(64, activation='relu'),
Dense(2) # 输出预测坐标
])
model.compile(optimizer='adam', loss='mse')
# 训练数据格式:[样本数,时间步,特征]
X_train = np.random.rand(1000, 10, 2)
y_train = np.random.rand(1000, 2)
model.fit(X_train, y_train, epochs=20)
风险评估模型
通过计算碰撞时间(TTC)和安全距离,评估潜在危险:
def calculate_ttc(obj1, obj2, velocity1, velocity2):
relative_vel = np.linalg.norm(velocity1 - velocity2)
distance = np.linalg.norm(obj1[:2] - obj2[:2])
return distance / relative_vel if relative_vel > 0 else float('inf')
传感器融合与多模态学习
卡尔曼滤波融合IMU与GPS数据
不同传感器的数据融合可提升定位精度:
from filterpy.kalman import KalmanFilter
# IMU提供角速度,GPS提供位置
kf = KalmanFilter(dim_x=4, dim_z=2)
kf.x = np.array([0, 0, 0.1, 0.1]) # 初始状态 [lat, lon, vel_lat, vel_lon]
kf.F = np.array([[1, 0, 1, 0],
[0, 1, 0, 1],
[0, 0, 1, 0],
[0, 0, 0, 1]])
kf.H = np.array([[1, 0, 0, 0],
[0, 1, 0, 0]])
kf.R = np.eye(2) * 0.1**2 # GPS噪声
kf.Q = np.eye(4) * 0.01**2 # 过程噪声
def fuse_sensors(gps_measurement):
kf.predict()
kf.update(gps_measurement)
return kf.x[:2]
多模态深度学习模型
结合摄像头图像与激光雷达点云,提升感知鲁棒性:
import torch.nn as nn
class MultiModalNet(nn.Module):
def __init__(self):
super().__init__()
self.cnn = nn.Sequential(
nn.Conv2d(3, 16, 3),
nn.ReLU(),
nn.MaxPool2d(2)
)
self.pointnet = nn.Sequential(
nn.Linear(3, 64),
nn.ReLU(),
nn.Linear(64, 128)
)
self.fc = nn.Linear(128 + 16*8*8, 3) # 假设图像分辨率为32x32
def forward(self, image, point_cloud):
image_feat = self.cnn(image).view(-1)
point_feat = self.pointnet(point_cloud)
combined = torch.cat((image_feat, point_feat), dim=1)
return self.fc(combined)
仿真测试与模型部署
Carla模拟器集成Python脚本
在虚拟环境中验证算法有效性:
import carla
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)
world = client.get_world()
# 控制车辆直线行驶
vehicle = world.get_actors()[0]
vehicle.apply_control(carla.VehicleControl(throttle=0.5))
ONNX格式模型轻量化部署
将PyTorch模型转换为ONNX格式,适配车载边缘设备:
import torch
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(model, dummy_input, "model.onnx")
伦理与系统鲁棒性设计
对抗攻击防御策略
在关键任务系统中,需防范恶意攻击对模型的干扰:
from art.attacks import FastGradientMethod
from art.estimators.classification import PyTorchClassifier
# 定义对抗攻击
attack = FastGradientMethod(estimator=PyTorchClassifier(model), eps=0.1)
perturbed_image = attack.generate(x=test_image)