Частота кадров в 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.