51uwb.cn

标题: 如何在标签上用三遍定位显示XY [打印本页]

作者: 毕业设计    时间: 2021-5-25 23:59
标题: 如何在标签上用三遍定位显示XY
  如何利用程序内未启用的三边定位算法,来实现在便签上显示XY值。
  可不可以详细说一下定位原码中的三遍定位算法是需要哪一个函数,并且如何进行调用

作者: 蓝点无限    时间: 2021-5-26 10:05
你的意思是固件还是上位机部分?
作者: 毕业设计    时间: 2021-5-26 12:09
蓝点无限 发表于 2021-5-26 10:05
你的意思是固件还是上位机部分?

是固件部分,在设备上显示

作者: 蓝点无限    时间: 2021-5-26 14:18
毕业设计 发表于 2021-5-26 12:09
是固件部分,在设备上显示

在BP50 的定位代码中,我们把上位机解算三边定位的函数已经移植并可编译。对应的文件为trilateration.c.

具体使用的函数为GetLocation。

在main.c 中已经定位了变量vec3d AnchorList,并在main中对三个基站坐标进行赋值,实际使用的时候需要根据基站放置位置修改三个基站坐标。

按照GetLocation函数的参数要求,将三个基站坐标和对应的距离信息传递进去便可以解算标签的坐标。

着重看下GetLocation 参数使用。 祝好!
作者: 毕业设计    时间: 2021-5-26 16:10
蓝点无限 发表于 2021-5-26 14:18
在BP50 的定位代码中,我们把上位机解算三边定位的函数已经移植并可编译。对应的文件为trilateration.c.
...

Getlocation中的返回值为什么只有一个result,如何在显示屏幕上显示标签的X,Y
作者: 蓝点无限    时间: 2021-5-26 17:40
毕业设计 发表于 2021-5-26 16:10
Getlocation中的返回值为什么只有一个result,如何在显示屏幕上显示标签的X,Y

result 表示是否成功

结果在参数里,通过指针方式返回,仔细看结果。

函数的返回值不止有return 一种方式
作者: 毕业设计    时间: 2021-5-27 00:18
蓝点无限 发表于 2021-5-26 17:40
result 表示是否成功

结果在参数里,通过指针方式返回,仔细看结果。

可否具体一点说明,,哪个是表示的XY,以及如何在main.c里面调用,谢谢您!
(我是三个基站一个标签)
作者: 蓝点无限    时间: 2021-5-27 09:01
毕业设计 发表于 2021-5-27 00:18
可否具体一点说明,,哪个是表示的XY,以及如何在main.c里面调用,谢谢您!
(我是三个基站一个标签)
  1. int GetLocation(vec3d *best_solution, int use4thAnchor, vec3d* anchorArray, int *distanceArray)
复制代码


这个函数参数说明,
第一个参数best_solution,其实是用来接收计算结果的。
第二个参数use4thAnchor,是否有4个基站,如果2D定位,3基站,将其设置为0,否则设置为1
第三个参数anchorArray,传递基站的坐标,有x y z
第四个参数distanceArray, 标签与基站对应的距离

返回值,为是否定位成功。

下面是上位机部分调用这个函数的实例
  1. int RTLSClient::calculateTagLocation(vec3d *report, int count, int *ranges)
  2. {
  3.     int result = 0;
  4.     vec3d anchorArray[4];

  5.     anchorArray[0].x = _ancArray[0].x;
  6.     anchorArray[0].y = _ancArray[0].y;
  7.     anchorArray[0].z = _ancArray[0].z;

  8.     anchorArray[1].x = _ancArray[1].x;
  9.     anchorArray[1].y = _ancArray[1].y;
  10.     anchorArray[1].z = _ancArray[1].z;

  11.     anchorArray[2].x = _ancArray[2].x;
  12.     anchorArray[2].y = _ancArray[2].y;
  13.     anchorArray[2].z = _ancArray[2].z;

  14.     anchorArray[3].x = _ancArray[3].x;
  15.     anchorArray[3].y = _ancArray[3].y;
  16.     anchorArray[3].z = _ancArray[3].z;

  17.     result = GetLocation(report, ((count==4) ? 1 : 0), &anchorArray[0], ranges);

  18.     return result;
  19. }
复制代码


关于在固件里调用三边定位算法的步骤
step1 定义需要传递的参数类型。
  1. vec3d AnchorList[ANCHOR_MAX_NUM];
  2. vec3d tag_best_solution;
  3. int Anthordistance[ANCHOR_MAX_NUM];
复制代码


step2 配置基站的坐标,需要根据基站放置的坐标实际配置
  1.     AnchorList[0].x =0.12;
  2.     AnchorList[0].y =0.34;
  3.     AnchorList[0].z =0;

  4.     AnchorList[1].x =0.25;
  5.     AnchorList[1].y =0;
  6.     AnchorList[1].z =0;

  7.     AnchorList[2].x =0;
  8.     AnchorList[2].y =0;
  9.     AnchorList[2].z =0;
复制代码

step3 传递测距信息到Anthordistance
  1.         while(Anchor_Index < ANCHOR_MAX_NUM)
  2.         {
  3.             if(Anthordistance_count[Anchor_Index] > 0 )
  4.             {
  5.                 Anthordistance[Anchor_Index] =filter((int)(Anthordistance[Anchor_Index]/Anthordistance_count[Anchor_Index]),Anchor_Index);
  6.             }
  7.             Anchor_Index++;
  8.         }
复制代码

step4 调用GetLocation,这一步代码中没有实现。建议在distance_mange 函数中实现,因为这里已经将Anthordistance 赋值为最新的距离。

step5 根据返回值,将tag_best_solution 中的x 和 y 打印出来就是定位解算的标签坐标

祝好
作者: Aimmie    时间: 2021-11-25 20:19
蓝点无限 发表于 2021-5-27 09:01
这个函数参数说明,
第一个参数best_solution,其实是用来接收计算结果的。
第二个参数use4thAnch ...

请问在固件中修改可以再写的详细一点吗,是在tx_main.c里修改吗
作者: xzx829829    时间: 2022-2-7 16:50
楼主解决了吗?可以给个联系方式交流下吗
作者: stars^s    时间: 2022-2-8 17:36
蓝点无限 发表于 2021-5-27 09:01
这个函数参数说明,
第一个参数best_solution,其实是用来接收计算结果的。
第二个参数use4thAnch ...

请问GetLocation()的具体调用还可以在详细一些吗?
作者: stars^s    时间: 2022-2-8 17:39
蓝点无限 发表于 2021-5-26 14:18
在BP50 的定位代码中,我们把上位机解算三边定位的函数已经移植并可编译。对应的文件为trilateration.c.
...

请问一下能不能演示一下GetLocation()的具体调用?
作者: Lyyyyb    时间: 2023-12-24 11:08
感谢分享楼主




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