51uwb.cn

标题: 【开源项目】纯Python TWR算法UWB上位机 [打印本页]

作者: 蓝点无限    时间: 2021-8-15 21:16
标题: 【开源项目】纯Python TWR算法UWB上位机


初衷:           
           进一步降低学习门槛,使用纯Python 编写GUI 上位机,Python 易于编程,算法资料算法丰富。  
          TWR 算法上位机一般使用Deca官方提供的GUI上位机,使用QT C++编写,代码臃肿,不适合学习,同时三边定位算法部分晦涩难懂。
          之前在论坛开源了底层固件,再次补充一个开源版本上位机,实现了全流程的开源。

界面预览:
(, 下载次数: 607)


源码文件:
1.twr_51uwb_v2.py  主函数入口,同时处理TCP连接和界面显示
2.twr_main.py 主要负责数据结构解析,并实现定位计算,这个文件有三边定位算法,大家可以替换尝试其他算法
3.Coordinate_process.py 基站坐标处理,匹配预设基站地址,确定基站坐标
4. globalvar.py 共享全局变量,主要多文件共享基站地址和坐标信息
5.mainwindow.py 界面文件,使用qtdesign 绘制,并使用pyuic 自动生成的文件

主要功能:
1 通过TCP 获取信息,串口转TCP参见视频

2 解析收到的数据并完成解算
3 在界面显示基站和标签相对位置
4 统计框中显示标签坐标
5 上位机支持多基站,并且可以根据checkbox 确认是否使能基站
6 支持调试接口,可以将想要的数据打印到调试界面
7 支持标签history 定位点数量设定,默认5,最大20
8 支持标签根据历史信息显示不同透明度

开发环境:
Python 3.6(64bit),推荐集成开发环境PyCharm 社区版
主要库:pyqt5,numpy

其他:
目前找的三边算法,只支持2D 定位,并且需要4个基站。大家可以根据需要替换定位算法。
  1. tril2d = Trilateration()
  2.         tril2d.setDistances(Info['distance'])
  3.         tril2d.setAnthorCoor(Info['anthor'])
  4.         result_x, result_y = tril2d.trilaterate2D()
复制代码
上述为实际定位过程,分别为1. 实例化一个类,2. 传入距离信息,3.传入对应基站坐标信息,4启动定位并获取定位结果


数据格式说明:
&&&:20$0005:AD$0001:0080:11#0002:0080:22#0003:0081:33#0004:0079:44$AA##
TODO

源码:

(, 下载次数: 300)


改上位机可以匹配我们全新开源固件,可以应用与隧道等复杂定位场景。目前可以使用已有代码简单修改为4基站,若干标签定位。 多基站+若干标签定位全新固件已经开发完成,链接  http://51uwb.cn/forum.php?mod=viewthread&tid=402&extra=page%3D1     




同时该上位机支持现有BP30/BP400固件,只需要定位固件代码修改3个地方:
1 修改最大基站数目
  1. #define MAX_ANTHOR 4
复制代码
2 修改tx_main.c 数据格式
  1. static void Send_Dis_To_Anthor0(void)
  2. {
  3.          // printf("Debug here");
  4.     static int framenum = 0 ;
  5.                 char crc_byte = 0;
  6.     //only send this message to anthor0:short address equal 0x0001
  7.     msg_f_send.destAddr[0] =(0x0001) &0xFF;
  8.     msg_f_send.destAddr[1] =  ((0x0001)>>8) &0xFF;

  9.     msg_f_send.seqNum = distance_seqnum;

  10.     msg_f_send.messageData[0]='M';
  11.                 uint8 *pAnthor_Str = &msg_f_send.messageData[1];
  12.                 int str_len = 0x20;
  13.           sprintf(pAnthor_Str, "&&&:%02X$%04X:%02X[        DISCUZ_CODE_1        ]quot;,str_len,SHORT_ADDR,msg_f_send.seqNum);//AA55 ANTHORID
  14.     pAnthor_Str = pAnthor_Str + 15;
  15.           //printf(pAnthor_Str);
  16.          //0001:A1B1:11#
  17.           uint16 shortaddress = 0x0001;
  18.           uint8 rssi = 0x11;
  19.           sprintf(pAnthor_Str, "%04X:%04X:%02X#",shortaddress,Final_Distance[0],rssi);
  20.     pAnthor_Str = pAnthor_Str + 13;

  21.                 shortaddress = 0x0002;
  22.           rssi = 0x22;
  23.           sprintf(pAnthor_Str, "%04X:%04X:%02X#",shortaddress,Final_Distance[1],rssi);
  24.     pAnthor_Str = pAnthor_Str + 13;

  25.                 shortaddress = 0x0003;
  26.           rssi = 0x33;
  27.           sprintf(pAnthor_Str, "%04X:%04X:%02X#",shortaddress,Final_Distance[2],rssi);
  28.     pAnthor_Str = pAnthor_Str + 13;

  29.                 shortaddress = 0x0004;
  30.           rssi = 0x44;
  31.           sprintf(pAnthor_Str, "%04X:%04X:%02X$AA##",shortaddress,Final_Distance[3],rssi);
  32.     pAnthor_Str = pAnthor_Str + 17;

  33.           sprintf(pAnthor_Str, "\r\n");
  34.                
  35.                 while(msg_f_send.messageData[str_len] != '\n')
  36.                 {
  37.                         crc_byte =crc_byte^msg_f_send.messageData[str_len];
  38.                         str_len++;
  39.                 }
  40.     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, !GPIO_PIN_RESET);//PA node ,enable pa
  41.     dwt_writetxdata(11 + str_len,(uint8 *)&msg_f_send, 0) ;  // write the frame data
  42.     dwt_writetxfctrl(11 + str_len, 0);
  43.     dwt_starttx(DWT_START_TX_IMMEDIATE);
  44.     while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))
  45.     { };
  46.                 dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS);
  47.     framenum++;
  48.     LCD_Display_Distance();
  49. }
复制代码
3 修改rx_main.c 上传数据量
  1. case 'M':
  2.      USART_puts(&msg_f->messageData[1],72);
  3. break;
复制代码
说明:
按照如上修改固件,分别编译标签和4个基站,将定位距离数据通过地址为0x0001 的基站串口输出,并通过串口转WIFI模块传入到上位机。

整体TODO
上位机:     上位机动态选取最优4个基站定位(RSSI最大)
固件增强:  固件目前没有提取RSSI,固定使用4基站,后期可以改成动态,通过动态发现周围基站并测距,然后汇总。














作者: 805091316    时间: 2021-9-14 10:23
第二部分  “2 修改tx_main.c 数据格式” 的15行 sprintf(pAnthor_Str, "&&&:%02X$%04X:%02X[        DISCUZ_CODE_1        ]quot;,str_len,SHORT_ADDR,msg_f_send.seqNum);//AA55 ANTHORID

这里&&&前面的引号我放进keil里出错了,需要把这一句注释掉吗?求大佬回复
作者: 蓝点无限    时间: 2021-9-14 21:37
805091316 发表于 2021-9-14 10:23
第二部分  “2 修改tx_main.c 数据格式” 的15行 sprintf(pAnthor_Str, "&&&:%02X$%04X:%02X[        DISCU ...

你直接用git 下载源码吧,代码拷贝到帖子里,格式有点问题,没有[        DISCUZ_CODE_1        ]quot;,,应该是个“,具体以代码为准
作者: 805091316    时间: 2021-9-15 10:52
谢谢大佬,可以给个GIT的链接吗,忘记去哪找你了
作者: 蓝点无限    时间: 2021-9-15 21:53
805091316 发表于 2021-9-15 10:52
谢谢大佬,可以给个GIT的链接吗,忘记去哪找你了

看这个帖子
http://51uwb.cn/forum.php?mod=vi ... &extra=page%3D1
作者: szmcumcu    时间: 2021-9-29 08:56
好资料,很想学习,谢谢楼主无私分享,赞
作者: vacabun    时间: 2021-9-29 19:25
感谢分享!!!!!
作者: SimonQ    时间: 2021-10-14 17:08
真大佬,感谢分享!!
作者: renchao    时间: 2021-10-14 22:41
好任好人啊
作者: renchao    时间: 2021-10-14 22:42
太强了,python代码太实用
作者: renchao    时间: 2021-10-14 22:43
真大佬,感谢分享!!
作者: renchao    时间: 2021-10-14 22:43
好资料,很想学习,谢谢楼主无私分享,赞
作者: renchao    时间: 2021-10-14 22:43

谢谢大佬,可以给个GIT的链接吗,忘记去哪找你了
作者: renchao    时间: 2021-10-14 22:44

好资料,很想学习,谢谢楼主无私分享,赞
作者: renchao    时间: 2021-10-14 22:44
方法对付
作者: renchao    时间: 2021-10-14 22:45
大佬解了燃眉之急
作者: 760371303    时间: 2021-10-15 01:25
感谢大佬分享
作者: gaojie_123123    时间: 2021-10-15 08:53
不错,太强了,python代码太实用,顶!!!!!!!!!!!!!!!!!!!!!
作者: gaojie_123123    时间: 2021-10-15 09:01

太强了,python代码太实用,顶!!!!!!!!!!!!
作者: gaojie_123123    时间: 2021-10-15 09:01
太强了,python代码太实用,顶!!!!!!!!!!!!
作者: Aran    时间: 2021-10-21 13:42
好资料,很想学习,谢谢楼主无私分享,赞
作者: Aimmie    时间: 2021-11-8 14:59
感谢楼主分享!!!
作者: yj775132158    时间: 2021-11-15 15:02
开源yyds开源yyds开源yyds开源yyds
作者: yj775132158    时间: 2021-11-15 15:02

开源yyds开源yyds开源yyds开源yyds
作者: yj775132158    时间: 2021-11-15 15:22
pyuic  这个不该源文件吗

作者: chen1443683598    时间: 2021-11-15 19:30
这个太有用了  我找了好久 试一试
作者: adviil    时间: 2021-11-16 11:49
太需要了,谢谢谢谢!
作者: 16609519121    时间: 2021-11-16 21:43
谢谢分享,十分感谢
作者: 16609519121    时间: 2021-11-16 21:43
16609519121 发表于 2021-11-16 21:43
谢谢分享,十分感谢

谢谢分享,十分感谢
作者: 16609519121    时间: 2021-11-16 22:47
支持开源支持开源
作者: adviil    时间: 2021-11-17 10:04
谢谢楼主分享!!正好需要!!
作者: DW1000    时间: 2021-11-19 15:33
感谢分享!!!
作者: ysu_yyz    时间: 2021-11-26 09:04
感谢作者提供                    
作者: 老北京鸡肉卷    时间: 2021-11-26 10:00
感谢!!!!!!很实用
作者: 诺曼无线    时间: 2021-12-14 23:19
来学习,谢谢教导
作者: aistm32    时间: 2021-12-15 15:22
谢谢,学习学习
作者: nghai    时间: 2022-1-13 22:46
感谢分享!
作者: sage    时间: 2022-2-9 11:47
感谢大佬无私分享
作者: yoyo    时间: 2022-2-15 11:12
renchao 发表于 2021-10-14 22:42
太强了,python代码太实用

没想到python还可以顺滑的快速做界面
作者: yoyo    时间: 2022-2-15 11:13
赞啊,瞬间就有继续下去的心了
作者: yoyo    时间: 2022-2-15 11:38
请问已经用金钱购买了资料,为什么还是不能下载哇
作者: yoyo    时间: 2022-2-16 14:25
哪位小伙伴附件下载成功的,我用金币买了也下载不成功,求发邮箱1974251144@qq.com
作者: wjt00    时间: 2022-2-23 20:24
十个金币,怎么搞

作者: wjt00    时间: 2022-2-23 20:38
这个上位机和自带的功能一样吗?

作者: wjt00    时间: 2022-2-23 20:39
wjt00 发表于 2022-2-23 20:38
这个上位机和自带的功能一样吗?

我感觉c++功能挺全的,就是没法改
作者: spike    时间: 2022-3-8 23:36
感谢楼主分享
作者: wjt00    时间: 2022-3-9 10:41
[attach]614[/attach]
这是我用一个串口转TCP的软件,在原有的固件上进行修改,基站0串口输出到电脑,但是上位机没有显示
(, 下载次数: 273) (, 下载次数: 293) (, 下载次数: 295) (, 下载次数: 311)
这是我按照论坛修改的固件代码,请问是哪里出问题了?一定要串口转WIFI吗?

作者: wjt00    时间: 2022-3-9 10:43
wjt00 发表于 2022-3-9 10:41
这是我用一个串口转TCP的软件,在原有的固件上进行修改,基站0串口输出到电脑,但是上位机没有显示

这 ...



作者: wjt00    时间: 2022-3-9 10:44
wjt00 发表于 2022-3-9 10:43

下面好像显示数据无法识别
作者: wjt00    时间: 2022-3-9 11:19
本帖最后由 wjt00 于 2022-3-9 11:20 编辑

还有就是怎么样可以使基站和标签输出高电平呀?就是固件上这个串口,我要怎么控制,我希望达到一定条件,可以输出高电平,触发警报器
(, 下载次数: 325) 可能这个问题太小白,能告诉我去哪里学习吗?或者去看什么东西?



作者: wjt00    时间: 2022-3-9 18:04
我的设想,实现区域报警,在已经得到标签坐标的情况下,通过划定警戒区域,给予标签不同的权限,实现报警,基础界面如下:
(, 下载次数: 311)
新增权限窗口,主要目的是,划定警戒区域,点1为矩形左上角点,点2为矩形右下角点,可以像基站一样,勾选权限按钮,则点被引用,当两个点都被引用时,在下方坐标系内画出相应区域
(, 下载次数: 322)
(, 下载次数: 323)
接着是标签权限的划分,这个权限分为123三个级别(可以由)
self.spinBox.setMinimum(0)#
self.spinBox.setMaximum(2)#
使用spinBox.划定级别
第一级别,无视警戒区域,可以在任何区域内移动
第二级别,只允许在警戒区域内移动
第三级别,只允许在警戒区域外移动
在警戒区域划定前,标签权限划分无效
接下来是,警戒的判定,以进入警戒区域报警为例,
使用标签的坐标和警戒区域的坐标进行比较,点1ab),点2cd),标签坐标(xy
a<x<cb>y>d;则在警戒区域内,发出警报
接下来是,警报的实现
首先是上位机上实现,上位机上出现一个提示串口,显示某标签违反权限规则,
接着上位机通过串口向基站或标签传输一个信号,基站和标签间互相通信,所有的标签和基站都获取这个信号,然后向各自的串口输出一个持续的高电平,
我在串口处外接了一个警报器,当串口输出高电平,警报器就会发出警报
当标签回到正确的区域,或者标签直接断电失联的话,回复到原来的状态,警报解除

大佬指点一下,要是成功了,我就把代码共享


作者: 蓝点无限    时间: 2022-3-9 20:37
wjt00 发表于 2022-3-9 10:43

串口转tcp数据被截断了,每个数据包被分成了 两个tcp包发给上位机,上位机每次都不能收到完整数据包,所以会无法解析。
作者: 蓝点无限    时间: 2022-3-9 20:38
wjt00 发表于 2022-3-9 11:19
还有就是怎么样可以使基站和标签输出高电平呀?就是固件上这个串口,我要怎么控制,我希望达到一定条件,可 ...

因为你要用串口输出数据
建议你用LCD接口部分的IO 输出电平

对LCD接口的IO去掉液晶部分代码,将对应IO做普通IO初始化
作者: wjt00    时间: 2022-3-10 08:24
蓝点无限 发表于 2022-3-9 20:38
因为你要用串口输出数据
建议你用LCD接口部分的IO 输出电平

串口输出数据不是基站0吗?我用的标签串口输出警报,应该不影响吧?我就是四基站,多标签
作者: wjt00    时间: 2022-3-10 08:26
wjt00 发表于 2022-3-10 08:24
串口输出数据不是基站0吗?我用的标签串口输出警报,应该不影响吧?我就是四基站,多标签

我怎么调用标签的串口呀?

作者: sunmessi    时间: 2022-3-15 20:30
厉害!!!!!1
作者: sunmessi    时间: 2022-3-15 20:30

作者: sunmessi    时间: 2022-3-17 18:52
pythonyyds
作者: 暮雨    时间: 2022-4-8 21:42
想要源码学习一下
作者: 暮雨    时间: 2022-4-8 21:43
重新学QT太麻烦了
作者: List    时间: 2022-4-18 16:35
指令AT+CWJAP="SSID","PWD"中得网络和密码有什么要求吗?WiFi模块和电脑必须连接这个相同的网络吗?
作者: carpe.tan    时间: 2022-4-21 09:13
下载看看

作者: entropyyyy    时间: 2022-4-27 12:09
回复,支持作者的开发工作
作者: allenxu    时间: 2022-5-2 12:31
支持楼主,但是为什么2D定位也需要4个基站呢?
作者: 蓝点无限    时间: 2022-5-3 22:08
allenxu 发表于 2022-5-2 12:31
支持楼主,但是为什么2D定位也需要4个基站呢?

因为找了个定位解算算法,这个准确度挺好

还有,虽然三边定位三个基站可以,但是三个布设起来,总是一个三角形,没有4个布设区域覆盖性好
作者: duanzw    时间: 2022-5-18 14:27
好资料,很想学习,谢谢楼主无私分享
作者: sd196821    时间: 2022-6-7 07:20
好东西,感谢分享
作者: iampest    时间: 2022-6-10 17:55
想学习python定位
作者: iampest    时间: 2022-6-10 17:57
python代码太实用
作者: chenjinping    时间: 2022-7-3 21:22
下载了,谢谢分享发11
作者: 13033100737    时间: 2022-7-5 13:22
支持支持支持支持
作者: 13033100737    时间: 2022-7-5 15:22
学习学习学习
作者: nzshuai    时间: 2022-7-10 21:20
感谢大佬分享
作者: nzshuai    时间: 2022-7-10 22:45
yoyo 发表于 2022-2-16 14:25
哪位小伙伴附件下载成功的,我用金币买了也下载不成功,求发邮箱

请问下载成功了吗

作者: liyc    时间: 2022-7-14 13:18
感谢分享!!
作者: Ma1011_11    时间: 2022-7-19 20:06
谢谢楼主分享,太好用了这个上位机
作者: Ma1011_11    时间: 2022-7-19 20:06
还好有蓝点无限,不然我的项目都不知道怎么办
作者: Dragon    时间: 2022-7-19 20:43
谢谢分享,谢谢楼主
作者: Dragon    时间: 2022-7-20 17:13
太强了,python代码太实用
作者: Felicia    时间: 2022-8-4 14:02
感谢分享,很棒!!!
作者: chenx0422    时间: 2022-8-25 22:10

感谢分享!!!!!
作者: spike    时间: 2022-8-31 20:18
回帖子,攒积分
作者: spike    时间: 2022-8-31 20:18

回帖子,攒积分
作者: spike    时间: 2022-8-31 20:18

回帖子,攒积分
作者: zzz11    时间: 2022-9-1 15:52
本帖最后由 zzz11 于 2022-9-1 16:11 编辑

请问
这个下载后打开运行界面是上面的界面预览吗?
我看到还有下面这种的

C:\Users\Administrator\Desktop\word\日报\研二\第六周20220829-\1.png


作者: uwb158    时间: 2022-9-13 14:41
感谢分享!
作者: qingchen621    时间: 2022-9-16 08:53
多谢分享多谢分享Python+qt
作者: AAAaaa123456    时间: 2022-9-27 08:18
这积分搞的我好心酸
作者: mosquito    时间: 2022-11-20 11:31

感谢分享!
作者: Aimmie    时间: 2022-12-1 17:08
请问:支持标签history 定位点数量设定 这个功能怎么理解呀?感觉改动率之后没有什么区别呢
作者: jcuwbsuidao    时间: 2023-1-27 11:39
很有用,谢谢楼主
作者: jcuwbsuidao    时间: 2023-1-27 12:16
想把基站的编号显示在液晶屏上,怎么改代码
作者: admin    时间: 2023-1-28 21:04
jcuwbsuidao 发表于 2023-1-27 12:16
想把基站的编号显示在液晶屏上,怎么改代码

这个需要固件修改,上位机实现不了这个功能
作者: sscy    时间: 2023-2-2 18:13
谢谢大佬的分享
作者: Ialab2023    时间: 2023-3-9 16:27
真的超級感謝阿!!!!
作者: 可乐不是狗    时间: 2023-3-22 11:39
真大佬,感谢分享!!
作者: z936931869    时间: 2023-4-6 09:52

感谢,感谢
作者: 吉拉宇    时间: 2023-4-9 20:40
请问,BP30固件源码rx-main.c    USART_puts(&msg_f->messageData[1],72);这一处更改。可以直接改为
HAL_UART_Transmit(&UWB_USART, (uint8_t *)&msg_f->messageData[1], 72, 0xFFFF);吗?
               
         
作者: uuker    时间: 2023-4-10 14:43
太强了!对我帮助很大。
作者: citlcol    时间: 2023-4-14 09:00
renchao 发表于 2021-10-14 22:42
太强了,python代码太实用

python代码是4基站的吗?还是3基站的




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