DexCap——斯坦福李飞飞团队泡茶机器人:更好数据收集系统的原理解析、源码剖析
前言
2023年7月,我司组建大模型项目开发团队,从最开始的论文审稿,演变成目前的两大赋能方向
- 大模型应用方面,以微调和RAG为代表
除了论文审稿微调之外,目前我司内部正在逐一开发论文翻译、论文对话、论文idea提炼、论文修订/润色/语法纠错、论文检索 - 机器人(具身智能)方面,我们1月份开始攻机器人、Q1组建队伍、5月份成功复现UMI和DexCap后「是国内最早复现这两模型的团队或之一,为不断扩大整个大模型机器人的开发队伍,需要从课程中选拔更多人才,故推出:机器人二次开发线下营(线下提供价值20万的实体机器人 供线下实操)」
本月(即6月)总算要开始为工厂赋能了(目前已经谈好三个工厂的合作意向)
总之,经过过去近一年的努力,在今年创业的第十年,我司从教育为主,变成了「科技为主 教育为辅」,主做大模型应用、机器人(具身智能)、解决方案
而对于其中的机器人,无论是我、我合伙人孙老师、Y博士(我司机器人方向的合伙人),还是整个机器人开发团队,对具身智能的发展都充满无比的信心,誓要全力加速赋能各个典型的工业场景,毕竟科技就是最直接的生产力
本文中的DexCap一开始是在此文《模仿学习的集中爆发:从Dobb·E、Gello到斯坦福Mobile ALOHA、UMI、DexCap、伯克利FMB》中的,考虑到
- 一方面,经过我司七月的一系列实践得知,相较Moblie Aloha、UMI「其中,UMI详见:UMI——斯坦福刷盘机器人:从手持夹持器到动作预测Diffusion Policy(含代码解读)」,DexCap在工厂的落地性更高,可以更好的结合企业特定的需求场景做定制开发
- 二方面,我们准备把DexCap的源码也做下分析,以方便更广大的朋友
故把DexCap独立出来成本文
第一部分 斯坦福李飞飞团队DexCap:可扩展和便携的动作捕捉数据收集系统
1.1 项目背景:遇到的问题与解决方案
1.1.1 以前收集数据:从远程操作、基于视觉到运动捕捉
首先,对于数据的收集上,通过上面介绍的斯坦福mobile aloha/UMI可知,模仿学习最近在机器人领域取得了相当大的进展,特别是通过使用人类示范数据进行监督训练
- 常用的一种收集数据的方法是通过远程操作机器人手执行任务 比如mobile aloha。 然而,由于需要真实的机器人系统和缓慢的机器人运动,这种方法在扩展上是昂贵的
- 另一种方法是在操作过程中直接跟踪人手的运动而不控制机器人。 当前系统主要是基于视觉的,使用单视角摄像头。 然而,除了跟踪算法能否提供关键的准确的三维信息以供机器人策略学习之外,这些系统还容易受到在手-物体交互过程中经常发生的视觉遮挡的影响
- 对于收集灵巧操纵数据,运动捕捉(mo-cap)是一种比基于视觉的方法更好的选择。 运动捕捉系统提供准确的三维信息,并且对视觉遮挡具有鲁棒性。 因此,人类操作员可以直接用双手与环境进行交互,这样做快速且更容易扩展,因为不需要机器人硬件
进一步,为了将手部运动捕捉系统扩展到机器人学习的日常任务和环境中进行数据收集,一个合适的系统应该具备便携性和长时间捕捉的鲁棒性,能够提供准确的手指和腕关节姿态,以及三维环境信息,可问题是
- 大多数手部运动捕捉系统不具备便携性,依赖于校准良好的第三视角摄像头,虽然电磁场(EMF)手套解决了这个问题,但无法跟踪世界坐标系中的6自由度(6-DoF)腕关节姿态,这对于末端执行器(比如手指)的策略学习很重要
- 像基于IMU(Inertial Measurement Unit,惯性测量单元,主要用来检测和测量加速度与旋转运动的传感器)的全身套装这样的设备可以监测腕关节位置,但容易随时间漂移
除了硬件挑战外,还存在算法挑战,用于机器人模仿学习的动作捕捉数据。 尽管灵巧的机器人手使得直接从人类手部数据中学习成为可能,但机器人手和人类手之间的尺寸、比例和运动结构的固有差异需要创新算法
1.1.2 DEXCAP如何解决:便捷式动作捕捉、学习算法DEXIL、人机交互校正
为了分别解决硬件层面、算法层面的挑战,24年3月,李飞飞团队分别开发了一种新的便携式手部动作捕捉系统DEXCAP,和一种模仿算法DEXIL(DEXIL允许机器人直接从人类手部动作捕捉数据中学习灵巧操纵策略)
- 项目地址:DexCap | Scalable and Portable Mocap Data Collection System for Dexterous Manipulation
- 论文地址:DexCap: Scalable and Portable Mocap Data Collection System for Dexterous Manipulation
对于系统,DEXCAP作为便携式手部动作捕捉系统,可以实时跟踪手腕和手指运动的6自由度姿态(60Hz),该系统包括
- 一个动作捕捉手套用于跟踪手指关节,每个手套上方安装一个相机用于通过SLAM跟踪手腕的6自由度姿态
- 并在胸部安装一个RGB-D LiDAR相机观察3D环境(注意,手部动作的精确3D信息,例如,6自由度手部姿态、3D手指定位等很重要)
对于算法,为了利用DEXCAP收集的数据来学习灵巧机器人策略,作者团队提出了基于动作捕捉数据的模仿学习方法DEXIL,它包括两个主要步骤——数据重定位和基于点云输入的生成式行为克隆策略训练(data retargeting and training generative-based behavior cloning policy with point cloud inputs),还可以选择性地进行人机交互式运动校正
- 在重定位过程中,我们使用逆运动学(inverse kinematics,简称IK)将机器人手指尖重定位到与人类手指尖相同的3D位置
手腕的6自由度姿态用于初始化IK,以确保人类和机器人之间的手腕运动相同 - 然后,我们将RGB-D观测转换为基于点云的表示,继而使用基于点云的行为克隆算法,基于扩散策略[13]
- 在更具挑战性的任务中,当IK无法填补人类手和机器人手之间的体现差距时,我们提出了一种人机交互式运动校正机制,即在策略执行过程中,当出现意外行为时,人类可以佩戴DEXCAP并中断机器人的运动,这样的中断数据可以进一步用于策略微调
总之,不同于以下这些
- DIME [3] 使用虚拟现实技术来远程操作灵巧手进行数据收集
- Qin等人 [60] 使用单个RGB摄像头来跟踪手部姿态进行远程操作
- DexMV [61]、DexVIP [45] 和 VideoDex [69]利用人类视频数据来学习运动先验知识,但通常需要在仿真或真实机器人远程操作数据上进行额外训练
DEXCAP专注于灵巧模仿学习,依赖于 DEXCAP 来收集基于三维点云观测的高质量手部动作捕捉数据,这些数据可以直接用于训练单手或双手机器人的低级位置控制
1.2 硬件设备:数据捕捉设备和机器人的设计
DexCap为了捕捉适合训练灵巧机器人策略的细粒度手部动作数据,DexCap的设计考虑了四个关键目标:
- 详细的手指运动跟踪
- 准确的6自由度手腕姿态估计
- 以统一坐标框架记录对齐的3D观察数据
- 在各种真实环境中具有出色的便携性以进行数据收集
1.2.1 追踪手指运动:使用Rokoko动作捕捉手套
经过实验得知,使用电磁场手套,相比于基于视觉的手指追踪系统,在手物交互中对视觉遮挡的鲁棒性方面具有显著优势(论文中对电磁场手套系统和最先进的基于视觉的手部追踪方法在不同操纵场景下进行了定性比较)
在我们的系统中,手指运动使用Rokoko动作捕捉手套进行跟踪,如下图所示
- 每个手套的指尖都嵌入了一个微小的磁传感器(Each glove’s fingertip is embedded with a tiny magnetic sensor)
- 而信号接收器则放置在手套的背面(while a signal receiver hub is placed on the glove’s dorsal side)
- 每个指尖的三维位置是从接收器到传感器的相对三维位移来测量的(The 3D location of each fingertip is measured as the relative 3D translation from the hub to the sensors)
1.2.2 追踪6自由度手腕姿态:2个T265追踪相机和一个IMU传感器
除了手指运动外,了解机器人末端执行器在三维空间中的精确位置对于机器人操控至关重要。这需要DEXCAP用于估计和记录人手在数据收集过程中的6自由度姿态轨迹。 虽然基于相机和基于IMU的方法通常被使用,但每种方法都有其局限性
- 基于相机的系统,通常不便携且在估计手腕方向能力上有限,不太适合用于操纵任务的数据收集
- 基于IMU的系统,虽然可穿戴,但在长时间记录会话中容易出现位置漂移
为了解决这些挑战,故开发了一种基于SLAM算法的6自由度手腕跟踪系统,如上图(c)所示
该系统逐一通过
- 安装在每个手套背面的Intel Realsense T265相机「即两个鱼眼相机的图像(一篮、一绿)」
从而让其是便携的,可以在第三人称摄像机框架中无需手部可见的情况下跟踪手腕姿态 - IMU传感器信号(IMU传感器提供了训练机器人策略所需的关键手腕方向信息)
- SLAM算法构建环境地图
SLAM可以自动根据建立的地图纠正位置漂移,以实现长时间使用(SLAM can autonomously correct position drift with the built map for long-time use)
以实现对手腕6自由度姿态的一致跟踪
1.2.3 记录3D观察和校准:一个RGB-D LiDAR摄像机和一个T265跟踪相机
捕捉训练机器人策略所需的数据不仅需要跟踪手部运动,还需要记录3D环境的观察作为策略输入
为此,DexCap团队设计了一个装载摄像机的背包「如上图(a)、(b)所示,为方便大家对照,特把上图再贴一下,如下」
- 在正前面,它通过胸部摄像机支架的4个插槽集成了4个相机,顶部是一台Intel Realsense L515 RGB-D LiDAR摄像机,顶部下面是3个Realsense T265鱼眼SLAM跟踪相机(分别为红、绿、蓝),用于在人类数据收集过程中捕捉观察结果
其中
LiDAR相机和最上面的T265相机(红色)固定在相机支架上
而两个较低的(即绿色、蓝色)T265相机设计为可拆卸的,并可以固定在手套的背部进行手部6自由度姿态跟踪 - 在正背面,一个Intel NUC(Intel NUC 13 Pro,相当于就是一台带有64GB RAM和2TB SSD的迷你电脑),和一个40000mAh的移动电源放在背包中,支持长达40分钟的连续数据收集
接下来的关键问题是如何有效地将跟踪的手部运动数据与3D观察结果进行整合
- 在数据收集开始时,所有跟踪摄像机都放置在支架槽中(即一开始时,所有摄像头都安装在胸前。 在启动程序后,参与者在环境中移动几秒钟,使SLAM算法构建周围环境的地图),以确保相机框架之间的恒定变换(如上图左侧所示)
- 然后,我们将跟踪摄像机从支架上取下(一绿、一蓝),并插入到每个手套上的相机插槽中(如上图右侧所示)
此外,为了在人体运动中确保稳定的观察结果,LiDAR摄像机下方安装了另一个鱼眼跟踪摄像机「在上图中标为红色」
当然,DexCap的硬件设计模块化且成本低廉,不限制相机、动作捕捉手套和迷你PC的品牌或型号,总成本控制在4000美元的预算范围内(不包括机械臂)
1.2.4 双手灵巧机器人的设计:双机械臂、双LEAP机器手
为了验证通过数据训练的机器人策略是否OK,接下来建立一个双手灵巧的机器人系统
该系统由两个Franka Emika机器人臂组成,每个臂上配备有一个LEAP灵巧机器人手(一个有16个关节的四指手),如图(b)所示
为了进行策略评估,如上图图(b)所示,人类数据收集中使用的胸部LiDAR相机被从背心上取下,并安装在机器人臂之间的支架上(对于机器人系统,只使用LiDAR相机,不需要手腕相机。 机器人臂和LEAP手都以20Hz的控制频率运行,同时使用末端执行器位置控制和关节位置控制来控制两只机械臂和两只LEAP手,即use end-effector position control for both robot arms and joint position control for both LEAP hand)
1.3 学习算法DEXIL:数据的重定向与基于点云数据的策略预测
接下来,使用DexCap记录的人手动作捕捉数据来训练灵巧机器人策略,然后,我们会遇到这几个问题
- 我们如何将人手动作重新定位到机器人手上?
- 在双手设置中,当动作空间是高维的时候,什么算法可以学习灵巧策略?
- 此外,我们还希望研究直接从人手动作捕捉数据中学习的失败案例及其潜在解决方案
为了解决这些挑战,我们引入了DEXIL,这是一个使用人手动作捕捉数据训练灵巧机器人的三步框架
- 第一步是将DexCap数据重新定位到机器人的动作和观察空间中
- 第二步使用重新定位的数据训练(基于点云的扩散策略)
- 最后一步是一个可选的human-in-the-loop correction机制,旨在解决策略执行过程中出现的意外行为
1.3.1 数据和动作重定向:人手的动作重定向到机器手上
动作重定向
如上图(a)所示,由于人手和LEAP手的尺寸差异很大,而这种尺寸差异使得不好直接将手指运动转移到机器人硬件上,故需要先将人手动作捕捉数据重新定向到机器人实体上,这需要使用逆运动学(IK)将手指位置和6自由度手掌姿态进行映射
先前研究中的一个关键发现是,在与物体互动时,手指尖是手上最常接触的区域(如HO-3D [25]、GRAB [76]、ARCTIC [16]等研究所证明的)。 受此启发,我们通过使用逆运动学(IK)来匹配手指尖位置,重新定向手指运动
具体而言,我们使用一种能够实时生成平滑准确的手指尖运动的IK算法[63, 64, 79],以确定机器人手的16维关节位置。 这确保了机器人手指尖与人手指尖的对齐
- 考虑到LEAP手和人手不一样,其只有4个手指,故在人手到机器手的IK计算过程中排除了人手中小指的信息
此外,在动作捕捉数据中捕捉到的6自由度手腕姿态作为IK算法中手腕姿态的初始参考
首先,把手腕的6自由度姿态和LEAP手的手指关节位置,共同被用作机器人的本体感知状态
然后,使用位置控制,比如把机器人的动作标签被定义为下一个未来状态「We use position control in our setup and the robot’s action labels are defined as next future states at = st+1」 - 观察和状态表示的选择对于训练机器人策略至关重要
最终,他们将LiDAR相机捕捉到的RGB-D图像转换为3D点云(We convert the RGB-D images captured by the LiDAR camera in the DEXCAP data into point clouds using the camera parameter)
且所有点云观测都被均匀地降采样为5000个点,并与机器人的感知状态和动作一起存储在一个hdf5文件中。 然后从整个录制会话(每个任务演示10分钟)中手动注释每个任务演示的起始和结束帧。 训练数据集中不包括重置任务环境的运动
如下图所示, 初始列显示原始点云场景。 第2-7列提供右、中、左三组视图(两个视图一组),且三组视图中每一组视图中的蓝色背景列显示人体数据,黄色背景列显示机器人手部重定位 与RGB-D输入相比,这种额外的转换有两个重要的好处
首先,由于DEXCAP允许人体躯干在数据采集过程中自然移动,而直接使用RGB-D输入需要考虑用于移动相机框架
但通过将点云观测转换为一致的世界坐标系(在mocap开始时,红色主SLAM相机的坐标系定义为世界坐标系),便可隔离并消除了躯干运动,从而得到稳定的机器人观测
其次,点云在编辑和与机器人操作空间对齐方面具有更高的灵活性(过程中,通过比较PointNet[58]和Perceiver [35, 42]编码器来确定最适合点云输入的编码器)
考虑到在野外捕捉到的一些动作可能超出机器人的可达范围,调整点云观测和运动轨迹的位置可以确保它们在机器人的操作范围内可行
故,最终基于以上这些发现,将mocap数据中的所有RGB-D帧处理为与机器人空间对齐的点云,并排除与任务无关的元素(例如桌面上的点)
因此,这些经过精细处理的点云数据成为输入到机器人策略π的观测输入
1.3.2 基于点云的扩散策略
通过转换后的机器人状态 、动作 和相应的三维点云观测 ,我们将机器人策略学习过程形式化为轨迹生成任务
- 对于策略模型π,通过处理点云观测和机器人当前的本体感知状态,以生成一个动作轨迹「an policy model π, processes the point cloud observations ot and the robot’s current proprioception state st into an action trajectory (at, at+1, . . . , at+d) 」
- 在中给定具有N 个点的点云观测,,然后将其均匀下采样为K 个点,并将每个点对应的RGB像素颜色连接到最终的策略输入中(Given point cloud observation with N points ot in RN ×3, we uniformly down-sample it into K points and concatenate the RGB pixel color corresponding to each point into the final policy input in RK×6)
- 为了弥合人手和机器人手之间的视觉差距,使用正向运动学将机器人模型的链接与本体感知状态进行转换,并将转换后的链接的点云合并到观测中
且在训练过程中,我们还通过在机器人的操作空间内对点云和运动轨迹应用随机的二维平移来进行数据增强(During training, we also use data augmentation over the inputs by applying random 2D translations to the point clouds and motion trajectories with in the robot’s operational space)
学习灵巧机器人策略的一个挑战,特别是对于双手灵巧机器人,是处理大维度的动作输出
- 在对应的设置中,动作输出包括两个7自由度机器人臂和两个16自由度灵巧手在d个步骤中的动作,形成了一个高维回归问题(which forms a high-dimensional regression problem)
类似的挑战也在图像生成任务中进行了研究,该任务旨在回归高分辨率帧中的所有像素值(which aim to regress all pixel values in a high-resolution frame) - 最近,扩散模型通过其逐步扩散过程,在建模具有高维数据的复杂数据分布方面取得了成功,比如AI绘画
对于机器人技术,扩散策略「详见此文《UMI——斯坦福刷盘机器人:从手持夹持器到动作预测Diffusion Policy(含代码解读)》的第三部分」遵循相同的思路
从而将控制问题形式化为动作生成任务(For robotics, Diffusion Policy [ Diffusion policy: Visuomotor policy learning via action diffusion] follows the same idea and formalizes the control problem into an action generation task)
总之,一方面,使用扩散策略作为动作解码器,经验证它在学习灵巧机器人策略方面优于传统的基于MLP的架构(比如基于MLP的BC-RNN策略),如下表中,后5行的效果均高于前4行的结果
二方面,将DP-perc作为DEXIL的默认模型架构「其中,1 基于点云的学习算法(下表中最后三行的DP-point-raw,DP-point,DP-prec)不需要遮挡mask观测,且都实现了超过60%的任务成功率,2,即使不添加机器人手部点,下表中倒数第三行的DP-point-raw的性能也接近DP-point。这可能是因为点云输入的下采样过程降低了人类手套和机器人手之间的外观差距」
至于图像输入方法,使用ResNet-18 [29]作为图像编码器。 对于基于扩散策略的模型,则使用去噪扩散隐式模型DDIM进行去噪迭代 至于其他模型的选择及其他参数详见下图
在每次机器人动作之后,我们计算机器人当前自我感知与目标姿态之间的距离。 如果它们之间的距离小于一个阈值,认为机器人已经达到了目标位置,并将查询策略获取下一个动作
为了防止机器人变得空闲,如果它在规定的步数内未能达到目标姿态,将重新查询策略获取后续动作,一般在实验中将步数设定为10
1.3.3 人机协同校正
通过上述设计,DEXIL可以直接从DEXCAP数据中学习具有挑战性的灵巧操控技能(例如,拾取和放置以及双手协调),而无需使用机器人数据
然而,简单重定位的方法并未解决人机融合差距的所有方面。例如,使用剪刀时,稳定地握住剪刀需要将手指深入握柄。 由于机器手指与人手之间长度比例的差异,直接匹配指尖和关节运动并不能保证对剪刀施加相同的力
为了解决这个问题,我们提供了一种人在环路中的运动校正机制,包括两种模式-残差校正和远程操作。在策略执行过程中,我们允许人们通过佩戴DEXCAP实时向机器人提供校正动作(其中人类对策略生成的动作应用残差动作来纠正机器人行为。 纠正动作被存储在一个新的数据集中,并与原始数据集均匀采样,用于对机器人策略进行微调)
- 在残差模式下,DEX-CAP测量人手相对于初始状态在策略展开开始时的位置变化
位置变化被应用为残差动作到机器人策略动作,通过和进行缩放 然后可以将校正后的机器人动作形式化为
且经验性地发现,设置小尺度的 β(< 0.1)可以提供最佳用户体验,避免手指移动过快 - 在需要大幅度位置变化时,踩下脚踏板将切换系统到遥操作模式。则此时DEXCAP将不再使用之前的策略推理,而是直接将人类手腕变化应用于机器人手腕姿态(DEXCAP now ignores the policy rollout and applies human wrist delta directly to the robot wrist pose),机器人指尖现在直接跟随人类指尖,相当于直接遥控
换句话说,机器人指尖将在各自的手腕坐标系中通过逆运动学追踪人类指尖。用户还可以通过再次踩下脚踏板来在纠正机器人错误后切换回剩余模式
由于机器人已经学习了初始策略,还可以在一小部分回滚中进行校正,从而大大减少人力投入。 校正后的动作和观察结果存储在一个新的数据集中。 训练数据是从和原始数据集中以等概率抽样的方式进行的,以微调策略模型,类似于IWR [Human-in the-loop imitation learning using remote teleoperation]
1.4 数据
最终,我们使用三种数据类型(分别得到了201、129和82个演示):
- DEXCAP数据捕捉机器人操作空间内的人手动作
比如剪刀剪裁和泡茶任务分别获得了一个小时的DEXCAP数据,分别产生了104和55个演示 - 室外DEXCAP数据来自实验室外环境
比如一个小时的室外DEXCAP数据提供了96个演示 - 使用脚踏板收集human-in-the-loop correction data,用于调整机器人动作或启用远程操作以纠正错误
human-in-the-loop correction data for adjusting robot actions or enabling teleoperation to correct errors, col-lected using a foot pedal
数据最初以60Hz记录,然后降采样到20Hz以匹配机器人的控制速度,纠错数据直接以20Hz收集
最后,对于机器人的控制而言,采用Position control,以分层结构的方式进行:
- 在高层次上,学习策略生成下一步的目标位置,该位置包括机器人双臂末端执行器的6自由度姿态和双手16维手指关节位置
- 在低层次上,操作空间控制器(OSC)[A unified approach for motion and force control of robot manipulators: The operational space formulation]连续地插值将机械臂轨迹移动到高层次指定的目标位置,并将插值的OSC动作传递给机器人执行
第二部分 DexCap的源码剖析
// 待更
相关文章:
DexCap——斯坦福李飞飞团队泡茶机器人:更好数据收集系统的原理解析、源码剖析
前言 2023年7月,我司组建大模型项目开发团队,从最开始的论文审稿,演变成目前的两大赋能方向 大模型应用方面,以微调和RAG为代表 除了论文审稿微调之外,目前我司内部正在逐一开发论文翻译、论文对话、论文idea提炼、论…...
【Mtk Camera开发学习】01 MTK 平台Camera BringUp
本专栏内容针对 “知识星球”成员免费,欢迎关注公众号:小驰行动派,加入知识星球。 #MTK Camera开发学习系列 #小驰私房菜 这篇文章主要介绍MTK 平台,Camera BringUp会涉及到修改的模块。 MTK不同的平台系列,具体修改…...
新能源汽车内卷真相
导语:2025年,我国新能源汽车总产能预计可达3661万辆,如此产能如何消化? 文 | 胡安 “这样卷下去不是办法,企业目的是什么?是盈利,为国家作贡献,为社会作贡献。我们应该有大格局&…...
C 语言实现在终端里输出二维码
Mac 环境安装二维码库 brew install qrencode安装过程报权限问题执行以下命令 sudo chown -R 用户名 /usr/local/include /usr/local/lib chmod uw /usr/local/include /usr/local/lib#include <stdio.h> #include <qrencode.h>void print_qr_code(QRcode *qrcode…...
nodejs---fs模块,文件读写操作详解,自定义一个文件写入方法
fs模块导入 Node.js 同时支持 CommonJS 和 ES 模块系统(自 Node.js v12 以来) // 两种模块导入方式 import * as fs from fs;// Es6:这种方式需要在package.json中配置"type": "module" const fs require(fs);// commonJs:如果你…...
Linux(Rocky)下 如何输入中文(切换中文输入法)教程
RockyLinux如何输入中文(切换中文输入法) 注意 在字符画界面的Linux系统中 默认不具备中文输入法的功能 需要SSH或其他远程工具来实现 问题 可能大家有的时候安装了一个虚拟机之后 想切换中文输入法 但是一直找不到方法 下面将利用Rocky9.2作为演示…...
Python中包(package)与模块(module)的概念 以及 import 问题
目录 Python中 包(package) 与 模块(module) 的概念一. Python中, 包 (package) 与 模块 (module) 的概念1. 一个有 __init__.py 文件 的目录, 被视为一个 Python 的 包 (package)2. 一个Python源文件 , 被视为一个模块 (module) 二. 不同包之间 以及 同一个包的不同模块之间的…...
Android常见内存泄漏场景总结
一、非静态内部类造成的内存泄漏 造成原因:非静态内部类默认会持有外部类的引用,如果内部类的生命周期超过了外部类就会造成内存泄漏。 场景:当Activity销毁后,由于内部类中存在异步耗时任务还在执行,导致Activity实…...
未来已来:Angular、React、Vue.js——前端框架的三大巨头
目录 前言 一、Angular框架 特点和优势 核心技术和应用场景 二、React框架 特点和优势 核心技术和应用场景 三、Vue.js框架 特点和优势 核心技术和应用场景 总结: 前言 在Web前端开发领域,随着技术的不断发展,出现了众多优秀的框…...
Mybatis06-动态SQL
动态SQL 1.什么是动态SQL 什么是动态SQL:动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句. 类似JSTL标签 官网描述: MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接…...
26-LINUX--I/O复用-select
一.I/O复用概述 /O复用使得多个程序能够同时监听多个文件描述符,对提高程序的性能有很大帮助。以下情况适用于I/O复用技术: ◼ TCP 服务器同时要处理监听套接字和连接套接字。 ◼ 服务器要同时处理 TCP 请求和 UDP 请求。 ◼ 程序要同时处理多个套接…...
spring源码解析-(2)Bean的包扫描
包扫描的过程 测试代码: // 扫描指定包下的所有类 BeanDefinitionRegistry registry new SimpleBeanDefinitionRegistry(); // 扫描指定包下的所有类 ClassPathBeanDefinitionScanner scanner new ClassPathBeanDefinitionScanner(registry); scanner.scan(&quo…...
Java 数学计算 - Random类
在Java中,Random类用于生成伪随机数。这个类在java.util包中,你可以使用它来生成整数、浮点数等不同类型的随机数。以下是关于Random类的一些学习笔记和示例。 1. 创建Random对象 首先,你需要创建一个Random对象。默认情况下,如…...
Ubuntu22.04之解决:无法关机和重启问题(二百四十三)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...
大学数字媒体艺术设计网页设计试题及答案,分享几个实用搜题和学习工具 #媒体#职场发展
现在读书可不像小时候,以前想要校对试题答案,都得找到对应的纸质版答案查看,而且有的还只有答案,没有解析,无法弄清楚答案的由来。但是现在不一样了,现在我们可以通过搜题软件,寻找试题的答案&a…...
【ArcGIS微课1000例】0119:TIFF与grid格式互相转换
文章目录 一、任务描述二、tiff转grid三、grid转tif四、注意事项一、任务描述 地理栅格数据常用TIFF格式和GRID格式进行存储。TIFF格式的栅格数据常以单文件形式存储,不仅存储有R、G、B三波段的像素值,还保存有地理坐标信息。GRID格式的栅格数据常以多文件的形式进行存储,且…...
B3870 [GESP202309 四级] 变长编码
[GESP202309 四级] 变长编码 题目描述 小明刚刚学习了三种整数编码方式:原码、反码、补码,并了解到计算机存储整数通常使用补码。但他总是觉得,生活中很少用到 2 31 − 1 2^{31}-1 231−1 这么大的数,生活中常用的 0 ∼ 100 0…...
WordPress网站更换域名后如何重新激活elementor
在创建WordPress网站时,我们常常需要更改域名。但是,在更换域名后,你可能会遇到一个问题:WordPress后台中的Elementor插件授权状态会显示为不匹配。这时,就需要重新激活Elementor插件的授权。下面我会详细说明如何操作…...
linux cron 执行url
linux cron 执行url 在Linux中,你可以使用curl或wget来执行URL。如果你想要定期执行这个操作,可以使用cron来设置定时任务。 以下是一个使用curl在cron中执行URL的例子: 打开终端。 输入 crontab -e 命令来编辑你的cron作业。 添加一个新…...
压缩视频在线压缩网站,压缩视频在线压缩工具软件
在数字化时代,视频成为了人们记录和分享生活的重要载体。然而,视频文件一般都非常大,这不仅占据了大量的存储空间,也给视频的传输和分享带来了不便。因此,压缩视频成为了许多人必须掌握的技能。本文将详细介绍如何压缩…...
linux经典例题编程
编写Shell脚本,计算1~100的和 首先vi 1.sh,创建一个名为1.sh的脚本,然后赋予这个脚本权限,使用命令chmod 755 1.sh,然后就可以在脚本中写程序,然后运行。 shell脚本内容 运行结果: 编写Shell脚本…...
二叉树的实现(初阶数据结构)
1.二叉树的概念及结构 1.1 概念 一棵二叉树是结点的一个有限集合,该集合: 1.或者为空 2.由一个根结点加上两棵别称为左子树和右子树的二叉树组成 从上图可以看出: 1.二叉树不存在度大于2的结点 2.二叉树的子树有左右之分,次序不能…...
C++笔试强训day41
目录 1.棋子翻转 2.宵暗的妖怪 3.过桥 1.棋子翻转 链接https://www.nowcoder.com/practice/a8c89dc768c84ec29cbf9ca065e3f6b4?tpId128&tqId33769&ru/exam/oj (简单题)对题意进行简单模拟即可: class Solution { public:int dx[…...
【JavaScript】内置对象 - 字符串对象 ⑤ ( 判断对象中是否有某个属性 | 统计字符串中每个字符出现的次数 )
文章目录 一、判断对象中是否有某个属性1、获取对象属性2、判定对象是否有某个属性 二、统计字符串中每个字符出现的次数1、算法分析2、代码示例 String 字符串对象参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String 一、判…...
Linux环境下测试服务器的DDR5内存性能
要在Linux环境下测试服务器的DDR5内存性能,可以采用以下几种方法和工具: ### 测试原理 内存性能测试主要关注以下几个关键指标: - **带宽**:内存每秒能传输的数据量。 - **延迟**:内存访问请求从发出到完成所需的时间…...
19、matlab信号预处理中的中值滤波(medfilt1()函数)和萨维茨基-戈雷滤波滤(sgolayfilt()函数)
1、中值滤波:medfilt1()函数 说明:一维中值滤波 1)语法 语法1:y medfilt1(x) 将输入向量x应用3阶一维中值滤波器。 语法2:y medfilt1(x,n) 将一个n阶一维中值滤波器应用于x。 语法3:y medfilt1(x,n…...
Scala 练习一 将Mysql表数据导入HBase
Scala 练习一 将Mysql表数据导入HBase 续第一篇:Java代码将Mysql表数据导入HBase表 源码仓库地址:https://gitee.com/leaf-domain/data-to-hbase 一、整体介绍二、依赖三、测试结果四、源码 一、整体介绍 HBase特质 连接HBase, 创建HBase执行对象 初始化…...
前端工程化:基于Vue.js 3.0的设计与实践
这里写目录标题 《前端工程化:基于Vue.js 3.0的设计与实践》书籍引言本书概述主要内容作者简介为什么选择这本书?结语 《前端工程化:基于Vue.js 3.0的设计与实践》书籍 够买连接—>https://item.jd.com/13952512.html 引言 在前端技术日…...
Linux☞进程控制
在终端执行命令时,Linux会建立进程,程序执行完,进程会被终止;Linux是一个多任务的OS,允许多个进程并发运行; Linxu中启动进程的两种途径: ①手动启动(前台进程(命令gedit)...后台进程(命令‘&’)) ②…...
mybatis离谱bug乱转类型
字符串传入的参数被转成了int: Param("online") String online<if test"online 0">and (heart_time is null or heart_time <![CDATA[ < ]]> UNIX_TIMESTAMP(SUBDATE(now(),INTERVAL 8 MINUTE)) )</if><if test"…...
珠海seo海网站建设/键词优化排名
操作系统:centos6.4X86_64数据库:oracle12cR1需要的安装包:rlwrap-0.37.tar.gz(网上可下载)readline-6.0-4.el6.x86_64.rpm(镜像包)readline-devel-6.0-4.el6.x86_64.rpm(镜像包&…...
动态网站开发案例教程/站群优化公司
出现问题的code!!! 1 private void saveImage(String uri, String savePath) throws IOException {2 3 // 创建连接4 HttpURLConnection conn createConnection(uri);5 6 // 拿到输入流,此流即是图片资源本身7 InputStream imputStream conn.getInputStream(…...
asp网站制作实例教程/如何做品牌宣传与推广
数据库之存储过程和存储函数(六) 什么是存储过程 存储过程是一组为了完成某项特定功能的SQL语句集,其实质就是一段存储在数据库中的代码。它可以由声明式的sql语句和过程式sql语句组成。 优点 1. 可以增强sql语言的功能和灵活性 2. 良好的封装性3. 高性能4. 减少…...
网站建设 数据库/谷歌搜索引擎入口2022
项目组成员在针对要开发的系统做需求调研后,就要编写对应的需求说明书。 作为软件工程师,你就得知道需求分析说明书和需求规格说明书的区别,以期在正确的时候编写正确的需求文档。 两者有何不同: (1)面向…...
网站做推广页需要什么软件下载/互联网全网推广
spring的两大特性- ioc aop,实现原理: 如果存在A依赖B,B依赖A,那么是怎么加到IOC中去的 beanFactory的理解,怎么加载bean FactoryBean的理解 基于注解的形式,是怎么实现的, 你知道其原理吗,…...
福建省建设工程注册管理中心网站/网站推广排名教程
1.在C程序中调用被C编译器编译后的函数,为什么要加extern "C"? 答案:C语言支持函数重载,C语言不支持函数重载。 函数被C编译后在库中的名字与C语言的不同。 假设某个函数的原型为void foo(int x, int y)。 该函数被C编译…...