ROS中的三个重要计算机视觉的包分别为:OpenCV,(OpenNI2+OpenKinect) 和 PCL。OpenCV主要负责2D图像处理,OpenNI2和OpenKinect则是以Kinect为摄像头的深度视觉库,PCL是用于处理3D粒子群的库。
1.首先配置好ROS,若还没配置好ROS,参见 ROS和Android的配置笔记。
2.然后安装上面提及的这些包:
$ sudo apt-get install ros-indigo-openni-* ros-indigo-openni2-* \ros-indigo-freenect-*
$ rospack profile
3.安装摄像头的驱动,这里有很多方法,一个简易的方法(不一定适用于所有摄像头),是使用usb_cam包:
$ cd ~/catkin_ws/src
$ git clone https://github.com/bosch-ros-pkg/usb_cam.git
$ cd ~/catkin_ws
$ catkin_make
$ rospack profile
免Linux的驱动摄像头最好,可以通过 ls dev/ 看目录下有无检测到video0(一般为摄像头)。
如果usb_cam包无效,可以试一下Linux UVC包。
可以使用luvcview去测试linux下摄像头的安装是否正确。
4.安装rbx1包,这是ROS by Example的源代码:
$ cd ~/catkin_ws/src
$ git clone https://github.com/pirobot/rbx1.git
$ cd rbx1
$ git checkout indigo-devel
$ cd ~/catkin_ws
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash
$ rospack profile
5.先测试连接Kinect(没有Kinect可以跳过):
$ roslaunch freenect_launch freenect-registered-xyzrgb.launch
如果没有Kinect,可以在初始化结束之后ctrl+C退出。
6.测试
VMWare Workstation 虚拟机对摄像头支持不好。如果摄像头不支持,好像目前无解!
$ roslaunch rbx1_vision usb_cam.launch video_device:=/dev/video0
这会让摄像头publish图像到/camera/rgb/image_raw话题。
若提示没有找到包,试一下如下:
$ cd ~/catkin_ws
$ source ~/catkin_ws/devel/setup.bash
然后用image_view订阅该话题,即可显示摄像头的输入。
在新的terminal中:
$ rosrun image_view image_view image:=/camera/rgb/image_raw
若能看到摄像头输入,说明ROS已经能够正确读取摄像头输入。
7.下面我们安装OpenCV。
$ sudo apt-get install ros-indigo-vision-opencv libopencv-dev \python-opencv
$ rospack profile #查看已经安装的包
8.测试python是否能调用OpenCV:
$ python
>>> from cv2 import cv
如果能够import说明安装成功
>>> quit()
9. ROS与OpenCV之间的图像格式转换由 cv_bridge 包负责,我们看下这个包怎么运作:
$ roslaunch rbx1_vision usb_cam.launch video_device:=/dev/video0
$ $rosrun rbx1_vision cv_bridge_demo.py
Github的代码已经更新,这里面我们需要手动改一些这个python script的语句,注意,这个文件的路径在:
catkin_ws/src/rbx1/rbx1_vision/nodes下。
将其中的 input_rgb_image,input_depth_image全部改为/camera/rgb/image_raw。以上两个是jade里的更新的主题名,但在indigo里,还是以/camera/rgb/image_raw为主题名。
这个python script里面几个关键的语句:
# 创建CvBridge对象
self.bridge = CvBridge()
# 将ros_image通过蓝绿红8位色空间转换为OpenCV图像,结果返回给frame
frame = self.bridge.imgmsg_to_cv2(ros_image,"bgr8")
# 最后将frame用numpy转换成numpy数列,OpenCV这样大部分的函数才能够处理
frame = np.array(frame,dtype = np.uint8)
到这一步,ROS和OpenCV的配置基本完成,接下来OpenCV的开发可以基于ros2opencv2.py(catkin_ws/src/rbx1/rbx1_vision/src/rbx1_vision/ros2opencv2.py),改写其中的process_image()和process_depth_image()函数即可。在订阅主题的同时,这个节点也会发布信息到/roi(关注域,region of interest)主题下。
其具体的格式为:
uint32 x_offset
uint32 y_offset
uint32 height
uint32 width
bool do_rectify
具体请参考这个script。
References:
《ROS by Example》Chapter 10