概述
主要用到的文件有两个:
1. SerialConnection.cpp 负责串口初始化相关内容
2. RTLSClient.cpp 负责解算标签坐标并发送给上位机
3.trilateration.cpp 解算坐标数学原理
1.先执行 函数 void RTLSClient::newData()
当收到串口信息会调用这个函数,在这个函数中会判断是否接受到一个完整的数据包,这个数据包必须是固件和上位机约定的格式(格式可以看蓝点无限的论坛)否则认为数据包无效。
2 进入函数 void RTLSClient:: ProcessData(void)
对数据包进行解析,在这个函数里面调用 函数processTagRangeReport()储存标签与基站的距离信息
3.进入函数 trilaterateTag(TAG_ID, seq);
在这个函数会判断是有几个基站距离,然后调用函数calculateTagLocation(vec3d *report, int count, int *ranges) 完成解算。
在这个函数里面会判断是否解算出新的坐标,如果出现新的坐标,会emit更新坐标号: tagPos(
tid, rp.fx, rp.fy, rp.fz),(信号中的参数就是解算出来的坐标)当槽函数接受到这个信号就会更新上位机坐标。
4.为了项目需要我增加了一个串口回传功能,将标签坐标通过串口发送出去。
由于坐标为double类型,在发送时字节数偏多且处理比较麻烦,所以我将它扩大100倍,转化成
uint32型发送出去(此时精度达到cm),下面是代码示例:
void SerialConnection::sendpos(quint64 tid,double x,double y,double z)
{
QByteArray sendata;
QString s1,s2;
uint32 xx=x*100,yy=y*100;
s2=QString::number(xx,16);
s1=QString::number(yy,16);
qDebug()<<s1;
sendata=s2.append(s1).toLatin1().prepend("aa");
qDebug()<<sendata;
if(_serial->isOpen())
{
_serial->write(sendata);
//waitForData = true;
}
else
{
qDebug() << "not open - can't write?";
}
emit connectionStateChanged(Connected);
}
这是一个槽函数,需要与上面那个信号tagPos()关联起来。
下面是演示效果:
最后
以上就是殷勤小松鼠为你收集整理的uwb定位上位机定位源码流程分析的全部内容,希望文章能够帮你解决uwb定位上位机定位源码流程分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复