ROS 2 平台

ROS 2(Robot Operating System 2)是机器人操作系统的第二代版本。它是一个开源的机器人软件框架,旨在为机器人开发提供工具和库,以简化机器人应用的创建和管理。ROS 2 是由 Open Robotics 开发和维护的,继承了 ROS 1 的许多优点,同时在架构和功能上进行了改进,以满足现代机器人系统的需求。

搭建 ROS 2 开发环境

  1. 根据 Ubuntu 版本,安装对应的 ROS 2 开发平台。

    • Ubuntu20.04:ROS 2 Foxy

    • Ubuntu22.04:ROS 2 Humble

  2. 安装依赖。

    sudo apt install python3-colcon-common-extensions
    sudo apt install ros-foxy-camera-info-manager
    sudo apt install ros-foxy-image-publisher
    sudo apt install ros-foxy-diagnostic-updater
    

下载 Camport ROS 2 SDK

  1. 创建工作目录

    mkdir -p ~/ros2_ws/src
    cd ~/ros2_ws/src/
    
  2. 下载 Camport ROS 2

选择以下任意方式,下载 Camport ROS 2 SDK:

  • 使用浏览器下载: https://gitee.com/percipioxyz/camport_ros2.git

  • 使用 git 指令获取本地副本:打开终端,切换到需存放 SDK 的工作目录下,输入 git clone 命令克隆远程仓库。

    git clone https://gitee.com/percipioxyz/camport_ros2.git
    

Camport ROS 2 SDK 的目录如下图所示:

Camport ROS 2 SDK 目录

Camport ROS 2 SDK 目录

  • README.md:简述了 ROS 2 编译过程。

  • src/percipio_camera/CMakeLists.txt:Cmake 编译系统的规则文件。

  • src/percipio_camera/camport3:包含 Percipio SDK 的库文件和头文件。

  • src/percipio_camera/include:包含头文件。

  • src/percipio_camera/launch:包含 ROS 2 的启动文件,用于启动节点和配置参数,其中 percipio_camera.launch.py 用于启动单相机, multi_cam.launch.py 用于启动多相机。此外,包内包含的多个 Python 脚本可分别用于订阅节点并显示图像数据、发送软触发信号、离线检测等,详情请参见 订阅相机节点

  • src/percipio_camera/package.xml:描述功能包清单的文件,包括功能包的名称、版本号、作者信息、许可信息、编译依赖等。

  • src/percipio_camera/src:包含主要的源代码文件,包括节点实现、相机驱动等。

配置环境变量

source /opt/ros/foxy/setup.bash
echo "source /opt/ros/foxy/setup.bash" >> ~/.bashrc

构建工程

cd ~/ros2_ws/src/camport_ros2/
colcon build --event-handlers  console_direct+  --cmake-args  -DCMAKE_BUILD_TYPE=Release
sudo echo "source ./install/setup.bash" >> ~/.bashrc
source ~/.bashrc

小技巧

colcon build 说明:

  • --event-handlers  console_direct+:这个选项指定了事件处理程序。console_direct+ 表示直接在控制台输出构建事件的详细信息。这样可以更清楚地看到构建过程中的每一步和可能的错误信息。

  • --cmake-args  -DCMAKE_BUILD_TYPE=Release:这个选项传递了额外的 CMake 参数。在这种情况下,-DCMAKE_BUILD_TYPE=Release 设置了 CMake 的构建类型为 Release。这意味着构建将进行优化,适合发布版本,而不是调试版本。

编译后生成以下文件夹:

  • build :中间文件和目标文件。

  • install :可执行文件、库文件、头文件和其他资源文件。

  • log :包含编译和运行时生成的日志文件。

修改参数配置

ROS 2 支持通过以下两种方式修改相机参数。

方法一

在 launch 文件( percipio_camera.launch.py / multi_cam.launch.py )中配置相机启动时加载的参数。该方法仅适用于设置 launch 文件中包含的参数,具体步骤如下:

  1. 进入 “camport_ros2/install/percipio_camera/share/percipio_camera/launch” 路径。

  2. 修改参数配置。

如使用单台相机,打开 percipio_camera.launch.py 文件,并根据需要修改参数配置,可配参数的说明见下表。

  • 指定相机 SN 号

    DeclareLaunchArgument('serial_number', default_value='"207000106930"'),
    
  • 指定相机 IP 地址

    DeclareLaunchArgument('device_ip', default_value='192.168.120.112'),
    

备注

如果不通过 SN 或 IP 去指定相机,默认打开找到的第一台相机。

Launch 可配参数说明表

参数名

描述

取值范围

camera_name

Topic 名

自定义,多相机情况下可通过该名称区分相机

serial_number

相机 SN 号

可为空;也可填写待连接相机的 SN 号

device_ip

相机 IP 地址

可为空;也可填写待连接相机的 IP 地址

device_workmode

相机触发模式,支持连续出图、硬触发和软触发模式

trigger_off/trigger_soft/trigger_hard

gvcp_resend

重传开关

true/false

device_auto_reconnect

相机掉线重连

true/false

color_enable

彩色图像使能

true/false

color_resolution

彩色图像分辨率

设定范围请参考相机的 fetch_config.xml 文件

color_format

彩色图像格式

参考 camport_ros2/src/percipio_camera/src/percipio_device.cpp StreamFormatMapper format_mapper_list[]

color_aec_roi

彩色图自动曝光 ROI

格式为 ‘x,y,width,height’,其中(x,y)表示 ROI 左上角坐标,width 和 height 分别表示区域的宽度和高度

color_qos

Color 服务质量

SYSTEM_DEFAULT/DEFAULT/PARAMETER_EVENTS/SERVICES_DEFAULT/PARAMETERS/SENSOR_DATA

color_camera_info_qos

Color camera info 服务质量

SYSTEM_DEFAULT/DEFAULT/PARAMETER_EVENTS/SERVICES_DEFAULT/PARAMETERS/SENSOR_DATA

depth_enable

深度图像使能

true/false

depth_resolution

深度图像分辨率

设定范围请参考相机的 fetch_config.xml 文件

depth_format

深度图像格式

参考 camport_ros2/src/percipio_camera/src/percipio_device.cpp StreamFormatMapper format_mapper_list[]

depth_qos

Depth 服务质量

SYSTEM_DEFAULT/DEFAULT/PARAMETER_EVENTS/SERVICES_DEFAULT/PARAMETERS/SENSOR_DATA

depth_camera_info_qos

Depth camera info 服务质量

SYSTEM_DEFAULT/DEFAULT/PARAMETER_EVENTS/SERVICES_DEFAULT/PARAMETERS/SENSOR_DATA

depth_registration_enable

Depth to Color 对齐使能

true/false

depth_speckle_filter

深度图斑点滤波器开关

true/false

max_speckle_size

斑点滤波器面积阈值

默认值:150,取值范围:10-3000

max_speckle_diff

斑点滤波器聚类

默认值:64,取值范围:5-1500

depth_time_domain_filter

时域滤波开关

true/false

depth_time_domain_num

时域滤波数量

默认值:3,范围:2-10

point_cloud_enable

点云图像使能

true/false

color_point_cloud_enable

彩色点云图像使能

true/false

point_cloud_qos

点云图服务质量

SYSTEM_DEFAULT/DEFAULT/PARAMETER_EVENTS/SERVICES_DEFAULT/PARAMETERS/SENSOR_DATA

left_ir_enable

左 IR 图像使能

true/false

left_ir_qos

左 IR 服务质量

SYSTEM_DEFAULT/DEFAULT/PARAMETER_EVENTS/SERVICES_DEFAULT/PARAMETERS/SENSOR_DATA

left_ir_camera_info_qos

左 IR camera info 服务质量

SYSTEM_DEFAULT/DEFAULT/PARAMETER_EVENTS/SERVICES_DEFAULT/PARAMETERS/SENSOR_DATA

tof_depth_quality

ToF 相机深度质量

basic/medium/high,设定范围请参考相机的相关属性

tof_modulation_threshold

ToF 相机激光调制光强

设定范围请参考相机的相关属性

tof_jitter_threshold

ToF 相机抖动过滤

设定范围请参考相机的相关属性

tof_filter_threshold

ToF 相机飞点滤波

设定范围请参考相机的相关属性

tof_channel

ToF 相机调制频率

设定范围请参考相机的相关属性

tof_HDR_ratio

ToF 相机高动态范围比

设定范围请参考相机的相关属性

备注

  1. xxx_qos 可配值说明:

  • SYSTEM_DEFAULT:使用系统的默认 QoS 设置,这些设置通常由底层的 DDS(Data Distribution Service)实现定义。效果取决于具体的 DDS 实现。

  • DEFAULT:提供可靠的消息传递,适用于大多数通用的通信需求。最多保留 10 条最新消息。

  • PARAMETER_EVENTS:专门用于参数事件的 QoS 设置,确保参数变化事件能够可靠传递。最多保留 1000 条最新消息。

  • SERVICES_DEFAULT:服务通信的默认 QoS 设置,确保服务请求和响应能够可靠传递。保留所有服务请求和响应消息。

  • PARAMETERS:专门用于参数的 QoS 设置,确保参数设置和获取的可靠性。最多保留 1000 条最新消息。

  • SENSOR_DATA:传感器数据的 QoS 设置,适用于高频率、低延迟的数据流传输。最多保留 5 条最新消息。

  1. TL460-S1-E1 相机支持两种 bayer 格式的彩色图像输出:CSI_BAYER8RGGB 和 CSI_BAYER12RGGB。如通过修改 percipio.launch 文件指定相机出 bayer 格式的彩色图像,默认输出为 CSI_BAYER8RGGB,且无法通过修改该文件切换至 CSI_BAYER12RGGB。

  2. 当通过 percipio.launch 文件配置了相机不支持的图像格式或分辨率时,相机将输出默认配置的图像。

方法二

通过 Percipio Viewer 软件或 Camport SDK 设置相机参数。

  • GigE2.0 相机(除 PMD 系列与 GM 系列以外的相机)

    通过 Percipio Viewer 或 Camport SDK 3.X.X 将参数保存至相机 Storage 区,ROS 启动时将自动加载 storage 区的参数配置并开始采集图像。

  • GigE2.1 相机(PMD 系列与 GM 系列相机)

    通过 Camport SDK 4.X.X 或新版 Percipio Viewer 设置相机默认加载目标 User Set 属性组,相机上电后将自动加载该 User Set 属性组的参数配置。

启动相机节点

ros2 launch percipio_camera percipio_camera.launch.py

若相机节点正常启动,终端会打印相机 IP、SN、深度图及彩色图格式与分辨率等信息。

备注

运行过程中,请勿关闭该服务终端。

订阅相机节点

“src/percipio_camera/launch” 路径包含以下基于 Python 的相机节点订阅示例脚本:

  • depth.py:使能指定相机采集指定图像格式和分辨率的深度图像。

    percipio.launch 文件中,将 color_enable 置为 true 并保存。启动相机节点后,另开一个终端,切换到 “src/percipio_camera/launch” 路径下。输入 python3 depth.py 并运行,弹出的窗口将实时显示指定相机的 depth 图像。如下图所示:

    depth.py 运行结果

    depth.py 运行结果

    备注

    若 depth_registration_enbale 为 true,则输出映射到彩色图空间的深度图;若 depth_registration_enbale 为 false,则输出原始深度图。

  • color.py:使能指定相机采集到指定图像格式和分辨率的彩色图像。

    percipio.launch 文件中,将 color_enable 置为 true 并保存。启动相机节点后,另开一个终端,切换到 “src/percipio_camera/launch” 路径下。输入 python3 color.py 并运行,弹出的窗口将实时显示指定相机的 color 图像。如下图所示:

    color.py 运行结果

    color.py 运行结果

  • cloud.py:使能指定相机采集到指定图像格式和分辨率的点云并保存。

    percipio.launch 文件中,将 depth_enable 与 point_cloud_enable 置为 true,并将 depth_registration_enbale 与 color_point_cloud_enable 置为 false。启动相机节点后,另开一个终端,切换到 “src/percipio_camera/launch” 路径下。输入 python3 cloud.py 并运行,弹出的窗口将实时显示指定相机的原始点云。同时,该终端将打印点云保存路径与点云点数。如下图所示:

    cloud.py 运行结果

    cloud.py 运行结果

  • registered_cloud.py:使能指定相机采集指定图像格式和分辨率的彩色点云并保存。

    percipio.launch 文件中,将 color_enable、depth_enable、depth_registration_enbale 与 color_point_cloud_enable 均置为 true 并保存,启动相机节点。然后另开一个终端,切换到 “src/percipio_camera/launch” 路径下。运行 python3 registered_cloud.py,弹出的窗口将实时显示指定相机的彩色点云。同时,该终端将打印点云保存路径与点云点数。如下图所示:

    registered_cloud.py 运行结果

    registered_cloud.py 运行结果

  • offline_detect.py:订阅 “/camera/device_event” 话题,监听相机的离线、超时或重连完成,并在收到消息时打印日志。

  • send_trigger.py: 订阅 “/camera/trigger_event” 话题,按照设定的频率发送软触发信号(需相机处于软触发模式才会生效)。