Робот Webots не разговаривает при попытке использовать его с внешним Kinect

Я пытаюсь создать симуляцию Webots, в которой я хочу, чтобы мой робот говорил, когда камера Kinect обнаруживает человека.

У меня есть Kinect V2, подключенный к USB-порту, и он может самостоятельно обнаружить человека, запустив мой код Python, используя PyKinect2 и pygame.

В качестве следующего шага я поместил этот код в среду 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()

1 ответ

Решение

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).

Другие вопросы по тегам