本次内容:
上篇日记中建立了NanoPi(Debian)与PC(ubuntu)之间的ROS网络通路,并进行了PC键盘控制NanoPi中的小龟移动测试,这篇日记继续扩展,实现在PC上的node订阅NanoPi上发布的实时图像话题。
过程笔记:
NanoPi2端:
首先,需要在NanoPi上编辑图像话题的发布文件pub.cpp,需要包含下面的头文件:
ros.h包含了ros系统的函数库,image_transport.h中定义了图像传输的类,在ROS中OpenCV图像与ROS图像的转换是通过cv_bridge完成的,因此需要包含cv_bridge.h文件,image_encofings.h是传感器相关的消息类型,highgui.h文件提供了OpenCV窗口控件的调用。接下来是主函数的编写,来完成图像话题的发布功能:
主函数中,首先用OpenCV的获取图像接口类VideoCapture实例化,将从摄像头得到的图像转换为ROS图像格式,并用pub话题发布出去。在此定义一个image_transport::Subscriber类对象pub来发布camera/image类型的话题,如果相机读取错误或ROS状态错误也会提示“Faild to capture frame”的信息。
PC端:
需要编写图像话题订阅程序sub.cpp,首先同样需要包含以下头文件:
在main函数中使用image_transport::Subscriber类创建一个sub对象,用来订阅camera/image类型的话题,一旦接收到camera/image类型的话题后,就会启用回调函数imageCallback,将得到的ROS格式图像通过cv_bridge再次转化为opencv的可识别格式,并通过cv::imshow函数将实时视频显示在“Cam”窗口中。
至此需要准备的程序完毕,在CMakeList.txt中添加生成可执行文件的命令如下:
在Catkin空间中执行catkin_make,即可生成pub与sub的可执行文件,要在PC端生成sub执行文件,在NanoPi端生成pub可执行文件。
PC端:接下来用上个日记中建立网络通路的方法在pc端ping通NanoPi,并分别设置主机端口,再在PC端运行master:
NanoPi2端:在NanoPi上启动具有发布图像功能的节点:
PC端:在PC端启动订阅图像功能的节点:
然后便可从pc端看到从NanoPi端传回的图像了: