RIOT 基于 uwb-core 的双向测距(TWR)实战:从 twr-aloha 示例到 dwm1001 双节点测距

发布时间:2026/9/19 14:58:13
RIOT 基于 uwb-core 的双向测距(TWR)实战:从 twr-aloha 示例到 dwm1001 双节点测距 RIOT 基于 uwb-core 的双向测距TWR实战从 twr-aloha 示例到 dwm1001 双节点测距【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT本指南以 RIOT 仓库中的examples/advanced/twr_aloha示例为核心讲解如何在搭载 Decawave DW1000 芯片的板卡如 dwm1001之间运行 IEEE 802.15.4 UWB 双向测距Two-Way RangingTWR覆盖本地双节点实验、五种 TWR 协议的选择与参数配置、结果 JSON 输出解析以及基于 IoT-LAB 的云端实验与自动测试方案。读完本文你将能够自行编译烧录并驱动两块 dwm1001 完成厘米级测距并理解其背后的 uwb-core 软件栈实现。示例概览twr-aloha 能做什么examples/advanced/twr_aloha是 RIOT 官方提供的 UWB 测距演示应用其目标是让两块支持 DW1000 设备的板卡之间可以测试不同的双向测距算法。该示例依赖 RIOT 对 uwb-core 包的移植以及配套的 uwb-dw1000 驱动包。从源码结构看该示例由以下几部分构成文件职责main.c应用入口初始化 uwb-core 测距子系统随后进入 RIOT shellcontrol.c / control.h测距控制逻辑封装监听、请求、结果回调等核心 APItwr_shell.c提供twr与ifconfig两个 shell 命令twr_shell.py基于 riotctrl 的 Python 交互封装ShellInteractiontests-with-config/01-run.py自动化冒烟测试Makefile构建配置与模块选择构建配置如何把五种 TWR 算法编进去示例的 Makefile 完整展示了 uwb-core 应用的编译方式关键点如下APPLICATION twr-aloha BOARD ? dwm1001 RIOTBASE ? $(CURDIR)/../../.. # Include uwb-core, uwb-dw1000 USEPKG uwb-core USEPKG uwb-dw1000 # Use event threads instead of a custom event queue USEMODULE uwb-core_event_thread CFLAGS -DEVENT_THREAD_MEDIUM_STACKSIZETHREAD_STACKSIZE_DEFAULT # Include all ranging algorithms USEMODULE uwb-core_twr_ss USEMODULE uwb-core_twr_ss_ack USEMODULE uwb-core_twr_ss_ext USEMODULE uwb-core_twr_ds USEMODULE uwb-core_twr_ds_ext ## Uncomment to enable trx info such as rssi, los, fppl calculation # USEMODULE uwb-core_rng_trx_info解读要点默认板卡为dwm1001通过BOARD ?设定它自带 DW1000 射频前端是该示例的典型目标平台通过USEPKG引入 uwb-core 与 uwb-dw1000 两个包其中 uwb-core 的依赖会进一步拉起mynewt-core包、periph_spi/periph_gpio_irq等硬件特性见 pkg/uwb-core/Makefile.dep并在架构层面排除了arch_avr8与arch_native五个uwb-core_twr_*模块分别对应五种测距协议从 pkg/uwb-core/Makefile.dep 可以看到只要启用任意uwb-core_twr_%模块构建系统就会自动追加uwb-core_rng、uwb-core_rng_math、uwb-core_dsp依赖uwb-core_event_thread让 uwb-core 使用 RIOT 标准事件线程而非自建事件队列取消注释USEMODULE uwb-core_rng_trx_info可额外启用 RSSI、LOS视距估计、FPPL首径相位损耗等射频信道信息的计算与输出所有 uwb-core 应用都需要CFLAGS -fms-extensions微软扩展语法支持使用 LLVM 工具链时还需追加-Wno-microsoft-anon-tagBOARDS_UNSUPPORTED : xg23-pk6068a用于排除与 Silabs SDK 宏定义冲突的板卡另有 Makefile.ci 列出内存不足BOARD_INSUFFICIENT_MEMORY的板卡清单。应用入口与控制 API测距是怎么跑起来的main.c 逻辑非常精简先调用uwb_core_rng_init()完成测距子系统初始化再进入 RIOT shell 等待用户命令。初始化链路实现在 pkg/uwb-core/contrib/uwb_core_init.c依次启动事件队列线程、初始化并配置 dw1000 设备预分配收发缓冲区、配置 MAC 与射频参数随后按编译进来的模块逐个调用twr_ss_pkg_init()、twr_ds_pkg_init()等协议包初始化函数启用uwb-core_twr_ss_ack时还会自动打开硬件 ACKuwb_set_autoack。control.h 定义了本示例对外暴露的核心 API函数作用uwb_core_rng_init()查找 dw1000 设备与测距实例注册 MAC 扩展回调初始化周期事件启动即进入休眠uwb_core_rng_listen_enable()/uwb_core_rng_listen_disable()开启/关闭监听测距请求响应方模式uwb_core_rng_start(addr, proto, interval, count)以指定协议、间隔与次数向目标短地址发起测距请求发起方模式uwb_core_rng_req_remaining()返回剩余未完成的测距请求数测距完成回调位于 control.c 的_complete_cb从接收帧解析出src/dst短地址通过uwb_rng_twr_to_tof()计算飞行时间Time of Flight再由uwb_rng_tof_to_meters()转为米乘 100 得到厘米级距离d_cm结果通过事件回调event_callback_post异步打印避免在中断上下文做重活。若启用uwb-core_rng_trx_info还会补充rssi、tof、los、fppl字段。本地双节点实验flash 与串口操作烧录并打开串口在两个独立的终端中分别烧录并连接两块板卡若使用 IoT-LAB 节点命令需加IOTLAB_NODE前缀。注意示例实际位于examples/advanced/目录下因此正确的构建路径为$ make -C examples/advanced/twr_aloha/ flash term -j $ make -C examples/advanced/twr_aloha/ flash term -jflash目标负责烧录固件term目标打开 RIOT shell 串口交互。第一步节点 A 开启监听并获取短地址在节点 A 的 shell 中开启监听 twr lst on [twr]: start listening随后用ifconfig查看网络接口信息 ifconfig Iface 3 HWaddr: C8:0C NID: DE:CA Long HWaddr: 08:2B:31:07:CC:52:C8:0C该输出由 twr_shell.c 中的_twr_ifconfig生成HWaddr是 16 位短地址本示例即目标地址NID是 PAN ID默认DE:CA还包含信道号与按 DW1000 寄存器换算的TX-Power单位 0.1dBm、TC-PGdelay等信息。第二步节点 B 发起测距请求在节点 B 的 shell 中向节点 A 的短地址发送请求 twr req C8:0C [twr]: start ranging第三步观察测距结果测距完成后两个节点都会输出一行 JSON 格式的结果 {t: 55158, src: 02:A1, dst: C8:0C, d_cm: 39}字段含义对应 control.h 中的uwb_core_rng_data_t字段含义t测距完成时的时间戳mssrc发起方短地址dst响应方短地址d_cm估算距离厘米tof/los/rssi/fppl仅启用uwb-core_rng_trx_info时输出飞行时间、视距估计、RSSI、首径相位损耗twr 命令详解协议、次数与间隔默认使用twr-ss单边双向测距Single-Sided TWR。查看完整帮助 twr req --help Usage: twr req short_addr [-p proto] [-c count] [-h][-i ms interval] - short_addr: short address of request destination - count: number of requests (default: 1) - ms interval: wait interval milliseconds between requests(default: 1000) - proto: twr protocol (ss|ss-ext|ss-ack|ds|ds-ext, default: ss) twr lst on: start listening for ranging requests twr lst off: stop listening for ranging requests参数解析逻辑位于 twr_shell.c 的_twr_handlershort_addr目标短地址形如C8:0C必须是十六进制字节对冒号分隔且不能为00:00-c count连续测距次数默认 1-i ms interval两次请求之间的等待间隔毫秒默认 1000-p proto测距协议五个取值对应 control.h 中的twr_protocol_t枚举取值协议说明ssUWB_DATA_CODE_SS_TWR单边 TWR默认ss-ackUWB_DATA_CODE_SS_TWR_ACK单边 TWR响应为硬件 ACKss-extUWB_DATA_CODE_SS_TWR_EXT单边 TWR扩展帧dsUWB_DATA_CODE_DS_TWR双边 TWRDouble-Sidedds-extUWB_DATA_CODE_DS_TWR_EXT双边 TWR扩展帧twr lst on/off分别调用uwb_core_rng_listen_enable()/disable()控制监听状态。连续测距示例以 10ms 间隔连续请求 5 次采用默认ss协议 twr req C8:0C -c 5 -i 10 [twr]: start ranging {t: 251588, src: 02:A1, dst: C8:0C, d_cm: 38} {t: 251600, src: 02:A1, dst: C8:0C, d_cm: 37} {t: 251610, src: 02:A1, dst: C8:0C, d_cm: 38} {t: 251620, src: 02:A1, dst: C8:0C, d_cm: 37}切换为双边测距协议ds twr req C8:0C -c 5 -i 10 -p ds [twr]: start ranging {t: 312513, src: C8:0C, dst: 02:A1, d_cm: 36} {t: 312525, src: C8:0C, dst: 02:A1, d_cm: 37} {t: 312535, src: C8:0C, dst: 02:A1, d_cm: 35} {t: 312545, src: C8:0C, dst: 02:A1, d_cm: 35}注意ds协议下结果行的src/dst与ss相反从 control.c 的_complete_cb注释可知ss 模式下最后一帧的 src 是发起方而 ds 模式下最后一帧保存的是响应方地址因此在双节点输出中呈现交换现象。另外启用CONFIG_TWR_SHELL_BLOCKING默认开启见 control.h后twr req会阻塞 shell 直到所有请求完成便于脚本化采集。IoT-LAB 云端实验在真实测试床上跑测距twr-aloha 可以直接部署到 IoT-LAB 这类公开测试床。原文给出的流程如下。前置条件安装 iotlab-cli 工具$ pip install iotlabcli在 IoT-LAB 测试床官网注册账户认证$ iotlab-auth --user username --password password提交实验提交一个 60 分钟、包含 2 块 dwm1001 板卡的实验站点选择saclay$ iotlab-experiment submit -n twr-aloha -d 60 -l 2,archidwm1001:dw1000sitesaclay等待实验进入 Running 状态$ iotlab-experiment wait --timeout 30 --cancel-on-timeout注意若上述命令返回Timeout reached, cancelling experiment exp_id说明节点资源暂时不可用请稍后重新提交实验。获取实验节点列表$ iotlab-experiment --jmespathitems[*].network_address | sort() get --nodes [ dwm1001-1.saclay.iot-lab.info, dwm1001-10.saclay.iot-lab.info ]烧录时需将IOTLAB_NODE设置为上述任一节点例如第一个节点$ IOTLAB_NODEdwm1001-2.saclay.iot-lab.info make -C examples/advanced/twr_aloha/ flash term -j释放资源实验结束后停止实验以释放节点$ iotlab-experiment stop自动测试用 riotctrl 脚本化 UWB 实验示例内置了基于riotctrl的自动化冒烟测试。前置依赖$ pip install rioctrl pyserial运行测试$ make -C examples/advanced/twr_aloha flash test-with-config测试用例位于 tests-with-config/01-run.py覆盖三项基本行为test_ifconfig解析ifconfig输出校验 PAN ID 为DE:CA、信道号为默认的5且长短地址均存在test_listen验证twr lst on/off的返回信息test_req验证twr req默认参数目标ff:ff能触发[twr]: start ranging。配套的 twr_shell.py 提供了可复用的TwrCmd交互类twr_listen(on...)、twr_req(addr, count, interval, proto, ...)、ifconfig()等封装并借助TwrIfconfigParser把ifconfig文本解析为结构化字典netif/hwaddr/hwaddr64/panid/channel。正如原 README 所述该ShellInteraction可用于编写更复杂的 UWB 实验脚本或回归测试例如循环切换协议、改变间隔、采集多组d_cm数据用于误差分析。小结twr-aloha 是理解 RIOT 上 UWB 双向测距的极佳入口它把 uwb-core 包的初始化、五种 TWR 协议的模块化编译、事件驱动的测距回调、shell 交互与 riotctrl 自动化测试完整串联起来。无论你是在本地用两块 dwm1001 做厘米级测距实验还是借助 IoT-LAB 做大规模远程测试都可以直接复用本示例的命令体系与代码骨架。进一步深入时可继续阅读 pkg/uwb-core/contrib/uwb_core.c 与 pkg/uwb-core/include/uwb_core.h 了解 uwb-core 移植层实现并结合各协议包的syscfg_*.h配置头位于 pkg/uwb-core/include/dpl_syscfg按需裁剪功能。【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询