1.问题出现
在虚拟机中进行ROS视觉方面的操作时,调用摄像头出现报错:
AttributeError: 'NoneType' object has no attribute 'shape'
[ERROR] [1665194860.752950024]: select timeout
[usb_cam-1] process has died [pid 49165, exit code 1, cmd /opt/ros/melodic/lib/usb_cam/usb_cam_node __name:=usb_cam __log:=/home/rosmelodic/.ros/log/469c5216-46a2-11ed-89a7-000c2969e545/usb_cam-1.log].
log file: /home/rosmelodic/.ros/log/469c5216-46a2-11ed-89a7-000c2969e545/usb_cam-1*.log
但从这个报错查出来的都是opencv的问题,读取摄像头信息失败了。
但是在opencv读取视频和图片全部成功,可能是摄像头的问题,或者调用摄像头的代码出现问题。
由于调用摄像头的代码往往潜藏在一个项目中,而且层层嵌套,而且一般情况下,官方打包好的代码一般都是自己的问题,而不是官方代码的问题。
2.排查
(1)虚拟机在默认设置下,电脑的摄像头是没连接的,通过设置把摄像头连接起来。
在连接后,再运行调用摄像头的代码,还是失败,进行第二个排查。
(2)进入当前的虚拟机设置,看看是不是接口出现了问题。有些新的笔记本是usb2.0以上的接口,我的是3.1。
(3)还失败,查看是不是驱动的问题。
sudo apt-get install ros-melodic-usb-cam
这是通用驱动,其中melodic为ros版本,对应修改。
roslaunch usb_cam usb_cam-test.launch
这是刚刚驱动自带的一个测试demo,如果正常运行,可以排除硬件上的问题。
(4)再回到调用摄像头的代码,运行一下,看看成功与否,如果之前的测试damo跑起来了,但是调用摄像头代码报错,考虑是代码需要修改。
经过后面的学习,还有一种可能,就是调用摄像头时的参数和摄像头硬件的参数不对应。
<launch>
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
<param name="video_device" value="/dev/video0" />
<param name="image_width" value="640" />
<param name="image_height" value="480" />
<param name="pixel_format" value="yuyv" />
<param name="camera_frame_id" value="usb_cam" />
<param name="io_method" value="mmap"/>
</node>
<node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
<remap from="image" to="/usb_cam/image_raw"/>
<param name="autosize" value="true" />
</node>
</launch>
其中节点usb_cam节点的参数mage_width和image_height和硬件参数不对应时也会报错,不能盲目的复制人家的代码要结合自己的硬件。