3

我正在为 sphero,机器人球(他们的论坛有问题,似乎无法提问)编写游戏。我正在尝试为 2 名或更多球员进行球对球碰撞检测。

首先,他们在这里提供了一个示例: https ://github.com/orbotix/Sphero-iOS-SDK/tree/master/samples/CollisionDetection

他们提供的阈值太敏感了,在木地板上它一直触发。暂时忘记这一点,我必须使用两个设备的影响时间戳来查看它们是否大致同时触发了碰撞。

我的问题是在减去时间戳时,在某些情况下我会得到非常广泛的变化,而且我认为差异一开始就很长。我存储了几个时间戳,所以我不会错过正确的时间戳,我尝试使用死时间来查看降低它是否会有所帮助。

最常见的是减去 2 个 NSTimeIntervals 我得到 0.68 和 0.72 之间的差异(我预计会有 0.01 级反应)。所以我检查差异是否低于 0.72,连续 3 次我在 0.72 和 0.73 之间,有几次我得到 1.5、2.6、1.1 甚至 3.8。

它似乎并不可靠。文档说这次来自 iPhone 参考。两台设备都会同步以自动获取时间,因此它们尽可能彼此靠近。

有没有人试过这个并想出一个可靠的解决方案,不涉及保持一个球静止?

4

4 回答 4

3

当我开始担任 Sphero 的制造商 Orbotix 的开发人员时,我对球对球碰撞的主题进行了大量研究。

这是一个非常复杂的问题要解决。我最接近完成这项工作(对于受感染的僵尸研究游戏)是检测哪个球击中哪个球的准确率约为 80%,样本大小为 3。你放入游戏中的球越多,准确率越低变得。因此,我们决定通过让一个球在它变得脆弱之前停止移动来消除这个问题,就像在 Sphero TAG 中一样。

有几个因素限制了这种能力,您似乎已经发现了它们。我认为最大的问题是碰撞检测在球行驶时表现不佳。尤其是在粗糙的表面上或当球做出快速的急速运动时。再加上死区时间,仅此一项就会导致专业问题。

我能够将碰撞时间戳平均控制在 50 毫秒内。您是否考虑在手机之间传输数据包时的 wifi 延迟?

解决方案是您可能不想听到的,但您应该调整您的游戏玩法以在碰撞检测功能范围内工作。也就是说,当可以接触到球时,球的行驶速度非常慢,甚至像 TAG 一样停下来。问问自己,如果没有球对球的碰撞,我怎样才能让这个变得有趣?

于 2013-03-06T20:59:39.497 回答
0

我只想说,首先,我们正在将我们的开发者支持论坛移到 StackOverflow,这就是为什么你不能在论坛上发帖的原因。所以,西蒙,你来到 StackOverflow 是对的,你应该感到自豪。

我们只是将论坛更改为重定向到这里,而不是让人们感到困惑。

于 2013-03-13T20:49:58.690 回答
0

时间戳Sphero 生成。但它们只有在您使用 Poll Packet Times 命令来生成延迟和偏移值时才有意义。请参考 API 命令文档中的 DID 00h、CID 50h。

话虽如此,碰撞检测是我们不断发展的技术。我们在机器人内部实时滑动数据窗口上采用了巧妙编码的 DFT 频率变换。这些参数允许调整到您正在运行的表面;没有通用设置。如果您获得太多误报,请进行实验。如果您有改进算法的想法,请直接联系我们,也许我们可以将其作为一种新的过滤方法。我们总是对聪明的想法持开放态度!

于 2013-03-18T20:04:57.113 回答
0

您可以在游戏开始时同步每个 Sphero 的内部计时器。这些可以与每个主机电话内的同步计时器进行匹配。时钟可能不同,但一毫秒就是一毫秒。您还可以降低碰撞检测的阈值,从而使“事件”(损坏、感染等)只有在“攻击”Sphero 以一定速度移动时才会发生。或其变体。

于 2013-08-11T03:50:08.807 回答