最近在做远程控制无人车的应用,其中远程控制需要进行实时进行图像传输,将apollo车上的相机图像传输到本地。其中实现方式可以自己搭建阿里云服务器,将图像传输到服务器。另一个比较简单的方式是使用ros的多主机通信的方式进行图像传输。下面进行简单介绍:
1. 使用SD-WAN将多主机,例如无人车上的工控机和本地的计算机连接到同一局域网内。SD-WAN类似花生壳VPN,能实现远程访问。
2. 例如远程无人车为主节点master, 本地计算机为副节点。通过下面教程,配置主从机器的/ect/hosts文件和~/.bashrc文件,根据自己sd-wan的实际情况。
3. 检查多主机之间是否能ping通,例如ping gao或者ping drl
4. 开启无人车上的uvc摄像头rosrun uvc_camera uvc_camera_node
5. 检查是否有相应的图像topic,必须要有compressed的图像, img_raw传输速度非常慢。
6. 在本地主机上检查是否有相同的压缩图像topic
#include <ros/ros.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>
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,这是单路相机时的延迟, 基本没有增加很多带宽,马上测试多路相机情况。