如何扩展Self-Parking Car Evolution:添加新传感器与复杂泊车场景的完整指南
【免费下载链接】self-parking-car-evolution🧬 Training the car to do self-parking using a genetic algorithm项目地址: https://gitcode.com/gh_mirrors/se/self-parking-car-evolution
Self-Parking Car Evolution是一个基于遗传算法的自动驾驶汽车模拟项目,它通过进化算法训练汽车学会自主泊车。本教程将指导您如何扩展这个项目,添加新的传感器类型和更复杂的泊车场景,让您的自动驾驶汽车能够应对更真实的驾驶挑战。🚗
项目概述与核心架构
Self-Parking Car Evolution项目使用遗传算法来训练汽车完成自主泊车任务。项目的核心架构分为三个主要部分:
- 传感器系统- 汽车通过8个距离传感器感知周围环境
- 神经网络大脑- 将传感器输入转换为控制指令
- 遗传算法引擎- 通过自然选择优化汽车行为
现有传感器系统分析
当前项目中的汽车配备了8个距离传感器,这些传感器均匀分布在汽车周围,用于检测障碍物距离。传感器数据通过carGenetic.ts中的CAR_SENSORS_NUM常量定义:
// Car has 8 distance sensors. export const CAR_SENSORS_NUM = 8;每个传感器返回一个0-1之间的归一化距离值,表示到最近障碍物的距离。这些值被输入到汽车的"大脑"——两个线性多项式公式中,分别控制引擎(前进/后退)和方向盘(左转/右转)。
扩展传感器类型:从8个到多功能传感器
1. 添加新的传感器类型
为了应对更复杂的泊车场景,我们可以扩展传感器系统。以下是几种实用的传感器类型:
速度传感器- 让汽车感知自身速度
// 在src/libs/carGenetic.ts中添加 export const SPEED_SENSOR_ENABLED = true; export const MAX_CAR_SPEED = 5; // 最大速度单位方向传感器- 检测汽车相对于停车位的角度
export const DIRECTION_SENSOR_ENABLED = true; export const DIRECTION_SENSORS_NUM = 4; // 前后左右四个方向停车位距离传感器- 专门检测到目标停车位的距离
export const PARKING_SENSOR_ENABLED = true; export const PARKING_SENSORS_NUM = 2; // 水平和垂直距离2. 修改基因组结构
添加新传感器需要扩展基因组长度。当前基因组由两个部分组成:
- 引擎公式系数:
(CAR_SENSORS_NUM + BIAS_UNITS) * GENES_PER_NUMBER - 方向盘公式系数:
(CAR_SENSORS_NUM + BIAS_UNITS) * GENES_PER_NUMBER
要添加新传感器,需要修改GENOME_LENGTH的计算:
// 扩展后的传感器总数 const TOTAL_SENSORS_NUM = CAR_SENSORS_NUM + (SPEED_SENSOR_ENABLED ? 1 : 0) + (DIRECTION_SENSOR_ENABLED ? DIRECTION_SENSORS_NUM : 0) + (PARKING_SENSOR_ENABLED ? PARKING_SENSORS_NUM : 0); export const ENGINE_FORMULA_GENES_NUM = (TOTAL_SENSORS_NUM + BIAS_UNITS) * GENES_PER_NUMBER; export const WHEELS_FORMULA_GENES_NUM = (TOTAL_SENSORS_NUM + BIAS_UNITS) * GENES_PER_NUMBER; export const GENOME_LENGTH = ENGINE_FORMULA_GENES_NUM + WHEELS_FORMULA_GENES_NUM;3. 实现传感器数据处理
在src/components/world/car/Car.tsx中,需要修改传感器数据收集逻辑:
// 扩展传感器数据收集 const collectSensorData = () => { const sensorValues: number[] = []; // 原有的8个距离传感器 for (let i = 0; i < SENSORS_NUM; i++) { const distance = calculateDistance(i); sensorValues.push(normalizeDistance(distance)); } // 新增速度传感器 if (SPEED_SENSOR_ENABLED) { const speed = calculateCarSpeed(); sensorValues.push(normalizeSpeed(speed)); } // 新增方向传感器 if (DIRECTION_SENSOR_ENABLED) { const directions = calculateDirectionToParking(); directions.forEach(dir => sensorValues.push(dir)); } // 新增停车位传感器 if (PARKING_SENSOR_ENABLED) { const parkingDistances = calculateParkingDistances(); parkingDistances.forEach(dist => sensorValues.push(dist)); } return sensorValues; };创建复杂泊车场景
1. 多车位泊车场景
当前项目只有一个停车位。我们可以扩展为多个停车位场景:
// 在src/constants/app.ts中添加 export const PARKING_SCENARIOS = { SINGLE_SPOT: 'single', PARALLEL_PARKING: 'parallel', PERPENDICULAR_PARKING: 'perpendicular', MULTIPLE_SPOTS: 'multiple', TIGHT_SPACE: 'tight' }; // 停车位配置接口 interface ParkingSpotConfig { position: [number, number, number]; rotation: number; width: number; length: number; difficulty: number; // 1-10难度等级 }2. 动态障碍物系统
添加移动障碍物增加训练难度:
// 动态障碍物类 class DynamicObstacle { position: [number, number, number]; velocity: [number, number, number]; size: [number, number, number]; movementPattern: 'linear' | 'circular' | 'random'; update(deltaTime: number) { // 根据运动模式更新位置 switch (this.movementPattern) { case 'linear': this.position[0] += this.velocity[0] * deltaTime; this.position[2] += this.velocity[2] * deltaTime; break; case 'circular': // 圆周运动逻辑 break; case 'random': // 随机运动逻辑 break; } } }3. 不同路面条件
模拟不同路面条件对汽车控制的影响:
export const ROAD_CONDITIONS = { DRY: { friction: 1.0, name: '干燥路面' }, WET: { friction: 0.7, name: '湿滑路面' }, ICY: { friction: 0.3, name: '冰面' }, GRAVEL: { friction: 0.8, name: '碎石路面' } };遗传算法优化策略
1. 适应度函数改进
当前的适应度函数只考虑汽车与停车位的距离。我们可以扩展为多目标优化:
// 在src/libs/carGenetic.ts中改进适应度函数 export const advancedCarFitness = (params: AdvancedLossParams): number => { const { wheelsPosition, parkingLotCorners, timeElapsed, // 花费时间 collisions, // 碰撞次数 fuelConsumption, // 燃料消耗 smoothness // 行驶平滑度 } = params; // 基础距离分数 const distanceScore = 1 / (carLoss({ wheelsPosition, parkingLotCorners }) + 1); // 时间惩罚(越短越好) const timePenalty = timeElapsed > 30 ? 0.5 : 1; // 碰撞惩罚 const collisionPenalty = Math.max(0, 1 - collisions * 0.2); // 燃料效率奖励 const fuelBonus = fuelConsumption < 10 ? 1.2 : 1; // 平滑度奖励 const smoothnessBonus = smoothness > 0.8 ? 1.1 : 1; return distanceScore * timePenalty * collisionPenalty * fuelBonus * smoothnessBonus; };2. 选择策略优化
改进遗传算法的选择机制:
// 精英保留策略 const ELITE_PERCENTAGE = 0.1; // 保留前10%的精英个体 // 多样性保护机制 const DIVERSITY_THRESHOLD = 0.7; // 基因组相似度阈值 // 自适应突变率 function adaptiveMutationRate(generation: number, diversity: number): number { const baseRate = 0.01; const generationFactor = Math.max(0.1, 1 - generation / 1000); const diversityFactor = diversity < 0.3 ? 1.5 : 1; return baseRate * generationFactor * diversityFactor; }3. 交叉操作改进
实现更智能的交叉策略:
// 多点交叉代替单点交叉 function multiPointCrossover( parent1: Genome, parent2: Genome, crossoverPoints: number ): [Genome, Genome] { const child1: Genome = []; const child2: Genome = []; const segmentLength = Math.floor(parent1.length / (crossoverPoints + 1)); for (let i = 0; i < parent1.length; i++) { const segmentIndex = Math.floor(i / segmentLength); const useParent1 = segmentIndex % 2 === 0; child1.push(useParent1 ? parent1[i] : parent2[i]); child2.push(useParent1 ? parent2[i] : parent1[i]); } return [child1, child2]; }实战案例:平行泊车场景
1. 场景配置
创建平行泊车训练场景:
// 平行泊车场景配置 const parallelParkingScenario = { name: '平行泊车挑战', difficulty: 7, parkingSpots: [ { position: [10, 0, 0], rotation: 0, width: 2.5, length: 5, occupied: false }, { position: [10, 0, 6], rotation: 0, width: 2.5, length: 5, occupied: true // 被其他车辆占用 }, { position: [10, 0, -6], rotation: 0, width: 2.5, length: 5, occupied: true // 被其他车辆占用 } ], obstacles: [ { type: 'car', position: [8, 0, 6], size: [1.5, 1, 4] }, { type: 'car', position: [8, 0, -6], size: [1.5, 1, 4] } ], startPositions: [ [15, 0, 0], // 前方位置 [12, 0, 3], // 斜向位置 [8, 0, 2] // 近距离位置 ] };2. 专用传感器配置
为平行泊车优化传感器布局:
// 平行泊车专用传感器配置 export const PARALLEL_PARKING_SENSORS = { FRONT_CORNER_LEFT: 0, // 左前角 FRONT_CORNER_RIGHT: 1, // 右前角 SIDE_LEFT: 2, // 左侧面 SIDE_RIGHT: 3, // 右侧面 REAR_CORNER_LEFT: 4, // 左后角 REAR_CORNER_RIGHT: 5, // 右后角 REAR_CENTER: 6, // 正后方 ANGLE_TO_SPOT: 7, // 与停车位角度 DISTANCE_TO_CURB: 8 // 到路缘石距离 }; // 传感器角度调整 const PARALLEL_SENSOR_ANGLES = [ -45, // 左前角 45, // 右前角 -90, // 左侧面 90, // 右侧面 -135, // 左后角 135, // 右后角 180, // 正后方 0, // 角度传感器 -90 // 路缘石传感器 ];训练策略与性能优化
1. 渐进式训练法
// 渐进式训练策略 class ProgressiveTraining { private currentDifficulty = 1; private readonly maxDifficulty = 10; getTrainingScenario(): TrainingScenario { const scenarios = { 1: { name: '空旷停车', obstacles: 0, timeLimit: 60 }, 3: { name: '简单障碍', obstacles: 2, timeLimit: 45 }, 5: { name: '中等障碍', obstacles: 4, timeLimit: 30 }, 7: { name: '复杂障碍', obstacles: 6, timeLimit: 25 }, 9: { name: '极限挑战', obstacles: 8, timeLimit: 20 } }; return scenarios[this.currentDifficulty] || scenarios[1]; } evaluatePerformance(fitness: number): void { if (fitness > 0.9 && this.currentDifficulty < this.maxDifficulty) { this.currentDifficulty++; console.log(`升级到难度 ${this.currentDifficulty}`); } else if (fitness < 0.5 && this.currentDifficulty > 1) { this.currentDifficulty--; console.log(`降级到难度 ${this.currentDifficulty}`); } } }2. 并行训练加速
// Web Worker并行训练 class ParallelTraining { private workers: Worker[] = []; private readonly populationSize: number; private readonly workerCount: number; constructor(populationSize: number, workerCount = 4) { this.populationSize = populationSize; this.workerCount = Math.min(workerCount, navigator.hardwareConcurrency || 4); this.initializeWorkers(); } private initializeWorkers(): void { for (let i = 0; i < this.workerCount; i++) { const worker = new Worker('training-worker.js'); this.workers.push(worker); } } async evaluateGeneration(genomes: Genome[]): Promise<number[]> { const chunkSize = Math.ceil(genomes.length / this.workerCount); const promises: Promise<number[]>[] = []; for (let i = 0; i < this.workerCount; i++) { const start = i * chunkSize; const end = Math.min(start + chunkSize, genomes.length); const chunk = genomes.slice(start, end); promises.push( new Promise((resolve) => { const worker = this.workers[i]; worker.postMessage({ genomes: chunk, task: 'evaluate' }); worker.onmessage = (e) => resolve(e.data.fitnessScores); }) ); } const results = await Promise.all(promises); return results.flat(); } }监控与可视化改进
1. 实时训练监控
// 训练监控面板 class TrainingMonitor { private metrics = { bestFitness: 0, averageFitness: 0, worstFitness: 0, generation: 0, diversity: 0, convergenceRate: 0 }; update(generation: Generation, fitnessScores: number[]): void { this.metrics.generation++; this.metrics.bestFitness = Math.max(...fitnessScores); this.metrics.worstFitness = Math.min(...fitnessScores); this.metrics.averageFitness = fitnessScores.reduce((a, b) => a + b) / fitnessScores.length; // 计算种群多样性 this.metrics.diversity = this.calculateDiversity(generation); // 计算收敛速率 this.metrics.convergenceRate = this.calculateConvergenceRate(); this.renderDashboard(); } private calculateDiversity(generation: Generation): number { // 计算基因组之间的平均汉明距离 let totalDistance = 0; let comparisons = 0; for (let i = 0; i < generation.length; i++) { for (let j = i + 1; j < generation.length; j++) { const distance = this.hammingDistance(generation[i], generation[j]); totalDistance += distance; comparisons++; } } return totalDistance / comparisons; } private hammingDistance(genome1: Genome, genome2: Genome): number { let distance = 0; for (let i = 0; i < genome1.length; i++) { if (genome1[i] !== genome2[i]) distance++; } return distance / genome1.length; } }2. 3D可视化增强
// 传感器可视化增强 class EnhancedSensorVisualization { private sensorColors = { SAFE: 0x00FF00, // 绿色 - 安全距离 WARNING: 0xFFFF00, // 黄色 - 警告距离 DANGER: 0xFF0000, // 红色 - 危险距离 PARKING: 0x0000FF // 蓝色 - 停车位相关 }; renderSensorRays(car: Car, sensors: SensorData[]): void { sensors.forEach((sensor, index) => { const ray = this.createSensorRay( car.position, sensor.direction, sensor.distance, this.getColorForDistance(sensor.distance, sensor.type) ); // 添加距离标签 if (sensor.distance !== undefined) { this.addDistanceLabel(ray, sensor.distance); } // 添加传感器类型指示器 this.addSensorTypeIndicator(ray, sensor.type); }); } private getColorForDistance(distance: number, type: SensorType): number { if (type === 'PARKING') return this.sensorColors.PARKING; if (distance > 3) return this.sensorColors.SAFE; if (distance > 1) return this.sensorColors.WARNING; return this.sensorColors.DANGER; } }部署与测试建议
1. 分阶段测试策略
- 单元测试- 测试每个传感器和算法的独立功能
- 集成测试- 测试传感器与大脑的协同工作
- 场景测试- 在不同泊车场景中测试整体性能
- 压力测试- 测试在极限条件下的表现
2. 性能基准测试
// 性能基准测试套件 class PerformanceBenchmark { async runBenchmarks(): Promise<BenchmarkResults> { const results: BenchmarkResults = { sensorUpdateTime: await this.testSensorUpdate(), genomeEvaluationTime: await this.testGenomeEvaluation(), generationEvolutionTime: await this.testGenerationEvolution(), memoryUsage: await this.testMemoryUsage() }; return results; } private async testSensorUpdate(): Promise<number> { const iterations = 1000; const start = performance.now(); for (let i = 0; i < iterations; i++) { const car = new Car(); car.updateSensors(); } const end = performance.now(); return (end - start) / iterations; } // ... 其他测试方法 }3. 持续集成配置
在项目根目录创建.github/workflows/tests.yml:
name: Tests and Benchmarks on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Setup Node.js uses: actions/setup-node@v2 with: node-version: '16' - name: Install dependencies run: npm ci - name: Run unit tests run: npm test - name: Run integration tests run: npm run test:integration - name: Run performance benchmarks run: npm run benchmark - name: Build project run: npm run build总结与下一步
通过扩展传感器系统和创建复杂泊车场景,您可以显著提升Self-Parking Car Evolution项目的实用性和挑战性。以下是一些进一步的改进方向:
- 深度学习集成- 将遗传算法与神经网络结合
- 多车协同- 训练多辆车协同泊车
- 真实数据训练- 使用真实停车场数据训练
- 硬件在环- 连接真实硬件进行测试
记住,遗传算法的关键在于平衡探索(尝试新解决方案)和利用(优化现有方案)。通过精心设计的传感器系统和场景配置,您的自动驾驶汽车将能够学会在越来越复杂的环境中安全、高效地泊车。
开始扩展您的Self-Parking Car Evolution项目吧!每个改进都将让您的自动驾驶汽车更智能、更适应真实世界的泊车挑战。🚀
扩展提示:在修改代码时,始终从简单的改变开始,逐步增加复杂度。先测试新的传感器类型,再添加复杂场景,最后优化遗传算法参数。这样您可以确保每个更改都有效,并且能够快速定位和解决问题。
祝您扩展成功!🎉
【免费下载链接】self-parking-car-evolution🧬 Training the car to do self-parking using a genetic algorithm项目地址: https://gitcode.com/gh_mirrors/se/self-parking-car-evolution
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考