毕业设计 发表于 2021-5-25 23:59:28

如何在标签上用三遍定位显示XY

如何利用程序内未启用的三边定位算法,来实现在便签上显示XY值。
可不可以详细说一下定位原码中的三遍定位算法是需要哪一个函数,并且如何进行调用

蓝点无限 发表于 2021-5-26 10:05:38

你的意思是固件还是上位机部分?

毕业设计 发表于 2021-5-26 12:09:08

蓝点无限 发表于 2021-5-26 10:05
你的意思是固件还是上位机部分?

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

蓝点无限 发表于 2021-5-26 14:18:35

毕业设计 发表于 2021-5-26 12:09
是固件部分,在设备上显示
在BP50 的定位代码中,我们把上位机解算三边定位的函数已经移植并可编译。对应的文件为trilateration.c.

具体使用的函数为GetLocation。

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

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

着重看下GetLocation 参数使用。 祝好!

毕业设计 发表于 2021-5-26 16:10:19

蓝点无限 发表于 2021-5-26 14:18
在BP50 的定位代码中,我们把上位机解算三边定位的函数已经移植并可编译。对应的文件为trilateration.c.
...

Getlocation中的返回值为什么只有一个result,如何在显示屏幕上显示标签的X,Y

蓝点无限 发表于 2021-5-26 17:40:54

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

result 表示是否成功

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

函数的返回值不止有return 一种方式

毕业设计 发表于 2021-5-27 00:18:24

蓝点无限 发表于 2021-5-26 17:40
result 表示是否成功

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


可否具体一点说明,:D,哪个是表示的XY,以及如何在main.c里面调用,谢谢您!
(我是三个基站一个标签)

蓝点无限 发表于 2021-5-27 09:01:01

毕业设计 发表于 2021-5-27 00:18
可否具体一点说明,,哪个是表示的XY,以及如何在main.c里面调用,谢谢您!
(我是三个基站一个标签)

int GetLocation(vec3d *best_solution, int use4thAnchor, vec3d* anchorArray, int *distanceArray)


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

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

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

    anchorArray.x = _ancArray.x;
    anchorArray.y = _ancArray.y;
    anchorArray.z = _ancArray.z;

    anchorArray.x = _ancArray.x;
    anchorArray.y = _ancArray.y;
    anchorArray.z = _ancArray.z;

    anchorArray.x = _ancArray.x;
    anchorArray.y = _ancArray.y;
    anchorArray.z = _ancArray.z;

    anchorArray.x = _ancArray.x;
    anchorArray.y = _ancArray.y;
    anchorArray.z = _ancArray.z;

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

    return result;
}

关于在固件里调用三边定位算法的步骤
step1 定义需要传递的参数类型。
vec3d AnchorList;
vec3d tag_best_solution;
int Anthordistance;

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

    AnchorList.x =0.25;
    AnchorList.y =0;
    AnchorList.z =0;

    AnchorList.x =0;
    AnchorList.y =0;
    AnchorList.z =0;
step3 传递测距信息到Anthordistance
      while(Anchor_Index < ANCHOR_MAX_NUM)
      {
            if(Anthordistance_count > 0 )
            {
                Anthordistance =filter((int)(Anthordistance/Anthordistance_count),Anchor_Index);
            }
            Anchor_Index++;
      }
step4 调用GetLocation,这一步代码中没有实现。建议在distance_mange 函数中实现,因为这里已经将Anthordistance 赋值为最新的距离。

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

祝好

Aimmie 发表于 2021-11-25 20:19:46

蓝点无限 发表于 2021-5-27 09:01
这个函数参数说明,
第一个参数best_solution,其实是用来接收计算结果的。
第二个参数use4thAnch ...

请问在固件中修改可以再写的详细一点吗,是在tx_main.c里修改吗

xzx829829 发表于 2022-2-7 16:50:40

楼主解决了吗?可以给个联系方式交流下吗
页: [1] 2
查看完整版本: 如何在标签上用三遍定位显示XY