Webots机器人在尝试将其与外部Kinect一起使用时不说话



我正在尝试创建一个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)。。

最新更新