1. D435i相机与ROS2环境搭建

D435i是Intel RealSense系列中一款集成IMU的深度相机,在机器人导航和SLAM应用中非常实用。相比普通摄像头,它最大的优势在于能同时提供视觉数据和惯性测量数据。我在实际项目中使用这款相机时发现,很多开发者遇到的第一个难题就是如何正确配置ROS2环境。

首先需要安装RealSense的ROS2功能包。对于Ubuntu 20.04和ROS2 Foxy版本,可以直接通过apt安装:

sudo apt-get install ros-foxy-realsense2-camera

安装完成后,建议先测试相机是否能正常工作。连接相机后运行:

ros2 launch realsense2_camera rs_launch.py

这个命令会启动默认配置的相机节点。如果一切正常,你应该能在终端看到设备初始化信息。不过默认配置可能不符合我们的需求,特别是当我们需要特定分辨率的灰度图和固定频率的IMU数据时。

2. 理解D435i的数据流配置

D435i可以输出多种数据流,包括RGB图像、红外图像、深度图和IMU数据。在我们的场景中,重点关注的是640x480分辨率的双目灰度图和200Hz的IMU数据。

相机内部有两个红外摄像头(infra1和infra2),它们输出的就是我们要用的灰度图。IMU则包含陀螺仪和加速度计数据。默认情况下,这些数据流的配置可能不是最优的,需要手动调整。

在ROS2中,所有配置都通过launch文件完成。RealSense的launch文件通常位于:

/opt/ros/foxy/share/realsense2_camera/launch/rs_launch.py

这个Python格式的launch文件定义了相机的各种参数。修改前建议先备份原文件:

sudo cp /opt/ros/foxy/share/realsense2_camera/launch/rs_launch.py ~/rs_launch.py.backup

3. 配置640x480灰度图输出

要实现640x480分辨率的灰度图输出,需要修改infra1和infra2的配置。在rs_launch.py文件中,找到configurable_parameters列表,这里定义了所有可配置参数。

关键参数包括:

  • enable_infra1:启用左红外摄像头
  • enable_infra2:启用右红外摄像头
  • depth_module.profile:设置深度模块(包含红外摄像头)的分辨率和帧率

将相关参数修改为:

{
    'name': 'depth_module.profile', 
    'default': '640,480,30',
    'description': 'depth module profile'
},
{
    'name': 'enable_infra1', 
    'default': 'true',
    'description': 'enable infra1 stream'
},
{
    'name': 'enable_infra2', 
    'default': 'true',
    'description': 'enable infra2 stream'
}

这样配置后,相机将输出30fps的640x480红外图像,对应的话题分别是:

  • /camera/infra1/image_rect_raw
  • /camera/infra2/image_rect_raw

4. 配置200Hz IMU数据同步

IMU的配置稍微复杂一些,因为需要确保陀螺仪和加速度计数据正确同步。D435i的IMU实际上由两个独立传感器组成,它们有不同的采样率:

  • 陀螺仪:最高400Hz
  • 加速度计:最高250Hz

要实现200Hz的统一输出,需要配置以下参数:

{
    'name': 'enable_gyro',
    'default': 'true',
    'description': "''"
},
{
    'name': 'enable_accel',
    'default': 'true',
    'description': "''"
},
{
    'name': 'gyro_fps',
    'default': '200',
    'description': "''"
},
{
    'name': 'accel_fps',
    'default': '200',
    'description': "''"
},
{
    'name': 'unite_imu_method',
    'default': '2',
    'description': '[0-None, 1-copy, 2-linear_interpolation]'
}

特别重要的是unite_imu_method参数,它决定了如何合并陀螺仪和加速度计数据。设置为2表示使用线性插值法,能提供更平滑的IMU数据流。

5. 完整launch文件配置示例

以下是经过优化的完整配置片段:

configurable_parameters = [
    {'name': 'camera_name', 'default': 'camera', 'description': 'camera unique name'},
    {'name': 'serial_no', 'default': "''", 'description': 'choose device by serial number'},
    {'name': 'usb_port_id', 'default': "''", 'description': 'choose device by usb port id'},
    {'name': 'device_type', 'default': "''", 'description': 'choose device by type'},
    {'name': 'config_file', 'default': "''", 'description': 'yaml config file'},
    {'name': 'unite_imu_method', 'default': "2", 'description': '[0-None, 1-copy, 2-linear_interpolation]'},
    {'name': 'json_file_path', 'default': "''", 'description': 'allows advanced configuration'},
    {'name': 'log_level', 'default': 'info', 'description': 'debug log level [DEBUG|INFO|WARN|ERROR|FATAL]'},
    {'name': 'output', 'default': 'screen', 'description': 'pipe node output [screen|log]'},
    {'name': 'depth_module.profile', 'default': '640,480,30', 'description': 'depth module profile'},
    {'name': 'enable_depth', 'default': 'false', 'description': 'enable depth stream'},
    {'name': 'rgb_camera.profile', 'default': '0,0,0', 'description': 'color image width'},
    {'name': 'enable_color', 'default': 'false', 'description': 'enable color stream'},
    {'name': 'enable_infra1', 'default': 'true', 'description': 'enable infra1 stream'},
    {'name': 'enable_infra2', 'default': 'true', 'description': 'enable infra2 stream'},
    {'name': 'infra_rgb', 'default': 'false', 'description': 'enable infra2 stream'},
    {'name': 'tracking_module.profile', 'default': '0,0,0', 'description': 'fisheye width'},
    {'name': 'enable_fisheye1', 'default': 'true', 'description': 'enable fisheye1 stream'},
    {'name': 'enable_fisheye2', 'default': 'true', 'description': 'enable fisheye2 stream'},
    {'name': 'enable_confidence', 'default': 'true', 'description': 'enable depth stream'},
    {'name': 'gyro_fps', 'default': '200', 'description': "''"},
    {'name': 'accel_fps', 'default': '200', 'description': "''"},
    {'name': 'enable_gyro', 'default': 'true', 'description': "''"},
    {'name': 'enable_accel', 'default': 'true', 'description': "''"},
    {'name': 'enable_pose', 'default': 'true', 'description': "''"},
    {'name': 'pose_fps', 'default': '200', 'description': "''"},
    {'name': 'pointcloud.enable', 'default': 'false', 'description': ''},
    # 其他保持默认的参数...
]

6. 验证配置效果

配置完成后,使用以下命令启动相机:

ros2 launch realsense2_camera rs_launch.py

启动后,可以通过以下命令检查话题列表:

ros2 topic list

你应该能看到以下关键话题:

  • /camera/infra1/image_rect_raw - 左红外图像
  • /camera/infra2/image_rect_raw - 右红外图像
  • /camera/imu - 融合后的IMU数据

要验证帧率是否符合预期,可以使用:

ros2 topic hz /camera/infra1/image_rect_raw
ros2 topic hz /camera/imu

第一个命令应该显示约30Hz的图像帧率,第二个命令应显示约200Hz的IMU数据率。

7. 常见问题排查

在实际部署中可能会遇到一些问题,以下是我总结的几个常见情况及解决方法:

问题1:IMU数据频率不稳定 可能是USB带宽不足导致的。D435i在高速数据传输时需要USB3.0接口。检查连接:

lsusb -t

确认相机连接在USB3.x端口下。

问题2:图像和IMU数据不同步 确保enable_sync参数设置为true:

{'name': 'enable_sync', 'default': 'true', 'description': "''"}

问题3:无法修改launch文件 可能需要修改文件权限:

sudo chmod 777 /opt/ros/foxy/share/realsense2_camera/launch/rs_launch.py

修改配置后如果遇到问题,可以尝试重置相机固件:

rs-fw-update -f

8. 性能优化建议

经过多次项目实践,我总结出几个优化D435i性能的技巧:

  1. 降低CPU占用:在资源有限的设备上,可以关闭不需要的数据流。比如如果只用灰度图和IMU,确保关闭RGB和深度:
{'name': 'enable_color', 'default': 'false'},
{'name': 'enable_depth', 'default': 'false'}
  1. 调整曝光参数:在低光环境下,可以适当增加红外摄像头的曝光时间:
{'name': 'depth_module.exposure.1', 'default': '7500'},
  1. 使用硬件同步:如果需要更精确的时间同步,可以考虑使用硬件触发信号,通过trigger_mode参数配置。

  2. 温度补偿:长时间运行时IMU数据可能会有漂移,可以在算法层面实现温度补偿,或者定期进行校准。

这套配置已经在多个SLAM项目中验证过稳定性,特别是在资源受限的移动机器人平台上表现良好。关键是要根据具体应用场景微调参数,比如在高速运动场景可以适当降低图像分辨率换取更高帧率。

Logo

聚焦RDK与具身智能,汇集机器人开发教程、开源案例和技术交流

更多推荐