You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32 UWB DW1000多标签室内定位干扰问题及代码求助

多标签UWB室内定位干扰问题解决与优化代码

问题根源

多标签无规则同时发送UWB测距信号时,会引发信道冲突,导致测距数据丢失或误差剧增。原代码未采用时隙协调机制,所有标签随机发起测距请求,是干扰的核心原因。

解决方案

  1. 启用TDMA时隙协调:通过DW1000Ranging库的锚点主动协调模式,让锚点统一调度各标签的测距时间,避免信号重叠。
  2. 启用测距数据过滤:开启库内的平滑过滤功能,减少环境干扰带来的测距波动。
  3. 统一通信模式:所有设备使用相同的通信模式,优先选择MODE_LONGDATA_RANGE_ACCURACY平衡测距精度和抗干扰性。
  4. 确保设备地址唯一性:每个标签和锚点必须使用唯一的64位MAC地址,避免地址冲突。

优化后的锚点代码

#include <SPI.h>
#include "DW1000Ranging.h"

// 锚点唯一MAC地址,每个锚点需修改为不同值
#define ANCHOR_ADD "88:17:5B:D5:A9:9A:E2:9C"

// ESP32 SPI引脚定义
#define SPI_SCK 18
#define SPI_MISO 19
#define SPI_MOSI 23
#define DW_CS 4

// DW1000模块引脚
const uint8_t PIN_RST = 27; // 复位引脚
const uint8_t PIN_IRQ = 34; // 中断引脚
const uint8_t PIN_SS = 4;   // SPI片选引脚

void setup()
{
    Serial.begin(115200);
    delay(1000);
    
    SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI);
    DW1000Ranging.initCommunication(PIN_RST, PIN_SS, PIN_IRQ);
    
    // 绑定回调函数
    DW1000Ranging.attachNewRange(newRange);
    DW1000Ranging.attachBlinkDevice(newBlink);
    DW1000Ranging.attachInactiveDevice(inactiveDevice);
    
    // 启用测距数据平滑过滤
    DW1000Ranging.useRangeFilter(true);

    // 启动为锚点,第三个参数设为true开启主动协调模式(TDMA调度)
    DW1000Ranging.startAsAnchor(ANCHOR_ADD, DW1000.MODE_LONGDATA_RANGE_ACCURACY, true);
}

void loop()
{
    DW1000Ranging.loop();
}

void newRange()
{
    Serial.print("标签短地址: ");
    Serial.print(DW1000Ranging.getDistantDevice()->getShortAddress(), HEX);
    Serial.print("\t 测距值: ");
    Serial.print(DW1000Ranging.getDistantDevice()->getRange());
    Serial.print(" m");
    Serial.print("\t 接收功率: ");
    Serial.print(DW1000Ranging.getDistantDevice()->getRXPower());
    Serial.println(" dBm");
}

void newBlink(DW1000Device *device)
{
    Serial.print("发现新设备,短地址: ");
    Serial.println(device->getShortAddress(), HEX);
}

void inactiveDevice(DW1000Device *device)
{
    Serial.print("移除离线设备,短地址: ");
    Serial.println(device->getShortAddress(), HEX);
}

优化后的标签代码

#include <SPI.h>
#include "DW1000Ranging.h"

// 标签唯一MAC地址,每个标签需修改为不同值
#define TAG_ADD "7F:00:22:EA:82:60:3B:9C"

// ESP32 SPI引脚定义
#define SPI_SCK 18
#define SPI_MISO 19
#define SPI_MOSI 23
#define DW_CS 4

// DW1000模块引脚
const uint8_t PIN_RST = 27; // 复位引脚
const uint8_t PIN_IRQ = 34; // 中断引脚
const uint8_t PIN_SS = 4;   // SPI片选引脚

void setup()
{
    Serial.begin(115200);
    delay(1000);
    
    SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI);
    DW1000Ranging.initCommunication(PIN_RST, PIN_SS, PIN_IRQ);
    
    // 绑定回调函数
    DW1000Ranging.attachNewRange(newRange);
    DW1000Ranging.attachNewDevice(newDevice);
    DW1000Ranging.attachInactiveDevice(inactiveDevice);
    
    // 启用测距数据平滑过滤
    DW1000Ranging.useRangeFilter(true);

    // 启动为标签,使用与锚点一致的通信模式
    DW1000Ranging.startAsTag(TAG_ADD, DW1000.MODE_LONGDATA_RANGE_ACCURACY);
}

void loop()
{
    DW1000Ranging.loop();
}

void newRange()
{
    Serial.print("锚点短地址: ");
    Serial.print(DW1000Ranging.getDistantDevice()->getShortAddress(), HEX);
    Serial.print("\t 测距值: ");
    Serial.print(DW1000Ranging.getDistantDevice()->getRange());
    Serial.print(" m");
    Serial.print("\t 接收功率: ");
    Serial.print(DW1000Ranging.getDistantDevice()->getRXPower());
    Serial.println(" dBm");
}

void newDevice(DW1000Device *device)
{
    Serial.print("发现新锚点,短地址: ");
    Serial.println(device->getShortAddress(), HEX);
}

void inactiveDevice(DW1000Device *device)
{
    Serial.print("移除离线锚点,短地址: ");
    Serial.println(device->getShortAddress(), HEX);
}

额外注意事项

  • 所有锚点和标签的MAC地址必须唯一,可通过模块自带地址或自行生成。
  • 建议使用3个及以上锚点实现三角定位,提升位置计算精度。
  • 若仍存在干扰,可尝试调整UWB信道(通过DW1000.setChannel()函数),避开环境中的其他无线信号。

内容的提问来源于stack exchange,提问作者Anonym48978

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 05:01:02