当前位置:   article > 正文

RealSense相机在ros2环境的安装_realsense ros2

realsense ros2

一、SDK的安装

在安装前一定要确定SDK和realsense相机之间的版本对应的关系,我使用的SDK的版本是:librealsense-2.51.1  对应的ROS的版本是: realsense-ros-4.51.1。

  1. git clone -b v2.51.1 https://github.com/IntelRealSense/librealsense.git 下载太慢的话直接去网站下载源码
  2. 1)安装依赖包
  3. sudo apt-get install libudev-dev pkg-config libgtk-3-dev
  4. sudo apt-get install libusb-1.0-0-dev pkg-config
  5. sudo apt-get install libglfw3-dev
  6. sudo apt-get install libssl-dev
  7. 2)安装权限脚本
  8. cd librealsense
  9. sudo cp config/99-realsense-libusb.rules /etc/udev/rules.d/
  10. sudo udevadm control --reload-rules && udevadm trigger
  11. 3)编译
  12. mkdir build
  13. cd build
  14. cmake ../ -DBUILD_EXAMPLES=true
  15. make
  16. sudo make install
  17. 4)使用
  18. realsense-viewer
  19. 5)卸载
  20. dpkg -l | grep "realsense" | cut -d " " -f 3 | xargs sudo dpkg --purge

二、realsense_ros2的安装

安装步骤参考以下链接:

GitHub - IntelRealSense/realsense-ros: Intel(R) RealSense(TM) ROS Wrapper for D400 series, SR300 Camera and T265 Tracking Module

  1. mkdir -p ~/ros2_ws/src
  2. cd ~/ros2_ws/src/
  3. git clone https://github.com/IntelRealSense/realsense-ros.git -b ros2-development
  4. cd ~/ros2_ws
  5. sudo apt-get install python3-rosdep -y
  6. sudo rosdep init # "sudo rosdep init --include-eol-distros" for Eloquent and earlier
  7. rosdep update # "sudo rosdep update --include-eol-distros" for Eloquent and earlier
  8. rosdep install -i --from-path src --rosdistro $ROS_DISTRO --skip-keys=librealsense2 -y
  9. colcon build
  10. ROS_DISTRO=<YOUR_SYSTEM_ROS_DISTRO> # set your ROS_DISTRO: humble, galactic, foxy, eloquent, dashing
  11. 添加到终端环境中
  12. source /opt/ros/$ROS_DISTRO/setup.bash
  13. cd ~/ros2_ws
  14. . install/local_setup.bash
  15. 安装成功后测试:
  16. ros2 launch realsense2_camera rs_launch.py
  17. 执行的方法有:
  18. ros2 run realsense2_camera realsense2_camera_node --ros-args -p enable_color:=false -p spatial_filter.enable:=true -p temporal_filter.enable:=true
  19. ros2 launch realsense2_camera rs_launch.py
  20. ros2 launch realsense2_camera rs_launch.py depth_module.profile:=1280x720x30 pointcloud.enable:=true

三、相机相关话题的研究

3.1 开启IMU

  1. ros2 launch realsense2_camera rs_launch.py pointcloud.enable:=true enable_gyro:=true enable_accel:=true
  2. 或在运行时使用以下命令来启用加速器和陀螺仪:
  3. ros2 param set /camera/camera enable_accel true
  4. ros2 param set /camera/camera enable_gyro true

 3.2 相机参数设置

对于整个参数类型列表ros2 param list。ros2 param get <node> <parameter_name>例如,读取参数值使用:ros2 param get /camera/camera depth_module.emitter_on_off 为参数使用设置新值ros2 param set <node> <parameter_name> <value>即ros2 param set /camera/camera depth_module.emitter_on_off true

 3.2 相机延迟测试工具的开启

为了了解延迟减少情况,可以通过启动文件使用帧延迟报告工具。启动文件将包装器和帧延迟报告器工具组件加载到单个容器中(因此是相同的过程)。该工具打印出每帧的帧延迟 ( now - frame.timestamp)。

除非要求,否则不会构建该工具。在构建期间打开BUILD_TOOLS以使其可用:

colcon build --cmake-args '-DBUILD_TOOLS=ON'

launch 文件接受一个参数 ,intra_process_comms控制是否开启零拷贝。默认开启: 

ros2 launch realsense2_camera rs_intra_process_demo_launch.py intra_process_comms:=true 

四、打开需要的话题 及关闭激光

  1. # Copyright 2023 Intel Corporation. All Rights Reserved.
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. """Launch realsense2_camera node."""
  15. import os
  16. import yaml
  17. from launch import LaunchDescription
  18. import launch_ros.actions
  19. from launch.actions import DeclareLaunchArgument, OpaqueFunction
  20. from launch.substitutions import LaunchConfiguration
  21. configurable_parameters = [{'name': 'camera_name', 'default': 'camera', 'description': 'camera unique name'},
  22. {'name': 'serial_no', 'default': "''", 'description': 'choose device by serial number'},
  23. {'name': 'usb_port_id', 'default': "''", 'description': 'choose device by usb port id'},
  24. {'name': 'device_type', 'default': "''", 'description': 'choose device by type'},
  25. {'name': 'config_file', 'default': "''", 'description': 'yaml config file'},
  26. {'name': 'unite_imu_method', 'default': "0", 'description': '[0-None, 1-copy, 2-linear_interpolation]'},
  27. {'name': 'json_file_path', 'default': "''", 'description': 'allows advanced configuration'},
  28. {'name': 'log_level', 'default': 'info', 'description': 'debug log level [DEBUG|INFO|WARN|ERROR|FATAL]'},
  29. {'name': 'output', 'default': 'screen', 'description': 'pipe node output [screen|log]'},
  30. {'name': 'depth_module.profile', 'default': '0,0,0', 'description': 'depth module profile'},
  31. {'name': 'enable_depth', 'default': 'false', 'description': 'enable depth stream'},
  32. {'name': 'rgb_camera.profile', 'default': '0,0,0', 'description': 'color image width'},
  33. {'name': 'enable_color', 'default': 'false', 'description': 'enable color stream'},
  34. {'name': 'enable_infra1', 'default': 'true', 'description': 'enable infra1 stream'},
  35. {'name': 'enable_infra2', 'default': 'true', 'description': 'enable infra2 stream'},
  36. {'name': 'infra_rgb', 'default': 'false', 'description': 'enable infra2 stream'},
  37. {'name': 'enable_fisheye1', 'default': 'true', 'description': 'enable fisheye1 stream'},
  38. {'name': 'enable_fisheye2', 'default': 'true', 'description': 'enable fisheye2 stream'},
  39. {'name': 'enable_confidence', 'default': 'true', 'description': 'enable depth stream'},
  40. {'name': 'gyro_fps', 'default': '0', 'description': "''"},
  41. {'name': 'accel_fps', 'default': '0', 'description': "''"},
  42. {'name': 'enable_gyro', 'default': 'true', 'description': "''"},
  43. {'name': 'enable_accel', 'default': 'true', 'description': "''"},
  44. {'name': 'enable_pose', 'default': 'true', 'description': "''"},
  45. {'name': 'pose_fps', 'default': '200', 'description': "''"},
  46. {'name': 'pointcloud.enable', 'default': 'false', 'description': ''},
  47. {'name': 'pointcloud.stream_filter', 'default': '2', 'description': 'texture stream for pointcloud'},
  48. {'name': 'pointcloud.stream_index_filter','default': '0', 'description': 'texture stream index for pointcloud'},
  49. {'name': 'enable_sync', 'default': 'true', 'description': "''"},
  50. {'name': 'align_depth.enable', 'default': 'true', 'description': "''"},
  51. {'name': 'colorizer.enable', 'default': 'false', 'description': "''"},
  52. {'name': 'clip_distance', 'default': '-2.', 'description': "''"},
  53. {'name': 'linear_accel_cov', 'default': '0.01', 'description': "''"},
  54. {'name': 'initial_reset', 'default': 'false', 'description': "''"},
  55. {'name': 'allow_no_texture_points', 'default': 'false', 'description': "''"},
  56. {'name': 'pointcloud.ordered_pc', 'default': 'false', 'description': ''},
  57. {'name': 'tf_publish_rate', 'default': '0.0', 'description': 'Rate of publishing static_tf'},
  58. {'name': 'diagnostics_period', 'default': '0.0', 'description': 'Rate of publishing diagnostics. 0=Disabled'},
  59. {'name': 'decimation_filter.enable', 'default': 'false', 'description': 'Rate of publishing static_tf'},
  60. {'name': 'rosbag_filename', 'default': "''", 'description': 'A realsense bagfile to run from as a device'},
  61. {'name': 'depth_module.exposure.1', 'default': '7500', 'description': 'Depth module first exposure value. Used for hdr_merge filter'},
  62. {'name': 'depth_module.gain.1', 'default': '16', 'description': 'Depth module first gain value. Used for hdr_merge filter'},
  63. {'name': 'depth_module.exposure.2', 'default': '1', 'description': 'Depth module second exposure value. Used for hdr_merge filter'},
  64. {'name': 'depth_module.gain.2', 'default': '16', 'description': 'Depth module second gain value. Used for hdr_merge filter'},
  65. {'name': 'depth_module.hdr_enabled', 'default': 'false', 'description': 'Depth module hdr enablement flag. Used for hdr_merge filter'},
  66. {'name': 'hdr_merge.enable', 'default': 'false', 'description': 'hdr_merge filter enablement flag'},
  67. {'name': 'wait_for_device_timeout', 'default': '-1.', 'description': 'Timeout for waiting for device to connect (Seconds)'},
  68. {'name': 'reconnect_timeout', 'default': '6.', 'description': 'Timeout(seconds) between consequtive reconnection attempts'},
  69. {'name': 'depth_module.emitter_enabled', 'default': 'false', 'description': ''},
  70. ]
  71. def declare_configurable_parameters(parameters):
  72. return [DeclareLaunchArgument(param['name'], default_value=param['default'], description=param['description']) for param in parameters]
  73. def set_configurable_parameters(parameters):
  74. return dict([(param['name'], LaunchConfiguration(param['name'])) for param in parameters])
  75. def yaml_to_dict(path_to_yaml):
  76. with open(path_to_yaml, "r") as f:
  77. return yaml.load(f, Loader=yaml.SafeLoader)
  78. def launch_setup(context, *args, **kwargs):
  79. _config_file = LaunchConfiguration("config_file").perform(context)
  80. params_from_file = {} if _config_file == "''" else yaml_to_dict(_config_file)
  81. log_level = 'info'
  82. # Realsense
  83. if (os.getenv('ROS_DISTRO') == "dashing") or (os.getenv('ROS_DISTRO') == "eloquent"):
  84. return [
  85. launch_ros.actions.Node(
  86. package='realsense2_camera',
  87. node_namespace=LaunchConfiguration("camera_name"),
  88. node_name=LaunchConfiguration("camera_name"),
  89. node_executable='realsense2_camera_node',
  90. prefix=['stdbuf -o L'],
  91. #parameters=[set_configurable_parameters(configurable_parameters)
  92. #, params_from_file
  93. #],
  94. parameters=[{
  95. 'enable_infra1': True,
  96. 'enable_infra2': True,
  97. 'enable_color': False,
  98. 'enable_depth': False,
  99. 'depth_module.emitter_enabled': 0,
  100. 'depth_module.profile': '640x360x90'}],
  101. output='screen',
  102. arguments=['--ros-args', '--log-level', LaunchConfiguration('log_level')],
  103. )
  104. ]
  105. else:
  106. return [
  107. launch_ros.actions.Node(
  108. package='realsense2_camera',
  109. namespace=LaunchConfiguration("camera_name"),
  110. name=LaunchConfiguration("camera_name"),
  111. executable='realsense2_camera_node',
  112. parameters=[{
  113. 'enable_infra1': True,
  114. 'enable_infra2': True,
  115. 'enable_color': False,
  116. 'enable_depth': False,
  117. 'depth_module.emitter_enabled': 0,
  118. 'depth_module.profile': '640x360x90'}],
  119. output='screen',
  120. arguments=['--ros-args', '--log-level', LaunchConfiguration('log_level')],
  121. emulate_tty=True,
  122. )
  123. ]
  124. def generate_launch_description():
  125. return LaunchDescription(declare_configurable_parameters(configurable_parameters) + [
  126. OpaqueFunction(function=launch_setup)
  127. ])

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/59725
推荐阅读
相关标签
  

闽ICP备14008679号