最近又在弄仿真,需要把RGBD相机转成点云。
ROS提供了用于单目、双目、深度图像处理、相机标定和可视化的工具,包含在集成模块image_pipeline中。主要有以下几个包:
camera_calibration相机标定
depth_image_proc深度图像处理
image_proc基本图像处理
stereo_image_proc双目图像处理
image_view图像可视化
image_rotate图像旋转
image_publisher图像发布
ROS的图像处理模块做的还是很实用的。
image_pipeline提供了深度图像处理包depth_image_proc,因此从深度图转点云图很方便,不需要自己求算相机的内参外参。
需要注意的是,depth_image_proc包需要通过nodelet使用。
最重要的首先就是深度图转点云,ROS通过nodelet插件载入depth_image_proc/point_cloud_xyz方法来进行RGBD图像与PCL的转换。
depth_image_proc/point_cloud_xyz订阅深度相机的参数以及深度图像,并发布点云:
Subscribe:
camera_info (sensor_msgs/CameraInfo)
image_rect (sensor_msgs/Image)
Publish:
points (sensor_msgs/PointCloud2)
Params:
queue_size (int, default: 5)
实际使用时,可采用以下launch文件写法:
上面的launch文件把depth_image_proc/point_cloud_xyz原本订阅和发布的话题映射到了实际使用的话题上。
ROS还提供了将RGB图与深度图配准后投影到点云的方法,depth_image_proc/point_cloud_xyz:
Subscribe:
rgb/camera_info (sensor_msgs/CameraInfo)
rgb/image_rect_color (sensor_msgs/Image)
depth_registered/image_rect (sensor_msgs/Image)
Publish:
depth_registered/points (sensor_msgs/PointCloud2)
Params:
queue_size (int, default: 5)
具体的launch文件与纯深度图转点云类似。需要注意的是,首先要把深度图重投影到RGB图上,也就是“配准”,然后再转RGB点云。
ROS提供了一个将深度图重投影到RGB图上的方法,depth_image_proc/register:
Subscribe:
rgb/camera_info (sensor_msgs/CameraInfo)
rgb/image_rect_color (sensor_msgs/Image)
depth/image_rect (sensor_msgs/Image)
Publish:
depth_registered/camera_info (sensor_msgs/CameraInfo)
depth_registered/image_rect (sensor_msgs/Image)
Params:
queue_size (int, default: 5)
Required TF:
/depth_optical_frame → /rgb_optical_frame
投影时,需要从深度相机光轴坐标系到RGB相机坐标系的TF。
ROS还提供了一个从uint16类型的深度图(mm)转为float类型深度图(m)的方法depth_image_proc/convert_metric:
Subscribe:
image_raw (sensor_msgs/Image)
Publish:
image (sensor_msgs/Image)
最后,还有一个深度图转视差图的方法depth_image_proc/disparity,但实际中用的比较少。
本次记录了在ROS中使用depth_image_proc包将RGBD数据转换为点云数据的方法,加深一下工具使用能力。