我是靠谱客的博主 殷勤小松鼠,最近开发中收集的这篇文章主要介绍uwb定位上位机定位源码流程分析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

主要用到的文件有两个:

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定位上位机定位源码流程分析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部