1.如何从零开始实现TDOA技术的系统 UWB 精确定位系统(5)
2.Android系统反编译FrameWork层虚拟定位方法
3.tf2系列教程(十六):了解ROS 2中的tf2和时间(C++)
4.tf2系列教程(十四):在ROS 2中添加固定坐标系(C++)
如何从零开始实现TDOA技术的 UWB 精确定位系统(5)
这是一篇系列文章的第五部分,主题是坐标如何从零开始实现TDOA技术的UWB精确定位系统。
在开始之前,源码有一些重要的系统提示。首先,坐标阅读这篇文章需要具备一定的源码大智慧过滤器源码电子技术和软件编程基础。其次,系统文章中提到的坐标硬件和软件并非开源,它旨在教授如何实现UWB定位系统,源码而非直接提供解决方案。系统如果你对UWB定位感兴趣,坐标并且具备相应的源码硬件和软件背景,以及充足的系统时间,那么你可以尝试自己构建一个定位系统。坐标对于商业公司,源码如果你打算将UWB定位系统转化为商业产品,这篇文章同样适用。如果你希望快速进入生产环节,可以直接购买我们的电路图和软件源代码。
在前几篇文章中,我们介绍了基站和标签的硬件设计,以及基站和标签的固件设计,包括时钟同步等要点。现在,我们将介绍定位引擎的官方jeeplus源码设计,重点是TDOA算法。
使用DW的定位系统,通常使用的定位方案是TOF或TDOA。TOF方案在DecaWave公司提供的例程和Trek的代码中都有介绍,通过测距得到Tag与几个Anchor之间的距离,然后使用Trilateration算法计算Tag的坐标。我们使用TDOA方案。Tag发出定位UWB包后,被定位区域内的几个Anchor收到,各个Anchor记录下收到这个UWB包的时间戳,改善到定位引擎RTLE,由RTLE根据各个Anchor收到该UWB包的时间差计算Tag的坐标。这个计算坐标的算法叫Multilateration,具体介绍参考https://en.wikipedia.org/wiki/Pseudo-range_multilateration。
另外,TDOA定位有下行和上行两方案。GPS使用的是下行方案,上行则是由被定位的Tag发出定位信号,由各个负责接收,坐标计算定位引擎集中进行计算。上行方案对Tag的要求低,对电力的要求也很低,例如Tag可能会做成工牌或手环。下行方案则要求Tag有坐标计算能力,词典系统源码对MCU的要求会比较高。
接下来,我们将介绍TDOA的原理,Multilateration算法以及Andersen的算法。在介绍完这些内容后,我们将继续探讨坐标质量评估和第二个Multilateration算法。最后,我们将介绍第三个Multilateration算法,它使用最小二乘法进行收敛,从而得到更精确的坐标。
使用TDOA技术实现UWB精确定位的最有价值的技术都介绍完了。如果你之前对UWB不了解,看起来会比较费力,因为我基本上都只是介绍技术要点,而不是做科普。如果你正在研发类似的系统,你应该可以开始写代码了。
接下来,我会再写几篇文章,介绍一些技术细节。
这几篇文章的内容看起来有点乱,确实也有点乱。有点理解那些写网络连载小说的作者了,想到哪里写到哪里,wow源码脚本还要有连贯性,太难了。不像平时写技术方案,你可以反复修改、推敲。
Android系统反编译FrameWork层虚拟定位方法
做模拟定位功能时,传统方法通过应用定位服务、root权限或框架层的hook会面临系统安全限制和权限管理问题。因此,转而探索直接从操作系统层面入手,试图修改系统类和函数,以达到与hook相同的效果。在Android 6.0版本下,该方法已经成功应用于三大地图应用和短视频平台中,而在Android 7.0版本下,虽然能够干扰三大地图的精准定位,但无法像在6.0版本那样模拟自己的位置信息。
在操作框架层的反编译和修改过程中,主要包括如下关键步骤和改动:
1. **屏蔽wifi列表**:除了白名单应用外,禁止返回其他应用的wifi列表信息,以此削弱基于wifi定位的精准度。
2. **自定义上次连接的wifi网卡地址**:通过修改系统行为,让应用接收到的wifi信息与实际环境不符,以此干扰定位服务。bilibili上传源码
3. **禁止返回wifi相关信息**:防止应用获取到与真实环境不符的wifi信息,进一步降低定位准确性。
4. **wifi配置信息返回null**:避免应用接收到的wifi配置信息影响其定位算法。
5. **GSM基站信息写入**:引入虚拟的GSM基站信息,混淆定位系统对真实基站的识别。
6. **CDMA基站信息写入**:同样引入CDMA基站信息,进一步干扰基站定位机制。
7. **GPS修改**:调整GPS信号,包括修改有效卫星数目等,以混淆定位服务对真实GPS信号的依赖。
8. **其他相关类反编译和修改**:对涉及定位功能的其他系统类进行反编译、修改,确保整体定位机制被干扰或误导。
在进行上述改动前,需要先了解Android系统在5.0版本后引入的ART(Android Runtime)技术,以便在system/framework目录中找到对应手机架构的oat文件。根据不同架构(如arm或arm)找到相应的oat文件,并使用oat2dex.jar工具解包,获取包含源代码的dex文件。接着,使用smali工具将dex文件转换为易于修改的smali文件,并在classes2.dex中添加自己的类,用于读取和模拟配置文件中的虚拟信息。通过修改location对象的创建过程,替换其中的关键属性值,如经纬度、时间戳、速度、海拔等,以达到模拟定位的效果。
在Android 6.0版本下,上述方法成功应用于导航和短视频平台,而在Android 7.0版本下,虽然仍能干扰定位,但模拟定位功能的实现更为复杂。在7.0版本中,谷歌开放了获取GPS底层数据的途径,通过监听OnNmeaMessageListener并最终在GnssStatusListenerTransport类中创建原始数据对象,获取到包含坐标信息和卫星信息的NMEA格式数据。尽管可以修改这些数据,但未能有效实现模拟定位,可能的原因是仅针对wifi和基站信息的干扰不足以完全绕过系统定位逻辑。
通过上述方法的实施,尝试绕过传统定位机制的限制,实现了在特定条件下对定位服务的干扰或误导,展示了直接从操作系统层面修改和干扰定位服务的可能性,为定位服务的安全性和隐私保护提出了新的思考方向。
tf2系列教程(十六):了解ROS 2中的tf2和时间(C++)
在ROS 2中,tf2是一个核心组件,用于管理坐标系变换树,跟踪和传播不同坐标系之间的变换信息。在本教程中,我们将探讨如何在lookupTransform()函数中使用超时设置以等待tf2坐标变换树上的坐标变换可用。
理解tf2的时间机制非常重要。每个坐标系变换都保存了一个时间快照,默认最多秒。使用lookupTransform()函数时,我们获取最新的坐标变换,但并不知道该变换的确切时间。本教程将指导你如何获取特定时间的坐标变换。
具体步骤如下:
1. 打开学习tf2的C++软件包中的src/turtle_tf2_listener.cpp源代码文件。在回调函数on_timer()中,我们关注to_frame_rel参数的定义,即在FrameListener类的构造函数中。将to_frame_rel参数设置为turtle1,让第二只小乌龟跟随第一只小乌龟。
2. 移除或注释掉启动文件中设置target_frame参数的代码行,这将让turtle2跟随turtle1,而不是固定坐标系“胡萝卜(carrot1)”。
3. 更改tf2::TimePoint()为this->now(),这指定了查找当前时刻的坐标变换,并移除超时参数。这导致lookupTransform()函数失败,输出消息提示坐标变换不可用。
4. 使用tf2提供的等待工具,通过在lookupTransform()函数中添加Duration参数来解决此问题。在本例中,等待ms,或者使用以下代码。该函数有四个参数:目标坐标系、源坐标系、查找的时刻以及可选的等待超时时长。设置超时时长后,lookupTransform()将阻塞直到坐标变换可用,或在超时时长内无法获取时引发异常。
5. 超时参数的设置至关重要。如果未设置,系统可能会报错坐标系不存在或坐标变换消息在将来。但也不能设置过长,否则会导致系统阻塞。
6. 重新编译并运行软件包,现在可以正常运行了。
通过本教程,你将了解到如何在ROS 2环境中通过设置超时等待来确保tf2坐标变换的可用性,从而在实时系统中实现稳定的坐标系跟踪。
tf2系列教程(十四):在ROS 2中添加固定坐标系(C++)
在ROS 2中,教程十四将指导您如何通过C++编程为系统添加一个固定坐标系。这个教程特别适合初学者,旨在扩展您之前小乌龟示例的知识,展示tf2的强大功能。
.1 添加固定坐标系的理由在于,对于许多任务,基于传感器或链接的本地坐标系思考更为方便。tf2允许用户为这些对象定义独立的坐标系,并处理坐标变换。
.2 在ROS 2的坐标变换树中,坐标系之间遵循树状结构,不允许形成闭环。在现有示例中,world、turtle1和turtle2构成坐标系层级。为了添加新坐标系,您需要选择一个现有坐标系作为父级,例如,将要在小乌龟turtle1中添加的“胡萝卜”坐标系carrot1。
.3 通过在小乌龟turtle1的C++源代码中实现,首先创建一个名为fixed_frame_tf2_broadcaster.cpp的文件。代码中包含了必要的头文件,如geometry_msgs的TransformStamped,rclcpp库的rclcpp.hpp,以及tf2_ros中的TransformBroadcaster。固定坐标系广播器类FixedFrameBroadcaster定义了构造函数、计时器以及回调函数,用于定期发送坐标变换信息,其中carrot1坐标系仅在y轴上相对于turtle1偏移2米。
.4 要运行坐标系广播器节点,您需要在learning_tf2_fixed_frame_demo.launch.py启动文件中增加新的节点,启动后,通过turtle_teleop_key节点控制小乌龟,观察第二只小乌龟是否跟随carrot1坐标系的移动,同时使用tf2_echo检查坐标变换的正确性。
通过这个教程,您将学会如何在ROS 2的环境中添加固定坐标系,并利用tf2的机制实现坐标系之间的变换跟踪。