ROS传输图像带宽不够用的解决方法(realsenseD415压缩图像)

  • 最近在做图像的深度学习识别,但是移动机器人上的电脑配置不够,只能用我的电脑远程的去处理图像,但是遇到了严重的带宽瓶颈,按照我的电脑150Mbps的无线网卡来算,每秒的极限传输速度就是150/8 = 18.75Mb/s,而实际上在多人占用一个垃圾路由器的限制下我监控到的速度只有2M/s,导致传输图像速度远远不够,因为realsense一张彩色图像(640*480)以30fps发送的带宽就有几十MB/s,极其恐怖,连更换网卡都难以解决。
  • 如图为/camera/aligned_depth_to_color/image_raw的带宽占用:
    ROS传输图像带宽不够用的解决方法(realsenseD415压缩图像)_第1张图片
  • 幸好我们有压缩图像的话题可以接收,让我们看看realsense的部分话题发布:
    ROS传输图像带宽不够用的解决方法(realsenseD415压缩图像)_第2张图片
  • 发现有很多在有后缀compressed的图像,是被压缩为JPEG或PNG的格式发送的,虽然我知道他们是压缩的,但是之前还没测试过,这次让我们看一下他们的带宽占用:
    ROS传输图像带宽不够用的解决方法(realsenseD415压缩图像)_第3张图片
  • 压缩效果恐怖如斯!
    这样我同时传输深度与彩色图像的压缩版本就只需要2M/s的带宽了,基本可以满足需求,如果带宽还是不够,可以把图像的发布帧率修改的更低一些,比如降到15fps。
  • 把图像话题改成compressed试一下,结果错误出现了,看来事情没有那么简单!
下面是我收集的三种方法,来做压缩图像的subscriber的
  • 方法一: 在节点后加入配置rosrun subscriber subscriber image_transport:=compressed,这种方法最为方便了,不需要修改源文件中的话题为compressed的, image_transport组件会自动帮你使用压缩方式进行图像接收,缺点是需要在后面加一个参数,当然可以写成launch文件直接用rosparam把参数写进去。
  • 方法二:python文件中的修改:
    加入from sensor_msgs.msg import CompressedImage
    修改接收话题 rospy.Subscriber('/camera/color/image_raw/compressed',CompressedImage, callback, queue_size=1)
    修改回调函数中 img = bridge.compressed_imgmsg_to_cv2(data, desired_encoding="passthrough")
  • 方法三:C++中文件修改:如果c++中是使用image_transport接收的图像,可以在subscriber这里修改参数,加上最后一句:
    image_sub_depth = it_.subscribe( "/camera/aligned_depth_to_color/image_raw",1, &ImageConverter::imageDepthCb, this,image_transport::TransportHints("compressed") );
    不过这里我遇到了一点问题,获取的彩色图像很正常,但是深度图像CV16U1有报错,目前还没有解决掉。
  • 方法四:直接使用ros::Subscriber而不是image_transport::Subscriber接收图像,当成正常图像那种接收,加入sensor_msgs/CompressedImage.h头文件,接收Compressed类的话题,但是这里获取到的深度图像不正确,彩色图像倒是正常,暂时还没有解决,最后就选择了第一种方法。

另外补充下图像话题的关键词含义:

  • camera_info:图像的内参、畸变等参数
  • depth 深度图像
  • color 彩色图像
  • infra1\infra2 红外图像
  • pointcloud点云图像
  • aligned XXX to XXX 将XXX映射对齐到XXX的图像

参考链接:
http://docs.erlerobotics.com/robot_operating_system/ros/basic_concepts/examples/subcribe_images
http://wiki.ros.org/compressed_image_transport
https://github.com/tzutalin/ros_sample_image_transport/blob/master/src/image_transport_subscriber.cpp
https://answers.ros.org/question/230476/how-to-subscribe-to-sensor_msgscompressedimage-without-the-raw-image/
http://forum.erlerobotics.com/t/how-to-subscribe-camera-image-compressed/2341

你可能感兴趣的:(ROS的那些坑)