ROS图像相关包

转载地址:http://blog.csdn.net/zizi7/article/details/51326055

1. 摄像头图像采集

有2个思路,一个是使用ROS现有的包(主流方法);一个是利用OpenCV提供的VideoCapture方法,然后通过ROS提供的cv_bridge转为sensor_msgs/Image消息(cv_bridge的例程)。
对于第一个思路,ROS有个官方提供的驱动包:libuvc_camera,但《ROS By Example》一书出于使用便利性推荐第三方包:usb_cam。具体使用方法参考“ROS中使用摄像头的问题”


2. 图像信息在ROS中的流动

使用ROS提供的image_transport空间发布和订阅图像话题。一个细节是,image_transport提供了两组类:Publisher, Subscriber和CameraPublisher, CameraSubscriber,前者仅发送图像消息(Sensor_msgs/Image),后者同时提供摄像机信息(sensor_msgs/CameraInfo)。

2.1 Sensor_msgs/Image

参考官方文档

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. # This message contains an uncompressed image  
  2. # (0, 0) is at top-left corner of image  
  3. std_msgs/Header header  
  4. uint32 height  
  5. uint32 width  
  6. string encoding  
  7. uint8 is_bigendian  
  8. uint32 step  
  9. uint8[] data  
2.2 sensor_msgs/CameraInfo
参考官方文档。主要包含了相机分辨率、内参矩阵、畸变向量、旋转矩阵(针对双目相机)等。

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. std_msgs/Header header  
  2. uint32 height  
  3. uint32 width  
  4. stringdistortion_model  
  5. float64[] D  
  6. float64[9] K  
  7. float64[9] R  
  8. float64[12] P  
  9. uint32 binning_x  
  10. uint32 binning_y  
  11. sensor_msgs/RegionOfInterestroi  
2.3 插件
Compressed_image_transport 是image_transport的一个插件包,可以将图像压缩为JPEG或PNG。
Threora_image_transport 是image_transport的一个插件包,可以对图像消息做视频流压缩处理。


3. 视觉算法前的预处理

从摄像头采集的图像一般需要去畸变等步骤才可为高阶视觉算法使用。
ROS的image_pipline主要实现5个功能:相机标定、单相机去畸变(image_proc类实现)、双目相机去畸变、深度相机处理(Kinect)和可视化(image_view)。
实际上这些功能大多使用OpenCV的函数实现的,因此如果嫌麻烦了解这些包,完全可以自己用OpenCV搞定标定、去畸变这些工作。
Image_proc根据CameraInfo去畸变,同时转换bayer(相机内部原始图片,后缀为.raw)。

图3-1. image_proc处理逻辑
如图,Image_proc输出4种图像,分别为灰度畸变、彩色畸变、灰度去畸变、彩色去畸变图像。

4. OpenCV在ROS里的使用

参考官方文档。主要包含两个包:cv_bridgeimage_geometry。前者主要实现OpenCV的Mat/IplImage向ROS消息的转换;后者提供了提供了一系列关于图像几何处理的方法。
Image_geometry预设了两种相机模型:针孔模型(PinholeCameraModel)和双目模型(StereoCameraModel)。类里面实现了图像坐标系(已做去畸变处理)与相机坐标系的转换方法(project3dToPixel / projectPixelTo3dRay,可以参考其源代码,就是简单的应用了图像坐标系到相机坐标系的转换关系
所以需要提前做rectify)。
这里提供了一个使用image_geometry的例子。
以上所有的应用都是基于已知CameraInfo的前提,但如何组织和publish这个消息没找到例子。
camera_info_manager(函数源代码)通过load标定结果设置camerainfo,其中解析标定YML文件的函数由camera_calibrate提供(看它的源代码更好理解)。
camera_info_manager的使用在camera1394里有应用。

5. 坐标转换

Tf采用树的结构组织每个frame的转换关系(旋转和平移,一个细节是这里用四元数Quaternion或RPY的方式描述旋转,有别于OpenCV里的3*3旋转矩阵或罗德里格斯变换。)每个frame可以发布和订阅指定的转换(同时还有时间维度,因为转换关系可能随时间变化)。

6. 其他

1)  OpenCV里一些与坐标转换有关的函数:
cvFindExtrinsicCameraParams(2.x以上版本改为Solvepnp):给定物体世界坐标与其在图像内坐标、内参、畸变,输出旋转,平移。
projectPoints:给定物体世界坐标、旋转、平移、畸变,输出其在图像内坐标。
FindHomography:给定两个平面的系列对应点,输出其透视变换关系H(3*3)。
ConvertPointsToHomogeneous:将点从欧式空间转为齐次空间。这里给出了两种空间的解释,非常形象。
2) 坐标系概念:
“世界坐标系和相机坐标系,图像坐标系的关系”“相机针孔模型----从世界坐标系,到相机坐标系,再到图像物理坐标系,最后到图像像素坐标系的转换过程解析”解释的比较清晰。
这里有一个从图像到世界坐标系转换的尝试,但失败了,因为少了深度信息。
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS中的坐标转换函数是通过tf2库来实现的。这个函数采用固定轴的旋转方式,先绕定轴x旋转(横滚),然后再绕定轴y (俯仰),最后绕定轴z(偏航)。从数学形式上说,这是绕定轴XYZ矩阵依次左乘,即R=R(z)R(y)R(x)的顺序。这种方式的好处是直观且便于人机交互。\[1\] 在动态坐标变换中,ROS系统会根据时间戳进行坐标系和坐标点的匹配,来保证坐标变换的准确性。当时间戳相差较大时,系统会报错。为了解决这个问题,需要在循环中更新订阅端的无效时间戳,即每次循环都要更新时间戳。虽然buffer的时间戳一直不变,但是其内容是一直变得,在一直更新。因此,忽略时间戳并不会影响转换精度。\[2\] 在创建项目功能时,需要依赖于tf2、tf2_ros、tf2_geometry_msgs、roscpp、rospy、std_msgs、geometry_msgs和turtlesim等库。在准备参数时,需要提供两组静态坐标变换的偏移量和四元数,即对应的son1和son2在世界坐标系下的坐标变换。\[3\] #### 引用[.reference_title] - *1* [SLAM中坐标轴旋转及ros的接口解释](https://blog.csdn.net/qq_42911741/article/details/127728007)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [ros tf坐标](https://blog.csdn.net/gyxx1998/article/details/128529862)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [ROS tf2 坐标变换学习(一)](https://blog.csdn.net/weixin_43134049/article/details/124017749)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值