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

2023-05-16

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

文章目录

  • 1 ROS中的图像数据
    • 1.1 二维图像
      • 1.1.1 安装安装usb_cam
      • 1.1.2 显示图像数据
    • 1.2 三维图像(kinect)
  • 2 摄像头标定
    • 2.1 摄像头标定准备工作
    • 2.2 摄像头标定流程
      • 2.2.1 普通摄像头标定流程
      • 2.2.2 Kinect标定流程
    • 2.3 摄像头使用标定文件
      • 2.3.1 普通摄像头如何使用标定文件?
      • 2.3.2 Kinect如何使用标定文件?
      • 2.3.3 使用标定文件时可能产生的错误
  • 3 ROS+OpenCV
    • 3.1 OpenCV简介
    • 3.2 OpenCV使用
    • 3.3 人脸识别
    • 3.4 物体跟踪
  • 4 二维码识别
    • 4.1 二维码使用
    • 4.2 摄像头二维码识别
    • 4.3 Kinect二维码识别
  • 5 扩展内容:物体识别与机器学习
  • 6 参考资料

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 

image-20200514050519626

查看图像消息

$ rosmsg show sensor_msgs/Image 

image-20200514050341910

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

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

压缩图像消息

$ rosmsg show sensor_msgs/CompressedImage

3

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

1.2 三维图像(kinect)

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

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

显示点云类型

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

image-20200514055259403

查看点云消息

$ rosmsg show sensor_msgs/PointCloud2 
  • height:点云图像的纵向分辨率;
  • width:点云图像的横向分辨率;
  • 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.标定过程

image-20200514070452407

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

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

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

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

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

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

image-20200514071919747

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

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

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

image_width: 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参数来进行加载;

image-20200514074628746

2.3.2 Kinect如何使用标定文件?

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

image-20200514075201202

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

image-20200514075627468

原因:标定文件中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 

image-20200514081639196

测试例程

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

image-20200514093102783

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

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

输入参数:

1.图像消息流

2.转换的图像数据格式

3.3 人脸识别

image-20200514095917834

启动人脸识别实例

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

image-20200514101144920

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

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

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

3.4 物体跟踪

image-20200514101637978

启动物体跟踪实例

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

image-20200514102357607

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

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

4 二维码识别

4.1 二维码使用

安装二维码识别功能包

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

image-20200514110200374

创建二维码

$ 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS中阶笔记(五):机器人感知—机器视觉 的相关文章

  • UCOSIII学习-任务管理

    UCOSIII学习 任务管理 1 UCOSIII 任务组成2 UCOSIII 默认系统任务3 UCOSIII 任务状态4 任务堆栈1 任务堆栈的创建2 任务堆栈初始化 5 任务控制块1 任务控制块创建2 任务控制块初始化 6 任务就绪表1

随机推荐

  • ubuntu(Linux)配置允许远程登陆

    安装ubuntu后默认不可以以root方式登录系统 xff0c 需要做以下配置 1 使用sudo i 命令可以让用户切换到root用户 xff0c guo用户是安装ubuntu时配置的用户 xff0c 因人而异 xff1b 2 配置root
  • python带下划线的变量和函数

    参考文献 xff1a https blog csdn net AI S YE article details 44685139
  • ADD,COPY,ENTRYPOINT和cmd

    Dockerfile中有关信息 xff1a ADD与COPY区别 add 1 对压缩包进行解压2 可以在后面直接跟文件地址 copy xff1a 把本地的文件copy到容器里面 ENTRYPOINT与CMD区别 1 第一种解释 xff08
  • docker实例操作

    很多东西都是借鉴各位大神的 xff0c 也不知道具体是谁或是哪个链接 xff0c 很抱歉 两者同为目前版本中个人和小团队常用的服务级操作系统 xff0c 在线提供的软件库中可以很方便的安装到很多开源的软件及库 两者都使用bash作为基础sh
  • 三、FreeRTOS任务管理--常用函数

    任务的基本概念 FreeRTOS 的任务可认为是一系列独立任务的集合 每个任务在自己的环境中运行 在任何时刻 xff0c 只有一个任务得到运行 xff0c FreeRTOS 调度器决定运行哪个任务 调度器会不断的启动 停止每一个任务 xff
  • 七、FreeRTOS事件和常用函数接口

    基本概念 事件是一种实现任务间通信的机制 xff0c 主要用于实现多任务间的同步 xff0c 但事件通信只能是事件类型的通信 xff0c 无数据传输 与信号量不同的是 xff0c 它可以实现一对多 xff0c 多对多的同步 即一个任务可以等
  • PX4姿态估计源码分析

    写在前面 今天入坑PX4开始学习PX4代码 xff0c pixhawk硬件是可以支持PX4 ardupilot两套固件 我用的是1 6 0rc1版本代码 代码位置 xff1a Firmware1 6 0rc1 src modules att
  • PX4位置估计源码分析

    写在前面 源码版本 xff1a 1 6 0rc1 源码位置 xff1a Firmware 1 6 0rc1 src modules position estimator inav position estimator inav main c
  • ROS入门笔记(二):ROS安装与环境配置及卸载(重点)

    ROS入门笔记 xff08 二 xff09 xff1a ROS安装与环境配置及卸载 xff08 重点 xff09 文章目录 1 ROS安装步骤1 1 ROS版本1 2 确定Ubuntu版本号1 3 安装ROS1 3 1 Ubuntu初始环境
  • windows安装Java环境及Flightplot分析PX4飞行日志

    写在前面 用Flightplot分析PX4飞行日志 xff0c 不管是windows还是Ubuntu都需要安装对应的Java环境 xff08 我用的是win10家庭版 xff09 1 下载安装java环境 xff1a a 下载 点击地址进行
  • PX4_ECL_EKF代码分析1

    写在前面 源码版本 xff1a 1 6 0rc1 源码位置1 xff1a Firmware 1 6 0rc1 src modules ekf2 main cpp 源码位置2 xff1a Firmware 1 6 0rc1 src lib e
  • PX4_ECL_EKF代码分析2

    写在前面 源码版本 xff1a 1 6 0rc1 源码位置1 xff1a Firmware 1 6 0rc1 src modules ekf2 main cpp 源码位置2 xff1a Firmware 1 6 0rc1 src lib e
  • 基于RflySim平台的mahony(含磁罗盘)互补滤波在pixhawk仿真及实物实验(带实验数据)

    写在前面 本案例实验采用RflySim平台 xff0c 该平台可以高效快速编写代码 xff0c 使用simulink模型搭建 xff0c 可以见代码直接生成对应的C代码 xff0c 并一键将代码烧录Pixhawk中 xff0c 是一种快速开
  • ROS学习笔记(1)——创作工作空间/安装usb_cam来调用摄像头

    写在前面 ubuntu版本 xff1a 20 04 ros版本 xff1a noetic 工作空间 工作空间 workspace 是一个存放工程开发相关的文件夹 xff0c 一般包含 xff1a src xff1a 代码空间 xff0c 存
  • ROS学习笔记(2)——roslaunch turtle_tf turtle_tf_demo.launch报错问题(Ubuntu20.04python2与python3版本切换)

    写在前面 Ubuntu版本 xff1a 20 04 ROS版本 xff1a noetic 解决运行roslaunch turtle tf turtle tf demo launch文件后报错问题 问题说明 xff1a 此问题最终是由于pyt
  • ROS学习笔记(3)——通过脚本控制rviz中创建的机器人运动

    写在前面 需求 xff1a rviz中创建的机器人模型 xff0c 通过运行脚本方式控制其运动 ros版本 kinetic noetic 两个版本亲测都可以 整体效果 思路 机器人描述文件xacro xff0c 通过joint 关节 来控制
  • ROS学习笔记(4)——RVIZ中显示双足机器人行走

    写在前面 ros版本 kinetic noetic 亲测可行 结合前面笔记 3 需求 xff1a 在rviz中实现双足机器人行走 效果展示 实现方式 rviz中机器人运动是通过控制关节运动的角度 xff0c 来改变机器人在rviz中的显示
  • C 语言中 void* 详解及应用

    void 在英文中作为名词的解释为 空虚 空间 空隙 xff0c 而在 C 语言中 xff0c void 被翻译为 34 无类型 34 xff0c 相应的void 为 34 无类型指针 34 void 似乎只有 34 注释 34 和限制程序
  • Modbus Poll/Slave 模拟器使用教程

    一 Modbus协议 ModBus官网是Modicon xff08 Modicon被施耐德收购 xff09 公司为其PLC通讯而开发的一种通讯协议 Q1 什么是PLC xff1f A1 在工业生产过程中 xff0c 大量的开关量顺序控制 x
  • ROS中阶笔记(五):机器人感知—机器视觉

    ROS中阶笔记 xff08 五 xff09 xff1a 机器人感知 机器视觉 文章目录 1 ROS中的图像数据1 1 二维图像1 1 1 安装安装usb cam1 1 2 显示图像数据 1 2 三维图像 kinect 2 摄像头标定2 1