mirror of
https://github.com/orbbec/OrbbecSDK_ROS2.git
synced 2026-10-07 21:37:46 +08:00
tmp
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
# 高效的进程内通信:
|
||||
|
||||
### 简介
|
||||
|
||||
如果我们的ROS2封装器节点与订阅者节点加载在同一进程中,它支持零拷贝通信。这可以减少图像/点云话题的拷贝时间,特别是在大帧分辨率和高FPS的情况下。
|
||||
|
||||
您需要启动一个组件容器,并将我们的节点作为组件与其他组件节点一起启动。有关"在单个进程中组合多个节点"的更多详细信息,请参见 [此处](https://docs.ros.org/en/rolling/Tutorials/Composition.html)。
|
||||
|
||||
有关高效进程内通信的更多详细信息,请参见 [此处](https://docs.ros.org/en/humble/Tutorials/Intra-Process-Communication.html#efficient-intra-process-communication)。
|
||||
|
||||
### 示例
|
||||
|
||||
**手动将多个组件加载到同一进程中**
|
||||
|
||||
* 启动组件:
|
||||
|
||||
```bash
|
||||
ros2 run rclcpp_components component_container
|
||||
```
|
||||
|
||||
* 添加封装器:
|
||||
|
||||
```bash
|
||||
ros2 component load /ComponentManager orbbec_camera orbbec_camera::OBCameraNodeDriver -e use_intra_process_comms:=true
|
||||
```
|
||||
|
||||
以相同方式加载其他组件节点(封装器话题的消费者)。
|
||||
|
||||
**使用启动文件**
|
||||
|
||||
```bash
|
||||
ros2 launch orbbec_camera gemini_intra_process_demo_launch.py
|
||||
```
|
||||
|
||||
**限制**
|
||||
|
||||
* RCLPY目前不支持节点组件
|
||||
|
||||
* 使用 `image_transport` 的压缩图像将被禁用,因为进程内通信不支持此功能
|
||||
@@ -0,0 +1,146 @@
|
||||
# 针对Orbbec相机与ROS2的Fast DDS优化
|
||||
|
||||
使用默认配置时,Fast DDS表现出次优的传输效率,导致在ROS2中使用Orbbec相机时图像传输延迟显著。本文档提供了优化Fast DDS以提高图像传输效率的指导。
|
||||
|
||||
## 调整系统参数
|
||||
|
||||
**IP分片时间**
|
||||
|
||||
- **路径**: `/proc/sys/net/ipv4/ipfrag_time`(默认值:30秒)
|
||||
- **目的**: 定义IP分片保留在内存中的持续时间。
|
||||
- **调整**: 减少此值以缩短未接收到分片的时间窗口,这有助于减少延迟。考虑到您环境的具体需求,因为此设置会影响所有传入的分片。
|
||||
|
||||
**示例**: 设置为3秒。
|
||||
|
||||
```bash
|
||||
sudo sysctl net.ipv4.ipfrag_time=3
|
||||
```
|
||||
|
||||
**IP分片内存阈值**
|
||||
|
||||
- **路径**: `/proc/sys/net/ipv4/ipfrag_high_thresh`(默认值:262144字节)
|
||||
- **目的**: 设置用于重组IP分片的最大内存。
|
||||
- **调整**: 增加此值以允许更多内存用于分片重组,这可以改善较大数据包的处理。
|
||||
|
||||
**示例**: 增加到128 MB。
|
||||
|
||||
```bash
|
||||
sudo sysctl net.ipv4.ipfrag_high_thresh=134217728
|
||||
```
|
||||
|
||||
**最大缓冲区大小**
|
||||
|
||||
- **目的**: 配置接收和发送数据的最大缓冲区大小,这对高吞吐量数据传输至关重要。
|
||||
- **调整**: 设置接收和发送操作的最大缓冲区大小。
|
||||
|
||||
**命令**:
|
||||
|
||||
```bash
|
||||
sudo sysctl -w net.core.rmem_max=2147483647
|
||||
sudo sysctl -w net.core.rmem_default=2147483647
|
||||
sudo sysctl -w net.core.wmem_max=2147483647
|
||||
sudo sysctl -w net.core.wmem_default=2147483647
|
||||
```
|
||||
|
||||
或者,通过将这些设置添加到 `/etc/sysctl.d/10-fastrtps-max.conf` 文件中使其永久生效。
|
||||
|
||||
```bash
|
||||
sudo gedit /etc/sysctl.d/10-fastrtps-max.conf
|
||||
```
|
||||
|
||||
将以下行添加到文件中:
|
||||
|
||||
```bash
|
||||
net.core.rmem_max=2147483647
|
||||
net.core.rmem_default=2147483647
|
||||
net.core.wmem_max=2147483647
|
||||
net.core.wmem_default=2147483647
|
||||
```
|
||||
|
||||
然后保存并退出文件。运行 `sudo sysctl -p` 以应用更改。
|
||||
|
||||
有关详细指导,请参考 [ROS 2 DDS调优文档](https://docs.ros.org/en/foxy/How-To-Guides/DDS-tuning.html)。
|
||||
|
||||
## Fast DDS配置
|
||||
|
||||
以下是针对Orbbec相机与ROS2使用而优化的Fast DDS配置文件示例。此配置通过调整缓冲区大小和传输设置来增强整体数据传输。
|
||||
|
||||
**配置文件:** `shm_fastdds.xml`
|
||||
|
||||
将此文件放在 `$HOME` 目录中。
|
||||
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
|
||||
<transport_descriptors>
|
||||
<transport_descriptor>
|
||||
<transport_id>UDP_transport</transport_id>
|
||||
<type>UDPv4</type>
|
||||
<maxInitialPeersRange>10</maxInitialPeersRange>
|
||||
<maxMessageSize>65000</maxMessageSize>
|
||||
<sendBufferSize>1048576</sendBufferSize>
|
||||
<receiveBufferSize>1048576</receiveBufferSize>
|
||||
</transport_descriptor>
|
||||
</transport_descriptors>
|
||||
<participant profile_name="participant_profile_ros2" is_default_profile="true">
|
||||
<rtps>
|
||||
<name>profile_for_ros2_context</name>
|
||||
<userTransports>
|
||||
<transport_id>UDP_transport</transport_id>
|
||||
</userTransports>
|
||||
<useBuiltinTransports>false</useBuiltinTransports>
|
||||
<sendSocketBufferSize>1048576</sendSocketBufferSize>
|
||||
<listenSocketBufferSize>1048576</listenSocketBufferSize>
|
||||
<builtin>
|
||||
<initialPeersList>
|
||||
<locator>
|
||||
<udpv4>
|
||||
<address>127.0.0.1</address>
|
||||
</udpv4>
|
||||
</locator>
|
||||
</initialPeersList>
|
||||
</builtin>
|
||||
</rtps>
|
||||
</participant>
|
||||
<data_writer profile_name="default publisher profile" is_default_profile="true">
|
||||
<qos>
|
||||
<publishMode>
|
||||
<kind>ASYNCHRONOUS</kind>
|
||||
</publishMode>
|
||||
<latencyBudget>
|
||||
<duration>
|
||||
<sec>0</sec>
|
||||
<nanosec>1000000</nanosec>
|
||||
</duration>
|
||||
</latencyBudget>
|
||||
</qos>
|
||||
<historyMemoryPolicy>PREALLOCATED_WITH_REALLOC</historyMemoryPolicy>
|
||||
</data_writer>
|
||||
<data_reader profile_name="default subscription profile" is_default_profile="true">
|
||||
<qos>
|
||||
<data_sharing>
|
||||
<kind>AUTOMATIC</kind>
|
||||
</data_sharing>
|
||||
<latencyBudget>
|
||||
<duration>
|
||||
<sec>0</sec>
|
||||
<nanosec>1000000</nanosec>
|
||||
</duration>
|
||||
</latencyBudget>
|
||||
</qos>
|
||||
<historyMemoryPolicy>PREALLOCATED_WITH_REALLOC</historyMemoryPolicy>
|
||||
</data_reader>
|
||||
</profiles>
|
||||
```
|
||||
|
||||
**环境变量**
|
||||
|
||||
设置以下环境变量以使用自定义Fast DDS配置文件:
|
||||
|
||||
```bash
|
||||
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
|
||||
export FASTRTPS_DEFAULT_PROFILES_FILE=$HOME/shm_fastdds.xml
|
||||
export RMW_FASTRTPS_USE_QOS_FROM_XML=1
|
||||
```
|
||||
|
||||
此配置旨在优化数据流并减少传输延迟,提高Orbbec相机系统在ROS2环境中的响应性和可靠性。
|
||||
@@ -0,0 +1,95 @@
|
||||
## 使用Orbbec ROS包降低CPU使用率
|
||||
|
||||
您可以在 [示例](https://github.com/orbbec/OrbbecSDK_ROS2/tree/v2-main/orbbec_camera/examples) 中找到使用示例代码。
|
||||
|
||||
本文档概述了在使用 **Gemini 330系列相机** 的 **OrbbecSDK_ROS2 v2** 环境中最小化CPU使用率的策略。固件版本必须 **不低于1.4.10**,且 `device` 应设置为 **Default**。
|
||||
|
||||
### 降低CPU使用率的推荐设置
|
||||
|
||||
要在OrbbecSDK_ROS2中实现最低的CPU使用率,建议配置以下参数。
|
||||
|
||||
| 参数 | 推荐值 | 说明 |
|
||||
| :--------------: | :------------------------------------: | :--------------------------------------------: |
|
||||
| `uvc_backend` | `v4l2` | 与 `libuvc` 相比CPU使用率更低 |
|
||||
| `color_format` | `RGB` | CPU使用率低于 `MJPG` |
|
||||
| `filter` | 仅使用 `hardware_noise_removal_filter` | 其他滤波器会显著增加CPU使用率 |
|
||||
|
||||
### 用于测试的启动文件
|
||||
|
||||
* `gemini_330_series_lower_cpu_usage.launch.py`
|
||||
* `multi_camera_lower_cpu_usage.launch.py`
|
||||
|
||||
### 测试环境
|
||||
|
||||
**硬件配置**
|
||||
|
||||
* **CPU**: Intel i7-8700 @ 3.20GHz
|
||||
|
||||
* **内存**: 24 GB
|
||||
|
||||
* **存储**: Micron 2200S NVMe 256GB
|
||||
|
||||
* **GPU**: NVIDIA GeForce GTX 1660Ti
|
||||
|
||||
* **操作系统**: Ubuntu22.04
|
||||
|
||||
**ROS配置**
|
||||
|
||||
* **ROS版本**: ROS2 Humble
|
||||
|
||||
* **SDK版本**: OrbbecSDK_ROS2 v2.2.1
|
||||
|
||||
**相机设置**
|
||||
|
||||
* 设备: 2x Gemini 335, 1x Gemini 336, 1x Gemini 336L
|
||||
|
||||
* 固件版本: 1.4.10
|
||||
|
||||
|
||||
### 测试设置
|
||||
|
||||
**数据流设置:**
|
||||
|
||||
* 深度/左IR/右IR: 848×480 @ 30fps
|
||||
* 彩色: 848×480 @ 30fps
|
||||
|
||||
注意:以下CPU使用率数据重点关注 `uvc_backend`、`color_format` 和各种滤波器组合。
|
||||
|
||||
### 测试结果
|
||||
|
||||
**`uvc_backend` 对比(RGB格式)**
|
||||
|
||||
| libuvc CPU使用率 | v4l2 CPU使用率 | 绝对变化 |
|
||||
| :--------------: | :------------: | :-------------: |
|
||||
| 182.8% | 118.8% | -64.0% |
|
||||
|
||||
使用v4l2后端可以显著降低CPU使用率。在我们的实现中,v4l2无需对Linux内核进行任何补丁即可工作,允许用户轻松在v4l2和libuvc之间切换,并保持与标准Linux发行版的完全兼容性。
|
||||
|
||||
**`color_format` 对比(MJPG vs RGB)**
|
||||
|
||||
| 后端 | MJPG CPU使用率 | RGB CPU使用率 | 绝对变化 |
|
||||
| :-----: | :------------: | :-----------: | :-------------: |
|
||||
| libuvc | 347.7% | 182.8% | -164.9% |
|
||||
| v4l2 | 170.0% | 118.8% | -51.2% |
|
||||
|
||||
如果选择RGB格式而不是MJPG,可以降低CPU使用率,因为MJPG图像的解码会消耗主机CPU资源。
|
||||
|
||||
**滤波器配置影响**
|
||||
|
||||
| 应用的滤波器 | libuvc CPU使用率 | CPU使用率增加 | v4l2 CPU使用率 | CPU使用率增加 |
|
||||
| ----------------------------------------------------- | ---------------- | ------------------ | -------------- | ------------------ |
|
||||
| 无滤波器(基准) | 182.8% | 0.0%(基准) | 118.8% | 0.0%(基准) |
|
||||
| `(软件)noise_removal_filter` | 218.0% | +35.2% | 128.5% | +9.7% |
|
||||
| `(软件)noise_removal_filter + spatial_filter` | 469.6% | +286.8% | 336.7% | +217.9% |
|
||||
| `hardware_noise_removal_filter` | 186.3% | +3.5% | 115.4% | -3.4% |
|
||||
| `hardware_noise_removal_filter + spatial_filter` | 251.3% | +68.5% | 152.5% | +33.7% |
|
||||
|
||||
根据测试结果,仅使用 `hardware_noise_removal_filter` 相比无滤波器基准,对 `libuvc`(+3.5%)和 `v4l2`(-3.4%)的CPU使用率变化可以忽略不计,因为此滤波器在相机硬件内部运行。相比之下,其他滤波器在主机系统上执行。将 `spatial_filter` 添加到硬件滤波器会导致CPU使用率适度增加,而应用基于软件的 `noise_removal_filter`——无论是单独使用还是与 `spatial_filter` 结合——都会显著增加CPU负载。为保持较低的CPU使用率,建议避免使用基于软件的滤波器,仅依赖 `hardware_noise_removal_filter`。
|
||||
|
||||
### 进一步优化
|
||||
|
||||
| 参数 | 推荐值 | 说明 |
|
||||
| :----------------------------: | :----------------------------------------------: | :---------------------------------------------: |
|
||||
| `depth_registration` | `false` 或 `true` 配合 `align_mode=HW` | 软件对齐消耗更多CPU |
|
||||
| `enable_point_cloud` | `false` | 禁用点云可降低CPU使用率 |
|
||||
| `enable_colored_point_cloud` | `false` | 禁用彩色点云可降低CPU使用率 |
|
||||
Reference in New Issue
Block a user