Частота кадров в ROS-изображениях очень низкая

Я пытаюсь обработать вывод датчика VREP с помощью opencv через ROS API. Мне удалось настроить сцену и запустить сценарии, но проблема в том, что я получаю примерно 4-5 кадров в секунду даже без реальной обработки (в настоящее время я просто отправляю изображения непосредственно на вывод).

Эта проблема, по-видимому, не зависит от разрешения изображения, поскольку при захвате как 1024*512, так и 128*128 получается один и тот же кадр / с.

Это также не относится к блокировке вызовов, хотя я выкладываю однопоточный код, у меня есть довольно сложный конвейер многопоточной обработки, который довольно хорошо работает с реальными камерами (~50 кадров в секунду).

Скрипты Lua на стороне VREP, похоже, также не являются проблемой, поскольку я попытался поиграть с примерами ретрансляции видео, предоставленными vrep, и они, кажется, достигают довольно удовлетворительного fps.

Таким образом, кажется, что потоковое изображение является узким местом.

Вот мой пример сценария:

# coding=utf-8

import rclpy
import rclpy.node as node
import cv2
import numpy as np
import sensor_msgs.msg as msg

import third_party.ros.ros as ros

class TestDisplayNode(node.Node):
    def __init__(self):
        super().__init__('IProc_TestDisplayNode')
        self.__window_name = "img"
        self.sub = self.create_subscription(msg.Image, 'Vision_sensor', self.msg_callback)

    def msg_callback(self, m : msg.Image):
        np_img = np.reshape(m.data, (m.height, m.width, 3)).astype(np.uint8)
        self.display(np_img)

    def display(self, img : np.ndarray):
        cv2.imshow(self.__window_name, cv2.cvtColor(img, cv2.COLOR_RGB2BGR))
        cv2.waitKey(1)

def main():
    ros_core = Ros2CoreWrapper()

    node = TestDisplayNode()

    rclpy.spin(node)

    node.destroy_node()
    rclpy.shutdown()

if __name__ == "__main__":
    main()

Я также должен упомянуть, что я запускаю его с помощью ros bridge, так как мне нужно, чтобы обработка выполнялась с python3, который поддерживается только ROS2, и VREP, кажется, работает только с ROS1 (хотя я только начинаю работать с этими системами, поэтому Я не уверен в этом случае).

1 ответ

Решение

У меня похожая проблема с медленным питоном.

Я использовал флаг -OO: https://docs.python.org/3/using/cmdline.html, что сократило время выполнения.

Также была подана новая проблема: https://github.com/ros2/rosidl_python/issues/9 показывающая, как можно улучшить преобразование объектов сообщений для python.

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