复杂地形越野机器人导航新突破!VERTIFORMER:数据高效多任务Transformer助力越野机器人移动导航
- 作者: Mohammad Nazeri 1 ^{1} 1, Anuj Pokhrel 1 ^{1} 1, Alexandyr Card 1 ^{1} 1, Aniket Datar 1 ^{1} 1, Garrett Warnell 2 , 3 ^{2,3} 2,3, Xuesu Xiao 1 ^{1} 1
- 单位: 1 ^{1} 1乔治梅森大学计算机科学系, 2 ^{2} 2美国陆军研究实验室, 3 ^{3} 3德克萨斯大学奥斯汀分校计算机科学系
- 论文标题:VERTIFORMER: A Data-Efficient Multi-Task Transformer for Off-Road Robot Mobility
- 论文链接:https://arxiv.org/pdf/2502.00543
- 代码链接:https://github.com/mhnazeri/VertiFormer
主要贡献
- 提出了数据高效多任务Transformer模型VERTIFORMER,其通过统一的多模态潜在表示、可学习的掩码建模以及非自回归训练,能够在仅使用一小时训练数据的情况下,同时完成多种越野移动任务,例如正向和逆向运动学建模、行为克隆以及地形块重建等。
- 对不同的Transformer设计进行了全面评估,包括掩码建模(MM)、下一步预测(NTP)、仅编码器以及仅解码器等,以用于越野运动学表示。
- 在具有垂直挑战性的复杂越野地形上,进行了物理机器人实验,验证了模型在多种越野移动任务上的有效性。
研究背景
- 自主移动机器人在越野环境中面临着诸多挑战,如不规则地形造成的车辆翻滚风险、车轮打滑导致的牵引力下降以及对机器人底盘或驱动系统的潜在机械损坏等。精确理解车辆与地形之间的运动学交互是应对这些越野移动挑战的关键。
- 尽管数据驱动的方法在相对平坦的环境中显示出一定的潜力,但对于复杂越野环境中机器人底盘与垂直挑战性地形之间的复杂关系,需要更复杂的学习架构来充分捕捉和表示这些细微的运动学交互。
- Transformer架构因其在自然语言处理(NLP)和计算机视觉(CV)中展现的强大能力,为理解复杂关系提供了新的机遇。然而,这些领域的Transformer训练范式并不完全适用于机器人移动,尤其是越野机器人移动,因为获取大规模机器人数据集存在困难,且现有的NLP和CV训练范式可能不适用于机器人移动数据的独特特征。
VERTIFORMER
- VERTIFORMER 是一种数据高效的多任务 Transformer 模型,专门用于复杂越野地形上的机器人运动学表示和导航。
- 该模型通过统一的多模态潜在表示、可学习的掩码建模和非自回归训练,能够在仅使用一小时训练数据的情况下同时完成多种越野移动任务。
VERTIFORMER训练
统一多模态潜在表示
- VERTIFORMER 包含 Transformer 编码器(VERTIENCODER)和 Transformer 解码器(VERTIDECODER)。
- 模型接收的动作 a 0 : T a_{0:T} a0:T、机器人姿态 p 0 : T p_{0:T} p0:T 和地形块 i 0 : T i_{0:T} i0:T 首先分别通过独立的线性映射投影到嵌入空间:
a ^ t = f a ( a t ) = W a a t + b a , a t ∈ a 0 : T , p ^ t = f p ( p t ) = W p p t + b p , p t ∈ p 0 : T , i ^ t = f i ( i t ) = W i i t + b i , i t ∈ i 0 : T , \begin{align*} \hat{a}_t &= f_a(a_t) = W_a a_t + b_a, \quad a_t \in a_{0:T}, \\ \hat{p}_t &= f_p(p_t) = W_p p_t + b_p, \quad p_t \in p_{0:T}, \\ \hat{i}_t &= f_i(i_t) = W_i i_t + b_i, \quad i_t \in i_{0:T}, \end{align*} a^tp^ti^t=fa(at)=Waat+ba,at∈a0:T,=fp(pt)=Wppt+bp,pt∈p0:T,=fi(it)=Wiit+bi,it∈i0:T,
其中, W a , W p , W i W_a, W_p, W_i Wa,Wp,Wi 为权重矩阵, b a , b p , b i b_a, b_p, b_i ba,bp,bi 为偏置向量。为了在 VERTIFORMER 内部实现有效的跨模态交互,需要将不同模态的嵌入投影到统一的潜在空间中,以减少统计特性上的潜在差异。因此,进一步应用线性变换 f s f_s fs 将嵌入拼接起来:
z t = f s ( a ^ t , p ^ t , i ^ t ) = W s ( a ^ t ⋅ p ^ t ⋅ i ^ t ) + b s , t ∈ [ 0 : T ] , z_t = f_s(\hat{a}_t, \hat{p}_t, \hat{i}_t) = W_s (\hat{a}_t \cdot \hat{p}_t \cdot \hat{i}_t) + b_s, \quad t \in [0 : T], zt=fs(a^t,p^t,i^t)=Ws(a^t⋅p^t⋅i^t)+bs,t∈[0:T],
其中, W s W_s Ws 和 b s b_s bs 分别为 f s f_s fs 的权重矩阵和偏置向量。最终得到的统一标记 z 0 : T z_{0:T} z0:T 作为输入传递给 VERTIENCODER。
可学习掩码建模
结合统一表示,VERTIFORMER 提出了一种随机可学习的掩码建模技术,以实现多任务学习。在训练过程中,模型首先在所有模态上进行预热,然后以相等的概率应用两种不同的数据掩码方法:
-
基于动作的未来姿态预测:
- 在 50% 的训练实例中,提供人类演示生成的未来 τ \tau τ 步动作 a T + 1 : T + τ a_{T+1:T+\tau} aT+1:T+τ 作为输入,同时将对应的未来姿态 p T + 1 : T + τ p_{T+1:T+\tau} pT+1:T+τ 替换为可学习的掩码。
- 这使得模型能够基于提供的未来动作和先前的历史上下文预测未来的姿态,类似于越野移动中的正向运动学建模(FKD)任务。
-
基于姿态的未来动作预测:
- 在剩余的 50% 的实例中,提供未来姿态 p T + 1 : T + τ p_{T+1:T+\tau} pT+1:T+τ 作为输入,而将对应的未来动作 a T + 1 : T + τ a_{T+1:T+\tau} aT+1:T+τ 使用另一个可学习的掩码进行掩码。
- 这促使模型基于提供的未来姿态和历史上下文预测未来动作,类似于逆向运动学建模(IKD)任务。
-
这种交替掩码策略与统一表示相结合,促进了能够解码动作和姿态信息的联合表示的学习。可学习掩码可以被视为一种可学习的门控机制,在训练期间选择性地过滤信息流。
-
此外,通过扩展掩码策略同时掩码未来的动作 a T + 1 : T + τ a_{T+1:T+\tau} aT+1:T+τ 和姿态 p T + 1 : T + τ p_{T+1:T+\tau} pT+1:T+τ,VERTIFORMER 能够以零样本的方式执行行为克隆(BC)。
-
在这种配置下,模型仅基于历史上下文预测动作和姿态,有效地模仿演示的行为,而无需从规划器那里获取关于未来动作和姿态的显式信息。
非自回归训练
- 基于相关研究的工作,VERTIFORMER 使用多个上下文标记来表示未来状态的分布。这些上下文标记用于通知 VERTIDECODER 预测未来的自我状态和环境的演变。
- 拥有多个上下文标记使得 VERTIFORMER 能够非自回归地预测未来。非自回归方法的动机在于自回归模型中固有的潜在计算瓶颈,因为自回归模型需要多次查询模型,并且容易受到早期步骤中误差传播的影响。
- 通过学习多上下文表示,非自回归方法旨在提高训练效率和推理速度,这对于实时机器人控制应用来说是一个关键考虑因素。
- VERTIFORMER 的训练通过最小化模型预测与相应真实值之间的均方误差(MSE)来完成。模型评估是通过计算模型预测与真实值之间在未见数据集上的误差率来进行的。
VERTIFORMER推理
- 在正向运动学建模(FKD)推理过程中,VERTIENCODER 接收与训练时相同的输入历史。
- VERTIDECODER 接收来自外部采样式规划器(例如 MPPI)的采样动作,同时掩码对应的姿态,迫使模型仅基于采样动作(和上下文标记)预测未来的姿态,以便规划器可以选择最优轨迹以最小化成本函数。
- 对于逆向运动学建模(IKD),全局规划器生成期望的未来姿态,通过掩码动作,促使模型预测实现这些全局规划姿态的未来动作。通过掩码动作和姿态,VERTIFORMER 可以执行零样本行为克隆(BC)。
使用一小时数据高效训练VERTIFORMER
实验设置
- 数据集:使用了一小时的人类遥控驾驶数据,这些数据在一个定制的越野测试平台上采集,包含复杂的地形特征(如岩石、巨石、木板、人工草坪等)。
- 评估指标:通过计算模型预测与真实值之间的误差率来评估性能,重点关注机器人姿态的三个分量(X、Y、Z)。
实验结果
- 位置编码:正弦位置编码在预测机器人姿态时表现优于可学习位置编码。
- 归一化层:在 Transformer 输出层之前应用 RMSNorm 层可以显著提高模型性能和训练稳定性。
- 统一多模态潜在表示:统一表示能够显著提高模型对时间依赖性和运动学转换的理解能力,与分离表示相比,学习损失显著下降。
- 预测范围:非自回归模型(VERTIFORMER)在长时预测中表现出更高的准确性和稳定性,避免了自回归模型中常见的误差累积问题。
- 地形块重建头:加入地形块重建头会降低模型性能,因为越野地形的复杂性使得重建任务非常困难,引入了噪声。
- 不同训练范式对比:非自回归的 VERTIFORMER 在正向运动学建模(FKD)、逆向运动学建模(IKD)和行为克隆(BC)任务中均优于其他模型,包括仅编码器(MM)、仅解码器(NTP)和端到端(End2End)模型。
实验结论
- 数据效率:VERTIFORMER 通过独特的训练方法和架构设计,在仅使用一小时数据的情况下,能够同时完成多种越野移动任务。
- 性能优势:非自回归设计和统一的多模态潜在表示显著提高了模型的准确性和稳定性,尤其是在长时预测和多任务学习方面。
- 泛化能力:模型在未见的测试环境中表现出良好的泛化能力,能够适应不同的地形和摩擦系数。
真实机器人平台实验
实验设置
- 机器人平台:使用了一个开源的四轮越野机器人(Verti-4-Wheeler, V4W),该机器人配备了 Microsoft Azure Kinect RGB-D 摄像头用于构建地形图,以及 NVIDIA Jetson Xavier 处理器用于实时计算。
- 测试环境:实验在一个 4m × 2.5m 的测试平台上进行,该平台包含多种复杂地形,如岩石、巨石、木板、人工草坪和可变形泡沫,模拟了具有不同摩擦系数和变形能力的垂直挑战性地形。
- 任务:实验验证了 VERTIFORMER 在三种任务上的性能:
- 正向运动学建模(FKD):与 MPPI 规划器结合,预测机器人未来的姿态。
- 逆向运动学建模(IKD):与全局规划器结合,生成实现目标姿态的动作。
- 行为克隆(BC):仅基于历史数据预测未来动作,无需显式的目标姿态或动作。
实验结果
- 性能指标:通过成功率、平均穿越时间、平均侧倾角和俯仰角来评估模型性能。
- 实验结果:
- FKD 任务:VERTIFORMER 与 MPPI 规划器结合,成功率达到 100%,平均穿越时间为 9.42 秒,平均侧倾角为 0.169 弧度,平均俯仰角为 0.096 弧度。
- IKD 任务:VERTIFORMER 与全局规划器结合,成功率达到 80%,平均穿越时间为 17.16 秒,平均侧倾角为 0.136 弧度,平均俯仰角为 0.077 弧度。
- BC 任务:VERTIFORMER 在行为克隆任务中成功率达到 80%,平均穿越时间为 12.64 秒,平均侧倾角为 0.154 弧度,平均俯仰角为 0.099 弧度。
实验结论
- 模型优势:VERTIFORMER 在复杂越野地形上表现出色,能够有效处理多种任务,且在数据稀缺条件下具有良好的泛化能力。
- 性能对比:与现有的先进模型(如 TAL、VERTIENCODER、VERTIDECODER)相比,VERTIFORMER 在成功率、穿越时间和姿态稳定性方面均表现出色。
- 实际应用:实验结果表明,VERTIFORMER 可以在真实机器人平台上高效运行,为越野机器人导航和运动学建模提供了一种有效的解决方案。
结论与未来工作
- VERTIFORMER作为一种数据高效多任务Transformer,能够仅使用有限的训练数据(一小时)来学习复杂的车辆-地形运动学交互,并在多种越野移动任务上取得了优异的性能,同时提高了模型的泛化能力和对未知环境的适应性。
- 未来的研究可以探索如何进一步提高模型在长时预测和复杂地形上的性能,例如改进掩码策略、优化模型架构或结合其他先进的训练技术。
- 此外,还可以将该模型应用于其他机器人领域,如视觉导航或操作任务,以验证其在不同场景下的适用性和有效性。
相关文章:
复杂地形越野机器人导航新突破!VERTIFORMER:数据高效多任务Transformer助力越野机器人移动导航
作者: Mohammad Nazeri 1 ^{1} 1, Anuj Pokhrel 1 ^{1} 1, Alexandyr Card 1 ^{1} 1, Aniket Datar 1 ^{1} 1, Garrett Warnell 2 , 3 ^{2,3} 2,3, Xuesu Xiao 1 ^{1} 1单位: 1 ^{1} 1乔治梅森大学计算机科学系, 2 ^{2} 2美国陆军研究实验室&…...
ROS 快速入门教程04
12.激光雷达工作原理 激光雷达的作用是探照周围障碍物的距离,按照测量维度可以分为单线雷达和多线雷达。 按照测量原理可以分为三角测距雷达和TOF雷达。按照工作方式可以分为固态雷达和机械旋转雷达。 本次讲解以TOF雷达为例,雷达发射器发射激光遇到障碍…...
Node.js 开发项目
初始化 npm init## npm install 编辑packege.json 添加,以支持ES6的语法 "type": "module" 连接mysql示例 import db from ./db/ops_mysql.jsconst createTable async () > {const insert_data CREATE TABLE IF NOT EXISTS users (…...
Linux系统下的常用网络命令
1.ping命令 作用:用来检测网络的连通情况和分析网络速度;根据域名得到服务器IP;根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。 参数:-c 数字:设定ping命令发出的消息包数量,如无…...
【器件专题1——IGBT第1讲】IGBT:电力电子领域的 “万能开关”,如何撑起新能源时代?
一、IGBT 是什么?重新认识这个 “低调的电力心脏” 你可能没听过 IGBT,但一定用过它驱动的设备:家里的变频空调、路上的电动汽车、屋顶的光伏逆变器,甚至高铁和电网的核心部件里,都藏着这个 “电力电子开关的瑞士军刀”…...
C++23 新特性深度落地与最佳实践
一、引言 C 作为一门历史悠久且广泛应用的编程语言,一直在不断发展和演进。C23 作为 C 标准的一个重要版本,引入了许多令人期待的新特性,这些特性不仅提升了代码的可读性、可维护性,还增强了程序的性能和安全性。本文将深入探讨 …...
26考研 | 王道 | 数据结构笔记博客总结
26考研 | 王道 | 数据结构笔记博客总结 笔者博客网站 分类: 数据结构 | Darlingの妙妙屋 26考研 | 王道 | 数据结构 | 第一章 数据结构绪论 | Darlingの妙妙屋 26考研 | 王道 | 数据结构 | 第二章 线性表 | Darlingの妙妙屋 26考研 | 王道 | 数据结构 | 第三章 栈和队列 |…...
Bolsig+超详细使用教程
文章目录 Bolsig介绍Bolsig的使用 Bolsig介绍 BOLSIG 是一款用于求解弱电离气体中电子玻尔兹曼方程的免费计算程序,适用于均匀电场条件下的群体实验、气体放电及碰撞型低温等离子体研究。在此类环境中,电子分布函数呈现非麦克斯韦特性,其形态…...
基于线性LDA算法对鸢尾花数据集进行分类
基于线性LDA算法对鸢尾花数据集进行分类 1、效果 2、流程 1、加载数据集 2、划分训练集、测试集 3、创建模型 4、训练模型 5、使用LDA算法 6、画图3、示例代码 # 基于线性LDA算法对鸢尾花数据集进行分类# 基于线性LDA算法对鸢尾花数据集进行分类 import numpy as np import …...
C#高级语法--接口
先引用一些通俗一点的话语说明 1. 接口就像“插座标准”(解耦) 🧩 场景: 你家的手机充电器(USB-C、Lightning)必须插进匹配的插座才能充电。问题:如果每个手机品牌插座都不一样,你换手机就得换充电器,太麻烦了!💡 接口的作用: 定义一个通用的充电口标准(比如U…...
软测面经(私)
测试流程 分析需求——>制定测试计划——>设计测试用例——>执行测试——>编写测试报告 黑盒测试 等价类划分、边界值分析法、猜错法、随机数法、因果图。 白盒测试 代码检查法、程序变异、静态结构分析法、静态质量度量法、符号测试法、逻辑覆盖法、域测试、…...
线程函数库
pthread_create函数 pthread_create 是 POSIX 线程库(pthread)中的一个函数,用于创建一个新的线程。 头文件 #include <pthread.h> 函数原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*s…...
数据结构初阶:排序
概述:本篇博客主要介绍关于排序的算法。 目录 1.排序概念及应用 1.1 概念 1.2 运用 1.3 常见的排序算法 2. 实现常见排序算法 2.1 插入排序 2.1.1 直接插入排序 2.1.2 希尔排序 2.2 选择排序 2.2.1 直接选择排序 2.2.2 堆排序 2.3 交换排序 2.3.1 冒泡排序…...
openwrt查询网关的命令
方法一:route -n 方法二:ip route show...
优化非线性复杂系统的参数
非线性项组合的系统 对于系统中的每一个复杂拟合,即每一个残差函数,都能表示为非线性方程的趋势,例如较为复杂的系统函数组, from optimtool.base import sp, np x sp.symbols("x1:5") res1 0.5*x[0] 0.2*x[1] 1.…...
【QQMusic项目界面开发复习笔记】第二章
🌹 作者: 云小逸 🤟 个人主页: 云小逸的主页 🤟 motto: 要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在&…...
并发编程【深度解剖】
并发介绍 谈到并发,随之而来的就是那几个问题。并发 并行 线程 进程 注意!!!本篇文章更多用诙谐的语调讲解,为保证易于理解,不够官方正式,所以可以结合AI读本篇文章,并且本文是以 g…...
前端如何连接tcp 服务,接收数据
在传统的浏览器前端环境中,由于浏览器的同源策略和安全限制,无法直接建立 TCP 连接。不过,可以通过 WebSocket 或者使用 WebRTC 来间接实现与 TCP 服务的通信,另外在 Node.js 环境中可以直接使用 net 模块建立 TCP 连接。下面分别…...
用C语言实现——一个中缀表达式的计算器。支持用户输入和动画演示过程。
一、思路概要和知识回顾 1.思路概要 ①中缀表达式计算: 需要处理运算符的优先级,可能需要用到栈结构。 ❗❗如何将中缀表达式转换为后缀表达式?或者直接计算? 通常,中缀转后缀(逆波兰式)再…...
使用 Pandas 进行多格式数据整合:从 Excel、JSON 到 HTML 的处理实战
前言 在数据处理与分析的实际场景中,我们经常需要整合不同格式的数据,例如 Excel 表格、JSON 配置文件、HTML 报表等。本文以一个具体任务(蓝桥杯模拟练习题)为例,详细讲解如何使用 Python 的 Pandas 库结合其他工具&…...
常见游戏引擎介绍与对比
Unreal Engine (UE4/UE5) 主语言:C Unreal Engine 主要使用 C 作为开发语言。C 提供了高性能的底层控制,适用于需要精细调优的 AAA 级游戏。C 在 Unreal 中用于开发核心游戏逻辑、物理引擎等性能要求较高的部分。 脚本语言:蓝图(B…...
第十一天 主菜单/设置界面 过场动画(Timeline) 成就系统(Steam/本地) 多语言支持
前言 对于刚接触Unity的新手开发者来说,构建完整的游戏系统往往充满挑战。本文将手把手教你实现游戏开发中最常见的四大核心系统:主菜单界面、过场动画、成就系统和多语言支持。每个模块都将结合完整代码示例,使用Unity 2022 LTS版本进行演示…...
vue3 使用 vite 管理多个项目,实现各子项目独立运行,独立打包
场景: 之前写过一篇 vite vue2 的配置,但是现在项目使用 vue3 较多,再更新一下 vue脚手架初始化之后的项目,每个项目都是独立的,导致项目多了之后,node依赖包过多,占用内存较多。想实现的效果…...
k8s(9) — zookeeper集群部署(亲和性、污点与容忍测试)
一、部署思路 1、前期设想 zookeeper集群至少需要运行3个pod集群才能够正常运行,考虑到节点会有故障的风险这个3个pod最好分别运行在3个不同的节点上(为了实现这一需要用到亲和性和反亲和性概念),在部署的时候对zookeeper运行的pod打标签加…...
Linux操作系统复习
Linux操作系统复习 一. Linux的权限和shell原理1. Linux从广义上讲是什么 从狭义上讲是什么?2. shell是什么?3. 为什么要设置一个shell外壳而不是直接和linux 内核沟通4. shell的原理是什么5. Linux中权限的概念6. 如何提升当前操作的权限7. 文件访问者的…...
深入解析 Linux 中动静态库的加载机制:从原理到实践
引言 在 Linux 开发中,动静态库是代码复用的核心工具。静态库(.a)和动态库(.so)的加载方式差异显著,直接影响程序的性能、灵活性和维护性。本文将深入剖析两者的加载机制,结合实例演示和底层原…...
总账主数据——Part 2 科目-1
本文主要介绍在S4 HANA OP中 总账主数据的后台配置及前台操作。 目录 1. 准备 1.1 科目表的定义(OB13) 1.2 给公司代码分配科目表(OB62) 1.3 定义科目组(OBD4) 1.4 定义留存收益科目(OB53) 1.5 维护科目表层“文本标识” (OBT6) 1.6 维护公司代码层“文本标识” (OBT…...
借助内核逻辑锁pagecache到内存
一、背景 内存管理是一个永恒的主题,尤其在内存紧张触发内存回收的时候。系统在通过磁盘获取磁盘上的文件的内容时,若不开启O_DIRECT方式进行读写,磁盘上的任何东西都会被缓存到系统里,我们称之为page cache。可以想象࿰…...
✨ Apifox:这玩意儿是接口界的“瑞士军刀”吧![特殊字符][特殊字符]
——全网最皮最全测评,打工人看了直呼“真香” 📢 友情提醒 还在用 Postman 测接口、Swagger 写文档、Mock.js 造假数据、脑细胞搞团队协作? 停! 你仿佛在玩《工具人环游记》,而隔壁同事已经用 Apifox 「一杆清台」了…...
《普通逻辑》学习记录——性质命题及其推理
目录 一、性质命题概述 二、性质命题的种类 2.1、性质命题按质的分类 2.2、性质命题按量的分类 2.3、性质命题按质和量结合的分类 2.4、性质命题的基本形式归纳 三、四种命题的真假关系 3.1、性质命题与对象关系 3.2、四种命题的真假判定 3.3、四种命题的对当关系 四、四种命题…...
设备接入与APP(应用程序)接入华为云iotDA平台的路径元素有哪些不同?
目录 壹、设备接入华为云iotDA 🏢 形象比喻:设备 员工,IoTDA 平台 安保森严的总部大楼 一、📍 平台接入地址 总部大楼地址 二、🧾 接入凭证 出入证 / 门禁卡 / 工牌 1. 设备密钥或证书 2. 预置接入凭证密钥&a…...
【git#4】分支管理 -- 知识补充
一、bug 分支 假如我们现在正在 dev2 分支上进行开发,开发到一半,突然发现 master 分支上面有 bug,需要解决。 在Git中,每个 bug 都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临…...
AXOP34062: 40V双通道运算放大器
AXOP34062是一款通用型高压双通道运算放大器,产品的工作电压为2.5V至40V,具有25MHz的带宽,压摆率为10V/μs,静态电流为650A。较高的耐压和带宽使其可以胜任绝大多数的高压应用场景。 主要特性 轨到轨的输入输出范围低输入失调电…...
OpenCv高阶(十)——光流估计
文章目录 前言一、光流估计二、使用步骤1、导库读取视频、随机初始化颜色2、初始化光流跟踪3、视频帧处理循环4、光流计算与可视化5、循环控制与资源释放完整代码 总结 前言 在计算机视觉领域,光流估计是捕捉图像序列中像素点运动信息的核心技术。它描述了图像中每…...
BS客户端的单点登录
1、参数类似于“XXXXX://?userIdsystem&time1696830378038&token38a8ea526537766f01ded33a6cdfa5bd” 2、在config里加一个LoginSecret参数可随意指定一个字符串 3、BS登录代码里会对“LoginSecret的参数值用户ID时间戳”进行MD5加密形成token,与传过来的…...
通讯录完善版本(详细讲解+源码)
目录 前言 一、使通讯可以动态更新内存 1、contact.h 2、contact.c 存信息: 删除联系人,并试一个不存在的人的信息,看看会不会把其他人删了 编辑 修改: 编辑 排序: 编辑 销毁: 编辑 …...
第3讲:ggplot2完美入门与美化细节打磨——从基础绘制到专业级润色
目录 1. 为什么选择ggplot2? 2. 快速了解ggplot2绘图核心逻辑 3. 基础绘图示范:柱状图、折线图、散点图 (1)简单柱状图 (2)折线图示范 (3)高级散点图 + 拟合线 4. 精细美化:细节打磨决定专业感 5. 推荐的美化小插件(可选进阶) 6. 小练习:快速上手一幅美化…...
带宽?增益带宽积?压摆率?
一、带宽(Bandwidth) 1.科学定义: 带宽指信号或系统能够有效通过的频率范围,通常定义为信号功率下降到中频值的一半(即 - 3dB)时的最高频率与最低频率之差。对于运算放大器(Op-Amp)…...
为什么栈内存比堆内存速度快?
博主介绍:程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章,首发gzh,见文末👇…...
什么是非关系型数据库
什么是非关系型数据库? 引言 随着互联网应用的快速发展,传统的基于表格的关系型数据库(如 MySQL、Oracle 等)已经不能完全满足现代应用程序的需求。在这种背景下,非关系型数据库(NoSQL 数据库)…...
制作一个简单的操作系统9
自定义 myprintf 函数实现解析 探索如何实现一个自定义的 printf 函数来处理任意 %d 和 %s 组合 (说实话,想不用任何库函数和头文件,纯C实现太难了,我放弃了,弄了一个简陋版本 对付用) 运行效果: Hello 123 World 456 Coding这样参数传递:(最多支持5个参数,按顺序…...
华为Pura X的智控键:让折叠机体验更上一层楼的设计
还记得Mate 70系列刚出那会,我体验了下智控键,那时候就觉得这个“把快捷方式做进电源键”的交互方式非常惊艳,没想到在Pura X上,这种便捷体验感更上了一层楼。 智控键:折叠屏手机的天选快捷方式? 传统折叠…...
打造高功率、高电流和高可靠性电路板的厚铜PCB生产
厚铜PCB生产是指制作一种具有较厚铜层的PCB(Printed Circuit Board,印刷电路板)。这种PCB通常用于高功率、高电流和高可靠性的电子设备中。厚铜PCB的生产过程包括以下几个 主要步骤: 1. 基材准备 厚铜PCB的基材通常采用FR4或CEM-…...
AI超级智能体教程(三)---程序调用AI大模型的四种方式(SpringAI+LangChain4j+SDK+HTTP)
文章目录 1.安装SDK(查看文档)2.创建API-key3.项目引入灵积大模型4.HTTP接入的方式5.SpringAI引入5.1添加依赖5.2添加配置5.3测试代码 6.LangChain4j引入6.1依赖引入6.2测试提问 1.安装SDK(查看文档) 安装阿里云百炼SDK_大模型服…...
JDBC连接数据库
一、查询 sqlserver数据库 private List<Map<String, String>> getPathList(String id) throws Exception {String driverName "com.microsoft.sqlserver.jdbc.SQLServerDriver";String dataBaseurl "jdbc:sqlserver://localhost:1433;SelectMeth…...
常见缓存淘汰算法(LRU、LFU、FIFO)的区别与实现
一、前言 缓存淘汰算法主要用于在内存资源有限的情况下,优化缓存空间的使用效率。以确保缓存系统在容量不足时能够智能地选择需要移除的数据。 二、LRU(Least Recently Used) 核心思想:淘汰最久未被访问的数据。实现方式&#x…...
深度学习--循环神经网络RNN
文章目录 前言一、RNN介绍1、传统神经网络存在的问题2、RNN的核心思想3、 RNN的局限性 二、RNN基本结构1、RNN基本结构2、推导3、注意4、循环的由来5、再谈RNN的局限 总结 前言 循环神经网络(RNN)的起源可以追溯到1982年,由Saratha Sathasiv…...
大学IP广播系统解决方案:构建数字化智慧化大学校园IP广播平台
大学IP广播系统解决方案:构建数字化智慧化大学校园IP广播平台 北京海特伟业科技有限公司任洪卓于2025年4月24日发布 随着教育信息化建设的深入推进,传统的模拟广播系统已无法满足现代化校园对智能化、场景化、融合化的管理需求。为此,海特伟业提出构建…...
#ifndef #else #endif条件编译
目录 一、#ifdef 1. 基本用法 2. 查看头文件 3. 目的 4. 常见用途 4. 取消定义 5.小结 二、#ifndef和#ifdef区别 1. #ifdef 2. #ifndef 3.结论 一、#ifdef 宏定义 #define H_PWM_L_ON 的作用是创建一个名为 H_PWM_L_ON 的宏。以下是这个宏定义的一些关键点ÿ…...
SystemVerilog语法之typedef与自定义结构
1.7 使用typedef创建新的类型 在Verilog中,你可以为操作数的位宽或者类型分别定义一个宏,但是你并没有创建新的数据类型,而是进行了文本的替换。在SystemVerilog中,可以使用typedef创建新的类型。可以将parameter和typedef语句放…...