51uwb.cn

 找回密码
 立即注册
查看: 23033|回复: 160
打印 上一主题 下一主题

【开源项目】纯Python TWR算法UWB上位机

  [复制链接]

35

主题

955

帖子

3994

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3994
跳转到指定楼层
楼主
发表于 2021-8-15 21:16:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式


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

界面预览:



源码文件:
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

源码:

Trilateration_PyQt5.rar (91.96 KB, 下载次数: 292, 售价: 10 金钱)


改上位机可以匹配我们全新开源固件,可以应用与隧道等复杂定位场景。目前可以使用已有代码简单修改为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基站,后期可以改成动态,通过动态发现周围基站并测距,然后汇总。













回复

使用道具 举报

0

主题

8

帖子

10

积分

新手上路

Rank: 1

积分
10
沙发
发表于 2021-9-14 10:23:52 | 只看该作者
第二部分  “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里出错了,需要把这一句注释掉吗?求大佬回复
回复

使用道具 举报

35

主题

955

帖子

3994

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3994
板凳
 楼主| 发表于 2021-9-14 21:37:11 | 只看该作者
805091316 发表于 2021-9-14 10:23
第二部分  “2 修改tx_main.c 数据格式” 的15行 sprintf(pAnthor_Str, "&&&:%02X$%04X:%02X[        DISCU ...

你直接用git 下载源码吧,代码拷贝到帖子里,格式有点问题,没有[        DISCUZ_CODE_1        ]quot;,,应该是个“,具体以代码为准
回复

使用道具 举报

0

主题

8

帖子

10

积分

新手上路

Rank: 1

积分
10
地板
发表于 2021-9-15 10:52:01 | 只看该作者
谢谢大佬,可以给个GIT的链接吗,忘记去哪找你了
回复

使用道具 举报

35

主题

955

帖子

3994

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3994
5#
 楼主| 发表于 2021-9-15 21:53:26 | 只看该作者
805091316 发表于 2021-9-15 10:52
谢谢大佬,可以给个GIT的链接吗,忘记去哪找你了

看这个帖子
http://51uwb.cn/forum.php?mod=vi ... &extra=page%3D1
回复

使用道具 举报

0

主题

45

帖子

48

积分

新手上路

Rank: 1

积分
48
6#
发表于 2021-9-29 08:56:08 | 只看该作者
好资料,很想学习,谢谢楼主无私分享,赞
回复

使用道具 举报

0

主题

13

帖子

19

积分

新手上路

Rank: 1

积分
19
7#
发表于 2021-9-29 19:25:59 | 只看该作者
感谢分享!!!!!
回复

使用道具 举报

0

主题

2

帖子

10

积分

新手上路

Rank: 1

积分
10
8#
发表于 2021-10-14 17:08:38 | 只看该作者
真大佬,感谢分享!!
回复

使用道具 举报

0

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
9#
发表于 2021-10-14 22:41:57 | 只看该作者
好任好人啊
回复

使用道具 举报

0

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
10#
发表于 2021-10-14 22:42:45 | 只看该作者
太强了,python代码太实用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

bphero Inc.  

GMT+8, 2024-4-20 15:04 , Processed in 0.022441 second(s), 5 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表