一、openni_camera
1.openni_camera:
OpenNI摄像机在ROS下的驱动,可以发出原始的depth、RGB、IR图像流。
OpenNI摄像包括: Microsoft Kinect, PrimeSense PSDK, ASUS Xtion Pro、Pro Live。
这是最简化的驱动程序,节点只可以发送原始数据。因此推荐使用openni2_launch安装包, 因为其中包含了对RGB-D数据的进一步处理。
Ubuntu下的安装:
sudo apt-get install ros-<rosdistro>-openni2-camera
或者
sudo apt-get install ros-<rosdistro>-openni2-launch
2.openni2_node发布的话题:
(1)RGB camera:
rgb/camera_info(sensor_msgs/CameraInfo)//相机的校准和元数据
rgb/image_raw (sensor_msgs/Image) //来自于设备的原始数据
(2)Depth camera:
depth_registration为false(关闭OpenNI registration)时:
depth/camera_info (sensor_msgs/CameraInfo)//相机的校准和元数据
depth/image_raw (sensor_msgs/Image) //来自于设备的原始数据,毫米表示的uint16格式深度数据。
Registered depth camera (aligned with RGB camera),depth_registration为true(使能OpenNI registration):
depth_registered/camera_info (sensor_msgs/CameraInfo)//相机的校准和元数据,与depth_registered/image_raw同步。
depth_registered/image_raw (sensor_msgs/Image)//来自于设备配准后的原始数据,毫米表示的uint16格式深度数据。
(3)IR camera:
ir/camera_info (sensor_msgs/CameraInfo) /相机的校准和元数据
ir/image_raw (sensor_msgs/Image) //原始的uint16 IR image
(4)IR projector:
projector/camera_info (sensor_msgs/CameraInfo)
伪造IR projector的校准,基准以P矩阵形式编码,立体进程节点可以使用depth和projector信息作为左右对。
3.服务:
rgb/set_camera_info (sensor_msgs/SetCameraInfo) //设置RGB camera校准
ir/set_camera_info (sensor_msgs/SetCameraInfo)//设置IR camera校准
4.参数:
(1)~device_id (string, default: #1)
指定打开的设备,推荐以下格式:
#1 :发现的第一个设备使用该编号。
2@3 :USB总线2,地址为3。
B00367707227042B:设备的序列名。
(2)~rgb_frame_id(string, default: /openni_rgb_optical_frame)
RGB camera 的 tf 坐标系。
(3)~depth_frame_id(string,default:/openni_depth_optical_frame)
IR/depth camera 的 tf 坐标系。
(4)~rgb_camera_info_url(string,default:file://${ROS_HOME}/
camera_info/${NAME}.yaml)
RGB camera的校准文件URL.
(5)~time_out (double)//数据流刷新超时
5.动态可重组参数:
(1)~image_mode (int, default: 2)
color/grayscale image的输出模式,包括:
SXGA_15Hz (1): 1280x1024@15Hz,
VGA_30Hz (2): 640x480@30Hz,
VGA_25Hz (3): 640x480@25Hz,
QVGA_25Hz (4): 320x240@25Hz,
QVGA_30Hz (5): 320x240@30Hz,
QVGA_60Hz (6): 320x240@60Hz,
QQVGA_25Hz (7): 160x120@25Hz,
QQVGA_30Hz (8): 160x120@30Hz,
QQVGA_60Hz (9): 160x120@60Hz
(2)~depth_mode (int, default: 2)
depth image的输出模式,包括:
SXGA_15Hz (1): 1280x1024@15Hz,
VGA_30Hz (2): 640x480@30Hz,
VGA_25Hz (3): 640x480@25Hz,
QVGA_25Hz (4): 320x240@25Hz,
QVGA_30Hz (5): 320x240@30Hz,
QVGA_60Hz (6): 320x240@60Hz,
QQVGA_25Hz (7): 160x120@25Hz,
QQVGA_30Hz (8): 160x120@30Hz,
QQVGA_60Hz (9): 160x120@60Hz
(3)~depth_registration (bool, default: False)
深度数据校准。
(4)~data_skip (int, default: 0)
每隔N幅图像发送一幅。(rgb/depth/depth_registered/ir) N: 0 to 10
(5)~depth_time_offset (double, default: 0.0)
深度图像时间偏移量,单位:s. Range: -1.0 to 1.0
(6)~image_time_offset (double, default: 0.0)
image图像时间偏移量,单位:s. Range: -1.0 to 1.0
(7)~depth_ir_offset_x (double, default: 5.0)
X offset between IR and depth images Range: -10.0 to 10.0
(8)~depth_ir_offset_y (double, default: 4.0)
Y offset between IR and depth images Range: -10.0 to 10.0
(9)~z_offset_mm (int, default: 0)
Z offset in mm Range: -50 to 50
6.openni_camera/driver nodelet和openni_node具有相同的参数。
二、rgbd_launch:
打开RGBD设备的launch文件,载入的节点将原始的depth/RGB/IR图像流转变成了
depth图像, disparity图像 and (registered) point clouds。
1.rgbd_launch包含了驱动安装包openni_launch或 freenect_launch需要的通用launch文件。
主要有两个重要的launch文件:
(1)processing.launch.xml:安装一系列nodelets去处理来自RGB-D driver(openni_camera or freenect_camera)
的数据,还可以设定参数简化处理nodelets图像。
(2)kinect_frames.launch:为 Kinect安装tf tree。也可以从openni_launch or freenect_launch内部启动该文件。
2.rgbd_launch文件包含多个分散处理的launch文件。但只有 processing.launch.xml可以在外部修改使用。
processing.launch.xml参数:
(1)rgb_processing (bool, default: true)
安装产生原始和校准的单色及多彩图像的nodelets。
给出了来自RGB-D驱动的Bayer编码的rgb/image_raw topic。
产生了rgb/image_mono, rgb/image_rect_mono, rgb/image_color和rgb/image_rect_color话题。
(2)debayer_processing (bool, default: true)
设置为true说明rgb_processing=true,设置为false会导致rgb_processing只产生rgb/image_rect_color。
(3)ir_processing (bool, default: true)
设置为true,校准 IR image(ir/image_raw -> ir/image_rect_raw)
(4)depth_processing (bool, default: true)
给出原始的深度数据并校准。
将原始的和校准的图像数据转变为标准的格式(uint16 -> float),产生一个点云。
需要depth/image_raw,产生depth/image_rect_raw (rectified), depth/image (metric), depth/image_rect (rectified, metric), depth/points (pointcloud).
(5)depth_registered_processing (bool, default: true)
产生深度和RGB配准的RGBD点云。
点云的生成有两种方式:
软件配准管线(要求:sw_registered_processing = true,
depth_processing = true,depth_registration = false)。
硬件配准管线(要求:hw_registered_processing = true,
depth_registration = true)
(6)disparity_processing (bool, default: true)
由未校准的深度数据生成disparity图像。
将depth/image_rect_raw and projector/camera_info转换成depth/disparity。
(7)sw_registered_processing (bool, default: true)
软件管线配准处理: depth/image_rect_raw
->depth_registered/sw_registered/image_rect_raw(registered)
->depth_registered/points AND depth_registered/disparity.
(8)hw_registered_processing (bool, default: true)
硬件管线配准处理:
depth/image_raw->depth_registered/hw_registered/image_rect_raw(rectified)-> depth_registered/points 和 depth_registered/disparity.
重映射:
(1)rgb (string, default: rgb)
重映射rgb命名空间。
(2)ir (string, default: ir)
重映射ir命名空间。
(3)depth (string, default: depth)
重映射depth命名空间。
(4)depth_registered (string, default: depth_registered)
重映射depth_registered命名空间。
(5)projector (string, default: projector)
重映射projector命名空间。
三、openni2.launch
主要是对rgbd_launch和openni_camera的包装。
<launch>
<!-- "camera" 唯一标识该设备. 所有的topics都在"camera"命名空间下,并且它是tf frame ids的前缀. -->
<arg name="camera" default="camera" />
<arg name="rgb_frame_id" default="$(arg camera)_rgb_optical_frame" />
<arg name="depth_frame_id" default="$(arg camera)_depth_optical_frame" />
<!-- device_id有如下的格式:
"#1" : 第一个被发现 的设备。
"2@X" :USB bus 2 上第X个被发现的设备-->
<arg name="device_id" default="#1" />
<!-- 默认校准文件存在是${ROS_HOME}/camera_info/${NAME}.yaml,
${NAME}是来自"[rgb|depth]_[serial#]"的设备序列编号,例: "depth_B00367707227042B".
-->
<arg name="rgb_camera_info_url" default="" />
<arg name="depth_camera_info_url" default="" />
<!-- 硬件设备配准-->
<arg name="depth_registration" default="false" />
<!-- 驱动参数 -->
<arg name="color_depth_synchronization" default="false" />
<arg name="auto_exposure" default="true" />
<arg name="auto_white_balance" default="true" />
<!-- 重映射设备空间的所有参数 -->
<arg name="rgb" default="rgb" />
<arg name="ir" default="ir" />
<arg name="depth" default="depth" />
<!-- 当你播放录制的包文件或自己编写了更为精准的tf时,需要选择性抑制自主载入驱动的nodelet或发布的tf tree. -->
<arg name="load_driver" default="true" />
<arg name="publish_tf" default="true" />
<!-- 处理模式 -->
<arg name="rgb_processing" default="true" />
<arg name="debayer_processing" default="false" />
<arg name="ir_processing" default="false" />
<arg name="depth_processing" default="true" />
<arg name="depth_registered_processing" default="true" />
<arg name="disparity_processing" default="false" />
<arg name="disparity_registered_processing" default="false" />
<arg name="hw_registered_processing" default="true" if="$(arg depth_registration)" />
<arg name="sw_registered_processing" default="false" if="$(arg depth_registration)" />
<arg name="hw_registered_processing" default="false" unless="$(arg depth_registration)" />
<arg name="sw_registered_processing" default="true" unless="$(arg depth_registration)" />
<!-- 默认关闭topic复位功能 -->
<arg name="respawn" default="false" />
<!-- nodelet manager的线程数 -->
<arg name="num_worker_threads" default="4" />
<!-- 载入topics/nodelets进入 "camera" 命名空间 -->
<group ns="$(arg camera)">
<!-- 启动t nodelet manager -->
<arg name="manager" value="$(arg camera)_nodelet_manager" />
<arg name="debug" default="false" /> <!-- Run manager in GDB? -->
<include file="$(find rgbd_launch)/launch/includes/manager.launch.xml">
<arg name="name" value="$(arg manager)" />
<arg name="debug" value="$(arg debug)" />
<arg name="num_worker_threads" value="$(arg num_worker_threads)" />
</include>
<!-- 载入驱动 -->
<include if="$(arg load_driver)"
file="$(find openni2_launch)/launch/includes/device.launch.xml">
<arg name="manager" value="$(arg manager)" />
<arg name="device_id" value="$(arg device_id)" />
<arg name="rgb_frame_id" value="$(arg rgb_frame_id)" />
<arg name="depth_frame_id" value="$(arg depth_frame_id)" />
<arg name="rgb_camera_info_url" value="$(arg rgb_camera_info_url)" />
<arg name="depth_camera_info_url" value="$(arg depth_camera_info_url)" />
<arg name="rgb" value="$(arg rgb)" />
<arg name="ir" value="$(arg ir)" />
<arg name="depth" value="$(arg depth)" />
<arg name="respawn" value="$(arg respawn)" />
<arg name="depth_registration" value="$(arg depth_registration)" />
<arg name="color_depth_synchronization" value="$(arg color_depth_synchronization)" />
<arg name="auto_exposure" value="$(arg auto_exposure)" />
<arg name="auto_white_balance" value="$(arg auto_white_balance)" />
</include>
<!-- 载入标准的constellation of processing nodelets -->
<include file="$(find rgbd_launch)/launch/includes/processing.launch.xml">
<arg name="manager" value="$(arg manager)" />
<arg name="rgb" value="$(arg rgb)" />
<arg name="ir" value="$(arg ir)" />
<arg name="depth" value="$(arg depth)" />
<arg name="respawn" value="$(arg respawn)" />
<arg name="rgb_processing" value="$(arg rgb_processing)" />
<arg name="debayer_processing" value="$(arg debayer_processing)" />
<arg name="ir_processing" value="$(arg ir_processing)" />
<arg name="depth_processing" value="$(arg depth_processing)" />
<arg name="depth_registered_processing" value="$(arg depth_registered_processing)" />
<arg name="disparity_processing" value="$(arg disparity_processing)" />
<arg name="disparity_registered_processing" value="$(arg disparity_registered_processing)" />
<arg name="hw_registered_processing" value="$(arg hw_registered_processing)" />
<arg name="sw_registered_processing" value="$(arg sw_registered_processing)" />
</include>
</group> <!-- camera -->
<!-- 载入默认tf -->
<include if="$(arg publish_tf)"
file="$(find rgbd_launch)/launch/kinect_frames.launch">
<arg name="camera" value="$(arg camera)" />
</include>
</launch>