背景:我正在为 OpenComputers 添加的移动计算机实现导航系统,这是一个 Minecraft 模组。对于那些不熟悉这个模组的人来说,它基本上添加了各种 Lua 可编程、可升级的计算机,包括移动计算机——即机器人、无人机和平板电脑。尝试对机器人和无人机进行编程以执行自主任务时经常出现的众多挑战之一是确保它们始终知道自己的坐标。
最简单的解决方案是使用导航升级,它正是这样做的 - 为计算机提供其相对于制作它的地图中心的精确坐标。然而,它有两个主要缺点 - 它占用了 II 级升级槽,这可不是小事,而且仅限于地图区域。后者或多或少是可以接受的,但仍然使这种导航方法在某些用例中不可用。
另一种解决方案是让计算机记住一次它们的坐标,然后跟踪它们的运动,但这也有一些潜在的警告——你必须通过自定义子程序控制所有运动或使用黑客来拦截组件调用,你可以'移动计算机时不必每次都手动输入坐标,无人机存在一些精度误差,这对平板电脑根本不起作用。
第三种方法——我正在研究的方法——类似于现实生活中的 GPS。它基于这样一个事实,即计算机可以使用无线网卡进行升级,以便能够在 400 块的相当大的距离内相互发送消息,并且随着消息本身它们接收到精确的距离(浮点数,以块为单位) ) 在发送者和接收者之间。如果我们将一些固定计算机指定为不断广播其位置的“卫星”,我们可以使移动计算机能够使用来自 4 颗以上卫星的信息进行三边测量。
这种方法具有可扩展性(您可以不断向网络中添加更多卫星以扩大其覆盖范围),不会占用仅用于导航目的的额外升级槽(因为许多移动计算机已经升级了无线网卡)并且精确,这与其他两种方法相比,它具有明显的优势。但是,它需要一些令人惊讶的复杂计算,这就是我卡住的地方。
问题:我需要找到一个三边测量算法(最好附带一个代码示例),它可以让任何移动计算机在知道指定“卫星”的坐标和距离的情况下计算其位置(在 ~0.25 块的误差范围内)他们。我们假设所有的计算机和卫星都配备了第 II 层无线网卡(即它们可以在 400 个块的总范围内相互发送消息,并以 float32 数字允许的精度知道发送者与其自身之间的距离)。该解决方案将使用纯 Lua 编码,无需访问任何第三方服务,因此像 Mathematica 这样的数据包是不行的。目前我正在押注某种合适的方法,尽管我没有
在最基本的层面上,我们可以假设有 4 颗卫星不断且正确地广播它们的位置,彼此相距适中的距离,并且不位于单个 2D 平面上。理想情况下,算法应该能够适应一些可选条件 - 请参阅下面的部分。
奖励积分:
- 使算法足够小以适应无人机的 2KB 内存(假设 UTF8 编码)。但是,它应该占用更少的空间,以便主程序也可以容纳。越小越好。
- 制定一种算法,使卫星彼此非常接近并具有非整数坐标(以允许用一个不断移动的机器人或无人机替换多个固定卫星,或使移动计算机在从一颗卫星)。
- 假设已经可以确定位置,则制作允许存在少于 4 颗卫星的算法 - 例如,如果所讨论的移动计算机是机器人,并且除了一个可能的位置之外的所有可能位置都低于或高于块的允许高度范围(y<0 或 y>255)。如果有三颗卫星位于例如 y=255 的高度,则这种设置是可能的。
- 制作一种算法,该算法可以抵抗某些卫星广播稍微错误的位置(设置中的一个小错误)。鉴于存在足够正确的测量值,该算法应该推断出正确的位置或完全抛出错误。理想情况下,它还可以记录“关闭”卫星的位置。
- 制定一种算法,该算法可以抵抗同时存在的两组或多组卫星在不同的坐标系中正确广播它们的位置(设置中的一个主要错误)。每个网络都有一个(假设是唯一的)标识符,允许区分由不同玩家(或者,好吧,只有一个)独立设置的不同网络。但是,如果他们不费心正确设置标识符,不同的信号可能会混淆,从而使移动数据终端感到困惑。因此,抗性算法应该能够检测到这种情况,或者直接抛出错误或区分不同的网络(然后可以对其进行微调以适应特定应用程序的目的 - 即拒绝加载,选择最近的网络,选择最大的网络、提示用户或控制服务器等。
我尝试了什么:除了尝试自己解决问题外,我还尝试在互联网上查找合适的解决方案。但是,我能找到的解决方案都不适合这项任务。
- 我通过谷歌搜索“三边测量算法”发现的大部分内容都是处理现实生活中的 GPS 系统——也就是说,只使用 2 个坐标,强烈考虑错误并且通常没有提供足够的精度。
- 相反,有些是纯数学的,建议建立一系列方程来找到球体的交点。可悲的是,据我微弱的数学背景让我理解,这种方法没有考虑浮点数的精度误差——圆不完全相交,点不在同一位置,所以方程没有解。
- 有些似乎解释了解决方案,但涉及很多我无法理解的复杂数学,并且没有包含精确的算法或至少一个代码示例。
- 至少有一个使用了像 Mathematica 这样的外部数据包,在这种情况下,这些数据包同样不可用。
如果我留下了一些不清楚的重点,请发表评论,以便我改进问题。提前致谢!