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

标签 python pygame kinect-v2 webots

我正在尝试创建一个 Webots 模拟,当 Kinect 摄像头检测到一个人时,我希望我的机器人能够说话。

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

下一步,我将该代码放入 Webots 环境中,并添加了一个机器人,以便在 Kinect 检测到用户时与用户对话。然而,当 Kinect 开始运行并弹出窗口时,Webots 时钟停止滴答,机器人不执行任何操作。关闭 Kinect 窗口后,机器人会说出该消息,但该代码应该在 Kinect 代码内执行,如下所示。

我相信这可能是一个同步问题,因为 Kinect 和 Webots 有自己的时钟,但我不确定。即使是这样,我也不知道该如何继续。欢迎任何建议。

这是我的代码的相关部分,如果需要,我可以提供完整的代码。 Kinect 人体检测是 this example 的稍微修改版本。 :

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)。我只需在主循环中添加对 robot.step(timeStep) 的调用,就在 self._clock.tick(30) 之前,并取消注释 的初始化timeStep 在你的主程序中。

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

关于python - Webots 机器人在尝试与外部 Kinect 一起使用时不说话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47603024/

相关文章:

python - MongoDB 和 PyMongo - 类似 SQL 的列

python - 如何提取洗衣机前面板的轮廓?

python - 如何设置条件执行步骤

python - 近距离 3D 显示困惑

c# - 使用 Azure Kinect DK 将 In32Rect 坐标转换为 Span<BGRA>

java - 灰度图像未使用 BufferedImage.TYPE_USHORT_GRAY 保存

python - 使用 Flask-socketio 和 socketIO 客户端

python - SFTP 通过 Paramiko 到 ipv6 linux 机器

python-3.x - pygame 没有可用的音频设备

c++ - 如何在 ROS 中使用 PCL 可视化 kinect 数据的表面法线?