ETS2LA技术架构深度解析:基于插件化系统的卡车模拟自动驾驶平台
【免费下载链接】Euro-Truck-Simulator-2-Lane-AssistPlugin based interface program for ETS2/ATS.项目地址: https://gitcode.com/gh_mirrors/eur/Euro-Truck-Simulator-2-Lane-Assist
ETS2LA(Euro Truck Simulator 2 Lane Assist)是一个为SCS Software卡车模拟游戏系列设计的开源自动驾驶辅助系统。该项目采用模块化架构设计,通过计算机视觉、机器学习算法和实时数据处理技术,在游戏环境中实现了车道保持、自适应巡航控制、碰撞预警等高级驾驶辅助功能。本文将深入分析其技术架构、实现原理以及扩展机制。
技术架构设计原理与实现策略
核心进程通信机制
ETS2LA采用多进程架构设计,通过共享内存和消息队列实现高效的数据交换。核心通信系统建立在ETS2LA/Plugin/process.py中定义的PluginProcess类之上,该进程模型负责管理插件生命周期、事件分发和状态同步。
# 进程通信示例 class PluginProcess: def __init__(self, path: str, queue: Queue, return_queue: Queue, sender: SharedMemorySender, receiver: SharedMemoryReceiver): self.path = path self.queue = queue self.return_queue = return_queue self.sender = sender self.receiver = receiver系统通过SharedMemorySender和SharedMemoryReceiver实现进程间高速数据交换,特别适用于需要低延迟的实时控制场景。这种设计允许插件在独立进程中运行,避免单个插件故障影响整个系统稳定性。
插件系统架构设计
ETS2LA的插件系统采用面向对象的类继承模型,所有插件必须继承自ETS2LAPlugin基类。该基类在ETS2LA/Plugin/classes/plugin.py中定义,提供了完整的插件生命周期管理和资源访问接口。
# 插件基类定义 class ETS2LAPlugin(object): def __init__(self, path: str, queue: Queue, return_queue: Queue, get_tag: Callable, set_tag: Callable, get_mem_tag: Callable, set_mem_tag: Callable): self.path = path self.queue = queue self.return_queue = return_queue self.tags = Tags(get_tag, set_tag) self.description = PluginDescription()每个插件通过PluginDescription类定义元数据,包括名称、版本、依赖模块和兼容性信息。这种声明式配置允许系统在运行时动态加载和验证插件,确保组件间的正确交互。
实时数据处理流水线
系统采用三层数据处理架构:数据采集层、处理层和控制输出层。数据采集通过游戏SDK接口(如SCSController)和计算机视觉模块(如ScreenCapture)并行执行,确保数据源的多样性和冗余性。
处理层由多个专用模块组成:
- Steering模块:实现转向控制算法,支持平滑滤波和游戏状态补偿
- Traffic模块:处理交通参与者检测和跟踪
- Semaphores模块:管理交通信号灯状态
- TruckSimAPI模块:提供游戏状态抽象接口
控制输出层通过游戏控制器接口将处理结果转换为游戏输入,实现闭环控制。
ETS2LA系统架构采用模块化设计,通过共享内存和消息队列实现高效进程间通信
计算机视觉与机器学习集成
图像处理流水线
ETS2LA的视觉系统基于OpenCV和PyTorch构建,提供实时图像采集、预处理和特征提取功能。Modules/ScreenCapture/main.py和Modules/BetterScreenCapture/main.py实现了多种屏幕捕获策略,包括DXGI、Windows GDI和MSS跨平台方案。
# 图像处理核心逻辑 class ScreenCaptureModule: def capture_frame(self): # 使用DXGI或GDI获取屏幕图像 frame = self.capture_method.capture() # 应用色彩空间转换和尺寸调整 processed = cv2.cvtColor(frame, cv2.COLOR_BGRA2RGB) # 执行车道线检测和障碍物识别 lanes = self.lane_detector.detect(processed) vehicles = self.object_detector.detect(processed) return processed, lanes, vehicles深度学习模型集成
系统通过ETS2LA/Handlers/pytorch.py提供的统一接口管理深度学习模型,支持从Hugging Face等平台自动下载和更新预训练模型。这种设计允许社区贡献者轻松集成新的检测算法,而无需修改核心系统。
# PyTorch模型管理器 class PyTorchHandler: def __init__(self, HF_owner: str, HF_repository: str, HF_model_folder: str, plugin_self: object = None, torch_dtype: torch.dtype = torch.bfloat16, threaded: bool = True): self.model_config = { 'owner': HF_owner, 'repo': HF_repository, 'folder': HF_model_folder } self.load_model()模型推理结果通过共享内存传递到控制模块,实现从感知到决策的端到端处理流程。系统支持多种检测任务,包括车道线检测、车辆识别、交通标志识别等。
控制系统设计与实现
转向控制算法
转向控制模块(Modules/Steering/main.py)实现了基于PID控制原理的自适应转向算法。系统通过时间窗口平滑和历史数据加权平均,确保转向输入的稳定性和响应性。
class SteeringValue: def __init__(self, value: float, timestamp: float): self.value = value self.timestamp = timestamp class Module(ETS2LAModule): SMOOTH_TIME: float = 0.1 # 平滑时间窗口 OFFSET: float = 0 # 转向偏移补偿 SENSITIVITY: float = 1 # 转向灵敏度 MAX_ANGLE: float = 1 # 最大转向角度 def CalculateSteeringAngle(self): if not self.IGNORE_SMOOTH: # 加权平均算法 weights = np.arange(len(self.steeringValues)) + 1 average = np.average( [value.value for value in self.steeringValues], weights=weights ) angle = average * self.SENSITIVITY + self.OFFSET angle = np.clip(angle, -self.MAX_ANGLE, self.MAX_ANGLE) return angle自适应巡航控制系统
自适应巡航控制(ACC)插件(Plugins/AdaptiveCruiseControl/main.py)实现了基于距离和相对速度的智能跟车算法。系统综合考虑前方车辆距离、相对速度、道路曲率和交通信号状态,生成平滑的速度控制指令。
class Plugin(ETS2LAPlugin): description = PluginDescription( name=_("Adaptive Cruise Control"), version="1.0", description=_("ACC provides automatic acceleration and braking depending on road conditions and vehicles ahead."), modules=["SDKController", "TruckSimAPI", "Traffic", "Semaphores"], tags=["Base", "Speed Control"], fps_cap=60, )ACC系统使用SmoothedValue类进行数据平滑处理,通过PIDGraph类可视化控制过程,便于调试和参数优化。
碰撞预警与避障
碰撞避免系统通过多传感器数据融合实现风险评估。系统实时计算时间到碰撞(TTC)、安全距离和避障路径,在危险情况下通过视觉和听觉警告提示驾驶员。
用户界面与交互设计
Web前端架构
ETS2LA采用现代化的Web技术栈构建用户界面,通过FastAPI后端和WebSocket实时通信提供响应式用户体验。界面系统位于ETS2LA/UI/目录,使用组件化设计模式。
# UI组件系统示例 class Button(Component): def __init__(self, text: str, style: Style = None, pressed: Callable | None = None): self.text = text self.style = ensure_style(style) self.pressed = pressed def to_dict(self) -> dict: return { 'type': 'button', 'text': self.text, 'style': self.style.to_dict(), 'on_press': self.get_fully_qualified_name(self.pressed) }实时数据可视化
系统提供丰富的可视化组件,包括图表、仪表盘和实时监控界面。ETS2LA/Utils/Values/graphing.py中的PIDGraph类专门用于展示控制系统的性能指标,帮助用户理解和优化自动驾驶参数。
ETS2LA的可视化界面展示系统状态和性能指标,支持实时监控和参数调整
扩展机制与插件开发
插件开发框架
ETS2LA为开发者提供了完整的插件开发框架,包括事件系统、状态管理和UI集成。插件开发者只需继承ETS2LAPlugin类并实现必要的生命周期方法。
# 最小化插件示例 from ETS2LA.Plugin import ETS2LAPlugin, PluginDescription from ETS2LA.Utils.translator import _ class Plugin(ETS2LAPlugin): description = PluginDescription( name=_("My Custom Plugin"), version="1.0.0", description=_("A custom plugin example"), modules=["SDKController"], tags=["Custom", "Example"] ) def run(self): # 主循环逻辑 while True: game_data = self.modules.SDKController.get_data() # 处理数据 self.tags.custom_value = processed_data事件系统与消息传递
系统的事件系统(ETS2LA/Events/event_system.py)支持发布-订阅模式,允许插件间解耦通信。事件可以通过装饰器或显式注册方式处理。
from ETS2LA.Events import events @events.on("vehicle_detected") def handle_vehicle(data): # 处理车辆检测事件 pass # 触发事件 events.trigger("vehicle_detected", vehicle_data)国际化支持
ETS2LA内置完整的国际化框架,支持超过20种语言。翻译系统基于gettext标准,通过ETS2LA/Utils/translator.py提供统一的翻译接口。
from ETS2LA.Utils.translator import _ # 使用翻译函数 localized_text = _("Adaptive Cruise Control")性能优化与系统集成
资源管理与内存优化
系统通过ETS2LA/Utils/Values/numbers.py中的SmoothedValue类实现高效的数据平滑和内存管理。该算法采用滑动窗口和权重分配策略,在保证实时性的同时最小化内存占用。
class SmoothedValue: def __init__(self, smoothingType: Literal["frames", "time"] = "frames", smoothingAmount: int | float = 10): self.smoothingType = smoothingType self.smoothingAmount = smoothingAmount self.values = deque(maxlen=int(smoothingAmount))多进程并发处理
ETS2LA采用生产者-消费者模式处理高并发数据流。每个插件在独立进程中运行,通过共享内存和消息队列实现数据交换,避免全局锁竞争和阻塞问题。
游戏集成与兼容性
系统通过Modules/SDKController/main.py提供的SCSController类与游戏SDK交互,支持ETS2和ATS双平台。控制器抽象层处理不同游戏版本和API差异,确保功能的向后兼容性。
技术演进方向与社区贡献
架构演进路线
当前系统正在向C#版本迁移,以提升性能和跨平台兼容性。重写分支(rewrite branch)展示了新的架构设计,包括更高效的资源管理和改进的插件系统。
社区贡献机制
ETS2LA采用开放的贡献模型,鼓励开发者通过GitHub和GitLab参与项目开发。项目维护者提供了详细的开发文档和代码规范,确保代码质量的一致性。
技术生态整合
系统设计支持与第三方工具和服务的集成,包括:
- 地图数据服务(通过
Plugins/Map/模块) - 语音合成系统(通过
Plugins/TTS/模块) - Discord集成(通过
Plugins/DiscordRichPresence/模块) - 增强现实显示(通过
Plugins/AR/模块)
部署与开发指南
环境配置要求
项目要求Python 3.12环境,依赖管理通过pyproject.toml文件定义。主要依赖包括:
- 计算机视觉:OpenCV、PyTorch、TorchVision
- 游戏集成:pygame、pynput
- Web框架:FastAPI、WebSockets
- 数据处理:NumPy、SciPy
开发工作流
- 环境设置:使用uv或pip安装依赖
- 插件开发:在
Plugins/目录创建新插件 - 本地测试:通过开发服务器运行和调试
- 代码提交:遵循项目代码规范和提交约定
性能调优建议
- 调整插件FPS限制以平衡性能和资源使用
- 使用适当的数据平滑参数避免控制抖动
- 监控系统内存使用,优化大型数据处理流程
- 利用多进程优势,将计算密集型任务分配到独立进程
ETS2LA项目展示了现代软件工程在游戏辅助系统中的应用,其模块化设计、实时处理能力和扩展性为类似项目提供了有价值的参考。通过持续的技术创新和社区协作,该项目有望推动模拟驾驶辅助技术向更高水平发展。
【免费下载链接】Euro-Truck-Simulator-2-Lane-AssistPlugin based interface program for ETS2/ATS.项目地址: https://gitcode.com/gh_mirrors/eur/Euro-Truck-Simulator-2-Lane-Assist
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考