ROS图像主题帧率极低

Posted

技术标签:

【中文标题】ROS图像主题帧率极低【英文标题】:ROS image topic framerate is extremely low 【发布时间】:2018-07-08 23:33:28 【问题描述】:

我正在尝试通过 ROS api 使用 opencv 处理 VREP 视觉传感器输出。我确实设法设置了场景并让脚本运行,但问题是即使没有实际处理,我也得到了 4-5 fps 的速度(目前我只是将图像直接推送到输出)。

此问题似乎与图像分辨率无关,因为 1024*512 和 128*128 捕获的 fps 完全相同。

这也不是阻塞调用的问题,虽然我发布的是单头代码,但我确实有相当复杂的多线程处理管道,它在实际相机(~50 fps)上表现得相当好。

VREP 方面的 Lua 脚本似乎也不是问题,因为我尝试使用 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(尽管我刚刚开始使用这些系统,所以我对这种情况没有信心)。

【问题讨论】:

我知道 ROS1 的消息传递率很低,但在 ROS2 中它更高。 【参考方案1】:

我遇到了与慢速 python 类似的问题。

我使用了标志-OO:https://docs.python.org/3/using/cmdline.html#cmdoption-o 这减少了执行时间。

此外,还提交了一个新问题:https://github.com/ros2/rosidl_python/issues/9 展示了如何改进 python 的消息对象转换。

【讨论】:

以上是关于ROS图像主题帧率极低的主要内容,如果未能解决你的问题,请参考以下文章

Android FFmage 修改视频分辨率,帧率,区域裁剪

主码流说明

视频识别:SlowFast Networks

ffmpeg 图像序列指定输入帧率

switch对电视要求高吗?配啥电视比较好?

Martrix源码分析系列-如何监控帧率变化