51uwb.cn

标题: 【开源项目】TWR算法-多基站多标签固件 [打印本页]

作者: 蓝点无限    时间: 2021-8-17 07:59
标题: 【开源项目】TWR算法-多基站多标签固件

初衷:           
       随着UWB大力发展,国内实际应用逐步落地。 对于UWB的需求已经不是停留在实验测试阶段,
       目前逐步进入商用大环境,很多厂商特殊需要一定要选用TWR,无法接收TDOA。
       但是受限于目前大部分TWR方案一般只能支持3-4基站定位,很多厂商无法实现UWB项目快速落地。
       基于以上,我们打算开源一套多基站多标签固件,方便高需求客户见解和二次开发。
       同时,对于学习测试的客户,建议依然使用基本版本3-4基站定位,这种多基站多标签实现增加了更多逻辑部分的实现,不适合入门学习。

软件流程:
(, 下载次数: 2173)

关键流程说明:
除了完成基本测距以外,这里主要需要完成动态识别功能,标签需要动态识别它周围的基站,时刻可以保持与周围3-4个基站进行测距。

固件Base:
这个固件依然基于我们的开源框架项目51uwb_base进行二次开发,
更多开源框架相关参见链接:http://51uwb.cn/forum.php?mod=viewthread&tid=165&extra=page%3D1


固件匹配Python开源上位机:
上位机使用我们目前已经开源的纯python版本上位机,相关链接:http://51uwb.cn/forum.php?mod=viewthread&tid=401&extra=page%3D1


固件重要问题说明:
1 串口输出,不同以往,这里用的是标签串口
2 上位机接口目前是TCP,需要使用串口转TCP工具:串口转TCP参见视频



固件源码:
固件源码已经放到git上,V1.0 版本开发完成,请详细看下面的描述
网页链接:https://tuzhuke@bitbucket.org/tuzhuke/bp30_multianthor
git下载  : git clone https://tuzhuke@bitbucket.org/tuzhuke/bp30_multianthor.git


固件开发记录
Day1:
githash:a387f5cdbbff3b6b1c818eaf459b4ad2a6fe24c0

主要完成功能,标签发送广播信号,基站接收广播信号。标签发送的广播信号需要包含已经识别的基站地址。

Step1 在标签中定义一个存放基站的结构体数组
  1. struct Anthor_Information
  2. {
  3.      uint16 short_address;//基站16bit 短地址
  4.      uint16 distance;//距离信息,高8 低8bit
  5.      uint32 last_time;//上次通信时间
  6.      uint8  rssi_info;//上次通信RSSI值记录
  7.     unsigned char alive; //是否已经识别或者是否已经丢失
  8. } anthor_info[MAX_ANTHOR];
复制代码
Step2 在标签中发送广播信号,广播信号包含了已经识别的基站,如果基站收到这个信息,发现数据包中已经有自己地址就无需反馈,否则反馈信息给标签。函数试下如下:
  1. /*******************************************************************************
  2. * 函数名  : BPhero_TAG_Broadcast
  3. * 描述    : 标签启动发送广播信息给各个基站,信息数据包包括了基站短地址
  4. * 输入    : 无
  5. * 输出    : 无
  6. * 返回值  : 无
  7. * 说明    : 发送broadcast信息(B信息)给所有基站
  8. *******************************************************************************/

  9. void BPhero_TAG_Broadcast(void)
  10. {
  11.     uint8 index = 0 ;
  12.     uint8 strlen = 0;
  13.     msg_f_send.destAddr[0] = 0xFF;
  14.     msg_f_send.destAddr[1] = 0xFF;

  15.     msg_f_send.seqNum = distance_seqnum;
  16.     msg_f_send.messageData[0]='B';//broadcast message
  17.     strlen = strlen + 1;

  18.     uint8 *pAnthor_Str = &msg_f_send.messageData[1];
  19.     //后面跟基站信息
  20.     for(index = 0 ; index < MAX_ANTHOR; index++)
  21.     {
  22.         if(anthor_info[index].alive == 1)
  23.         {
  24.             sprintf(pAnthor_Str, "%04X:",anthor_info[index].short_address);
  25.             pAnthor_Str = pAnthor_Str + 5;
  26.             strlen = strlen + 5;
  27.         }
  28.     }

  29.     //GPIOB.5设定,兼容之前带PA的模块-->如需求请联系www.51uwb.cn
  30.     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, !GPIO_PIN_RESET);//PA node ,enable pa
  31.     //写入数据
  32.     dwt_writetxdata(11 + strlen,(uint8 *)&msg_f_send, 0) ;  // write the frame data
  33.     dwt_writetxfctrl(11 + strlen, 0);
  34.     dwt_starttx(DWT_START_TX_IMMEDIATE);        //启动发送
  35.     while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))        //等待发送完成
  36.     { };
  37.     dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS);//清除发送完成标志
  38.     poll_tx_ts = get_tx_timestamp_u64();//读取发送时间戳

  39.     //清空接收缓存,待收到数据时使用
  40.     for (int i = 0 ; i < FRAME_LEN_MAX; i++ )
  41.     {
  42.         rx_buffer[i] = '\0';
  43.     }
  44.     dwt_enableframefilter(DWT_FF_DATA_EN);        //启动帧过滤功能
  45.     dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS*10);//设定接收延时函数
  46.     dwt_rxenable(0);//启动接收机
  47.     //sequence控制
  48.     if(++distance_seqnum == 255)
  49.         distance_seqnum = 0;
  50. }
复制代码
Step3 在标签中调用上述函数广播发送,我们使用之前代码定时器回调函数,通过回调函数,可以周期性发送
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  2. {
  3.     if (htim->Instance == htim3.Instance)
  4.     {
  5.         HAL_TIM_Base_Stop(&htim3);
  6.         {
  7.             dwt_forcetrxoff();
  8.             TAG_SendOut_Messge();
  9.             BPhero_TAG_Broadcast();
  10.         }

  11.         HAL_TIM_Base_Start(&htim3);
  12.     }
  13. }
复制代码
Step4: 在基站接收broadcast “B”信号,在rx_main.c中收到“B信号”后打印一串字符。
  1.             case 'B':
  2.                 printf("receive B message\n");
  3.                 break;
复制代码
分别编译标签和基站的进行测试。串口数据如下图,表明数据可以正常收到。
(, 下载次数: 2175)

Day2:
githash: e23e4e1e3bf681d1125036e5dbbf5a07fe363fdc

主要完成基站收到B信息后,以R信息回复给标签,标签收到信息提取短地址,并更新自己的结构体数组

Step1 修改标签广播格式,在数据包中增加已知基站的个数。
  1.     //后面跟基站信息
  2.     for(index = 0 ; index < MAX_ANTHOR; index++)
  3.     {
  4.         if(anthor_info[index].alive == 1)
  5.         {
  6.             sprintf(pAnthor_Str, "%04X:",anthor_info[index].short_address);
  7.             pAnthor_Str = pAnthor_Str + 5;
  8.             strlen = strlen + 5;
  9.                                           anthor_count++;
  10.         }
  11.     }
  12.                 msg_f_send.messageData[1] = anthor_count;
复制代码
Step2: 修改基站接收处理,目前只简单反馈信息给标签,以“R”信息回复到标签,同时将标签数据包中的“现有基站个数”打印出来用于debug
  1.             case 'B':
  2.                 printf("receive B anthor = %d\n",msg_f->messageData[1]);
  3.                 {
  4.                     msg_f_send.messageData[0]='R';//Poll message
  5.                     //后面修改这个数据长度
  6.                     dwt_writetxdata(11 + 1, (uint8 *)&msg_f_send, 0) ; // write the frame data
  7.                     dwt_writetxfctrl(11 + 1, 0);
  8.                     dwt_starttx(DWT_START_TX_IMMEDIATE);
  9.                     while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))
  10.                     { };
  11.                 }
  12.                 break;
复制代码
Step3: 标签收到信息,提取基站信息中的地址
  1.    case 'R':
  2.   address = msg_f_recv->sourceAddr[1]<<8|msg_f_recv->sourceAddr[0];
  3.   printf("receive R message 0x%04X\n",address);
  4.   Update_Anthor_Info(address);
  5.   break;
复制代码
  1. uint8 Update_Anthor_Info(uint32 shortaddress)
  2. {
  3.    uint8 index = 0;
  4.    printf("shortaddress = 0x%04X\n",shortaddress);
  5.    //后面跟基站信息
  6.     for(index = 0 ; index < MAX_ANTHOR; index++)
  7.     {
  8.         if(anthor_info[index].alive == 0)
  9.         {
  10.                                         anthor_info[index].short_address = shortaddress;
  11.                                         anthor_info[index].alive = 1;        
  12.                                         return 1;
  13.         }
  14.     }
  15.                 return 0;
  16. }
复制代码
Day3:
githash:4d1b64584706426c2a71174d7026cbe7696f2a4b

今天完成了基本功能开发,可以作为V1.0版本。
主要开发内容:基站解析标签发送的广播B信号,标签汇总R信号基站,如果收到R基站大于等于4个开始测距,如果测距的时候发现基站丢失,重新启动广播B信号。
1 基站解析标签广播B信号,匹配是否有自己的地址,有地址忽略,没有地址回复R信号
  1.             case 'B':
  2.                 printf("receive B anthor = %d\n",msg_f->messageData[1]);
  3.                 Num_Anthor = msg_f->messageData[1];
  4.                 Sourceaddress =  msg_f->sourceAddr[1]<<8| msg_f->sourceAddr[0];
  5.                 pAnthor_Str = &msg_f->messageData[2];
  6.                 match_flag = 0;
  7.                 for (Index = 0; Index < Num_Anthor; Index++)
  8.                 {
  9.                     printf("receive address = %04X\n",(pAnthor_Str[1]<<8|pAnthor_Str[0]));

  10.                     if(SHORT_ADDR == (pAnthor_Str[1]<<8|pAnthor_Str[0])) //匹配成功
  11.                     {
  12.                         printf("match\n");
  13.                         match_flag = 1;

  14.                     }
  15.                     pAnthor_Str = pAnthor_Str +3 ;
  16.                 }

  17.                 if(match_flag == 0)//没有匹配到,发送一个反馈信息
  18.                 {
  19.                     msg_f_send.messageData[0]='R';//Poll message
  20.                     //后面修改这个数据长度
  21.                     dwt_writetxdata(11 + 1, (uint8 *)&msg_f_send, 0) ; // write the frame data
  22.                     dwt_writetxfctrl(11 + 1, 0);
  23.                     dwt_starttx(DWT_START_TX_IMMEDIATE);
  24.                     while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))
  25.                     { };
  26.                 }
  27.                 break;
复制代码
2 标签汇总基站反馈的R信号,其实这部分代码在day2 已经完成,无需修改。
3 判断收到R信号个数,这个在定时广播里判断的。如果小于4,持续执行广播收集。
  1.         HAL_TIM_Base_Stop(&htim3);
  2.         {
  3.             dwt_forcetrxoff();
  4.             if(Count_Anthor() < 4)
  5.             {
  6.                 gProcess_Dis = 0;
  7.                 BPhero_TAG_Broadcast();
  8.                 gSend_index = 0;

  9.             }
复制代码
具体实现函数
  1. uint8 Count_Anthor()
  2. {
  3.     uint8 index = 0;
  4.     uint8 count = 0;
  5.     //后面跟基站信息
  6.     for(index = 0 ; index < MAX_ANTHOR; index++)
  7.     {
  8.         if(anthor_info[index].alive == 1)
  9.         {
  10.             count++;
  11.         }
  12.     }
  13.     return count;
  14. }
复制代码

3 当R信号基站数量等于4个,开始启动测距
  1.             if(Count_Anthor() < 4)
  2.             {
  3.                 gProcess_Dis = 0;
  4.                 BPhero_TAG_Broadcast();
  5.                 gSend_index = 0;

  6.             }
  7.             else
  8.             {
  9.                 if(gSend_index ==Count_Anthor())
  10.                 {
  11.                     gSend_index= 0;
  12.                     Send_Dis_To_Anthor0();
  13.                 } else
  14.                 {
  15.                     gProcess_Dis = 1;
  16.                     BPhero_Distance_Measure_Specail_ANTHOR();// 从1 2 3 4发送
  17.                 }
  18.             }
复制代码
这里的Send_Dis_To_Anthor0()是沿用之前的函数名,其实在这个里面实现了数据格式组装并在串口打印,以及调用函数在液晶显示。
BPhero_Distance_Measure_Specail_ANTHOR()主要功能就是启动测距,测距对象是收集到R信号的基站。
  1. void BPhero_Distance_Measure_Specail_ANTHOR(void)
  2. {
  3.     uint16 destaddress = Find_Address();
  4.    // printf("Send Index = %d, Address = 0x%04X\n",gSend_index,destaddress);
  5.     msg_f_send.destAddr[0] =(destaddress) &0xFF;
  6.     msg_f_send.destAddr[1] =  ((destaddress)>>8) &0xFF;

  7.     msg_f_send.seqNum = distance_seqnum;
  8.     msg_f_send.messageData[0]='P';//Poll message

  9.     //GPIOB.5设定,兼容之前带PA的模块-->如需求请联系www.51uwb.cn
  10.     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, !GPIO_PIN_RESET);//PA node ,enable pa
  11.     //写入数据
  12.     dwt_writetxdata(12,(uint8 *)&msg_f_send, 0) ;  // write the frame data
  13.     dwt_writetxfctrl(12, 0);
  14.     dwt_starttx(DWT_START_TX_IMMEDIATE);        //启动发送
  15.     while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))        //等待发送完成
  16.     { };
  17.     dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS);//清除发送完成标志
  18.     poll_tx_ts = get_tx_timestamp_u64();//读取发送时间戳

  19.     //清空接收缓存,待收到数据时使用
  20.     for (int i = 0 ; i < FRAME_LEN_MAX; i++ )
  21.     {
  22.         rx_buffer[i] = '\0';
  23.     }
  24.     dwt_enableframefilter(DWT_FF_DATA_EN);        //启动帧过滤功能
  25.     dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS);//设定接收延时函数
  26.     dwt_rxenable(0);//启动接收机
  27.     //sequence控制
  28.     if(++distance_seqnum == 255)
  29.         distance_seqnum = 0;
  30. }
复制代码
4 中断回调函数中处理timeout,如果测距对象基站没有反馈,标签发生timeout中断,则立即将该基站islive 设置为0,带下次统计,发现基站数量小于4,则标签重新发送广播信号收集基站。
  1.    else
  2.     {
  3.         if(gProcess_Dis == 1)
  4.         {
  5.             printf("timeout address 0x%04X\n",Find_Address());
  6.             Delete_Anthor(Find_Address());
  7.         }
复制代码
其它更新:
git hash:4892896b3d09e6009dfbe3d537e866f2c94d2d36

修改了一个祖传代码bug,使用了野指针....
git hash:d2e01e118126c9ce9c84337126db3e92d23ed3ba

修改了UWB中断,让UWB中断只处理接收成功和timeout两种事件,其他事件均不处理

同时,调试的时候发现上位机当收到异常数据无法处理,导致异常退出
  1. def twr_main(input_string):
  2.     print(input_string)
  3.     error_flag, result_dic = Process_String_Before_Udp(input_string)
  4.     if error_flag == 0:
  5.         [location_result, location_seq, location_addr, location_x, location_y] = Compute_Location(result_dic)
  6.         return location_result, location_seq, location_addr, location_x, location_y
  7.     return 0, 0, 0, 0, 0
复制代码
当发生异常,增加return 0, 0, 0, 0, 0,代码同步更新到上位机部分链接。


自此,通过三天,零散的时间,开发出一套可以动态识别基站并完成测距的固件代码,代码编写时间和测试debug时间基本是1:5,更多的是细节考虑步骤导致异常.
开发过程中遇到一个很诡异的异常,当其中一个基站地址将短地址设置为0x0006后,标签识别成功但是无法完成测距,通过加debug信息最终发现是由于标签测距完成后有一个滤波器,滤波器设置的最大基站数目为5,导致数组越界访问。

三天零散的开发时间,可以说这次开发非常顺利,一是由于有一个比较完备的代码框架,基于之前的代码框架开发,可以减少对于底层的依赖,只需要实现逻辑部分即可。而逻辑部分其实在很早之前就有想法,通过想法落实到流程图,规划每一步要做什么。目前的代码还没有切合到流程图上,流程图中,我的想法是即便有4个基站可以定位,依然周期性的发送广播,发现更多的基站,选取附近的基站做参考。 由于时间关系,这个部分可能留给各位看官了。


关于硬件,目前我们的代码,基于硬件是我们自研的BP30,使用主控是F4。同时可以无缝在BP400 上使用。 如果没有我们的硬件,可以适当进行移植,匹配主控。

最后,欢迎交流分享!

写在最后,重要提示!!
我们的开源项目,工程以git 管理,工程逐步迭代,逐步增加功能,使用代码请参考hash提交版本。
TWR算法-多基站多标签固件 V1.0 版本 GIT HASH为:d887386e8ed3d7ac978234c03e3eaf876a058631










作者: 兔子    时间: 2021-9-11 23:11
可以简单说说“很多厂商特殊需要一定要选用TWR,无法接收TDOA。”的原因吗楼主~
作者: 蓝点无限    时间: 2021-9-12 11:00
兔子 发表于 2021-9-11 23:11
可以简单说说“很多厂商特殊需要一定要选用TWR,无法接收TDOA。”的原因吗楼主~

接触过做煤矿项目的工程师,他们有个要求,单个基站存在的情况的时候,要获取到标签和这个基站的距离。TDOA这个做不到
作者: sdfb6868    时间: 2021-9-13 02:54
蓝点无限 发表于 2021-9-12 11:00
接触过做煤矿项目的工程师,他们有个要求,单个基站存在的情况的时候,要获取到标签和这个基站的距离。TD ...

TDOA只解决了“他在哪”不能解决“我在哪”的问题。标签单向广播,无法反向给标签传位置信息,使得基站知道标签在哪里,而标签自己不知道在哪里,应用到无人平台后无法解决“我在哪”的问题。TDOA不适用于此类场景
作者: bingnuo    时间: 2021-9-13 11:40
使用你们的模块与代码怎么标签出现重启现象呢,
作者: 蓝点无限    时间: 2021-9-13 22:00
sdfb6868 发表于 2021-9-13 02:54
TDOA只解决了“他在哪”不能解决“我在哪”的问题。标签单向广播,无法反向给标签传位置信息,使得基站知 ...

很形象,你说的这个是上行模式,其实下行模式可以解决“我在哪”的问题,下行模式就是GPS了,不过标签功耗较大,计算量也大了。

作者: 蓝点无限    时间: 2021-9-13 22:01
bingnuo 发表于 2021-9-13 11:40
使用你们的模块与代码怎么标签出现重启现象呢,

详细描述,或者提供一个完整的视频。
视频可以上传到B站,直接回复在论坛,论坛即可查看视频
作者: szmcumcu    时间: 2021-9-28 22:38
好资料,可惜下载不了,谢谢楼主的无私分享

作者: 兔子    时间: 2021-10-5 12:55
我的电脑编译的时候会提示缺少i2c_sw.h  需要手动在魔术棒的C/C++添加platform中的mpu9250到编译路径中
作者: 兔子    时间: 2021-10-5 13:56
蓝点无限 发表于 2021-9-13 22:01
详细描述,或者提供一个完整的视频。
视频可以上传到B站,直接回复在论坛,论坛即可查看视频

我现在用STLINK下载好固件后 串口都打印乱码  然后标签双红灯不闪烁   搜索基站功能失效
作者: 蓝点无限    时间: 2021-10-5 19:42
兔子 发表于 2021-10-5 13:56
我现在用STLINK下载好固件后 串口都打印乱码  然后标签双红灯不闪烁   搜索基站功能失效

切到帖子对应hash提交测试,默认下载是全部工程的最新提交。
截止回帖时,最新提交时数据融合部分,使用的晶振为12Mhz。
作者: 蓝点无限    时间: 2021-10-5 19:43
兔子 发表于 2021-10-5 12:55
我的电脑编译的时候会提示缺少i2c_sw.h  需要手动在魔术棒的C/C++添加platform中的mpu9250到编译路径中

感谢反馈,这个问题已经修复git hash:21ee4ff184f39a602f119fd203e5079a14ac73ad
作者: szmcumcu    时间: 2021-10-9 09:23
这个好资料,学习中,谢谢了
作者: gaojie_123123    时间: 2021-10-15 08:55

好资料,可惜下载不了,谢谢楼主的无私分享
作者: gaojie_123123    时间: 2021-10-15 08:55

好资料,可惜下载不了,谢谢楼主的无私分享,顶!!!!!!!!!!!!!!!1
作者: gaojie_123123    时间: 2021-10-15 08:57
好资料,可惜下载不了,谢谢楼主的无私分享,顶!!!!!!!!!!!!!!!1
作者: gaojie_123123    时间: 2021-10-15 08:57
好资料,可惜下载不了,谢谢楼主的无私分享,顶!!!!!!!!!!!!!!!1
作者: gaojie_123123    时间: 2021-10-15 08:58
好资料,可惜下载不了,谢谢楼主的无私分享,顶!!!!!!!!!!!!!!!1
作者: gaojie_123123    时间: 2021-10-15 08:58
好资料,可惜下载不了,谢谢楼主的无私分享,顶!!!!!!!!!!!!!!!1
作者: sd196821    时间: 2021-10-15 17:56
感谢楼主分享

作者: Aran    时间: 2021-10-17 20:51

好资料,可惜下载不了,谢谢楼主的无私分享,顶!!!!!!!!!!!!!!!1
作者: gaojie_123123    时间: 2021-10-21 13:35
请问上位机怎么打开啊?pycharm在哪下载啊?
作者: gaojie_123123    时间: 2021-10-21 13:37
请问上位机怎么打开啊?pycharm在哪下载啊?有人可以告诉我吗?谢谢!
作者: gaojie_123123    时间: 2021-10-21 13:38
gaojie_123123 发表于 2021-10-21 13:37
请问上位机怎么打开啊?pycharm在哪下载啊?有人可以告诉我吗?谢谢!

自己顶一下
作者: adviil    时间: 2021-11-17 10:03
谢谢楼主分享!!
作者: yiyayiya    时间: 2021-12-7 11:16
谢谢楼主分享,感谢。
作者: mengbinaaa    时间: 2022-1-3 22:56
感谢分享,顶一个
作者: nghai    时间: 2022-1-13 22:48
感谢分享!
作者: sage    时间: 2022-2-9 14:32
我毕设和UWB室内定位相关且也是用Python的可以适用吗?
作者: SeanW    时间: 2022-2-22 11:08
谢谢分享,学习一下
作者: 兔子    时间: 2022-3-4 10:05
请问BP-400可以使用d887386e8ed3d7ac978234c03e3eaf876a058631这套固件么
作者: sunmessi    时间: 2022-3-17 18:50
不错不错 厉害
作者: sunmessi    时间: 2022-3-17 18:51
赞赞赞赞赞
作者: 翻滚吧六宝    时间: 2022-4-20 09:48
蓝点无限 发表于 2021-9-12 11:00
接触过做煤矿项目的工程师,他们有个要求,单个基站存在的情况的时候,要获取到标签和这个基站的距离。TD ...

你好,我想问一下,当多个基站收到广播信息发送“R”时,不会产生碰撞吗
作者: 蓝点无限    时间: 2022-4-20 22:55
翻滚吧六宝 发表于 2022-4-20 09:48
你好,我想问一下,当多个基站收到广播信息发送“R”时,不会产生碰撞吗

会存在一定的可能性
当时如果基站本身布设距离有差异,最近的基站会首先回复,存在一点时间差
作者: allenxu    时间: 2022-5-2 12:32
非常好的资料,这个可以实现多标签定位吗?
作者: duanzw    时间: 2022-5-18 14:26
学习学习,目前正在研究UWB
作者: 巧克力夹心派    时间: 2022-5-27 15:22
https://tuzhuke@bitbucket.org/tuzhuke/bp30_multianthor.git固件源码打开是空白页
作者: sd196821    时间: 2022-6-7 07:23
多谢楼主的分享
作者: 巧克力夹心派    时间: 2022-6-7 16:10
有没有固件源码能下的大佬,能不能教教我,下载不了呀
作者: iampest    时间: 2022-6-10 17:54
谢谢分享。
作者: iampest    时间: 2022-6-10 17:58
感谢楼主分享
作者: 任性    时间: 2022-6-29 18:34
好资料,可惜下载不了,谢谢楼主的无私分享
作者: chenjinping    时间: 2022-7-3 21:17

好资料,可惜下载不了,谢谢楼主的无私分享,顶!!!!!!!!!!!!!!!1
作者: nzshuai    时间: 2022-7-10 22:50
太强了太强了
作者: liyc    时间: 2022-7-14 13:23
感谢楼主的分享
作者: Felicia    时间: 2022-8-5 14:53
感谢,很有帮助

作者: yyjdelete    时间: 2022-8-5 15:16
谢谢分享..
作者: tansf    时间: 2022-8-8 03:01
进了论坛才发现,我们项目目前的情况都太基础了,路还远着呢
作者: chenx0422    时间: 2022-8-25 22:17
好资料!!!!!!!!!!!!!!!!!!
作者: spike    时间: 2022-8-31 20:08
金钱不够
作者: uwb158    时间: 2022-9-14 14:31
谢谢楼主的无私分享
作者: tai888    时间: 2022-9-26 15:29
很棒的分享,謝謝樓主。
作者: AAAaaa123456    时间: 2022-9-27 08:17
这个积分是真的难搞
作者: 馒头卡    时间: 2022-10-3 18:24
多谢分享,非常感谢
作者: uwbzpp    时间: 2022-11-3 19:56

好资料,可惜下载不了,谢谢楼主的无私分享
作者: sscy    时间: 2023-2-2 18:17
感谢大佬分享
作者: anzijie    时间: 2023-2-3 16:09
请问源码开放吗,想下载学习 感谢
作者: zzb980116    时间: 2023-3-1 23:30
牛啊!!!
作者: zzb980116    时间: 2023-3-1 23:31
牛啊!!!1
作者: zzb980116    时间: 2023-3-1 23:31
阿斯蒂芬发请求方法
作者: zzb980116    时间: 2023-3-1 23:31
123456767大大
作者: zzb980116    时间: 2023-3-1 23:32
:D:D:D:D
作者: zzb980116    时间: 2023-3-1 23:32
:lol:lol:lol:lol
作者: zzb980116    时间: 2023-3-1 23:33

作者: zzb980116    时间: 2023-3-1 23:34

作者: Ialab2023    时间: 2023-3-9 16:31

感謝代碼分享
作者: wuxy    时间: 2023-3-17 10:42
请问这个程序适用于什么硬件啊,有没有测试的开发板,或者的硬件接口说明
作者: wuxy    时间: 2023-3-17 11:07
有哪位大佬测试过这个多对多的固件吗,测试好几天了,没什么进展,都快奔溃了,团队都要放弃这个方案了
作者: wuxy    时间: 2023-3-17 11:10
有没有大佬可以提供技术支持的啊,有偿支持,需求很简单,就是实现多对多测距,不用定位,节点也不多,不大于10个节点,
作者: zhengxi    时间: 2023-3-17 13:33
git上的源码没找到,楼主,可否提供一下
作者: lzp    时间: 2023-3-17 17:41
蓝点无限 发表于 2021-9-13 22:01
详细描述,或者提供一个完整的视频。
视频可以上传到B站,直接回复在论坛,论坛即可查看视频

BP50可以实现这个吗
作者: z936931869    时间: 2023-4-6 09:17

感谢,感谢
作者: Sherlock    时间: 2023-5-5 11:35
多谢楼主的无私分享。请问上位机代码为什么用Python呢?用QT的话移植方便很多的
作者: njjbhv    时间: 2023-5-10 10:53

真大佬,感谢分享!
作者: ztx    时间: 2023-5-17 11:12
资料怎么下载不了

作者: Luoxuan    时间: 2023-5-17 16:02
谢谢分享!
作者: jkjinght    时间: 2023-7-22 13:48
感谢分享,感谢分享,感谢分享,
作者: jkjinght    时间: 2023-7-22 13:50
感谢分享,感谢分享,感谢分享,
作者: hsz123    时间: 2023-8-29 12:31
厉害厉害,学到了 感谢楼主
作者: help008    时间: 2023-10-12 23:10
谢谢,支持开源
作者: keven818    时间: 2023-11-30 22:39
可以试试,再接再励,好想要
作者: keven818    时间: 2023-11-30 22:40
可以试试,再接再励,Python,好期待哦哈哈
作者: luzb    时间: 2024-1-15 14:56
正好做实验室项目需要用到多基站切换的功能,跟着学习了好久,赞赞赞~~~
作者: liuyue    时间: 2024-1-31 18:15
感谢分享!
作者: 18671186057    时间: 2024-2-17 17:44
好资料,没得金币下载,先看看
作者: 吱吱吱    时间: 2024-4-19 09:08
好资料感谢分享
作者: catliker    时间: 2024-4-22 14:33
要怎么才能赚到积分啊?软件下不下来
作者: LJJ    时间: 2024-4-28 17:46
本帖最后由 LJJ 于 2024-4-28 17:48 编辑

C:\Users\DZ\Pictures\QQ截图20240428174313.png
我按照固件修改BPhero_Distance_Measure_Specail_ANTHOR函数,但是当断开将某个基站断电时,标签会一直向这个基站地址发送P信号,且无法判断到接收超时,这是为什么,求解答,谢谢
作者: zhengwei913    时间: 2024-5-6 17:01

这个好资料,学习中,谢谢了
作者: cheng6336    时间: 2024-5-20 17:27

谢谢分享,学习一下
作者: Sulayman    时间: 2024-7-16 09:28
太感谢了,写的真棒,好好研究一下~
作者: Sulayman    时间: 2024-7-16 09:28
能不能凑够10金币...我想下载
作者: 想起温柔沉默默    时间: 2024-7-19 17:43
感谢大佬分享
作者: 怪怪爱玩    时间: 2024-8-4 17:23
玩起来容易不?




欢迎光临 51uwb.cn (http://51uwb.cn/) Powered by Discuz! X3.3