[开源项⽬]蓝点⽆限UWBPython版本上位机
初衷:
进⼀步降低学习门槛,使⽤纯Python 编写GUI 上位机,Python 易于编程,算法资料算法丰富。
TWR 算法上位机⼀般使⽤Deca官⽅提供的GUI上位机,使⽤QT C++编写,代码臃肿,不适合学习,同时三边定位算法部分晦涩难懂。
之前在论坛开源了底层固件,再次补充⼀个开源版本上位机,实现了全流程的开源。
界⾯预览:
源码⽂件:final sprintf是什么意思
1.twr_51uwb_v
2.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个。⼤家可以根据需要替换定位算法。
tril2d = Trilateration()
tril2d.setDistances(Info['distance'])
tril2d.setAnthorCoor(Info['anthor'])
result_x, result_y = ilaterate2D()
数据格式说明:
&&&:20$0005:AD$0001:0080:11#0002:0080:22#0003:0081:33#0004:0079:44$AA##
TODO
源码:
论坛开源链接下载:51uwb/forum.php?mod=viewthread&tid=401&extra=page%3D1
改上位机可以匹配我们全新开源固件,可以应⽤与隧道等复杂定位场景。⽬前可以使⽤已有代码简单修改为4,若⼲标签定位。多+若⼲标签定位全新固件已经开发完成,链接
同时该上位机⽀持现有BP30/BP400固件,只需要定位固件代码修改3个地⽅:
1 修改最⼤数⽬
#define MAX_ANTHOR 4
2 修改tx_main.c 数据格式
点击查看代码
static void Send_Dis_To_Anthor0(void)
{
// printf("Debug here");
static int framenum = 0 ;
char crc_byte = 0;
//only send this message to anthor0:short address equal 0x0001
msg_f_send.destAddr[0] =(0x0001) &0xFF;
msg_f_send.destAddr[1] = ((0x0001)>>8) &0xFF;
msg_f_send.seqNum = distance_seqnum;
msg_ssageData[0]='M';
uint8 *pAnthor_Str = &msg_ssageData[1];
int str_len = 0x20;
sprintf(pAnthor_Str, "&&&:%02X$%04X:%02X",str_len,SHORT_ADDR,msg_f_send.seqNum);//AA55 ANTHORID
pAnthor_Str = pAnthor_Str + 15;
//printf(pAnthor_Str);
//0001:A1B1:11#
uint16 shortaddress = 0x0001;
uint8 rssi = 0x11;
sprintf(pAnthor_Str, "%04X:%04X:%02X#",shortaddress,Final_Distance[0],rssi);
pAnthor_Str = pAnthor_Str + 13;
shortaddress = 0x0002;
rssi = 0x22;
sprintf(pAnthor_Str, "%04X:%04X:%02X#",shortaddress,Final_Distance[1],rssi);
pAnthor_Str = pAnthor_Str + 13;
shortaddress = 0x0003;
rssi = 0x33;
sprintf(pAnthor_Str, "%04X:%04X:%02X#",shortaddress,Final_Distance[2],rssi);
pAnthor_Str = pAnthor_Str + 13;
shortaddress = 0x0004;
rssi = 0x44;
sprintf(pAnthor_Str, "%04X:%04X:%02X$AA##",shortaddress,Final_Distance[3],rssi);
pAnthor_Str = pAnthor_Str + 17;
sprintf(pAnthor_Str, "\r\n");
while(msg_ssageData[str_len] != '\n')
{
crc_byte =crc_byte^msg_ssageData[str_len];
str_len++;
}
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, !GPIO_PIN_RESET);//PA node ,enable pa
dwt_writetxdata(11 + str_len,(uint8 *)&msg_f_send, 0) ; // write the frame data
dwt_writetxfctrl(11 + str_len, 0);
dwt_starttx(DWT_START_TX_IMMEDIATE);
while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))
{ };
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS);
framenum++;
LCD_Display_Distance();
}
3 修改rx_main.c 上传数据量
case 'M':
USART_puts(&msg_f->messageData[1],72);
break;
说明:
按照如上修改固件,分别编译标签和4个,将定位距离数据通过地址为0x0001 的串⼝输出,并通过串⼝转WIFI模块传⼊到上位机。
整体TODO
上位机:上位机动态选取最优4个定位(RSSI最⼤)
固件增强:固件⽬前没有提取RSSI,固定使⽤4,后期可以改成动态,通过动态发现周围并测距,然后汇总。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论