~欢迎关注~
微信公众号:古月居
新浪微博:古月春旭
知乎专栏:古月居
古月居联合深蓝学院推出的“古月私房课”第一弹——《ROS机械臂开发:从入门到实战》已经上线啦,欢迎各位小伙伴前来围观,以下是第八讲《ROS机器视觉应用中的关键点》的内容精要。
大家好,这里是《ROS机械臂开发:从入门到实战》的第八讲——ROS机器视觉应用中的关键点,我是主讲人胡春旭。
在很多应用场景中,机械臂都是重要的执行单元,需要配合摄像头等传感器来感知外界环境,本讲我们就来介绍ROS机器视觉应用中的几个关键点。
首先我们需要知道如何在ROS中将摄像头驱动起来,以及驱动发布的图像数据是什么样的。
ROS中有通用USB摄像头的驱动功能包——usb_cam,安装后很快就可以把摄像头跑起来,在该功能包的wiki上我们可以看到详细的接口说明,最终的图像将通过<camera_name>/image发布出来,订阅后就可以看到图像了。
该话题的消息类型是sensor_msgs/Image,具体结构如下,按照高清图像计算的话,每帧图像数据量将近3MB,每秒产生的数据量将在60MB以上,会对通信传输造成比较大的压力。
所以我们也经常使用压缩图像进行传输,ROS里也定义了CompressedImage压缩图像的消息,只包含压缩格式和数据即可,大大减少了传输数据量。
除二维摄像头外,我们也可以使用三维摄像头获取更为丰富的数据,常用的RGBD摄像头不仅可以获取每个像素点的RGB值,还可以获取深度XYZ信息,将会以一个点云的形态展现三维环境信息。
下图就是RealSense运行之后的点云图像。
ROS中定义了PointCloud2消息描述点云数据,单帧数据量是纯图像数据的多倍,在图像传输中同样需要考虑优化问题。
摄像头获取图像之后,我们就可以继续下一步——摄像头标定啦。这里有内参标定和外参标定的区别,本讲我们先介绍内参标定,下讲会介绍外参标定。
内参标定主要针对摄像头本身硬件的参数,避免数据源上带来的图像枕形畸变或筒形畸变,在ROS里有直接可用的标定功能包。
启动摄像头之后,就可以运行标定节点了,注意命令后边跟的配置参数,需要指明标定靶的内部角点数、方格边长以及图像话题名。
然后把标定靶放到视野中,根据右上角的提示不断移动,直到“CALIBRATE”按键变成绿色,说明标定图像采集结束,点击“CALIBRATE”和“SAVE”按键后完成标定过程。
将生成的标定参数文件放置到功能包中,并在驱动中添加文件路径,即可在运行后使用标定好的参数啦。
标定后的图像发布出来后,接下来是本讲的重点,我们要完成图像中某物体的识别。
这里要用到一个大家都很熟悉的工具——OpenCV。
ROS本身并没有图形处理能力,需要借助OpenCV等开源库实现,由于不同库中的图像数据定义不同,ROS定义了一个“Bridge”来做桥接,CvBridge就是完成ROS图像消息和OpenCV图像数据转换的“桥”。
我们来运行CvBridge官方提供的一个例程,先将ROS图像消息转换到OpenCV中,并调用OpenCV绘制了一个红点显示出来,再变换回ROS消息,使用ROS工具显示出来,两幅图像是完全一样的。
代码层面就是调用CvBridge实现的。
接下来我们看一个复杂点的图像识别案例:在如下仿真环境中,通过红色摄像头识别黑色桌面和绿色易拉罐的位置,下讲我们再来实现机械臂的抓取。
例程运行后,打开rqt工具,可以看到原始图像、桌面识别结果图像和物体识别结果图像,蓝色框出了识别物体的边缘,红心代表物体的中心。
代码实现方面依然是之前的流程,只不过OpenCV图像处理的部分复杂很多,通过图像通道的分离和阈值判断识别不同的颜色来确定物体的像素位置,再通过一个简单的线性变换计算图像坐标系下的实际位置。
再分别将结果转换成ROS图像消息发布出去,就可以在ROS中看到结果啦!
以上就是本讲的内容精要,详细讲解过程和仿真/真机演示过程请见具体课程。
更多精彩,欢迎大家关注“古月居”。
更多内容欢迎关注:
微信公众号:古月居 (guyue_home)
新浪微博:古月春旭
知乎专栏:古月居