ROS多机进行高速时实图像传输

最近在做远程控制无人车的应用,其中远程控制需要进行实时进行图像传输,将apollo车上的相机图像传输到本地。其中实现方式可以自己搭建阿里云服务器,将图像传输到服务器。另一个比较简单的方式是使用ros的多主机通信的方式进行图像传输。下面进行简单介绍:

1. 使用SD-WAN将多主机,例如无人车上的工控机和本地的计算机连接到同一局域网内。SD-WAN类似花生壳VPN,能实现远程访问。

2. 例如远程无人车为主节点master, 本地计算机为副节点。通过下面教程,配置主从机器的/ect/hosts文件和~/.bashrc文件,根据自己sd-wan的实际情况。

https://blog.csdn.net/xiongmingkang/article/details/81203329?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

3. 检查多主机之间是否能ping通,例如ping gao或者ping drl

4. 开启无人车上的uvc摄像头rosrun uvc_camera uvc_camera_node

5. 检查是否有相应的图像topic,必须要有compressed的图像, img_raw传输速度非常慢。

6. 在本地主机上检查是否有相同的压缩图像topic

#include 
#include 
#include 

void imageCallback(const sensor_msgs::CompressedImageConstPtr& msg)
{
  try
  {
    cv::Mat image = cv::imdecode(cv::Mat(msg->data),1);//convert compressed image data to cv::Mat
    cv::imshow("view", image);

    cv::waitKey(10);
  }
  catch (cv_bridge::Exception& e)
  {
    ROS_ERROR("Could not convert to image!");
  }
}

int main(int argc, char **argv)
{
  ros::init(argc, argv, "image_listener");
  ros::NodeHandle nh;
  cv::namedWindow("view");
  cv::startWindowThread();
  ros::Subscriber sub = nh.subscribe("/image_raw/compressed", 1, imageCallback);
  ros::spin();
  cv::destroyWindow("view");
}

使用以上代码,显示图像,因为没找到合适的compressed显示的包。

速度很快哦,在我这里测试, 正常情况下不接收任何topic时候延迟为64ms,接收img_raw时候延迟为700-900ms, 但是使用compressed时候延迟为65ms,这是单路相机时的延迟, 基本没有增加很多带宽,马上测试多路相机情况。

你可能感兴趣的:(ROS机器人杂谈)