xviz开发深层理解(一看就懂的小白理解模式)



 

1. xviz开发和传统http开发

XVIZ是为自动驾驶数据可视化设计的一种协议和格式,包含了一组库和工具用于处理和传输这种格式的数据。在某种程度上,你可以将XVIZ看作是一个专门为大规模、时间序列的3D数据设计的“HTTP”,它就像是数据交换的通信协议。

然而,不同于使用HTTP发送和接收任意类型的数据和资源,XVIZ更专注于实时的、结构化的车载传感器数据。同时,XVIZ的数据通常会通过WebSocket进行传输,以保证实时性和高效性。

至于xviz中streamName,的确,你可以把它看作是**类似于RESTful API中的特定端口或路径**。每个streamName都代表了一种特定类型的数据流(如汽车的位置、速度等)。

当涉及到从streamName获取数据,这一过程与使用axios从HTTP接口获取数据类似,都是从一个指定的源获取数据。但是在XVIZ和deck.gl的环境中,这个过程通常被抽象化,并且隐藏在框架内部。也就是说,开发者通常不需要手动写代码去请求或监听数据,只需要提供正确的streamName,当然,你也可以去研究源码实现哈哈,deck.gl和XVIZ将负责数据的获取和更新。

总的来说一句话总结:在开始一个项目时,你可能会首先创建一个React应用,然后在需要数据可视化的地方引入deck.gl库(或者streetscape.gl,如果你想要更高级的自动驾驶特性)。你的数据可能会来源于一个XVIZ服务端,你可以使用XVIZ库来处理这些数据并将其提供给deck.gl进行渲染。

2. streamName

在XVIZ中,streamName是一个用于标识和组织数据流的字符串。它通常用于将特定类型的图形元素(例如,点、线、多边形等)关联到一起,以便于在可视化中进行处理。

具体来说,你可以把“数据流”想象为一个时间序列数据的容器。举个例子,如果你正在显示一个移动车辆的数据,那么可能有一个名为/vehicle_pose的数据流用于储存车辆的位置信息,另一个名为/vehicle_speed的数据流储存速度信息等。

streamName参数用于指定PolygonLayer应该从哪个数据流获取需要渲染的数据。在这段代码中,streamName是作为一个输入提供的,所以实际的值取决于你从外部传入什么。此参数的值通常与你的XVIZ服务端配置相对应,因为服务端负责生成并发送这些数据流。

一旦你设置了streamName,deck.gl框架会处理剩余的工作,包括从正确的流中获取数据,并应用你定义的访问器函数(如 getPolygon, getLineColor等),以生成最终的可视化效果。

总的来说,streamName没有直接获取数据的作用,而是指导deck.gl去哪里(哪个数据流)寻找数据。

一个项目中使用的例子:前端使用数据部分

 

js
代码解读
复制代码
PolygonLayer({ id: id + '_baseline', streamName, coordinateSystem: COORDINATE_SYSTEM.CARTESIAN, filled: !!settings?.fillBottom, pickable: true, getPolygon: (d) => d.vertices, getLineWidth: (d) => { const defaultValue = 0.1 if (streamFilteredIds.length === 0) { return defaultValue } else if (streamFilteredIds.find((i) => d.id.includes(i))) { return defaultValue } else { return 0 } }, getLineColor: (d) => d.base.style.stroke_color, getFillColor: (d) => [0, 0, 0, 1], })

streamName可能来自于这样的定义:

 

js
代码解读
复制代码
const streams = [ { id: 'fusion-auto-boot', streamName: '/fusion_auto/object_detection/boot', streamFolder: 'fusion-icons', iconFolder: 'default' }....]

PolygonLayer 使用了几个特定参数来创建一个多边形层。以下是各个参数的含义:

  • id: 该层的唯一标识符。在这里,它由输入的 id 加上字符串 '_baseline' 构成。
  • streamName: 输入的 streamName,用于指定数据流的名称。
  • coordinateSystem: 指定了坐标系统为 COORDINATE_SYSTEM.CARTESIAN,即笛卡尔坐标系统。
  • filled: 填充属性取决于 settings?.fillBottom 的值。如果 fillBottomtrue,则填充多边形。
  • pickable: 设为 true,表示这个图层可供交互(如鼠标点击)。
  • getPolygon: 定义如何从数据 d 中获取多边形的顶点坐标。在这里,它直接返回 d.vertices
  • getLineWidth: 定义如何获取线条宽度。这里通过查找 streamFilteredIds 数组中是否包含 d.id 来决定线条宽度。默认宽度为0.1,但如果 d.id 不在 streamFilteredIds 之中,则设置宽度为0。
  • getLineColor: 从数据 d 中的 base.style.stroke_color 获取线条颜色。
  • getFillColor: 用户自定义的函数,这里返回固定的数组 [0, 0, 0, 1],这代表黑色(在RGBA空间中,RGB都为0代表黑色,A为1代表不透明)。

这样就类似http的axios一样,streamName对应相对端口,从xviz服务端配置的定义中拿到数据进行图形绘制操作

这就是xviz的骚操作了,补充一个知识点:

在使用XVIZ进行数据可视化时,数据通常是从一个运行的XVIZ服务端获取。这个服务端可以是一个实时数据源(例如正在运行的自动驾驶汽车),也可以是预先录制的数据文件。

你的XVIZ服务端会将数据整理成一个或多个数据流,每个数据流都有一个唯一的名字,比如/vehicle_pose/radar_points等。服务器会按照这些规范发送数据,客户端(在这里就是你的可视化代码)需要知道如何从正确的数据流中提取相应的数据。

这就是为什么streamName参数的值会依赖于你的XVIZ服务端配置:服务端定义了哪些数据流是可用的,以及它们的名称是什么。

当你创建一个PolygonLayer时,你需要指定一个streamName参数来告诉deck.gl从哪个数据流获取数据。你提供给streamName的实际值应该是XVIZ服务端中存在的一个数据流的名称。

一旦设定了正确的streamName,deck.gl就会监听这个数据流,并在新的数据到达时进行更新。当数据到达时,deck.gl会自动处理渲染,你不需要手动获取或处理数据。这一切都是由deck.gl和XVIZ库在后台进行的。

deck.gl是如何监听到对应stream的数据的

deck.gl的数据更新和监听机制主要由其底层框架luma.gl和XVIZ库进行支持。这个过程实际上并不直接暴露给开发者,但我可以给你提供一个大致的概述。

在你创建一个deck.gl图层(如PolygonLayer)并指定一个streamName之后,deck.gl会注册一个监听程序去跟踪与该数据流相关联的数据。

当XVIZ服务端生成新的数据并将其发送到客户端时,底层的WebSocket连接或其他类型的数据接口会接收这些数据,并触发一个事件。deck.gl的数据处理系统会监听这个事件,并根据streamName把新的数据分发到对应的图层。

然后,deck.gl会使用新的数据重新渲染关联的图层。具体来说,它会执行以下步骤:

  1. deck.gl首先使用你提供的访问器函数(如getPolygon, getLineColor等)处理新数据,以获取绘制图形所需的信息。
  2. 它然后使用WebGL(通过luma.gl库)将这些信息转换为可以被GPU理解的形式,并用它们来绘制新的图形。
  3. 这个新的图形会替代旧的图形显示在屏幕上,从而完成了数据的更新和渲染。

这就是deck.gl如何监听和响应数据流更新的基本原理。这个过程是在deck.gl内部自动完成的,作为开发者,你只需要负责提供正确的streamName和访问器函数即可。 ok! over





XVIZ:Uber 开源的交互式可视化框架-CSDN博客

内容概要:本文介绍了种基于多目标粒子群算法(MOPSO)的微电网优化调度模型,综合考虑风能、光伏、储能系统、柴油发电机、燃气轮机以及与主电网之间的能量交互等多种分布式能源的协同运行。通过构建以运行成本最小化、碳排放最低化和系统可靠性最优化为目标的多目标优化模型,利用Matlab平台实现MOPSO算法求解,完成对微电网在不同运行场景下的能量管理与调度方案优化。该模型能够有效平衡经济性与环保性之间的关系,适用于含多类型分布式电源的复杂微电网系统,具有较强的工程应用价值和科研参考意义; 适合人群:具备定电力系统基础知识和Matlab编程能力的研究生、科研人员及工程技术人员,尤其适合从事微电网、智能电网、综合能源系统、可再生能源集成与优化调度等领域研究的专业人士; 使用场景及目标:①用于多能源耦合微电网系统的协同优化调度研究;②支持多目标智能优化算法在能源系统中的建模与求解实践,帮助用户掌握MOPSO在实际工程问题中的应用方法;③为学术论文复现、毕业设计、科研项目开发提供完整的代码实例与技术支撑; 阅读建议:建议读者结合Matlab代码与理论文档,深入理解目标函数构建、约束条件处理及Pareto最优解集生成机制,重点关注算法参数设置、多目标权衡分析与结果可视化,并可通过调整能源配置或引入新约束进行二次开发与创新研究。
内容概要:本文系统研究了基于模型预测控制(MPC)的滚动优化方法在微电网多时间尺度能量管理调度中的应用。通过构建包含风能、光伏、储能等多种分布式能源的微电网综合系统模型,充分利用MPC的前瞻性预测与滚动优化机制,实现对系统内部能量流的精细化、动态化调控。研究重点解决了新能源出力强不确定性带来的调度挑战,兼顾系统运行的经济性、稳定性与可靠性,在日前、日内及实时等多个时间尺度上实现了优化决策的协同。文中配套提供了完整的Python代码实现,涵盖模型构建、约束处理、目标函数设定与求解全过程,具有较强的可复现性与工程参考价值。; 适合人群:具备定电力系统、优化理论基础和Python编程能力的研究生、科研人员及从事微电网、综合能源系统、能源互联网等领域研究的工程技术人员。; 使用场景及目标:①深入理解MPC在复杂能源系统调度中的核心原理与技术优势;②学习并复现多时间尺度滚动优化的完整建模与求解流程;③为微电网能量管理系统(EMS)的开发、相关学术研究或工程项目提供直接的算法实现参考与技术支撑; 阅读建议:建议读者结合所提供的Python代码进行逐行研读与调试,亲自动手修改系统参数、负荷曲线或新能源出力数据,以深刻体会MPC算法的动态响应特性与优化效果,进而在此基础上开展二次开发与创新性研究。
智能安防是依托人工智能、大数据、物联网等前沿技术构建的新代安全防护体系,彻底打破了传统安防“被动监控、事后追溯”的局限。它不再是孤立的摄像头、门禁和报警器的简单组合,而是通过全域感知设备的互联互通,实现对人员、车辆、环境等多维度数据的实时采集与智能分析。从社区出入口的人脸无感通行、异常行为识别,到道路上的违章智能抓拍、重点区域的入侵预警,再到企业园区的消防隐患预判、设备故障自动告警,智能安防能在毫秒级完成风险研判,把安全防线从“事后处置”前移到“事前预防”。如今,它早已渗透到城市治理、居家生活、商业运营等各类场景,成为守护公共安全与私人空间的核心技术支撑。 不同于传统安防依赖人工盯守的高成本模式,智能安防凭借算法的持续迭代,不断拓展安全防护的边界。它可以通过对历史数据的深度挖掘,提前识别人群聚集、消防通道占用等潜在风险,联动公安、物业、应急等多部门快速响应,大幅降低安全事件的发生概率和处置时长。在老旧小区改造中,智能安防设备的加装解决了过去流动人口管理难、高空抛物溯源难等长期痛点;在家庭场景里,智能门锁、可视门铃、燃气泄漏报警器等设备组成的居家安防网络,让用户通过手机就能随时掌握家中安全状态。随着数字城市建设的推进,智能安防正从单的安全工具,进化为构建智慧城市安全底座的关键组成部分,为人们的日常工作与生活筑牢更高效、更精准的防护屏障。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值