1

我正在尝试创建一个 Webots 模拟,当 Kinect 相机检测到一个人时,我希望我的机器人在其中说话。

我有一个连接到 USB 端口的 Kinect V2,它可以通过使用 PyKinect2 和 pygame 运行我的 Python 代码来自行检测一个人。

下一步,我将该代码放入 Webots 环境中,并添加了一个机器人,以便在 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()
4

1 回答 1

1

Webots 需要您定期调用robot.step(timeStep)函数才能在模拟时间上取得进展,否则它将简单地停止模拟并等待下一次调用robot.step(timeStep)。我只需在你的主循环中添加一个对robot.step(timeStep)的调用,就在self._clock.tick(30)之前,并取消注释你主程序中timeStep的初始化。

请注意,如果您的 Webbots 模拟是实时运行的,则调用robot.step(X)将持续大约X毫秒。因此,您可能应该在世界文件中将WorldInfo.basicTimeStep设置为 30 毫秒,并摆脱对self._clock.tick(30)的调用。

于 2017-12-04T08:09:54.200 回答