在参考ROS 下利用 usb_cam 读取图像、opencv 图像、摄像头的标定这篇博文时遇到了问题,在单独运行
rosrun usb_cam usb_cam_node
时出现[ERROR] [1538658769.608520191]: Webcam: expected picture but didn’t get it…
下面是解决过程。
usb_cam包中有一个测试文件usb_cam-test.launch,直接运行
roslaunch usb_cam usb_cam-test.launch
是完全没有问题的,打开看这个文件可知,是创建了/usb_cam/usb_cam_node和/image_view/image_view两个类型的节点,分别命名为usb_cam和image_view,前者用于“接入”摄像头的图像,并publish到/usb_cam/image_raw话题中,后者subscribe此话题,将图像输出到屏幕上。
然而,如果使用
ruscore
rosrun usb_cam usb_cam_node
rosrun image_view image_view image:=/usb_cam/image_raw
的组合,会出现错误([ERROR] [1538658769.608520191]: Webcam: expected picture but didn’t get it…)。经分析,这是因为usb_cam_node的源文件在编写时有如下这样一句:
// possible values: yuyv, uyvy, mjpeg, yuvmono10, rgb24
node_.param("pixel_format", pixel_format_name_, std::string("mjpeg"));
并不是很懂yuyv,mjpeg这些东西,大概是一些成像方式、图像格式之类的东西,在usb_cam-test.launch文件中有这样一句:
猜测这一句是关键,改变了usb_cam_node源文件中mjpeg的设置,和我用的外接USB摄像头匹配,所以可以使用 rosrun 命令显式设置节点的名称
rosrun package-name executable-name __name:=node-name
这种方法将使用 node-name 参数给出的名称覆盖节点的默认名。在本例中就是
rosrun usb_cam usb_cam_node __pixel_format:=yuyv
而不是
rosrun usb_cam usb_cam_node
注意,pixel_format前面加了两个下划线(我试过用一个下划线,居然也行得通)
另外,在usb_cam-test.launch文件中还有这样一句:
node_.param("video_device", video_device_name_, std::string("/dev/video0"));
所以,如果摄像头不是video0的话,使用rosrun时也要用类似上述的方式设置参数,类似的还有亮度、对比度、图想尺寸等参数,详见usb_cam-test.launch文件。