我正在尝试创建一个Webots模拟,我希望在Kinect摄像头检测到一个人时我的机器人讲话。
我有一个kinect v2连接到USB端口,它可以通过使用Pykinect2和Pygame运行我的Python代码来独自检测到一个人。
作为下一步,我将该代码放入Webot环境中,并在Kinect检测到它们时添加了一个机器人来与用户交谈。但是,当Kinect开始运行并弹出窗口时,Webots时钟停止滴答作用,并且机器人无能为力。关闭Kinect窗口后,机器人会说消息,但是该代码应该在Kinect代码中执行,如下所示。
我相信,由于Kinect和Webots具有自己的时钟,这可能是一个同步问题,但我不确定。即使是这样,我也不知道该如何进行。欢迎任何建议。
这是我代码的相关部分,如果需要,我可以提供完整的代码。Kinect身体检测是此示例的稍微修改的版本:
class BodyGameRuntime(object):
# ----- other functions here -----
def run(self):
# -------- Main Program Loop -----------
while not self._done:
# --- frame and window resize logic here
# --- Draw skeletons to _frame_surface
if self._bodies is not None:
# ---------- Body Found ----------
speaker.speak("User detected!", volume=1.0) # Speak to the user
for i in range(0, self._kinect.max_body_count):
body = self._bodies.bodies[i]
if not body.is_tracked:
continue
joints = body.joints
# convert joint coordinates to color space
joint_points = self._kinect.body_joints_to_color_space(joints)
self.draw_body(joints, joint_points, SKELETON_COLORS[i])
# --- copy back buffer logic here
# --- Update the screen with what we've drawn.
pygame.display.update()
pygame.display.flip()
# --- Limit to 30 frames per second
self._clock.tick(30)
# Close our Kinect sensor, close the window and quit.
self._kinect.close()
pygame.quit()
robot = Robot()
speaker = Speaker("Speaker")
#timestep = int(robot.getBasicTimeStep())
__main__ = "Kinect"
game = BodyGameRuntime()
game.run()
webots需要定期调用 robot.step(timeStep)函数,以便在模拟时间上进行进展,否则它将简单地停止模拟并等到下一个呼叫 robot.step(timeStep)。我只需在您的主循环中,就在 self._clock.tick(30)之前,将呼叫添加到 robot.step(timeStep) 和的初始化之前您的主要程序中的时间段
请注意,如果您的Webot仿真实时运行,请调用 robot.step(x)将持续大约 x 毫秒。因此,您可能应该将WorldInfo.basictimestep 设置为世界文件中的30毫秒,并摆脱呼叫 self._clock.tick(30)。。
。