使用Sphero API检测球与球之间的碰撞是否有更准确的方法?

3

我正在为Sphero机器球编写游戏(论坛遇到了问题,似乎无法提问)。我正在尝试为2个或更多玩家进行球与球之间的碰撞检测。

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

他们提供的阈值过于敏感,在木地板上会一直触发。暂且不考虑这个问题,我必须使用两个设备的碰撞时间戳来判断它们是否在大约相同的时间触发碰撞。

我的问题是,在减去时间戳时,某些情况下我得到的差异非常大,我认为起始差异本来就很长。我存储了几个时间戳,以便不错过正确的时间戳,并尝试调整死时间以查看是否可以降低误差。

最常见的是减去2个NSTimeInterval,我得到了0.68和0.72之间的差异(我原本期望是0.01级反应)。因此,我正在检查差异是否小于0.72,3次中有两次在0.72和0.73之间,还有几次得到了1.5、2.6、1.1甚至3.8。

似乎它不太可靠。文档说这个时间来自iPhone的参考。两个设备都同步自动获取时间,所以它们尽可能接近彼此。

有人尝试过这个并提出了可靠的解决方案吗,而不涉及保持一个球静止?

4个回答

3
我在担任Sphero开发人员时,对球与球之间的碰撞进行了大量研究。这是一个非常复杂的问题。在一个感染僵尸的研究游戏中,我最接近解决此问题的方法是使用3个样本大小,大约80%的准确度来检测哪个球撞击了哪个球。你在游戏中放置的球越多,准确性就会降低。因此,我们决定通过要求一个球在易受攻击之前停止移动来消除这个问题,就像在Sphero TAG中一样。
有一些因素限制了这种能力,而且似乎您已经发现了它们。我认为最大的问题是,在球正在运行时,碰撞检测性能很差。特别是在崎岖的表面或球做出快速而突然的运动时。这本身就会在死时间配合时造成重大问题。
我能够使碰撞时间戳平均精确到50毫秒。您是否考虑到了手机之间传输数据包的wifi延迟?
解决方案可能不是您想听到的,但您应该调整游戏玩法以适应碰撞检测的能力。也就是说,当球可以被接触时,球要慢慢行驶,甚至像在TAG中一样停下来。问问自己,如何在没有球与球碰撞的情况下使游戏变得有趣?

WiFi延迟?从阅读文档中我了解到,影响时间戳是由Sphero创建的,使用手机时间作为参考,因此我可以忽略延迟,因为它记录的是事件发生的时间,而不是数据包接收的时间。是的,我玩过Sphero标签游戏,但我真的不喜欢它,我想我只能放弃它了。感谢您的建议,节省了我很多浪费的时间。 - Simon McLoughlin

0
我想说的是,我们正在将开发者支持论坛迁移到StackOverflow,这就是为什么您无法在论坛上发布帖子的原因。所以,Simon,你来到StackOverflow是正确的选择,你应该感到自豪。
我们刚刚将论坛重定向到这里,而不是让人们感到困惑。

0
时间戳是由Sphero生成的。但是只有在使用Poll Packet Times命令生成延迟和偏移值时才有意义。请参考API命令文档中的DID 00h,CID 50h。
话虽如此,碰撞检测是我们不断发展的技术。我们在机器人内部实时使用一个滑动数据窗口上的巧妙编码DFT频率变换。参数允许调整你所运行的表面;没有通用设置。如果您获得了太多的误报,请进行实验。如果您有改进算法的想法,请直接联系我们,也许我们可以将其作为新的过滤方法包含在内。我们始终欢迎聪明的想法!

谢谢你的帮助,但我计划制作一个多球游戏,实际上,除非每个球内部都有类似NFC的东西,否则我不认为这会很好地运作。这样,当8个或更多的球四处漫游时,你就可以获得时间戳和哪个球撞到了你的唯一标识符,但这可能无法实现。 - Simon McLoughlin

0

在游戏开始时,您可以同步每个Sphero的内部计时器。这些可以与每个主机手机中的同步计时器匹配。时钟可能不同,但毫秒就是毫秒。您还可以降低碰撞检测的阈值,从而使“事件”(损坏、感染等)仅在“攻击”Sphero以一定速度移动时发生。或者采用类似的变化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接