zoukankan      html  css  js  c++  java
  • ROS中阶笔记(五):机器人感知—机器视觉

    ROS中阶笔记(五):机器人感知—机器视觉

    1 ROS中的图像数据

    1.1 二维图像

    1.1.1 安装安装usb_cam

    步骤一,检测电脑是安装usb_cam还是应该安装uvc_cam

     $ lsusb                         #查看usb摄像头
    

    打开网址:http://www.ideasonboard.org/uvc/,查看与自己摄像头匹配的ID号。
    如果有,就说明你的笔记本摄像头比较好,有他的厂商提供的linux驱动,是uvc_cam
    没有匹配的ID,说明是usb_cam。

    Bus 001 Device 002: ID 04f2:b6d9 Chicony Electronics Co., Ltd #摄像头
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 002 Device 004: ID 0e0f:0008 VMware, Inc.
    Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
    Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
    Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

    步骤二,查看摄像头设备

    $ ls /dev/video*                     #默认笔记本自带摄像头是video0
    

    步骤三,测试您的网络摄像头;(虚拟机+ubuntu16.04)

    $ sudo apt-get install cheese
    $ cheese                                       # 启动cheese查看摄像头情况
    

    步骤四,安装usb_cam

    $ sudo apt-get install ros-kinetic-usb-cam    # 安装摄像头功能包
    $ roslaunch usb_cam usb_cam-test.launch       # 启动功能包
    $ rqt_image_view                              # 可视化工具
    

    新版本的usb_cam包在launch文件夹下有自带的launch文件,名叫usb_cam-test.launch

    1.1.2 显示图像数据

    显示图像类型

    $ roslaunch usb_cam usb_cam-test.launch 		
    $ rostopic info /usb_cam/image_raw 
    

    查看图像消息

    $ rosmsg show sensor_msgs/Image 
    

    • Header:消息头,包含消息序号,时间戳和绑定坐标系;
    • height:图像的纵向分辨率;
    • 图像的横向分辨率;
    • encoding:图像的编码格式,包含RGB、YUV等常用格式,不涉及图像压缩编码;
    • is_bigendian:图像数据的大小端存储模式;
    • step:一行图像数据的字节数量,作为数据的步长参数;
    • data:存储图像数据的数组,大小为step*height个字节;

    1080 * 720分辨率的摄像头产生一帧图像的数据大小是 3 * 1080 * 720=2764800字节,即2.7648MB

    压缩图像消息

    $ rosmsg show sensor_msgs/CompressedImage
    

    • format:图像的压缩编码格式(jpeg,png,bmp)
    • data:存储图像数据数组

    1.2 三维图像(kinect)

    红外摄像头采集三维点云数据,采集的位置信息从xyz三个方向上描述,每一个方向上的数据都是一个浮点数;

    一个浮点数占据的空间大小为4个字节。

    显示点云类型

    $ roslaunch freenet_launch freenect.launch 	    #启动kinect 
    $ rostopic info /camera/depth_registered/points 
    

    查看点云消息

    $ rosmsg show sensor_msgs/PointCloud2 
    
    • height:点云图像的纵向分辨率;
    • 点云图像的横向分辨率;
    • fields:每个点的数据类型;
    • is_bigendian:数据的大小端存储模式;
    • point_step:单点的数据字节步长;
    • row_step:一列数据的字节步长;
    • data:点云数据的存储数组,总字节大小为row_step*height;
    • is_dense:是否有无效点;如果有无效点,考虑这一帧的图像数据是否保留或者舍弃。

    点云单帧数据量也很大,如果使用分布式网络传输,需要考虑能否满足数据的传输要求,或者针对数据进行压缩。

    2 摄像头标定

    2.1 摄像头标定准备工作

    图像数据采集之前,需要把摄像头进行一些标定,关于如何标定,我们需要外部工具:棋盘格标定靶

    摄像头为什么要标定?

    摄像头这种精密仪器对光学器件的要求较高,由于摄像头内部与外部的一些原因,生成的物体图像往往会发生畸变,为避免数据源造成的误差,需要针对摄像头的参数进行标定。

    安装标定功能包

    $ sudo apt-get install ros-kinetic-camera-calibration 
    

    2.2 摄像头标定流程

    2.2.1 普通摄像头标定流程

    1.启动摄像头

    $ roslaunch robot_vision usb_cam.launch      # 启动摄像头功能包  
    
    $ roslaunch usb_cam usb_cam-test.launch       # 启动摄像头功能包
    

    2.启动标定包

    $ rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.024 image:=/usb_cam/image_raw camera:=/usb_cam 
    
    # 8x6,中间是x,而不是乘号;
    # 启动标定包之后,把棋盘格标定靶放在摄像头的可视范围内;
    # square 0.024 实际打印出来纸张的正方形边长,自己拿尺子测量;0.024米
    
    - 1.size:标定棋盘格的内部角点个数,这里使用的棋盘一共有六行,每行有8个内部角点;
    - 2.square:这个参数对应每个棋盘格的边长,单位是米;
    - 3.image和camera:设置摄像头发布的图像话题;
    

    3.标定过程

    • X:标定靶在摄像头视野中的左右移动,变为绿色说明已经满足标定需求;
    • Y:标定靶在摄像头视野中的上下移动;
    • Size:标定靶在摄像头视野中的前后(远近)移动;
    • Skew:标定靶在摄像头视野中的倾斜转动;

    CALIBRATE:标定之前是灰色;标定成功之后,变为深绿色,说明当前标定已经结束;点击它,界面好像未响应,这是因为它在后台进行数据运算,不要关闭;

    后面两个灰色灰色按键SAVE、COMMIT变为深绿色,说明计算完成;

    4.同时在终端中显示标定结果:

    点击按键SAVE,在终端中显示标定的数据放在哪一个路径下面;

    ('Wrote calibration data to', '/tmp/calibrationdata.tar.gz')

    5.解压缩——找到标定文件

    ('Wrote calibration data to', '/tmp/calibrationdata.tar.gz')

    找到calibrationdata.tar.gz文件,解压,里面有很多图片(在做标定的时候,采样图片,这些图片已经没用),我们需要只有一个文件ost.yaml文件,把这个文件拷贝到功能包(自己建的任务的功能包)下面;

    image_ 640
    image_height: 480
    camera_name: narrow_stereo
    camera_matrix:
      rows: 3
      cols: 3
      data: [672.219498, 0.000000, 322.913816, 0.000000, 676.060141, 220.617820, 0.000000, 0.000000, 1.000000]
    distortion_model: plumb_bob
    distortion_coefficients:
      rows: 1
      cols: 5
      data: [-0.146620, 0.187588, 0.001657, 0.000009, 0.000000]
    rectification_matrix:
      rows: 3
      cols: 3
      data: [1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000]
    projection_matrix:
      rows: 3
      cols: 4
      data: [655.937012, 0.000000, 323.001754, 0.000000, 0.000000, 665.393311, 220.554221, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000]
    

    2.2.2 Kinect标定流程

    Kinect包含彩色摄像头和红外摄像头,我们需要针对两个摄像头分别做标定。

    1.启动Kinect

    $ roslaunch robot_vision freenect.launch 
    

    2.启动彩色摄像头

    $ rosrun camera_calibration cameracalibrator.py image:=/camera/rgb/image_raw camera:=/camera/rgb --size 8x6 --square 0.024 
     
    

    3.标定红外摄像头

    $ rosrun camera_calibration cameracalibrator.py image:=/camera/ir/image_raw camera:=/camera/ir --size 8x6 --square 0.024 
    

    2.3 摄像头使用标定文件

    2.3.1 普通摄像头如何使用标定文件?

    在launch文件中加载标定文件,通过camera_info_url参数来进行加载;

    2.3.2 Kinect如何使用标定文件?

    Kinect因为有两个标定文件,因此需要通过两个参数的加载来完成;把两个文件都加载在进来。

    2.3.3 使用标定文件时可能产生的错误

    原因:标定文件中camera_name参数与实际传感器名称不匹配

    解决方法:按照警告提示的信息进行修改即可。

    比如根据上图所示的警告,分别将两个标定文件.yaml中的camera_name参数修改为
    “rgb_A70774707163327A”、“depth_A70774707163327A”即可。

    3 ROS+OpenCV

    3.1 OpenCV简介

    Open Source Computer Vision Library;基于BSD许可发行的跨平台开源计算机视觉库(Linux、Windows和Mac OS等);由一系列C函数和少量C++类构成,同时提供C++、Python、Ruby、MATLAB等语言的接口;实现了图像处理和计算机视觉方面的很多通用算法,而且对非商业应用和商业应用都是免费的;可以直接访问硬件摄像头,并且还提供了一个简单的GUl系统一highgui。

    3.2 OpenCV使用

    安装OpenCV

    $ sudo apt-get install ros-kinetic-vision-opencv libopencv-dev python-opencv 
    

    测试例程

    $ roslaunch robot_vision usb_cam.launch        # 启动摄像头
    $ rosrun robot_vision cv_bridge_test.py        # 打开opencv图像,自己的api接口
    $ rqt_image_view                   # ROS中的图像
    

    imgmsg_to_cv2():将ROS图像消息转换成OpenCV图像数据

    cv2_to_imgmsg():将OpenCV格式的图像数据转换成ROS图像消息

    输入参数:

    1.图像消息流

    2.转换的图像数据格式

    3.3 人脸识别

    启动人脸识别实例

    $ roslaunch robot_vision usb_cam.launch            # 启动摄像头
    $ roslaunch robot_vision face_detector.launch      # 启动人脸识别功能节点
    $ rqt_image_view
    

    初始化部分:完成ROS节点、图像、识别参数的设置。

    ROS图像回调函数:将图像转化成OpenCV的数据格式,然后预处理之后开始调用人脸识别的功能函数,最后把识别的结果发布。

    人脸识别:调用OpenCV提供的人脸识别接口,与数据库中的人脸特征进行匹配。

    3.4 物体跟踪

    启动物体跟踪实例

    $ roslaunch robot_vision usb_cam.launch                  # 启动摄像头
    $ roslaunch robot_vision motion_detector.launch          # 启动物体跟踪功能节点
    $ rqt_image_view
    

    初始化部分:完成ROS节点、图像、识别参数的设置

    图像处理:将图像转换成OpenCV格式;完成图像预处理之后开始针对两帧图像进行比较,基于图像差异识别到运动的物体,最后标识识别结果并发布

    4 二维码识别

    4.1 二维码使用

    安装二维码识别功能包

    $ sudo apt-get install ros-kinect-ar-track-alvar
    

    创建二维码

    $ rosrun ar_track_alvar createMarker
    $ rosrun ar_track_alvar createMarker 0
    	
    $ roscd robot_vision/config
    $ rosrun ar_track_alvar createMarker -s 5 0         #边长5厘米,数字为0的二维码
    $ rosrun ar_track_alvar createMarker -s 5 1
    $ rosrun ar_track_alvar createMarker -s 5 2
    

    4.2 摄像头二维码识别

    1.启动摄像头二维码识别示例

    $ roslaunch robot_vision usb_cam_with_calibration.launch
    $ roslaunch robot_vision ar_track_camera.launch
    

    启动摄像头时,需要加载标定文件,否则可能无法识别二维码。

    2.查看识别到的二维码位姿

    $ rostopic echo /ar_pose_marker
    

    4.3 Kinect二维码识别

    启动Kinect二维码识别示例

    $ roslaunch robot_vision freenect.launch
    $ roslaunch robot_vision ar_track_kinect.launch
    

    5 扩展内容:物体识别与机器学习

    Object Recognition Kitchen(ORK) 物体识别框架

    TensorFlow Object Detection API 识别API

    6 参考资料

    ROS cV_bridge wiki: http://wiki.ros.org/cv_bridge
    ROS opencv_apps: http://wiki.ros.org/opencv_apps

    微信公众号:喵哥解说
    公众号介绍:主要研究机器学习、计算机视觉、深度学习、ROS等相关内容,分享学习过程中的学习笔记和心得!期待您的关注,欢迎一起学习交流进步!同时还有1200G的Python视频和书籍资料等你领取!!!

  • 相关阅读:
    02-三种布局方式/触屏事件/BFC
    02-单点登录(移动端)
    02-转>>chunk-vendors过大导致首屏加载太慢的优化
    15-转>pc端和h5端多页面配置
    14-转>publicPath
    04-GitHub上上传自己的项目
    03-合并到master后打tag
    final关键字
    重载(Overloading)与覆写(Override)的区别?
    腾讯微博
  • 原文地址:https://www.cnblogs.com/IT-cute/p/12990327.html
Copyright © 2011-2022 走看看