1 Realsense
D455 配置:
- RGB:彩色相机,FOV(h,v)( 90*65 )
- 红外点阵发射(结构光):位于上图中RGB右边,发射特定模式的红外光,通常是一种点阵图案,这有助于红外摄像头捕捉和计算物体的深度信息
- Right 和 Left:双目红外相机,FOV(h,v)( 87 *58 ),可接受普通光源和红外光源,基线9.5cm
可输出:1 深度图 %2@4M; 2 双目灰度图;3 彩色单目Left (ps:不同于RGB相机,这个是IR相机的彩色) - IMU:BMI055
- Intel RealSense D455 的深度信息是通过 结构光 和 双目立体视觉 两者共同计算的.
2 安装
以下是基于Ubuntu20.04系统安装realsense-ros
的一般步骤
2.1 前置
-
安装ROS:您需要在您的计算机上安装ROS。假设您使用的是ROS Noetic版本,您可以按照ROS官方安装指南进行安装。
-
安装RealSense SDK 2.0:在安装
realsense-ros
之前,您需要安装Intel RealSense SDK 2.0。您可以通过以下命令来安装它:sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE sudo add-apt-repository "deb https://librealsense.intel.com/Debian/apt-repo $(lsb_release -cs) main" -u sudo apt-get install librealsense2-dkms -y sudo apt-get install librealsense2-utils -y sudo apt-get install librealsense2-dev -y sudo apt-get install librealsense2-dbg -y # version后面出现realsense表示更新成功。 modinfo uvcvideo | grep "version:"
- 使用sdk:
插入D455相机,需要USB3.0及以上接口。使用命令启动:
realsense-viewer
用来列出系统上连接的所有RealSense设备和它们的属性,使用命令:
rs-enumerate-devices
2.2 realsense-ros
sudo apt install ros-noetic-realsense2-*
3 使用
3.0 获取标定内参
3.0.1 RGB camera
rostopic echo /camera/color/camera_info
header:
seq: 400
stamp:
secs: 1713497073
nsecs: 761307478
frame_id: "camera_color_optical_frame"
height: 720
width: 1280
distortion_model: "plumb_bob"
D: [-0.05626162886619568, 0.06444982439279556, -0.000530999677721411, 0.000420863158069551, -0.020820152014493942]
K: [642.4444580078125, 0.0, 645.138671875, 0.0, 640.9942016601562, 360.464599609375, 0.0, 0.0, 1.0]
R: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
P: [642.4444580078125, 0.0, 645.138671875, 0.0, 0.0, 640.9942016601562, 360.464599609375, 0.0, 0.0, 0.0, 1.0, 0.0]
binning_x: 0
binning_y: 0
roi:
x_offset: 0
y_offset: 0
height: 0
width: 0
do_rectify: False
-
header: 包含消息的元数据。
seq
: 消息序列号。stamp
: 时间戳,secs
和nsecs
分别代表自纪元以来的秒数和纳秒数。frame_id
: 坐标帧的名称,通常用于指定这些内参应用的坐标系统。
-
height 和 width: 图像的高度和宽度,以像素为单位。
-
distortion_model: 畸变模型的类型。"plumb_bob"是一种常见的畸变模型,用于描述镜头畸变。
-
D: 畸变系数数组,对应于您所使用的畸变模型(在这里是"plumb_bob"模型)。这些系数帮助矫正由镜头畸变引起的图像变形。
-
K: 内部矩阵(或相机矩阵),描述了相机的内部光学特性,包括焦距(以像素为单位的fx和fy)和光学中心(cx, cy)。
-
R: 旋转矩阵,用于从相机坐标系转换到理想的图像坐标系。这里的矩阵是一个单位矩阵,表示没有旋转。
-
P: 投影矩阵,通常用于将3D点投影到2D图像平面。它结合了相机的内参、任何额外的旋转以及立体视觉的校正。
-
binning_x 和 binning_y: 这两个参数通常用于描述图像的二值化处理,即在水平方向和垂直方向上每个bin包含的像素数。这里都是0,表示没有二值化。
-
roi (Region of Interest,感兴趣区域): 定义图像中的一个子区域,只有这个区域内的数据会被处理。
x_offset
和y_offset
: ROI区域起点的x和y坐标。height
和width
: ROI区域的高度和宽度。do_rectify
: 是否应用畸变校正。
3.0.2 infra1
camera 左目
rostopic echo /camera/infra1/camera_info
header:
seq: 336
stamp:
secs: 1713497084
nsecs: 199789524
frame_id: "camera_infra1_optical_frame"
height: 480
width: 848
distortion_model: "plumb_bob"
D: [0.0, 0.0, 0.0, 0.0, 0.0]
K: [429.2045593261719, 0.0, 427.69573974609375, 0.0, 429.2045593261719, 241.89158630371094, 0.0, 0.0, 1.0]
R: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
P: [429.2045593261719, 0.0, 427.69573974609375, 0.0, 0.0, 429.2045593261719, 241.89158630371094, 0.0, 0.0, 0.0, 1.0, 0.0]
binning_x: 0
binning_y: 0
roi:
x_offset: 0
y_offset: 0
height: 0
width: 0
do_rectify: False
3.0.3 infra2
camera 右目
rostopic echo /camera/color/camera_info
header:
seq: 345
stamp:
secs: 1713497084
nsecs: 499698400
frame_id: "camera_infra2_optical_frame"
height: 480
width: 848
distortion_model: "plumb_bob"
D: [0.0, 0.0, 0.0, 0.0, 0.0]
K: [429.2045593261719, 0.0, 427.69573974609375, 0.0, 429.2045593261719, 241.89158630371094, 0.0, 0.0, 1.0]
R: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
P: [429.2045593261719, 0.0, 427.69573974609375, -40.79789352416992, 0.0, 429.2045593261719, 241.89158630371094, 0.0, 0.0, 0.0, 1.0, 0.0]
binning_x: 0
binning_y: 0
roi:
x_offset: 0
y_offset: 0
height: 0
width: 0
do_rectify: False
3.1 获取标定外参
需要 source devel/setup.bash;
3.1.1 Left IR camera (深度图)到 RGB
camera
rostopic echo /camera/extrinsics/depth_to_color
这条命令会输出深度摄像头到彩色摄像头的转换矩阵,包括旋转矩阵和平移向量。旋转矩阵接近单位阵,平移向量大概距离6cm。
header:
seq: 0
stamp:
secs: 0
nsecs: 0
frame_id: "depth_to_color_extrinsics"
rotation:
[0.9999966025352478, 0.0024309128057211637, -0.000930685258936137,
-0.0024320671800523996, 0.9999962449073792, -0.001241242396645248,
0.0009276643977500498, 0.0012435016687959433, 0.9999988079071045]
translation:
[-0.05915042757987976, -0.0002094241644954309, 0.0002801527443807572]
3.1.2 Left IR camera 即为 depth camera
rostopic echo /camera/extrinsics/depth_to_infra1
旋转矩阵为单位阵,平移向量为0
header:
seq: 0
stamp:
secs: 0
nsecs: 0
frame_id: "depth_to_infra1_extrinsics"
rotation: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
translation: [0.0, 0.0, 0.0]
3.1.3 Left IR camera 到
Right IR camera
rostopic echo /camera/extrinsics/depth_to_infra2
旋转矩阵为单位阵,平移向量为右侧9.5cm
header:
seq: 0
stamp:
secs: 0
nsecs: 0
frame_id: "depth_to_infra2_extrinsics"
rotation: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
translation: [-0.09505465626716614, 0.0, 0.0]
3.2 使用RealSense ROS获取数据
3.2.1 使用默认配置
roslaunch realsense2_camera rs_camera.launch
启动后查看topic:
rostopic list
图像数据话题
/camera/color/camera_info: 提供彩色摄像头的校准和元数据信息,如内参矩阵、畸变系数等。
/camera/color/image_raw: 发布未经处理的彩色图像数据。
/camera/color/metadata: 关于彩色图像流的元数据。
/camera/depth/camera_info: 发布深度摄像头的校准和元数据信息。
/camera/depth/image_rect_raw: 发布矫正后的深度图像,这些图像已经根据内参矩阵进行了畸变校正。
/camera/depth/metadata: 深度图像流的元数据。
标定和参数配置话题
/camera/extrinsics/depth_to_color: 提供从深度摄像头到彩色摄像头的外参数据,即两个摄像头之间的相对位置和旋转。
/camera/motion_module/parameter_descriptions 和 /camera/motion_module/parameter_updates: 有关运动模块参数的描述和更新。
/camera/rgb_camera/auto_exposure_roi/parameter_descriptions 和 /camera/rgb_camera/auto_exposure_roi/parameter_updates: 彩色摄像头自动曝光区域的参数描述和更新。
/camera/stereo_module/auto_exposure_roi/parameter_descriptions 和 /camera/stereo_module/auto_exposure_roi/parameter_updates: 立体摄像模块的自动曝光区域参数描述和更新。
系统和诊断话题
/diagnostics: 发布系统的诊断信息,可以用于监控设备状态和性能。
/rosout 和 /rosout_agg: ROS系统日志输出,用于调试和日志记录。
/tf 和 /tf_static: 发布时间和空间中的坐标变换信息,/tf用于动态变换,而/tf_static用于几乎不变的变换。
3.2.2 启用原始双目IR图片
默认配置只开启了深度图模式,没有发送双目IR图片。
两个IR相机共有三种模式:1 深度图(默认打开);2双目灰度IR;3单左目彩色IR(不是那个彩色相机)
模式2和模式3不能同时,只能选择一种,模式1可以在打开模式2或3时同时开启。
编辑 /opt/ros/noetic/share/realsense2_camera/launch/rs_camera.launch:
配置模式2
<arg name="enable_infra" default="false"/>
<arg name="enable_infra1" default="true"/>
<arg name="enable_infra2" default="true"/>
<arg name="infra_rgb" default="false"/>
配置模式3
<arg name="enable_infra" default="true"/>
<arg name="enable_infra1" default="false"/>
<arg name="enable_infra2" default="false"/>
<arg name="infra_rgb" default="true"/>
3.2.3 lauch文件中所有可配置参数
基础参数
- serial_no: 指定连接设备的序列号。
- usb_port_id: 指定设备连接的USB端口ID。
- device_type: 指定设备类型,如D455。
- json_file_path: 指定一个JSON配置文件的路径,该文件包含用于设备的预设配置。
- camera: 指定摄像头的命名前缀。
- tf_prefix: 指定发布到tf中的坐标系前缀。
- external_manager: 如果设置为
true
,使用外部的节点管理器。 - manager: 指定节点管理器的名称。
- output: 指定日志输出方式。
- respawn: 如果节点终止,是否自动重启节点。
图像数据流参数
- fisheye_width/height: 指定鱼眼摄像头的图像宽度和高度。
- enable_fisheye: 是否启用鱼眼摄像头。
- depth_width/height: 指定深度摄像头的图像宽度和高度。
- enable_depth: 是否启用深度摄像头。
- confidence_width/height: 指定置信图像的宽度和高度。
- enable_confidence: 是否启用置信度图像。
- confidence_fps: 置信图像的帧率。
- infra_width/height: 指定红外摄像头的图像宽度和高度。
- enable_infra, enable_infra1, enable_infra2: 是否启用红外摄像头。
- infra_rgb: 是否将红外图像与RGB图像同步。
- color_width/height: 指定彩色摄像头的图像宽度和高度。
- enable_color: 是否启用彩色摄像头。
性能参数
- fisheye_fps, depth_fps, infra_fps, color_fps: 对应各摄像头的帧率。
- gyro_fps, accel_fps: 陀螺仪和加速度计的帧率。
- enable_gyro, enable_accel: 是否启用陀螺仪和加速度计。
点云和同步参数
- enable_pointcloud: 是否生成点云数据。
- pointcloud_texture_stream: 点云的纹理来源。
- pointcloud_texture_index: 使用的纹理流的索引。
- allow_no_texture_points: 是否允许无纹理点。
- ordered_pc: 是否生成有序点云。
- enable_sync: 是否启用传感器数据同步。
- align_depth: 是否将深度数据与其他数据流对齐。
转换和滤镜参数
- publish_tf: 是否发布TF转换。
- tf_publish_rate: TF发布的频率。
- filters: 应用于图像数据的滤波器。
- clip_distance: 裁剪距离,用于过滤远距离的点。
- linear_accel_cov: 线性加速度的协方差。
- initial_reset: 启动时是否重置设备。
- reconnect_timeout: 重连超时时间。
- wait_for_device_timeout: 等待设备连接的超时时间。
- unite_imu_method: IMU数据的合并方法。
- topic_odom_in: 接收里程计信息的话题。
- calib_odom_file: 里程计校准文件的路径。
- publish_odom_tf: 是否发布里程计的TF数据。
曝光和增益参数
- stereo_module/exposure/1, stereo_module/gain/1: 第一个红外摄像头的曝光和增益设置。
- stereo_module/exposure/2, stereo_module/gain/2: 第二个红外摄像头的曝光和增益设置。
3.2.4 URDF 坐标系可视化
roslaunch realsense2_description view_d455_model.launch
在 RViz 中查看 Intel RealSense D455 模型。这个启动文件一般包含在 realsense2_description
包中,该包用于存储和展示 RealSense 设备的 URDF(统一机器人描述格式)模型。
为什么urdf中会有camera_infra2_optical_frame与camera_infra2_frame 这两种形式的坐标系?
在 URDF (统一机器人描述格式) 中,包含 camera_infra2_optical_frame
和 camera_infra2_frame
这两种形式的坐标系的原因主要与ROS的坐标系规范和特定的应用需求有关。每种坐标系都有其特定的用途,理解它们的区别对于进行精确的空间计算和数据整合非常重要。ROS坐标系范:
-
通用坐标系(例如
camera_infra2_frame
):- 这通常是相对于摄像头硬件本身的坐标系。在这个坐标系中,原点通常位于摄像头的物理中心或某个固定的参考点,坐标轴与摄像头的默认方向对齐。
camera_infra2_frame
可能会用于表示摄像头硬件的位置和方向相对于其他硬件组件(如机器人本体)的情况。
-
光学坐标系(例如
camera_infra2_optical_frame
):- 光学坐标系遵循一个特殊的ROS规范,其中 z 轴正对着前方,x 轴向右,y 轴向下。这种布局是基于图像坐标系的常见布局,使得z轴正对图像平面。
camera_infra2_optical_frame
用于处理图像数据时更为方便,因为它使得摄像头捕获的图像直接对应于其坐标系的方向,这对于图像处理和计算机视觉应用尤为重要。
应用场景
- 数据转换:在ROS中,不同的节点和工具可能需要使用不同的坐标系来处理数据。例如,一个节点可能使用通用坐标系来计算摄像头的物理位置,而另一个节点则使用光学坐标系来处理图像数据和执行视觉识别任务。
- 模块化和灵活性:提供两种坐标系允许开发者根据需要选择最适合其应用的坐标系,而无需在中间进行复杂的坐标转换。