无线电定位系统已成为几乎所有类型的移动设备和相关应用的标配功能。在众多无线电定位方法中,基于超宽带 (UWB) 射频通信的实时定位系统 (RTLS) 扮演了中枢角色,确保在 GPS 等更为人熟悉的技术无法提供覆盖时,也能获取定位信息。
随着更高精度 RTLS 需求的日益增长,开发人员发现自己被困在双向测距或到达时间差 (TDOA) 定位等复杂的高精度方法之中。
Decawave 的集成式模块和软件为开发人员提供了一种更简单的 RTLS 解决方案,能够轻而易举地提供更精确的定位结果。
本文将回顾包括双向测距和 TDOA 在内的 RTLS 应用及算法,并讨论不同 RTLS 方法的相关实现权衡。之后,本文将介绍一种 Decawave UWB 收发器,重点说明使用该器件进行设计的具体要求。最后,本文将探讨 Decawave 软件架构和配套的固件开发,说明在 Decawave 平台上开发用户应用的具体方法。
高精度 RTLS 使用飞行时间方法,而这类方法几乎不受射频信号强度大幅变动的影响。依据此方法,可通过测量射频信号从标签传递到多个定位点所需的时间,来确定标签的位置。利用射频信号通过空气传播时的已知传播延迟,RTLS 应用可以将飞行时间转换为距离。
例如,如果标签到所有三个定位点之间的飞行时间完全相同,那么按理说,这种情况仅在标签与这些定位点等距时才会出现。由于应用知道各个定位点的确切位置,因此它能确定标签的绝对位置。
但是,要测量标签发射器的传播时间,定位点接收器需要使用与标签相同的时基,才能正确评估标签消息中内嵌的时间信息。如果定位点的时基滞后或领先于标签的时基,则计算的距离将会分别比实际距离更近或更远。
一种 RTLS 方法采取简单的方式应对这一问题,即对标签发射器和定位点接收器进行时间同步,确保每个定位点接收消息的时基与标签相同。即使在最佳情况下,实现时间同步也很有挑战,而在无线标签四处移动的 RTLS 应用中,这根本就不切实际。
另一种方法 TDOA 仅对定位点进行同步,从而消除了与移动标签同步相关的难点。为确定位置,RTLS 应用使用跨多个定位点测得的标签信号到达时间之差。例如,考虑之前三个定位点(A1、A2 和 A3)围绕一个标签等距离分布的示例。在标签移动后,如果各个定位点的 TDOA 被发现分别为 0、1 纳秒 (ns) 和 0,则表示该标签在远离定位点 A2 的直线方向上移动了约 30 厘米 (cm)(假设射频传播的速度为光速)。TDOA 的定位点同步要求与尝试同步定位点和标签相比,难度要小得多。但即便如此,此方法的精度仍取决于高度精确的同步。即便是一纳秒的同步差,也可能导致位置测量出现几厘米的差别。
依据此方法,标签发射简短的标识信号,向周围的定位点“亮明身份”。每个收到标签的初始标识信息的定位点随即与标签合作进行简短的双向数据交换,用于确定飞行时间,而无需考虑定位点与标签之间存在的时基差。
Decawave 在其双向测距 RTLS 协议中,从发现阶段和测距阶段的角度定义了此过程(图 1)。在发现期间,标签定期传送简短的标识信号(即眨眼信号),并等待来自定位点的响应。在标签和定位点彼此识别后,配对的标签和定位点使用简短的双向信息交换,其中包含了测距所需的信息。
图 1:在 Decawave 的双向测距协议中,标签和定位点交换一系列消息,以完成发现并提供测距信息。(图片来源:Decawave)
对于开发人员而言,实现这些精确设计的消息交换协议及其底层 UWB 无线电子系统带来的挑战可能令人生畏。但凭借 Decawave DWM1001 模块,开发人员只需很少的额外工作,就能快速向其应用中添加精确的 RTLS 功能。
在任何复杂的射频应用中,射频设计往往都会带来一些最艰巨的挑战,尤其在要求极小封装和极低功耗的移动应用中。DWM1001 模块通过充分利用 DW1000 收发器提供的集成式射频设计(图 2)解决了这些问题。
图 2:Decawave DW1000 收发器集成了无线电信号路径和数字控制逻辑,以提供一个完整的符合 IEEE802.15.4-2011 标准的系统。(图片来源:Decawave)
DW1000 提供集成了射频前端的完整 UWB 收发器,能够支持六个从 3.5 GHz 到 6.5 GHz 的 IEEE802.15.4-2011 通道,标准比特率为 110 Kb/s、850 Kb/s 和 6.81 Mb/s。该器件的集成数字控制子系统用于管理收发器,并支持双向测距和 TDOA RTLS 系统,定位精度可达 10 厘米。利用集成的一次性可编程存储器 (OTP),开发人员可以存储用于校准和纠错的数据,同时器件的可配置不间断存储器 (AON) 会在器件处于下文所述的低功耗状态期间保留配置数据。
在工作期间,该设备发送和接收标准 IEEE802.15.4-2011 帧,其中包含同步标头 (SHR)、物理层标头 (PHR),以及构成总体物理层服务数据单元 (PSDU) 的多达 127 字节的数据。除了标准帧以外,该设备还支持专有帧格式,该帧格式为需要发送更大数据有效载荷、但不要求符合 IEEE802.15.4-2011 标准的应用提供了多达 1023 个数据字节。
对于符合标准的应用,开发人员可以从一系列工作模式中进行选择,以满足特定的双向测距和 TDOA 操作使用实例。这些工作模式预先组合了数据速率、有效载荷大小和预先配置的前导码长度。例如,适用于远程应用的模式组合了较低的数据速率以及有利于在干扰或较弱信号中完成发现和测距的较长前导码。反之,具有较高数据速率和较短前导码的模式则支持短程应用。其他模式以不同大小的数据有效载荷支持这类远程和短程应用的特征。
但与任何射频设计一样,收发器工作期间的功耗会显著增大。例如,要传输符合 IEEE802.15.4-2011 标准的帧,同步标头和数据包等较长的帧组件消耗了大部分功耗(图 3)。
图 3:Decawave DW1000 的 RTLS 帧传输会导致各个帧组件的功耗显著增大,这促使设计人员开始寻求具有最短的有用同步标头和数据有效载荷的工作模式。(图片来源:Decawave)
与接收器操作相关的功耗甚至更大,这给功耗受限型设计带来了更艰巨的挑战(图 4)。开发人员可以将 DW1000 设定为在发送或接收操作后恢复其中一种低功耗状态。即便如此,标准协议和帧的性质使得用于降低帧操作期间功耗的选择很少。
图 4:由于前导码查寻阶段的持续时间较长,因此接收帧所需的功耗要求甚至高于传输操作。(图片来源:Decawave)
DW1000 提供了独特的节能功能来降低前导码 RX 阶段的功耗。开发人员可以为器件编制专门的前导码嗅探模式,而不是让接收器一直保持工作状态。这种情况下,DW1000 定期为接收器通电,查找前导码,如果未找到前导码则恢复待机状态(图 5)。
图 5:开发人员可通过使用 DW1000 的嗅探功能来降低与接收器操作相关的功耗,使得器件在待机模式与接收器活动模式之间交替变化。(图片来源:Decawave)
前导码嗅探等功能对于电池供电型标签而言尤其重要。开发人员可在 RTLS 操作期间应用多种节能方法。其中一种方法利用的是图 1 所示双向测距协议中存在的不同已知延迟。
例如,在发现阶段,定位点对标签“眨眼信号”的测距初始化应答会在一定的延迟后发生。开发人员可基于帧率和其他参数估算此延迟,在其定位点设计中测量其实际值,甚至在其定位点设计中构建特定的响应延迟时间。然后,开发人员可以在预期的延迟时间内安全地将标签接收器保持关闭状态,要搜寻响应则将接收器开启,如果测距初始化应答未在合理的窗口内到达,则将接收器再次关闭。
类似地,开发人员可以采取措施来限制在测距过程中需要将无线电保持开启状态的时间。例如,开发人员可以在设备中预加载所有需要的数据,并使用直接存储器访问来加快 DW1000 与主机内存之间的数据传输。
虽然这些低级优化可以提高增量节能,但开发人员还可通过动态更改位置更新速率进一步改善节能效果。标签停止移动后,便没有必要继续执行高能耗的发现和测距阶段。标签可以安全地进入低功耗休眠状态,并在其开始移动后唤醒,继续以标称速率进行更新。
通过集成 LIS2DH12 运动传感器,DWM1001 模块支持动态速率调整,并且支持两种运动相关的工作模式:低功耗和响应模式。开发人员可以对该模块进行配置,在 LIS2DH12 感应到模块处于静止状态时,DW1000 收发器以低功耗模式运行。当 LIS2DH12 检测到移动时,收发器可以恢复为响应模式,这时 DW1000 收发器将恢复正常的更新速率。
开发人员还可以进一步优化其 RTLS 应用,基于对象的速度和加速度来控制更新速率。例如,缓慢移动的标签可能只需较低的更新频率便可保持必要的定位精度。随着标签速度的增加,应用可通过提高位置更新速率进行响应。
图 6:Decawave DW1000 收发器采用严格的接口要求,从而确保可靠的电源、射频和定时信号。(图片来源:Decawave)
尽管类似这样的高级器件采用了高度简化的设计,但在要求以最低功耗实现最高性能的设计中,设计人员要想优化集成,仍可能面临严峻的挑战。DWM1001 模块将集成要求降低至少数几个电源、接地和数字接口的连接(图 7)。
图 7:Decawave DWM1001 模块通过提供完全集成的设计(集成了 DW1000 收发器与无线 MCU 和运动传感器)简化了 RTLS 开发。(图片来源:Decawave)
图 8:Decawave 定位和网络堆栈 (PANS) 库组合了蓝牙堆栈、RTOS、网络层和应用服务层,提供了一个功能丰富的 RTLS 应用平台。(图片来源:Decawave)
在构建于 DWM1001 的 MCU 上运行的固件应用时,开发人员通过综合应用编程接口 (API) 访问 PANS 库,该接口提供了各个 PANS 模块的相应入口点,从而对该模块进行配置和控制。PANS API 包含多个适用单独模块的 API 集,其中包括开发人员 C 代码、串行接口库(CPI 和 UART)以及 BLE 库(图 9)。
应用直接与这四个高级 API 连接,进而通过一个通用 API 解析器将这些调用转换为对 PANS 库的通用 API 调用,来实现对 PANS 库的访问。在此角色中,通用层提供了对 PANS 库的通用接口。
图 9:Decawave 通过广泛的 API 提供 PANS 库访问,每个 API 提供对底层线程化执行模型的简单访问。(图片来源:Decawave)
尽管这一多层系统看似非常复杂,但从开发人员的编程模型看却相对简单。将 API 调用与独立线程回调配合使用,有助于优化资源利用率和总体应用性能。
与此同时,底层复杂性也被一系列 API 屏蔽,这些 API 将面向应用的高级调用转换为经优化的与 DWM1001 硬件进行交互的特定线程化操作。DWM1001 编程模型则进一步简化了开发人员与此系统的交互。开发人员使用系统内建的用户专用应用线程,而不需要与多个线程和 API 交互。
如列表 1 所示,开发人员使用一个简单的 API 调用 (
列表 1:利用 Decawave 线程模型,开发人员只需一对简单的 API 调用便可注册并启动其用户应用线程。(代码来源:Decawave)
Decawave 提供了用户应用线程和回调示例代码。该示例代码捆绑在一个 Oracle Virtual Box 虚拟机映像中,其中包含了完整的工具链、库和简单的示例应用。该软件包设计为与连接到 Windows PC 的 Decawave DWM1001-DEV 开发板配合使用,提供了一个用于创建定制 RTLS 应用软件的框架。
包含在该软件包中的示例代码演示了关键的用户线程函数设计模式(列表 2)。在此示例中,用户线程函数 (
列表 2:在 Decawave 固件开发包的这个片段中,示例代码展示了用于在用户应用线程例程中注册回调和执行主循环的基本设计模式。(代码来源:Decawave)
示例回调函数 (
列表 3:此 Decawave 示例应用片段演示的回调提供了用于访问新位置数据的基本事件处理程序。(代码来源:Decawave)
例如,在一个完整的物联网 (IoT) RTLS 应用中,标签和定位点会通过链接到连接互联网的网关系统的路由定位点进行通信。Decawave 即将推出其第二版固件包,将通过基于 Linux 的软件包提供网关支持,并会使用熟悉的 IoT 信息传输协议,包括 HTTP、WebSockets、MQTT 和 AMQP。
Decawave DWM1001 模块提供了完整的 RTLS 系统,其中结合了 Decawave 的集成式 DW1000 UWB 收发器以及无线 MCU 和运动传感器。利用此模块和配套的软件包,开发人员可以快速实现高精度的电池供电型 RTLS 系统。
随着更高精度 RTLS 需求的日益增长,开发人员发现自己被困在双向测距或到达时间差 (TDOA) 定位等复杂的高精度方法之中。
Decawave 的集成式模块和软件为开发人员提供了一种更简单的 RTLS 解决方案,能够轻而易举地提供更精确的定位结果。
本文将回顾包括双向测距和 TDOA 在内的 RTLS 应用及算法,并讨论不同 RTLS 方法的相关实现权衡。之后,本文将介绍一种 Decawave UWB 收发器,重点说明使用该器件进行设计的具体要求。最后,本文将探讨 Decawave 软件架构和配套的固件开发,说明在 Decawave 平台上开发用户应用的具体方法。
RTLS 系统的作用
精密 RTLS 已成为在办公大楼、仓库、制造厂和装配线中用于确定或跟踪人员及移动资产位置的有效方法。依据此方法,一个移动对象(标签)使用低速率无线个人局域网 (LR-WPAN) 标准 IEEE 802.15.4-2011 中规定的标准格式和 UWB 技术,与固定位置的设备(定位点)交换信息。通过确定标签与多个定位点之间的距离,相关应用可以确定标签相对这些已知定位点的位置,进而确定标签的绝对位置。RTLS 方法
RTLS 应用使用多种方法确定距离。在最简单的方法中,应用或标签可以使用大多数收发器提供的接收信号强度指示器 (RSSI) 参数,来评估标签相对发射定位点的位置。由于存在多种可能影响链路预算的因素,此方法最多只能提供粗略的位置估计。相比之下,许多基于 RTLS 的新兴应用要求将绝对位置确定到几厘米的精度。高精度 RTLS 使用飞行时间方法,而这类方法几乎不受射频信号强度大幅变动的影响。依据此方法,可通过测量射频信号从标签传递到多个定位点所需的时间,来确定标签的位置。利用射频信号通过空气传播时的已知传播延迟,RTLS 应用可以将飞行时间转换为距离。
例如,如果标签到所有三个定位点之间的飞行时间完全相同,那么按理说,这种情况仅在标签与这些定位点等距时才会出现。由于应用知道各个定位点的确切位置,因此它能确定标签的绝对位置。
但是,要测量标签发射器的传播时间,定位点接收器需要使用与标签相同的时基,才能正确评估标签消息中内嵌的时间信息。如果定位点的时基滞后或领先于标签的时基,则计算的距离将会分别比实际距离更近或更远。
一种 RTLS 方法采取简单的方式应对这一问题,即对标签发射器和定位点接收器进行时间同步,确保每个定位点接收消息的时基与标签相同。即使在最佳情况下,实现时间同步也很有挑战,而在无线标签四处移动的 RTLS 应用中,这根本就不切实际。
另一种方法 TDOA 仅对定位点进行同步,从而消除了与移动标签同步相关的难点。为确定位置,RTLS 应用使用跨多个定位点测得的标签信号到达时间之差。例如,考虑之前三个定位点(A1、A2 和 A3)围绕一个标签等距离分布的示例。在标签移动后,如果各个定位点的 TDOA 被发现分别为 0、1 纳秒 (ns) 和 0,则表示该标签在远离定位点 A2 的直线方向上移动了约 30 厘米 (cm)(假设射频传播的速度为光速)。TDOA 的定位点同步要求与尝试同步定位点和标签相比,难度要小得多。但即便如此,此方法的精度仍取决于高度精确的同步。即便是一纳秒的同步差,也可能导致位置测量出现几厘米的差别。
双向测距
双向测距 RTLS 方法完全不需要精确的时间同步,但在标签中引入了传输能力要求。这种方法通过支持标签和定位点彼此交换定时信息,来规避不同时基带来的不确定性。标签和定位点无需同步它们的时基,而是使用一种简短的双向信息传输协议,实现精确地确定飞行时间和准确地计算标签位置。依据此方法,标签发射简短的标识信号,向周围的定位点“亮明身份”。每个收到标签的初始标识信息的定位点随即与标签合作进行简短的双向数据交换,用于确定飞行时间,而无需考虑定位点与标签之间存在的时基差。
Decawave 在其双向测距 RTLS 协议中,从发现阶段和测距阶段的角度定义了此过程(图 1)。在发现期间,标签定期传送简短的标识信号(即眨眼信号),并等待来自定位点的响应。在标签和定位点彼此识别后,配对的标签和定位点使用简短的双向信息交换,其中包含了测距所需的信息。
图 1:在 Decawave 的双向测距协议中,标签和定位点交换一系列消息,以完成发现并提供测距信息。(图片来源:Decawave)
对于开发人员而言,实现这些精确设计的消息交换协议及其底层 UWB 无线电子系统带来的挑战可能令人生畏。但凭借 Decawave DWM1001 模块,开发人员只需很少的额外工作,就能快速向其应用中添加精确的 RTLS 功能。
集成式 RTLS 模块
Decawave DWM1001 模块可完整实现 RTLS,将 Decawave DW1000 UWB 收发器与一个 Nordic Semiconductor NRF52832 无线 MCU 和一个 STMicroelectronics LIS2DH12 3 轴运动传感器集成在一起。尽管 DW1000 提供符合 IEEE 802.15.4-2011 标准的射频信号发送功能,但 NRF52832 MCU 仍针对 RTLS 应用执行其内嵌的固件。LIS2DH12 传感器在电源管理中扮演着重要的角色。在任何复杂的射频应用中,射频设计往往都会带来一些最艰巨的挑战,尤其在要求极小封装和极低功耗的移动应用中。DWM1001 模块通过充分利用 DW1000 收发器提供的集成式射频设计(图 2)解决了这些问题。
图 2:Decawave DW1000 收发器集成了无线电信号路径和数字控制逻辑,以提供一个完整的符合 IEEE802.15.4-2011 标准的系统。(图片来源:Decawave)
DW1000 提供集成了射频前端的完整 UWB 收发器,能够支持六个从 3.5 GHz 到 6.5 GHz 的 IEEE802.15.4-2011 通道,标准比特率为 110 Kb/s、850 Kb/s 和 6.81 Mb/s。该器件的集成数字控制子系统用于管理收发器,并支持双向测距和 TDOA RTLS 系统,定位精度可达 10 厘米。利用集成的一次性可编程存储器 (OTP),开发人员可以存储用于校准和纠错的数据,同时器件的可配置不间断存储器 (AON) 会在器件处于下文所述的低功耗状态期间保留配置数据。
在工作期间,该设备发送和接收标准 IEEE802.15.4-2011 帧,其中包含同步标头 (SHR)、物理层标头 (PHR),以及构成总体物理层服务数据单元 (PSDU) 的多达 127 字节的数据。除了标准帧以外,该设备还支持专有帧格式,该帧格式为需要发送更大数据有效载荷、但不要求符合 IEEE802.15.4-2011 标准的应用提供了多达 1023 个数据字节。
对于符合标准的应用,开发人员可以从一系列工作模式中进行选择,以满足特定的双向测距和 TDOA 操作使用实例。这些工作模式预先组合了数据速率、有效载荷大小和预先配置的前导码长度。例如,适用于远程应用的模式组合了较低的数据速率以及有利于在干扰或较弱信号中完成发现和测距的较长前导码。反之,具有较高数据速率和较短前导码的模式则支持短程应用。其他模式以不同大小的数据有效载荷支持这类远程和短程应用的特征。
功耗最小化
在实践中,开发人员会选择帧大小尽可能短的工作模式,以最大限度减小总体功耗,并让器件快速恢复低功耗状态。DW1000 提供了多种低功耗模式。在非活动期内,可以将器件置于待机模式,此模式的电流消耗仅为 19 毫安 (mA)。如果需要长期保持非活动状态,开发人员可将器件置于低功耗休眠模式,此时的电流消耗仅约 1 微安 (μA),而深度睡眠模式的电流消耗更是不超过 100 纳安 (nA)(典型值 50 nA)。但与任何射频设计一样,收发器工作期间的功耗会显著增大。例如,要传输符合 IEEE802.15.4-2011 标准的帧,同步标头和数据包等较长的帧组件消耗了大部分功耗(图 3)。
图 3:Decawave DW1000 的 RTLS 帧传输会导致各个帧组件的功耗显著增大,这促使设计人员开始寻求具有最短的有用同步标头和数据有效载荷的工作模式。(图片来源:Decawave)
与接收器操作相关的功耗甚至更大,这给功耗受限型设计带来了更艰巨的挑战(图 4)。开发人员可以将 DW1000 设定为在发送或接收操作后恢复其中一种低功耗状态。即便如此,标准协议和帧的性质使得用于降低帧操作期间功耗的选择很少。
图 4:由于前导码查寻阶段的持续时间较长,因此接收帧所需的功耗要求甚至高于传输操作。(图片来源:Decawave)
DW1000 提供了独特的节能功能来降低前导码 RX 阶段的功耗。开发人员可以为器件编制专门的前导码嗅探模式,而不是让接收器一直保持工作状态。这种情况下,DW1000 定期为接收器通电,查找前导码,如果未找到前导码则恢复待机状态(图 5)。
图 5:开发人员可通过使用 DW1000 的嗅探功能来降低与接收器操作相关的功耗,使得器件在待机模式与接收器活动模式之间交替变化。(图片来源:Decawave)
前导码嗅探等功能对于电池供电型标签而言尤其重要。开发人员可在 RTLS 操作期间应用多种节能方法。其中一种方法利用的是图 1 所示双向测距协议中存在的不同已知延迟。
例如,在发现阶段,定位点对标签“眨眼信号”的测距初始化应答会在一定的延迟后发生。开发人员可基于帧率和其他参数估算此延迟,在其定位点设计中测量其实际值,甚至在其定位点设计中构建特定的响应延迟时间。然后,开发人员可以在预期的延迟时间内安全地将标签接收器保持关闭状态,要搜寻响应则将接收器开启,如果测距初始化应答未在合理的窗口内到达,则将接收器再次关闭。
类似地,开发人员可以采取措施来限制在测距过程中需要将无线电保持开启状态的时间。例如,开发人员可以在设备中预加载所有需要的数据,并使用直接存储器访问来加快 DW1000 与主机内存之间的数据传输。
虽然这些低级优化可以提高增量节能,但开发人员还可通过动态更改位置更新速率进一步改善节能效果。标签停止移动后,便没有必要继续执行高能耗的发现和测距阶段。标签可以安全地进入低功耗休眠状态,并在其开始移动后唤醒,继续以标称速率进行更新。
通过集成 LIS2DH12 运动传感器,DWM1001 模块支持动态速率调整,并且支持两种运动相关的工作模式:低功耗和响应模式。开发人员可以对该模块进行配置,在 LIS2DH12 感应到模块处于静止状态时,DW1000 收发器以低功耗模式运行。当 LIS2DH12 检测到移动时,收发器可以恢复为响应模式,这时 DW1000 收发器将恢复正常的更新速率。
开发人员还可以进一步优化其 RTLS 应用,基于对象的速度和加速度来控制更新速率。例如,缓慢移动的标签可能只需较低的更新频率便可保持必要的定位精度。随着标签速度的增加,应用可通过提高位置更新速率进行响应。
RTLS 开发
除了能够支持动态更新速率等 RTLS 特性之外,该模块还提供了基本的 RTLS 开发优势。例如,DW1000 收发器针对电源去耦、天线网络匹配、基准振荡器和其他元器件采行了多种特定的接口要求(图 6)。类似地,NRF52832 无线 MCU 和 LIS2DH12 运动传感器也存在自己的接口设计需求。图 6:Decawave DW1000 收发器采用严格的接口要求,从而确保可靠的电源、射频和定时信号。(图片来源:Decawave)
尽管类似这样的高级器件采用了高度简化的设计,但在要求以最低功耗实现最高性能的设计中,设计人员要想优化集成,仍可能面临严峻的挑战。DWM1001 模块将集成要求降低至少数几个电源、接地和数字接口的连接(图 7)。
图 7:Decawave DWM1001 模块通过提供完全集成的设计(集成了 DW1000 收发器与无线 MCU 和运动传感器)简化了 RTLS 开发。(图片来源:Decawave)
软件模型
类似地,该模块还利用其预装的 Decawave 定位和网络堆栈 (PANS) 库固件大幅简化了软件开发与集成。PANS 库基于 MCU 的片载低功耗蓝牙 (BLE) 堆栈而构建,包含开源 eCos 实时操作系统 (RTOS)、一个网络层,以及支持 BLE 服务、RTLS 管理服务和双向测距 (TWR) 定位引擎的若干应用层(图 8)。图 8:Decawave 定位和网络堆栈 (PANS) 库组合了蓝牙堆栈、RTOS、网络层和应用服务层,提供了一个功能丰富的 RTLS 应用平台。(图片来源:Decawave)
在构建于 DWM1001 的 MCU 上运行的固件应用时,开发人员通过综合应用编程接口 (API) 访问 PANS 库,该接口提供了各个 PANS 模块的相应入口点,从而对该模块进行配置和控制。PANS API 包含多个适用单独模块的 API 集,其中包括开发人员 C 代码、串行接口库(CPI 和 UART)以及 BLE 库(图 9)。
应用直接与这四个高级 API 连接,进而通过一个通用 API 解析器将这些调用转换为对 PANS 库的通用 API 调用,来实现对 PANS 库的访问。在此角色中,通用层提供了对 PANS 库的通用接口。
图 9:Decawave 通过广泛的 API 提供 PANS 库访问,每个 API 提供对底层线程化执行模型的简单访问。(图片来源:Decawave)
线程化架构
在此架构中,DWM1001 固件软件使用线程化模型,基本上为堆栈中的每个模块和库都提供了单独的线程。堆栈顶部四个模块各自的线程将解析请求传递到通用 API 解析器线程,该线程则验证每条请求并调用 PANS 库,从而生成相应的响应。通用 API 线程进而使用发起调用时提供的回调函数,将结果返回到位于堆栈顶部的调用模块。尽管这一多层系统看似非常复杂,但从开发人员的编程模型看却相对简单。将 API 调用与独立线程回调配合使用,有助于优化资源利用率和总体应用性能。
与此同时,底层复杂性也被一系列 API 屏蔽,这些 API 将面向应用的高级调用转换为经优化的与 DWM1001 硬件进行交互的特定线程化操作。DWM1001 编程模型则进一步简化了开发人员与此系统的交互。开发人员使用系统内建的用户专用应用线程,而不需要与多个线程和 API 交互。
如列表 1 所示,开发人员使用一个简单的 API 调用 (
dwm_thread_create
) 来调用注册了用户应用线程函数 (app_thread_entry
) 的用户应用线程。副本
/* Create thread */
rv = dwm_thread_create(THREAD_APP_PRIO, app_thread_entry, (void*)NULL, "app", THREAD_APP_STACK_SIZE, &hndl);
APP_ERR_CHECK(rv);
/* Start the thread */
dwm_thread_resume(hndl);
列表 1:利用 Decawave 线程模型,开发人员只需一对简单的 API 调用便可注册并启动其用户应用线程。(代码来源:Decawave)
Decawave 提供了用户应用线程和回调示例代码。该示例代码捆绑在一个 Oracle Virtual Box 虚拟机映像中,其中包含了完整的工具链、库和简单的示例应用。该软件包设计为与连接到 Windows PC 的 Decawave DWM1001-DEV 开发板配合使用,提供了一个用于创建定制 RTLS 应用软件的框架。
包含在该软件包中的示例代码演示了关键的用户线程函数设计模式(列表 2)。在此示例中,用户线程函数 (
app_thread_entry
) 设置了应用特定的配置参数(例如更新速率),并使用 API 函数 dwm_evt_cb_register
及其回调函数名称 (on_dwm_evt
) 注册了回调。注册回调后,示例线程进入主循环 – 在此实例中为一系列延迟函数调用,用于减少资源利用。副本
void app_thread_entry(uint32_t data)
{
.
.
.
/* Update rate set to 1 second, stationary update rate set to 5 seconds */
APP_ERR_CHECK(dwm_upd_rate_set(10, 50));
/* Register event callback */
dwm_evt_cb_register(on_dwm_evt, 0);
.
.
.
while (1) {
/* Thread loop */
dwm_thread_delay(100);
}
}
列表 2:在 Decawave 固件开发包的这个片段中,示例代码展示了用于在用户应用线程例程中注册回调和执行主循环的基本设计模式。(代码来源:Decawave)
示例回调函数 (
on_dwm_evt
) 演示了在发生事件时调用的基本事件处理程序(列表 3)。在此代码示例中,唯一的有效事件是有可用的新位置信息 (DWM_EVT_NEW_LOC_DATA
)。在该事件的处理程序中,代码演示了检索可用定位点生成的位置数据所需的简单调用集。完成其事件处理任务后,回调直接进入休眠状态。副本
/**
* Event callback
*
* @param[in] p_evt Pointer to event structure
* @param[in] p_data Pointer to user data
*/
void on_dwm_evt(dwm_evt_t *p_evt, void *p_data)
{
int i;
switch (p_evt->header.id) {
/* New location data */
case DWM_EVT_NEW_LOC_DATA:
/* Process the data */
printf("\nT:%lu ", dwm_systime_us_get());
if (p_evt->data.loc.p_pos == 0) {
/* Location engine is disabled */
} else {
printf("POS:[%ld,%ld,%ld,%u] ", p_evt->data.loc.p_pos->x,
p_evt->data.loc.p_pos->y, p_evt->data.loc.p_pos->z,
p_evt->data.loc.p_pos->qf);
}
for (i = 0; i < p_evt->data.loc.anchors.dist.cnt; ++i) {
printf("DIST%d:", i);
printf("0x%04X", (unsigned int)(p_evt->data.loc.anchors.dist.addr[i] & 0xffff));
if (i < p_evt->data.loc.anchors.an_pos.cnt) {
printf("[%ld,%ld,%ld]",
p_evt->data.loc.anchors.an_pos.pos[i].x,
p_evt->data.loc.anchors.an_pos.pos[i].y,
p_evt->data.loc.anchors.an_pos.pos[i].z);
}
printf("=[%lu,%u] ", p_evt->data.loc.anchors.dist.dist[i],
p_evt->data.loc.anchors.dist.qf[i]);
}
printf("\n");
break;
default:
break;
}
/* Indicate the application has finished the tasks and can now */
dwm_sleep();
}
列表 3:此 Decawave 示例应用片段演示的回调提供了用于访问新位置数据的基本事件处理程序。(代码来源:Decawave)
例如,在一个完整的物联网 (IoT) RTLS 应用中,标签和定位点会通过链接到连接互联网的网关系统的路由定位点进行通信。Decawave 即将推出其第二版固件包,将通过基于 Linux 的软件包提供网关支持,并会使用熟悉的 IoT 信息传输协议,包括 HTTP、WebSockets、MQTT 和 AMQP。
总结
RTLS 在广泛的应用中扮演越来越重要的角色。尽管 RTLS 方法基于相对简单的原理,但这些方法的实现需要复杂的射频/模拟设计、系统设计以及软件开发,以确保使用最小的功耗获得最高的精度。Decawave DWM1001 模块提供了完整的 RTLS 系统,其中结合了 Decawave 的集成式 DW1000 UWB 收发器以及无线 MCU 和运动传感器。利用此模块和配套的软件包,开发人员可以快速实现高精度的电池供电型 RTLS 系统。
评论
查看更多