写在前面
本文是在ubuntu20.04下安装,其它版本大同小异。可能出现的问题,主要由各自安装相关库版本不一致导致,故问题不一,但一般很好解决,正常情况下不会出现。
Intel Realsense 深度摄像头D435i将D435强大的深度感知能力和惯性测量单元(IMU)结合起来,可满足RGBD、单目、双目slam研究与实战。本文介绍D435i相关工具安装、配置及校准,也是实战slam算法的前提,不可缺少的部分。实物如图所示:
一、工具安装
D435i工具包括,Intel Realsense SDK2.0 和realsense-ros。
1.Intel Realsense SDK2.0
(1)下载源码
- git clone https://github.com/IntelRealSense/librealsense.git
- cd librealsense
(2)安装依赖
- sudo apt-get install libudev-dev pkg-config libgtk-3-dev
- sudo apt-get install libusb-1.0-0-dev pkg-config
- sudo apt-get install libglfw3-dev
- sudo apt-get install libssl-dev
(3)添加权限
- sudo cp config/99-realsense-libusb.rules /etc/udev/rulesgger
- sudo udevadm control --reload-rules && udevadm trigger
(4)编译、安装
- mkdir build
- cd build
- cmake …
- make
- sudo make install
(5)测试
- cd examples/capture
- ./rs-capture
或者
- realsense-viewer
安装成功后,sdk界面显示如下
注:使用USB3.0接口。
2.安装realsense-ros
因后续需要使用ros进行双目、imu数据发布,因此需要安装realsense-ros。
(1)创建工作空间、下载源码及编译
- mkdir -p realsense_ws/src
- cd realsense_ws/src
- git clone https://github.com/IntelRealSense/realsense-ros.git
- git clone https://github.com/pal-robotics/ddynamic_reconfigure.git
- catkin_make
编译完成,根据个人喜好,可永久添加source - echo “source /realsense_ws/devel/setup.bash” >> ~/.bashrc
- source ~/.bashrc
(2)测试
若上一步未添加source,运行launch时需
- source devel/setup.bash
- roslaunch realsense2_camera rs_camera.launch
可查看发布的话题
- rostopic list
如下图所示
二、配置
因后续需要使用d435i进行vins_fusion实战,因此该配置为双目+imu,修改rs_camera.launch,具体如下。其它,如RGBD可以参照rs_rgbd.launch按需修改。
1. <launch>
2. <arg name="serial_no" default=""/>
3. <arg name="json_file_path" default=""/>
4. <arg name="camera" default="camera"/>
5. <arg name="tf_prefix" default="$(arg camera)"/>
6. <arg name="external_manager" default="false"/>
7. <arg name="manager" default="realsense2_camera_manager"/>
8.
9. <arg name="fisheye_width" default="640"/>
10. <arg name="fisheye_height" default="480"/>
11. <arg name="enable_fisheye" default="false"/>
12.
13. <arg name="depth_width" default="640"/>
14. <arg name="depth_height" default="480"/>
15. <arg name="enable_depth" default="false"/>
16.
17. <arg name="infra_width" default="640"/>
18. <arg name="infra_height" default="480"/>
19. <arg name="enable_infra1" default="true"/>
20. <arg name="enable_infra2" default="true"/>
21.
22. <arg name="color_width" default="640"/>
23. <arg name="color_height" default="480"/>
24. <arg name="enable_color" default="true"/>
25.
26. <arg name="fisheye_fps" default="30"/>
27. <arg name="depth_fps" default="30"/>
28. <arg name="infra_fps" default="30"/>
29. <arg name="color_fps" default="30"/>
30. <arg name="gyro_fps" default="400"/>
31. <arg name="accel_fps" default="200"/>
32. <arg name="enable_gyro" default="true"/>
33. <arg name="enable_accel" default="true"/>
34.
35. <arg name="enable_pointcloud" default="false"/>
36. <arg name="pointcloud_texture_stream" default="RS2_STREAM_COLOR"/>
37. <arg name="pointcloud_texture_index" default="0"/>
38.
39. <arg name="enable_sync" default="true"/>
40. <arg name="align_depth" default="true"/>
41.
42. <arg name="publish_tf" default="true"/>
43. <arg name="tf_publish_rate" default="0"/>
44.
45. <arg name="filters" default=""/>
46. <arg name="clip_distance" default="-2"/>
47. <arg name="linear_accel_cov" default="0.01"/>
48. <arg name="initial_reset" default="false"/>
49. <arg name="reconnect_timeout" default="6.0"/>
50. <arg name="unite_imu_method" default="linear_interpolation"/>
51. <arg name="topic_odom_in" default="odom_in"/>
52. <arg name="calib_odom_file" default=""/>
53. <arg name="publish_odom_tf" default="true"/>
54. <arg name="allow_no_texture_points" default="false"/>
65.
66. <group ns="$(arg camera)">
67. <include file="$(find realsense2_camera)/launch/includes/nodelet.launch.xml">
68. <arg name="tf_prefix" value="$(arg tf_prefix)"/>
69. <arg name="external_manager" value="$(arg external_manager)"/>
70. <arg name="manager" value="$(arg manager)"/>
71. <arg name="serial_no" value="$(arg serial_no)"/>
72. <arg name="json_file_path" value="$(arg json_file_path)"/>
73.
74. <arg name="enable_pointcloud" value="$(arg enable_pointcloud)"/>
75. <arg name="pointcloud_texture_stream" value="$(arg pointcloud_texture_stream)"/>
76. <arg name="pointcloud_texture_index" value="$(arg pointcloud_texture_index)"/>
77. <arg name="enable_sync" value="$(arg enable_sync)"/>
78. <arg name="align_depth" value="$(arg align_depth)"/>
79.
80. <arg name="fisheye_width" value="$(arg fisheye_width)"/>
81. <arg name="fisheye_height" value="$(arg fisheye_height)"/>
82. <arg name="enable_fisheye" value="$(arg enable_fisheye)"/>
83.
84. <arg name="depth_width" value="$(arg depth_width)"/>
85. <arg name="depth_height" value="$(arg depth_height)"/>
86. <arg name="enable_depth" value="$(arg enable_depth)"/>
87.
88. <arg name="color_width" value="$(arg color_width)"/>
89. <arg name="color_height" value="$(arg color_height)"/>
90. <arg name="enable_color" value="$(arg enable_color)"/>
91.
92. <arg name="infra_width" value="$(arg infra_width)"/>
93. <arg name="infra_height" value="$(arg infra_height)"/>
94. <arg name="enable_infra1" value="$(arg enable_infra1)"/>
95. <arg name="enable_infra2" value="$(arg enable_infra2)"/>
96.
97. <arg name="fisheye_fps" value="$(arg fisheye_fps)"/>
98. <arg name="depth_fps" value="$(arg depth_fps)"/>
99. <arg name="infra_fps" value="$(arg infra_fps)"/>
100. <arg name="color_fps" value="$(arg color_fps)"/>
101. <arg name="gyro_fps" value="$(arg gyro_fps)"/>
102. <arg name="accel_fps" value="$(arg accel_fps)"/>
103. <arg name="enable_gyro" value="$(arg enable_gyro)"/>
104. <arg name="enable_accel" value="$(arg enable_accel)"/>
105.
106. <arg name="filters" value="$(arg filters)"/>
107. <arg name="clip_distance" value="$(arg clip_distance)"/>
108. <arg name="linear_accel_cov" value="$(arg linear_accel_cov)"/>
109. <arg name="initial_reset" value="$(arg initial_reset)"/>
110. <arg name="reconnect_timeout" value="$(arg reconnect_timeout)"/>
111. <arg name="unite_imu_method" value="$(arg unite_imu_method)"/>
112. <arg name="topic_odom_in" value="$(arg topic_odom_in)"/>
113. <arg name="calib_odom_file" value="$(arg calib_odom_file)"/>
114. <arg name="publish_odom_tf" value="$(arg publish_odom_tf)"/>
115. <arg name="allow_no_texture_points" value="$(arg allow_no_texture_points)"/>
116. </include>
117. </group>
118. </launch>
109.
三、校准
d435i校准主要是针对双目相机内参、畸变及imu校准。
1.关闭结构光
d435i包含IR Project,用于辅助测量深度信息,而本文主要想通过单/双目完成slam实战,无需IR提供深度信息。但IR结构光会使成像有很多光斑,影响校准及后续双目使用,故需关闭。
修改rs_camera.launch
- gedit rs_camera.launch
在参数后添加
<arg name="emitter_enable" default="false"/><!-- rosparam set /camera/stereo_module/emitter_enabled false -->
<rosparam>/camera/stereo_module/emitter_enabled: false
</rosparam><rosparam if="$(arg emitter_enable)">
/camera/stereo_module/emitter_enabled: true
</rosparam>
代码块意思为,启用rs_camera.launch时,默认关闭结构光。
当需要时,可使用以下方式打开
- roslaunch realsense2_camera rs_camera.launch emitter_enable:=true
默认关闭时,运行无需添加后面参数 emitter_enable:=true
2.相机内参、畸变校准
参看相机默认内参
- source devel/setup.bash
- roslaunch realsense_camera rs_camera.launch
- rostopic echo /camera/infra1/camera_info
- rostopic echo /camera/infra2/camera_info
如下图所示:
注:这里特别注意,如果需要使用双目相机,话题如上,而不是/camera/color/camera_info
如图可知,默认提供了双目镜头内参,但没有畸变参数。由于后续需要使用kailbr,校准imu随机游走及相机与imu外参,故此处不使用自带工具进行相机内参校准。
3.imu六面校准
imu六面校准是指校准acc、gyro的零偏、尺度因子及非正交误差,realsense提供官方库。
(1)安装依赖
- sudo pip3 install pyrealsense2
(2)运行
进入rs-imu-calibration文件夹
- cd librealsense/tools/rs-imu-calibration
- python rs-imu-calibration.py
如下图所示
根据提示旋转六面。具体参照https://github.com/IntelRealSense/librealsense/blob/master/tools/rs-imu-calibration/README.md
注:1.为保证六面水平,可用realsense包装盒制作六面校准工装,2.采集每一面数据时,保证无振动干扰。
(3)保存、写入校准数据
六面数据采集完成后,提示:
Would you like to save the raw data?
输入yes,完成并写入硬件中。校准的数据保存在同目录下calibration.json中。
参考:
https://github.com/IntelRealSense/librealsense
https://github.com/IntelRealSense/realsense-ros
https://blog.csdn.net/Hanghang_article/details/103612300