当前位置: 首页 > news >正文

无线感知会议系列【16】QGesture-1

摘要:

    这是2018年发表的一篇 paper 《 Quantifying Gesture Distance and Direction with WiFi  Signals》

   下一篇重要分享 Decimeter-level localization with a single WiFi access point,主要创新点是如何对CFO SFO PBD 噪声进行去噪。

     许多人机交互(HCI)应用,如游戏系统中的音量调节,需要对运动距离和方向等度量指标进行定量手势测量。在本文中,我们提出了QGesture,一个手势识别系统,它利用商用现成(COTS)WiFi设备提供的信道状态信息(CSI)值来测量人手的运动距离和方向。为了实现高精度测量,我们首先使用相位校正算法来消除CSI测量中的相位噪声。然后,我们提出了一种稳健的估计算法,称为LEVD,用于估计并消除环境动态的影响。为了将手势动作与日常活动区分开来,我们设计了具有独特特征的简单手势作为前导,以确定手势的开始。

      我们的实验结果表明,QGesture在测量运动距离方面达到了3厘米的平均精度,在一维情况下,运动方向检测的准确率超过95%。此外,在二维情况下,其运动方向测量的平均绝对误差为15度,运动距离测量的平均精度为3.7厘米。

        这个方向还有类似的论文例如:WiDir: Walking Direction Estimation Using Wireless Signals


目录:

  1.    简介
  2.    相关工作
  3.    系统模型
  4.    方案设计
  5.     实验以及验证
  6.     限制
  7.     结论 和 讨论

 一 简介

         最近,已经提出了许多有趣的基于WiFi的手势识别方案。当人体移动时,会反射WiFi信号并在接收到的信号中引入失真。不同的手势会在WiFi信号中产生不同类型的失真。因此,通过分析WiFi信号的变化,我们可以识别出相应的手势。与传统的使用摄像头[4]或可穿戴传感器[10, 28, 36]的方法相比,基于WiFi的手势识别具有许多优势。例如,基于WiFi的手势识别既不需要照明也不需要携带任何设备。此外,由于WiFi信号可以穿透墙壁,因此它提供了更好的覆盖范围。

         基于WiFi的手势识别最重要的应用之一是与智能家居设备进行交互。现有的家用电器使用物理界面(如旋钮和杠杆)来提供定量输入,包括调节电视音量和灯光亮度。这些物理输入使用户能够根据即时反馈微调输入值。然而,使用亚马逊Echo或谷歌Home等流行的语音交互方式很难模拟这些物理输入。但是,基于WiFi的手势控制可以实现这种精细的定量控制。例如,用户可以将手向前推以增加电视机的音量,音量增加的大小与推手的距离成正比。为了实现这一点,我们不仅需要识别不同的预定义手势,还需要以几厘米的粒度量化手势的移动距离这样系统就可以根据用户推手的距离来调整音量,并在推送过程中提供当前音量设置的音频反馈。通过这种方式,用户可以使用单个动作将音量定量调整到所需的值,而无需重复手势来每次小幅增加或减少音量。

      使用来自商用硬件的射频(RF)信号来测量手势移动的距离和方向是一项艰巨的任务。先前使用商用设备WiFi测量的系统通常要求全身运动,如行走,来追踪运动速度和方向。由于商用WiFi设备的粗略测量,现有方案无法以精细粒度追踪手部/手指运动,这些运动相比全身运动会引入较弱的WiFi信号失真。它们只能通过将手部/手指运动与预定义的手势模式进行匹配来识别这些运动[1,。谷歌最近的Soli系统使用了基于60 GHz雷达技术的定制ASIC芯片,可以量化微手势,从而使这些手势能够作为小型可穿戴设备(如智能手表)的人类输入,这些设备的触摸屏太小,不便于人类进行输入。然而,由于60 GHz信号在空气中快速衰减,60 GHz系统要求手势在几十厘米范围内进行。有限的操作范围使其不适合作为家用电器的远程控制界面。

      在本文中,我们提出了QGesture系统,一个量化手势距离和方向的系统,它使用商用现货(COTS)WiFi设备来测量人手运动的距离和方向。图1展示了QGesture的基本系统结构。当用户向目标设备推动时,设备会收集信道状态信息(CSI),该信息会因手部运动反射的WiFi信号而受到扰动。手部反射的信号在CSI值中表现为一个动态向量分量,这会导致复数CSI测量值发生旋转。通过计算复数CSI测量值的相位变化可以计算出运动的距离,而运动的方向则可以通过旋转的方向来确定。因此,用户可以通过向前推动来增加音量,通过拉远来减小音量,而增加/减小的幅度由运动距离决定。由于WiFi信号的扰动可以在远距离被捕获,QGesture可以在最远2米的距离上工作。QGesture是实现家用电器定量远程控制的第一步。它展示了使用商用现货WiFi设备在几米范围内对手部运动的距离/方向进行精细测量的可行性。请注意,目前只有有限型号的无线网卡模块能够提供CSI测量[12],且智能手机上无法获取CSI。我们设想,未来会有更多的商用WiFi设备开放其CSI信息,以便我们的方法能够尽快部署在智能手机上。

设计QGesture时,有四个关键挑战需要解决。

  1  重建CSI测量的相位:

      CSI测量的相位对于确定运动方向至关重要。然而,由于商用现货(COTS)WiFi网络接口卡(NICs)的硬件不完善,发射器和接收器之间存在载波频率偏移(CFO)和采样频率偏移(SFO)。CFO和SFO都会导致CSI相位的高变化,并且这些变化对温度和硬件条件敏感。因此,在不干扰由手部运动引起的小相位变化的情况下,预测和消除此类相位变化是困难的。为了应对这一挑战,我们仔细分析了不同天线对中的相位偏移,并设计了相位校正算法,以便保留手部运动引起的相位变化。因此,我们可以以超过95%的准确率确定运动方向。

2  从由身体其他部位运动引起的变化混合中分离出手部运动引起的信道状态变化:

      这对于手势识别系统在远距离(即几米)上运行尤为重要,因为此类系统同时捕获手势运动和环境动态。当用户执行手势时,他们的躯干和手臂也会同时移动,这会对无线信道的测量产生显著干扰。为了应对这一挑战,我们分析了CSI信号,并发现了由手势产生的典型信号频率,这些频率不同于由身体其他部位运动产生的频率。然后,我们设计了一个稳健的估计算法,称为LEVD,以消除环境动态的影响 

3  从日常活动中分离出手势动作:

    日常活动,如行走和坐下,也会扭曲无线信道状态信息。为了确保QGesture仅对由特定手势引起的信道扭曲做出响应,我们设计了具有独特特征的简单手势作为前导,以确定手势的开始。我们的实验结果表明,QGesture可以高效地识别前导,准确率为92.5%,且误报率(FPR)较低,为3.2%。 

4  适应任意推送角度:

        CSI测量的相位变化由路径长度的变化决定,而路径长度的变化取决于运动角度以及手相对于发送器和接收器的位置。当手沿着连接发送器和接收器的直线移动时,路径长度变化为运动距离的两倍。然而,当运动发生在其他方向时,对于相同的运动距离,我们可能会得到更小的路径长度变化。为了允许沿任意角度推送,我们需要对手进行二维跟踪。为了应对这一挑战,我们建议使用多个接收器同时跟踪不同路径的路径长度变化。通过这样做,我们可以对手的位置进行三角测量,并测量推送角度和运动距离。我们的实验结果表明,我们可以以15度的精度测量运动角度,以3.7厘米的精度测量运动距离。

 我们使用商用现货(COTS)WiFi路由器和笔记本电脑实现了QGesture。我们的实验结果表明,在正常室内环境中,QGesture可以在1米距离内以3厘米的精度测量手势运动距离。在一维情况下,QGesture还可以可靠地检测手部运动方向,准确率超过95%。此外,在二维情况下,它实现了平均绝对方向误差为15度,运动距离测量的平均精度为3.7厘米


二  相关工作

       我们将现有的相关手势系统分为两组:基于射频(RF)的识别/跟踪和非基于射频的识别/跟踪。考虑到射频信号的收集方式,我们进一步将基于射频的系统分为两类:使用商用现货(COTS)硬件的基于射频的识别/跟踪和使用专用设备的基于射频的识别/跟踪。

        2.1  使用商用现货硬件的基于射频的识别/跟踪:

         大多数基于商用现货硬件的识别和跟踪系统使用从WiFi网络接口卡(NIC)获得的接收信号强度指示(RSSI)或信道状态信息(CSI)来捕获手势信号。WiKey方案建议使用CSI动态来识别微小的人类活动,如按键操作。WiFinger方案使用CSI来识别一组八个手势,准确率为93%[26]。WiGest方案使用三个无线链路来识别一组特殊的手势,其中用户的手阻挡了信号,从而引起了RSSI的显著变化,并实现了96%的识别准确率[1]。然而,这些系统大多只能识别一组预定义的手势,而没有考虑运动距离/方向的测量。WiDir使用WiFi CSI来估计全身运动的方向,如行走,误差为10。对于小范围的手部运动,WiDraw使用到达角(AOA)测量来实现5厘米的跟踪精度[25]。然而,基于AOA的方法的工作范围也有限,少于2英尺,因此不能在人机交互(HCI)应用中用作遥控器。QGesture受到之前WiFi CSI处理技术的启发,包括噪声去除算法、基本相位校正算法和前导手势设计。QGesture通过捕获远距离手部运动引起的小相位变化,推进了最先进的设计。除了基于WiFi的方案外,现有方案还使用商用现货RFID阅读器和标签来跟踪手势[9, 28]。然而,这些系统要求用户佩戴RFID或靠近RFID阵列操作,这使得它们使用起来不太方便。

2.2  使用专用设备的基于射频的识别/跟踪:

          射频信号也可以通过专用设备(如软件无线电系统)捕获。软件无线电系统,如USRP或WARP,可以访问细粒度的基带信号,从而能够提供量化手/手指运动距离和速度的能力[2, 3, 14, 31, 35]。WiSee使用USRP软件无线电来识别和分类九个全身手势,准确率为94%[24]。WiTrack使用特别设计的调频连续波(FMCW)雷达,带宽高达1.79 GHz,以约11厘米至20厘米的分辨率跟踪墙壁后的人体运动[2, 3]。WiDeo使用WARP硬件实现了对多个物体的7厘米跟踪精度[14]。AllSee使用特别设计的模拟电路来提取接收信号的包络,并在2.5英尺的短距离内识别手势[15]。虽然这些系统为无线信号的动态提供了有价值的见解,但使用粗粒度的CSI测量进行跟踪需要一组不同的信号处理算法。

2.3   非基于射频的识别/跟踪:

         手势识别也可以通过非基于射频的技术实现,包括计算机视觉、可穿戴设备和声波。基于计算机视觉的手势识别使用摄像头和红外传感器从视频中重建深度信息。当目标在一米以内时,基于计算机视觉的解决方案的距离测量精度可以达到几毫米[32],但在5米的操作范围内,深度精度会下降到几厘米[16]。基于计算机视觉的解决方案的主要限制是,其准确性高度依赖于视角和光照条件。此外,用户还可能对基于摄像头的解决方案有隐私方面的担忧。声波可以用来测量移动距离[23, 38, 39]或移动速度[11]。当用户手持设备时,基于声波的解决方案可以提供几厘米的距离测量精度[23, 38]。由于手反射的声波能量较弱,无设备的手势识别解决方案大多使用多普勒效应,但这只能提供低分辨率的速度测量,不能用于远距离的精细控制[11]。最近的精细跟踪解决方案仅适用于50厘米的短距离[21, 30]。QGesture使用了与LLAP[30]相似的基于相位的距离测量算法。然而,我们的远距离WiFi手势跟踪系统需要处理来自附近运动的相位噪声和干扰,这在短距离声波系统中可以忽略不计。


三  系统模型

      在本节中,我们首先介绍了一个量化手势移动距离和方向的理论模型。接着,我们讨论了来自商用现成(COTS)设备的信道状态信息(CSI)测量值偏离理论模型的各种噪声源。最后,我们提出了去除CSI测量中的载波频率偏移(CFO)和采样频率偏移(SFO)的方法,以便我们能够使用理论模型来测量移动距离和方向。 

 3.1 Modeling Phase-Distance Relationship

    

      信道状态信息(CSI)的幅度和相位变化与手势移动的距离和方向密切相关。为了简化问题,我们首先考虑信号仅通过一对发射器/接收器之间的两条路径传播的情况,即视距(LOS)路径(路径A)和手反射路径(路径B),如图2所示。理论上,在时间t测得的CSI中的信道频率响应(CFR)H(f; t)可以表示为:

 

其中:

      j是虚数单位,满足j² = -1

     f是WiFi信号的频率,

     aA(f; t)和aB(f; t)分别代表路径A和B的幅度衰减和初始相位。

    \tau_A=\frac{l_A}{c}:  由于路径A和B的长度不同,它们的传播延迟τA(t)和τB(t)也不同

    l_A,l_B: 是路径A的长度,c是光速。

 

信道频率响应(CFR)H(f; t)包含两个分量:

   一个是路径A的静态分量,另一个是路径B的动态分量,

  如图3所示。此外,由于不同的传播延迟和载波频率,不同天线对和不同子载波的静态分量的幅度也不同,这在我们的第5.5节中有所展示。

    请注意,CFR H(f; t)是一个复数,其实部和虚部分别被称为同相(I)分量和正交(Q)分量。因此,当我们在复平面上绘制CFR时,每个时间点的CFR值将是一个向量,并且随着时间的推移,向量的末端将绘制出I/Q轨迹。

    如果手朝发射器/接收器方向移动,则单个子载波的I/Q轨迹是一个弧线,如图3所示。这是因为当手移动时,路径A的向量不变。路径B向量会发生显著变化,当l_b(t)减小时,衰减a_b(f,t)仅缓慢变化,而相位显著增加。

对于5GHz的WiFi信号,无线电波长等于6厘米。因此,当l_B(t)减小一个无线电波长(6厘米)时,与路径B相对应的向量的相位 将增加2π。通过测量动态分量的相位变化,我们可以得到移动距离d为:

其中,a 是路径长度变化与移动距离之间的比例系数。例如,在图2所示的场景中,我们有 a = 2。因此,我们可以以几厘米的精度测量移动距离。此外,通过观察 Δφ 的符号,我们可以确定移动方向。

3.2 Practical Issues 

   

在将上述理论模型应用于实际的信道状态信息(CSI)测量之前,我们需要考虑三个实际问题。

   发射机与接收机之间的静态多径:在室内环境中,无线信号会被墙壁、家具或门等周围物体反射。如果反射体是静止的,例如图2中的路径A和C,我们可以将这些静态路径的组合视为一个单一的静态分量。考虑这样一个情况,总共有n条路径,其中第n条是动态路径,其余路径均为静态路径。因此,方程(1)可以重写为:

  

在方程(3)中,由于静态分量的信号强度a_i(f,t)和路径长度l_i(f,t)是恒定的,所以所有静态多径都可以视为一条单一路径,其对应的I/Q向量是所有静态路径向量的总和。

通过移动反射体的动态多径

       由移动反射体反射的信号也可能通过多条路径传播,如图2中的路径B和D所示。在这种情况下,当反射体移动时,所有这些路径的路径长度都会随时间变化。这些随时间变化的路径将在接收信号强度中产生多个随时间变化的分量。然而,在实际应用中,这些分量对测量精度的影响并不显著,因为接收到的反射信号强度主要由直接反射路径决定,例如图2中的路径B。人手面积较小,由手反射的信号弱于通过静态多径传播的信号。因此,如果信号被反射多次,例如像路径D那样先被手反射再被墙反射,信号强度将进一步衰减。与直接反射路径相比,这些多径分量的强度较小,因此我们可以忽略它们。我们的实验将表明,当存在强烈的动态多径时(例如靠近墙壁推动时),QGesture的测量误差仅略有增加。

    CSI测量中的噪声

             商用CSI测量包含多种类型的噪声。由于载波频率偏移(CFO)和采样频率偏移(SFO)的存在,CSI测量的相位尤其嘈杂。手部的移动仅使CSI的相位发生微小变化,例如图3中的Δ\theta。因此,在没有准确相位信息的情况下,我们只能像[29]中那样使用CSI的幅度来获得粗略的距离测量,但这样会丢失运动方向的信息。此外,由于测量误差,CSI测量的幅度也存在噪声。因此,在应用我们的理论模型之前,我们需要先去除CSI测量中的相位和幅度噪声。

 3.3 CSI Noise Sources

     

在信道状态信息(CSI)测量中存在三种噪声类型。前两种是相位噪声,最后一种是幅度噪声。

载波频率偏移(CFO):

       由于发射机和接收机中载波存在微小的频率差异,接收到的CSI H^{'}(f,t)包含了一个额外的相位偏移,表示为H^{'}(f,t)= e^{-j2\pi \delta ft}H(f,t),其中 \delta f是发送端和接收端之间的CFO[

27,  Decimeter-level localization with a single WiFi access point.

29  Understanding and Modeling of WiFi Signal Based Human Activity Recognition.

34  Precise Power Delay Profiling with Commodity WiFi. ]。

由于IEEE 802.11n标准允许发射机和接收机之间的CFO高达100 kHz,因此CFO会在CSI测量中引入较大的相位不确定性。例如,当以每秒4,000帧的速率测量CSI时,两个连续帧之间的相位变化(这两个帧被仅仅0.25毫秒的短时间间隔t分隔)可能由CFO引起高达50π的相位变化。因此,由CFO引起的相位变化远大于由运动引起的相位变化,在手部运动期间,相位变化小于1弧度,如图3所示。即使连续帧之间的时间间隔测量存在微小误差,也会导致较大的相位偏移,从而使CSI的相位呈现随机性。

  1s 4000帧,每帧的频率偏移是100KHz,则每帧的相位偏移为:

   \Delta \phi = -2\pi \bigtriangleup f t= -2\pi 100kHz \frac{1s}{4000}=50\pi(0.25ms CFO 导致的相位)

正常成年人的步速一般为1.5米每秒,0.25ms 运动距离为

l =v*t = 1.5m/s*0.25*10^{-3}s\approx 3.75*10^{-3}cm

对应的相位差 \Delta \phi = \frac{2\pi l}{\lambda}= \frac{2\pi 3.75*10^{-3}}{6}=1.25*10^{-3}\pi  感知对象的相位变化远远小于CFO 噪声,所以为什么一定要先去除CFO 相位噪声, 采用较高的采样频率可以降低CFO

因为t 减少了

《Understanding and Modeling of WiFi Signal BasedHuman Activity Recognition 》论文里面也有对CFO的详细描述以及计算过

   

 样频率偏移(SFO)和分组边界检测(PBD)误差:

      

      这两个误差源具有相似的影响,它们会在信道状态信息(CSI)上再添加一个相位偏移,表示为H^{"}(f,t)=e^{-j2\pi k \varphi }H^{'}(f,t),其中k是正交频分复用(OFDM)子载波的索引,ϕ是相位偏移[34]。与随时间累积的CFO引起的相位偏移不同,SFO和PBD的相位偏移与不同的OFDM子载波之间呈线性关系。此外,在不同的帧上,SFO/PBD偏移的相位偏移量(即ϕ的斜率)是不同的。

  幅度变化:

     由于传输功率的变化和环境噪声的影响,信道状态信息(CSI)测量的幅度也存在较大变化。这些幅度变化通常包含高能量的脉冲,这些脉冲可能会掩盖由手部运动引起的小幅度变化[29]。

3.4 Denoising CSI Measurements

我们通过两个步骤对信道状态信息(CSI)测量进行去噪:

1  相位校正:

     如第3.3节所述,在CSI测量中存在载波频率偏移(CFO)、采样频率偏移(SFO)和相位偏差失真(PBD)相位偏移。幸运的是,对于发射器/接收器的每一对天线,我们同时在30个正交频分复用(OFDM)子载波上测量CSI值。对于一个具有2根天线的发射器和一个具有3根天线的接收器,我们每个WiFi帧可以获得2×3×30=180个CSI值。我们可以利用CSI测量中的冗余来进行相位校正。

    1.1 (CFO)offset Correction

    为了估计CFO的值,我们首先观察到,CSI测量的相位主要由三个因素决定:CFO、采样频率偏移(SFO)/相位偏差失真(PBD)以及手部运动。如文献[27 Decimeter-level localization with a single WiFi access point.]所示,在索引为k=0的子载波上,SFO和PBD的相位偏移为零

      因此,每个天线对的0号子载波的相位仅包含CFO的相位和手部运动的影响

    然而,去除随机选择的天线对的相位可能会扭曲由手部运动引起的小相位变化。

  为了保留手部运动的影响,我们观察到,如第5.5节所示,手部运动对不同子载波产生的相位变化是不同的。

考虑图3中的两个子载波。尽管这两个子载波的动态分量幅度相似,但2号子载波的相位变化θ2要小得多,因为2号子载波的静态分量幅度远大于1号子载波。(sin\theta= \frac{r}{l},r相同)      在实际的CSI测量中,我们观察到有些子载波的静态分量幅度比动态分量高十倍以上,如第5.5节所示。在这种情况下,这些子载波中由手部运动引起的相位变化(例如,2号子载波的\theta_2)小于0.1弧度,这是在其他子载波中可以忽略的偏移(例如,1号子载波的\theta_1)。

  因此,我们可以选择一个天线对的0号子载波的CSI相位,该相位具有最大的静态分量幅度,作为CFO的参考。基于这些观察,我们按以下方式去除CFO偏移。

  •     1   我们首先通过对每个天线对的CSI幅度进行长期平均来估计静态分量的幅度。
  •       比如 subcarrier-2 和 subcarrier2 
  •     2   然后,我们选择具有最大CSI幅度的天线对作为参考。
  •     3     由于CSI不是在0号子载波上测量的,我们通过对-1号子载波和1号子载波的相位进行插值,得到所选天线对的0号子载波的CSI相位,这作为CFO的参考。(这个子载波对是1,2计算得到的幅度最大的子载波对)
  •     4   我们从其他天线对所有子载波的相位中减去计算出的CFO

1.2  SFO/PBD offset Correction

  • 我们基于标准算法[17 Decimeter Level Localization using WiFi]对剩余子载波的采样频率偏移(SFO)/相位偏差失真(PBD)偏移-2πkϕ进行校正。注意,每个WiFi帧的斜率ϕ都是不同的。因此,我们对每个天线对的30个子载波进行线性回归,以估计斜率ϕ。然后,我们使用估计的ϕ去除每个子载波的SFO/PBD。图4显示了相位校正前后一个天线对的信道状态信息(CSI)相位。我们观察到,如图4(a)所示,在短短1毫秒内,原始CSI相位会发生显著变化。相同子载波的相位可能相差π,且不同时间点的斜率ϕ也不同。图4(b)中的校正相位随时间变化更为一致。此外,我们还可以观察到相位校正后不同子载波上的小相位变化。

 2 幅度校正:

      相位校正后,我们通过过采样来降低幅度噪声。我们以每秒2500个样本的高采样率测量CSI值。请注意,正常的人体运动会引入频率在1至100赫兹范围内的CSI幅度变化[29 Understanding and Modeling of WiFi Signal BasedHuman Activity Recognition.]。因此,我们可以使用窗口大小为80个样本的低通滑动平均滤波器来平滑CSI幅度以及剩余的相位噪声。经过相位校正和幅度校正后,高噪声子载波的CSI值仍可能受到破坏。

        因此,我们使用子载波选择[20 Tracking Vital Signs During Sleep Leveraging Off-the-shelf WiFi.]和线性回归来减少误差。


 四  方案设计

     在去除信道状态信息(CSI)测量中的噪声后,QGesture首先使用LEVD算法来去除复平面中的静态分量。然后,我们根据第3.1节中介绍的相位-距离关系来测量手部移动的距离和方向。

    

4.1 现实环境中的信道状态信息(CSI)测量

       图5绘制了由Intel 5300网卡捕获的CSI值。在去噪后,商用现成设备的同相/正交(I/Q)波形与我们的理论模型相当吻合。当用户将手拉回40厘米时,我们观察到波形中大约有16个峰值,这表明相位改变了32π(这里π用数学符号表示,但在文本中通常用“Pi”或“π”表示,为保持一致性,这里用“π”的文本形式表示)。

       使用5.825 GHz下5.15厘米的波长,我们得到路径长度变化为82.4厘米,这与我们的模型非常接近,因为在此情况下我们设定a=2。此外,我们还观察到相位在减小(如图5(b)所示,CSI值顺时针旋转),这表明用户正在将手拉回。

      我们进一步观察到,现实环境中的CSI值与理论模型在两个方面存在偏差。

     首先,静态分量并非恒定不变,图5(b)中圆的中心在缓慢变化。这主要是由于用户身体的其他部位(如手臂或躯干)的缓慢移动。

     其次,动态分量的幅度也发生变化。这是由于当手远离发射器/接收器时,反射信号的强度减弱。静态分量的缓慢变化和反射信号强度的变化使得测量动态分量的相位变得具有挑战性。例如,如果我们使用恒定的静态分量估计(例如,I分量等于2),则可能会忽略图5(a)中最后几个较小的峰值,从而低估运动距离。

4.2 去除静态分量

       QGesture采用局部极值检测算法(LEVD)来追踪缓慢变化的静态分量。LEVD算法首先初始化静态分量估计S(t),将其设为CSI实部或虚部的长期平均值,例如2秒内的平均值。由于我们的WiFi场景中的信道相干时间约为10毫秒,因此在2秒内取平均值足以平滑信道变化。

           该算法使用实验确定的经验阈值T(如第5.5节所示)来检测局部最大值和最小值。一旦CSI值与其平均值偏差超过T,算法就开始检测局部最大值和最小值。这些局部最大值和最小值必须满足以下两个属性:

    1) 局部最大值必须至少比当前的静态分量估计S(t)大T的值。同样,局部最小值必须小于S(t) - T。

    2) 局部最大值和最小值必须交替出现。如果存在两个连续的局部最大值/最小值,我们只保留较大/较小的一个。

      在检测局部极值时,我们通过将其设置为最后一对局部最大值和最小值的平均值来动态更新静态分量估计S(t)。这样,LEVD就能够追踪缓慢变化的静态分量。

图6(a)显示了LEVD检测到的局部极值,它们精确地指示了波形的周期。在去除估计的静态分量后,LEVD能够很好地估计图6(a)中CSI波形的动态分量。LEVD的结果优于简单去除CSI波形平均值的方法。图6(b)显示了对于80厘米变化路径长度的LEVD和简单平均去除算法的距离估计。使用等式(2),我们发现LEVD的推送距离估计为40.17厘米,而简单平均去除的距离估计为33.6厘米。我们观察到,简单平均去除算法低估了距离,因为它忽略了图5(a)中最后几个较小的峰值。

 

4.3 测量移动距离和方向

在去除静态分量后,我们采用两种不同的策略来融合不同子载波和天线对上的CSI值,以进行移动距离/方向的测量。

第一种测量方法称为主成分识别(PCI WiFinger: Leveraging Commodity WiFi for Fine-grained Finger Gesture Recognition)[26]。在这种方法中,我们选择对手部移动最敏感的子载波,即在移动过程中相位变化最大的子载波,并使用该子载波进行测量。

第二种测量方法是对不同子载波上的CSI值幅度进行主成分分析(PCA ),这与[29Understanding and Modeling of WiFi Signal Based
Human Activity Recognition]中的方法类似。

我们选择第二大的PCA成分,并使用希尔伯特变换从幅度中恢复相位信息,然后使用恢复的相位信息来计算移动距离。这两种算法各有优势。

PCI算法保留了CSI值的相位,因此我们可以使用这种方法来确定移动方向。当手靠近发送器/接收器时,它工作得很好。

而PCA算法在手距离发送器/接收器超过1.5米时效果更好。这是因为PCA算法利用多个子载波之间的相关性“放大”了手部移动引起的小变化。然而,由于PCA算法在处理之前去除了相位信息,我们无法直接使用它来检测移动方向,因为移动方向的检测取决于相位是增加还是减少。

4.4 二维手部追踪


          由运动引起的路径长度变化由运动的距离和方向共同决定。考虑图7(a)中的情况,其中反射器不与发射器/接收器在同一直线上,如图2所示。在这种情况下,当反射器向接收器移动距离d时,反射信号的路径长度变化为d + d cos θ,其中θ是反射路径两段之间的角度。因此,路径长度变化与运动距离的比率(在等式(2)中定义为α)会随着用户位置的变化而变化。

        我们使用多个接收器来允许任意方向的推动。如图7(b)所示,距离为d的运动将在从发送器到两个接收器A和B的两条路径上引起不同的路径长度变化。当发送器与两个接收器之间的距离已知时,我们可以通过以对应发送器和接收器为焦点的两个椭圆的交点来定位手部[30]。因此,我们可以确定手部的运动角度和距离 。

       这个问题通过Fresnel 模型很容易取解释,异质性问题

 

4.5 前导动作检测


       为了将手势与背景动作区分开来,QGesture定义了“前导”动作来标记手势的开始。要激活QGesture,用户必须执行前导动作。一旦QGesture检测到前导动作,它将开始测量随后的推动距离和方向,并根据测量结果对运动信息进行响应。

      我们使用了两种手势作为前导:如图8所示的拳击动作和快速双击拳(间隔小于0.5秒),这两种手势易于在短时间内(即少于3秒)完成。

     此外,拳击动作具有非常鲜明的特征,如图8所示。它们以大约10厘米的快速移动开始,其中包含3到6个CSI波形周期。然后,会有一个0.2到0.4秒的短暂停顿,接着是另一只手的向后移动,也包含3到6个CSI波形周期。因此,拳击手势可以高效地被检测到。请注意,我们还可以使用其他活动(包括声音或注视)作为前导,这将是我们的后续工作。

        QGesture使用LEVD的结果来检测拳击手势。每个检测到的极值点都被逻辑回归分类器分为两类:有效极值和无效极值。

    我们在逻辑回归中使用了三个特征:当前极值的绝对值、前一个极值的绝对值以及当前极值与前一个极值之间的时间间隔。

       回归模型是使用人工标注的拳击数据训练的,这些数据包含400个有效的拳击极值和400个由其他活动产生的无效极值。回归模型根据极值的幅度和相邻极值之间的间隔来计算检测到的极值点属于拳击动作的概率。通过这种方式,我们可以通过寻找两个具有连续5到12个有效极值的片段(由0.2到0.4秒的短暂停顿分隔)来检测拳击手势。使用这些简单的标准,QGesture可以高效地检测拳击或快速双击拳,准确率超过92%,误报率低于3%。

     前导手势有两个作用。

     首先,它们标记了手势的起点,以避免将其他动作误认为是手势。

     其次,它们表明了用户对后续动作的意图。

  例如,我们可以使用单个拳击前导来表示接下来的推动动作是改变电视的音量,而使用快速双击拳前导来表示改变灯光的亮度。请注意,我们还可以引入更多手势,如打响指、挥手等,作为前导来表示后续手势的不同含义。

相关文章:

无线感知会议系列【16】QGesture-1

摘要: 这是2018年发表的一篇 paper 《 Quantifying Gesture Distance and Direction with WiFi Signals》 下一篇重要分享 Decimeter-level localization with a single WiFi access point,主要创新点是如何对CFO SFO PBD 噪声进行去噪。 许多人机交互&…...

如何用通义灵码快速绘制流程图?

使用通义灵码快速绘制流程图?新功能体验 不想读前人“骨灰级”代码,不想当“牛马”程序员,想像看图片一样快速读复杂代码和架构? 通义灵码已经支持代码逻辑可视化,可以把你的每段代码画成流程图。像个脑图工具一样帮你…...

如何搭建一个小程序:从零开始的详细指南

在当今数字化时代,小程序以其轻便、无需下载安装即可使用的特点,成为了连接用户与服务的重要桥梁。无论是零售、餐饮、教育还是娱乐行业,小程序都展现了巨大的潜力。如果你正考虑搭建一个小程序,本文将为你提供一个从零开始的详细…...

wp the_posts_pagination 与分类页面搭配使用

<ul> <?php while( have_posts() ) : the_post(); <li > <a href"<?php the_permalink(); ?>"> <?php xizhitbu_get_thumbnail(thumb-pro); ?> </a> <p > <a href&q…...

文件包含漏洞

本质 本质和SQL注入相同&#xff0c;都是输入一段用户可以控制的脚本或代码&#xff0c;让服务器执行 包含就比如把函数写在一个文件里&#xff0c;调用函数时直接用文件 文件包含漏洞就是攻击者修改了文件的位置&#xff0c;让后台执行任意文件 函数 &#xff08;PHP&…...

docker快速安装zookeeper

一、拉取镜像 docker pull zookeeper:3.9.3 二、启动zookeeper docker run --restartalways -d --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime zookeeper:3.9.3 如果需要挂载zookeeper文件及目录&#xff0c;则参数增加&#xff1a; -v /mydata/zookeeper/d…...

如何解决 java.security.acl.NotOwnerException: 在 ACL 中尝试执行非所有者的操作问题?亲测有效的解决方法!

在 Java 中&#xff0c;java.security.acl.NotOwnerException 异常通常出现在访问控制列表&#xff08;ACL&#xff09;操作中。当你尝试在一个不属于拥有者的实体上执行特定的操作时&#xff0c;Java 安全管理器会抛出此异常。简单来说&#xff0c;它指的是你正在尝试执行一个…...

【电力行业标准】《电力信息化软件工程度量规范》(DL/T 2015-2019)-费用标准解读系列20

《电力信息化软件工程度量规范》&#xff08;DL/T 2015-2019&#xff09;是国家能源局2019年6月4日发布&#xff0c;2019年10月1日实施的电力行业标准&#xff08;了解更多可直接关注我们咨询&#xff09;&#xff0c;规定了电力行业信息化软件工程度量原则与内容、成本构成及各…...

python除了熟悉的pandas,openpyxl库也很方便的支持编辑Excel表

excel表格是大家经常用到的文件格式&#xff0c;各行各业都会跟它打交道。之前文章我们介绍了使用openpyxl和xlrd库读取excel表数据&#xff0c;使用xlwt库创建和编辑excel表&#xff0c;在办公自动化方面可以方便我们快速处理数据&#xff0c;帮助我们提升效率。 python之open…...

JavaEE---计算机是如何工作的?

1.了解冯诺依曼体系结构 2.CPU的核心概念,CPU的两个重要指标(核心数和频率) 3.CPU执行指令的流程(指令表,一条一条指令,取指令,解析指令,执行指令) 4.操作系统核心概念(管理硬件,给软件提供稳定的运行环境) 5.进程的概念(运行起来的程序和可执行文件的区别) 6.进程的管理(…...

数据结构(Java版)第五期:ArrayList与顺序表(下)

目录 一、用数组实现顺序表 一、用数组实现顺序表 我们提到过&#xff0c;顺序表是基于数组的封装&#xff0c;这次我们以int为例&#xff0c;用数组去实现一个顺序表。 public class MyArrayList {private int[] arr;public MyArrayList(int capacity){//指定初始容量arr n…...

Docker和Docker Compose部署方式的区别以及各自适用的场景(ChatGPT-4o回答)

prompt: 请详细介绍和解释一下docker和docker compose部署两者之间的区别和使用场景 Docker和Docker Compose是用于容器化应用程序的两个重要工具&#xff0c;它们在功能和使用场景上有一些关键区别。 Docker Docker是一个开源平台&#xff0c;用于开发、运输和运行应用程序。…...

JavaSE---异常

1.异常的体系结构 Thorwable是异常类顶层类&#xff0c;派生出了Error和Exception Error&#xff1a;指的是JVM层面无法解决的问题&#xff0c;如JVM内部错误&#xff0c;资源耗尽等..一旦发生很难解决。 Exception&#xff1a;异常发生后可以通过代码处理&#xff0c;使程序继…...

大模型的认知记录:一次与4o讨论道德经的对话 - “我无法触碰“真实的花草树木”(无名),但通过语言(有名),我可以靠近人类的认知方式。”

因为其它人都去放假了&#xff0c;我比较悠闲&#xff0c;于是想再强化下认知和正念方面的东西。对于世界的感知&#xff0c;只要不强迫训练&#xff0c;很容易被现实世界给侵蚀了。记得去年有幸悟到点什么&#xff0c;感受点什么&#xff0c;但慢慢那种感受变得虚无起来了&…...

std::srand(static_cast<unsigned int>(std::time(0)));每一部分都是啥意思

std::srand(static_cast<unsigned int>(std::time(0))); 这行代码在C中用于初始化随机数生成器的种子。下面我将逐一解释这行代码中的每个部分&#xff1a; ‌std::time(0)‌: std::time 是C标准库中的一个函数&#xff0c;它返回当前时间&#xff08;自1970年1月1日以来…...

云计算之elastaicsearch logstach kibana面试题

1.ELK是什么? ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写 Elasticsearch:负责日志检索和储存 Logstash:负责日志的收集和分析、处理 Kibana:负责日志的可视化 这三款软件都是开源软件,通常是配合使用,而且又先后归于 Elastic.co 公司名下,…...

汽车免拆诊断案例 | 2017款捷豹F-PACE车发动机偶尔怠速不稳

故障现象  一辆2017款捷豹F-PACE车&#xff0c;搭载2.0 L GTDi发动机&#xff0c;累计行驶里程约为16万km。车主反映&#xff0c;车辆组合仪表上发动机故障灯点亮&#xff08;图1&#xff09;&#xff0c;且发动机偶尔怠速不稳。 图1 发动机故障灯点亮 故障诊断 接车后试车…...

20241124 Typecho 视频插入插件

博文免不了涉及到视频插入这些,网上的插件都或多或少的比较重,和Typecho的风格不搭配 后面就有了DPlay插件精简而来的VideoInsertion插件 VideoInsertion: Typecho 视频插入插件 目录结构 rockhinlink-ht2:/var/www/html/typecho/usr/plugins/VideoInsertion$ tree -h [4.…...

【接口调试】OpenAI ChatGPT API

【接口调试】AbortController 发出请求finish_reason 参数细节 – Openai ChatGPT 文档 发出请求 可以将以下命令粘贴到终端中以运行第一个API请求。 请确保用您的秘密API密钥替换$OPENAI_API_KEY。 curl https://api.openai.com/v1/chat/completions \-H "Content-Ty…...

ubuntu安装chrome无法打开问题

如果在ubuntu安装chrome后&#xff0c;点击chrome打开没反应&#xff0c;可以先试着在terminal上用命令打开 google-chrome 如果运行命令显示 Chrome has locked the profile so that it doesnt get corrupted. If you are sure no other processes are using this profile…...

【R安装】VSCODE安装及R语言环境配置

目录 VSCODE下载及安装VSCODE上配置R语言环境参考 Visual Studio Code&#xff08;简称“VSCode” &#xff09;是Microsoft在2015年4月30日Build开发者大会上正式宣布一个运行于 Mac OS X、Windows和 Linux 之上的&#xff0c;针对于编写现代Web和云应用的跨平台源代码编辑器&…...

什么是 Token 和 MD5 ?

目录 一&#xff1a;Token和MD5分别是什么 1&#xff1a;Token 2&#xff1a;MD5 二&#xff1a;简易Token的实现 1&#xff1a;Base64。 2&#xff1a;验证Token 三&#xff1a;MD5的使用 一&#xff1a;Token和MD5分别是什么 1&#xff1a;Token Token 的中文有人翻译成…...

Kubernetes(k8s)1.30.7简单快速部署对外部开放的有状态服务MYSQL8(快速有效)

如何在Kubernetes集群中快速创建部署一个单节点的有状态&#xff08;即将数据文件挂载到宿主机&#xff0c;防止重新部署mysql服务&#xff0c;数据文件丢失&#xff09;的对外开放的MYSQL服务。 通过创建一个 Kubernetes Deployment 并使用 PersistentVolumeClaim 将其连接到…...

基于Linux的repmgr搭建

第一部分 说明 repmgr是一个开源工具套件&#xff0c;用于管理 PostgreSQL 服务器集群中的复制和故障转移。它通过设置备用服务器、监控复制和执行管理任务&#xff08;例如故障转移或手动切换操作&#xff09;的工具增强了 PostgreSQL 的内置热备用功能。 PostgreSQL在9.0后引…...

Diff差异算法

目录 虚拟DOM Diff算法 Diff过程 示例 总结 在Vue.js中&#xff0c;虚拟DOM&#xff08;Virtual DOM&#xff09;是其核心特性之一&#xff0c;它极大地提高了DOM更新的效率。Vue.js使用虚拟DOM的diff算法来比较新旧虚拟DOM树&#xff0c;从而确定最小的DOM更新操作。这种…...

visionpro官方示例分析(一) 模板匹配工具 缺陷检测工具

1.需求&#xff1a;找出图像中的这个图形。 2.步骤 使用CogPMAlignTool工具&#xff0c;该工具是模板匹配工具&#xff0c;见名知意&#xff0c;所谓模板匹配工具就是说先使用该工具对一张图像建立模板&#xff0c;然后用这个模板在其他图像上进行匹配&#xff0c;匹配上了就说…...

字符串分割转换(Java Python JS C++ C )

题目描述 给定一个非空字符串S,其被N个‘-’分隔成N+1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。 对于新组成的每一个子串,如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母; 反之,如果它…...

第33章 - Go语言 云原生开发

第33章 - 云原生开发将深入探讨云原生技术及其在现代软件开发中的应用。我们将从云原生的基本概念开始&#xff0c;逐步介绍Kubernetes的基本使用方法&#xff0c;并结合具体的云服务提供商实例&#xff0c;通过Go语言编写的应用程序来展示如何实现云原生开发。 33.1 云原生的…...

springboot配置多数据源mysql+TDengine保姆级教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pom文件二、yamlDataSourceConfigServiceMapper.xml测试总结 前言 Mybatis-plus管理多数据源&#xff0c;数据库为mysql和TDengine。 一、pom文件 <de…...

RocketMQ负载均衡机制解析

消费者在消费消息的时候&#xff0c;需要知道从Broker的哪一个消息队列中去获取消息。 ❝ 所以&#xff0c;在消费者端必须要做负载均衡&#xff0c;即Broker端中多个消费队列分配给同一个消费者组中的哪些消费者消费。 在RocketMQ中&#xff0c;在消费者端有一个&#xff1a;R…...

PyTorch 模型转换为 ONNX 格式

PyTorch 模型转换为 ONNX 格式 在深度学习领域&#xff0c;模型的可移植性和可解释性是非常重要的。本文将介绍如何使用 PyTorch 训练一个简单的卷积神经网络&#xff08;CNN&#xff09;来分类 MNIST 数据集&#xff0c;并将训练好的模型转换为 ONNX 格式。我们还将讨论 PTH …...

大数据-234 离线数仓 - 异构数据源 DataX 将数据 从 HDFS 到 MySQL

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…...

【人工智能】使用Python实现序列到序列(Seq2Seq)模型进行机器翻译

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 序列到序列(Sequence-to-Sequence, Seq2Seq)模型是解决序列输入到序列输出任务的核心架构,广泛应用于机器翻译、文本摘要和问答系统等自然语言处理任务中。本篇文章深入介绍 Seq2Seq 模型的原理及其核心组件(…...

elasticsearch安装ik分词器

本文主要记录如何安装ik分词器&#xff0c;如果你刚好刷到了这篇文章&#xff0c;希望对你有所帮助。 IKAnalyzer是一个开源的&#xff0c;基于java语言开发的轻量级的中文分词工具包。采用了特有的“正向迭代最细粒度切分算法“&#xff0c;支持细粒度和最大词长两种切分模式&…...

QT6之主站freemodbus1.6移植

本次使用的QT是6.8 下载1.6的freemodbus资源包&#xff1a;至少以上的吧 随便下载&#xff1a;官网也可以这个是STM芯片的教程&#xff0c;移植基本一样&#xff0c;略有不同&#xff1b; STM32 移植FreeModbus详细过程-CSDN博客 移植freemodbus&#xff1a; 添加资源文件&a…...

【错误❌】——槽函数定义好但未初始化

public slots:void onClose(); 初始化即可成功&#xff1a;...

数据结构(理解)

探索数据结构&#xff1a;计算机世界的基石 在计算机科学的领域中&#xff0c;数据结构就如同建筑中的基石&#xff0c;它们支撑着整个软件世界的运行。无论是简单的应用程序&#xff0c;还是复杂的大型系统&#xff0c;数据结构都在其中起着至关重要的作用。 一、什么是数据结…...

ROS2 细节知识学习

1. rosidl_generate_interfaces() 在 ROS2 中&#xff0c;rosidl_generate_interfaces是一个关键的构建工具功能。它主要用于从接口定义文件&#xff08;如.msg消息文件、.srv服务文件和.action动作文件&#xff09;生成不同编程语言&#xff08;如 C、Python 等&#xff09;可…...

SQL进阶——JOIN操作详解

在数据库设计中&#xff0c;数据通常存储在多个表中。为了从这些表中获取相关的信息&#xff0c;我们需要使用JOIN操作。JOIN操作允许我们通过某种关系&#xff08;如相同的列&#xff09;将多张表的数据结合起来。它是SQL中非常重要的操作&#xff0c;广泛应用于实际开发中。本…...

Android studio 签名加固后的apk文件

Android studio打包时&#xff0c;可以选择签名类型v1和v2&#xff0c;但是在经过加固后&#xff0c;签名就不在了&#xff0c;或者只有v1签名&#xff0c;这样是不安全的。 操作流程&#xff1a; 1、Android studio 对项目进行打包&#xff0c;生成有签名的apk文件&#xff…...

Mybatis-基础操作

Mybatis的基础操作就是通过Mybatis完成对数据的增删改查。我们通过例子来引入这些操作&#xff0c;之前的项目较久远&#xff0c;因此我们从零开始进行准备工作&#xff1a; 搭建项目 一、创建数据库user_list并插入数据&#xff1a; -- 创建数据库 create table user_list …...

【工具】JS解析XML并且转为json对象

【工具】JS解析XML并且转为json对象 <?xml version1.0 encodingGB2312?> <root><head><transcode>hhhhhhh</transcode></head><body><param>ccccccc</param><param>aaaaaaa</param><param>qqqq<…...

软件测试技术面试题及参考答案整理

一、什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案&#xff1a; 兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行&#xff0c;即是通常说的软件的可移植性。 兼容的类型&#xff0c;如果细分的话&#xff0c;有平台的兼容&#xff0c;网络兼…...

Python学习36天

面向对象编程综合 # 创建父类 class Employee:# 创建私有属性__name None__salary None# 创建构造器初始化属性def __init__(self, __name, __salary):self.__name __nameself.__salary __salarydef get_annual(self):# 返回员工年薪return self.__salary * 12# 创建公共方…...

C语言——海龟作图(对之前所有内容复习)

一.问题描述 海龟作图 设想有一只机械海龟&#xff0c;他在C程序控制下在屋里四处爬行。海龟拿了一只笔&#xff0c;这支笔或者朝上&#xff0c;或者朝下。当笔朝下时&#xff0c;海龟用笔画下自己的移动轨迹&#xff1b;当笔朝上时&#xff0c;海龟在移动过程中什么也不画。 …...

关于如何在k8s中搭建一个nsfw黄图鉴定模型

随着现在应用内图片越来越多&#xff0c;安全审查也是必不可少的一个操作了 下面手把手教你如何将huggingface中的黄图检测模型部署到自己的服务器上去 1.找到对应的模型 nsfw_image_detection 2.在本地先验证如何使用 首先安装transformers python库 pip install transform…...

istio结合wasm插件的实际应用

在 Istio 中&#xff0c;WASM 插件的常见使用场景和功能包括以下几个方面&#xff1a; 1. 流量管理与请求修改 请求与响应头处理&#xff1a;动态添加、删除或修改 HTTP 请求或响应头。URL 重写&#xff1a;根据特定规则调整请求的路径或参数。请求路由增强&#xff1a;实现复…...

日志logrus

https://blog.csdn.net/m0_70982551/article/details/143095729 https://blog.csdn.net/wslyk606/article/details/81670713 https://www.bilibili.com/opus/1002468521099132928 地鼠文档&#xff1a;https://www.topgoer.cn/docs/goday/goday-1crg2adjknouc 极客文档&#xf…...

11.29 代码随想录Day45打卡(动态规划)

115.不同的子序列 题目&#xff1a;给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数。 题解&#xff1a; class Solution:def numDistinct(self, s: str, t: str) -> int:dp [[0] * (len(t) 1) for _ in range(len(s) 1)]for i in range…...

springboot336社区物资交易互助平台pf(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 社区物资交易互助平台设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff…...