uwb 原厂方案,Pdoa 原来做机器人跟随功能用的,懂的人看图都懂, 带开发资料。 http://blog.chinaunix.net/uid-27875-id-5827821.html 包括windows上的评估程序以及程序源码 + archor/tag的固件源码 + 串口开发协议和文档, 我这边也有 arm linux端 源码可以参考

"玩过机器人跟随项目的兄弟应该都见过这种场景:几台设备嘀嘀嘀互相定位,主机实时追踪从机方位。这背后的核心技术之一就是UWB的PDoA(相位差到达角)测向。原厂方案里其实藏着不少干货,咱们今天直接拆解实战代码。

先看这个PDOA_Value处理函数(截取自锚点固件):

void process_pdoa(int16_t raw_phase_diff) {
    float angle_rad = (raw_phase_diff * M_PI) / 32768.0f;
    current_angle = angle_rad * (180.0f / M_PI);
    
    // 滑动窗口滤波
    static float history[5];
    memmove(history, history+1, 4*sizeof(float));
    history[4] = current_angle;
    
    float sum = 0;
    for(uint8_t i=0; i<5; i++) sum += history[i];
    filtered_angle = sum / 5.0f;
}

这短短二十行代码干了三件大事:把原始相位差转成角度值,处理±180度边界问题,外加一个滑动平均滤波。注意那个32768的魔数——其实对应着16位有符号数的最大值,说明原厂直接用了ADC的原始数据。

串口协议里有个关键帧格式:

AA 01 [X_H][X_L] [Y_H][Y_L] [ANG_H][ANG_L] [STATUS] 55

咱们用Python解包可以这么玩:

def parse_frame(data):
    if data[0]==0xAA and data[-1]==0x55:
        x = (data[2]<<8 | data[3])/100.0
        y = (data[4]<<8 | data[5])/100.0
        angle = (data[6]<<8 | data[7]) - (0x10000 if data[6]>0x7F else 0)
        return {'x':x, 'y':y, 'angle':angle/100.0}

这种定点数处理方式在嵌入式里很常见,注意符号位的特殊处理。当角度值超过32767时会自动补成负数,和前面的C代码形成闭环。

原厂固件配置里有组神秘参数:

#define ANT_DELAY 16456 // 天线延迟,皮秒级
#define CALI_OFFSET -12.3 // 安装误差补偿

校准天线延迟时得用时域反射计实测,而安装补偿建议用转台实测后反向修正。别小看这几个参数,实测中能让角度精度从±15°提升到±3°。

uwb 原厂方案,Pdoa 原来做机器人跟随功能用的,懂的人看图都懂, 带开发资料。 http://blog.chinaunix.net/uid-27875-id-5827821.html 包括windows上的评估程序以及程序源码 + archor/tag的固件源码 + 串口开发协议和文档, 我这边也有 arm linux端 源码可以参考

ARM Linux端的处理更有意思:

ioctl(fd, TIOCMIWAIT, TIOCM_CD); // 阻塞等待载波检测

这个系统调用在检测到UWB脉冲时才会解除阻塞,比轮询方式省下80%的CPU占用。配合内核的HCI层驱动,实测定位更新率能跑到200Hz+。

配套的Windows评估工具其实是个宝藏,它的3D视图用了DirectX的粒子特效,但核心算法和Linux版本同源。建议对比两个平台的serial_monitor实现,能学到不少跨平台开发技巧。

想自己魔改的话,重点看固件里的pdoa_calibration.S汇编文件。原厂用定点DSP指令做了相位补偿运算,改这里能突破官方标称的测距范围(当然会牺牲精度)。

最后提醒下:玩UWB定位记得穿防静电服。别问我怎么知道的——说多了都是板子冒青烟的故事。"

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐