add Documents
@@ -1,27 +1,200 @@
|
|||||||
# Configuration file for the Sphinx documentation builder.
|
# Configuration file for the Sphinx documentation builder.
|
||||||
#
|
#
|
||||||
# For the full list of built-in configuration values, see the documentation:
|
# This file only contains a selection of the most common options. For a full
|
||||||
|
# list see the documentation:
|
||||||
# https://www.sphinx-doc.org/en/master/usage/configuration.html
|
# https://www.sphinx-doc.org/en/master/usage/configuration.html
|
||||||
|
|
||||||
|
# -- Path setup --------------------------------------------------------------
|
||||||
|
|
||||||
|
# If extensions (or modules to document with autodoc) are in another directory,
|
||||||
|
# add these directories to sys.path here. If the directory is relative to the
|
||||||
|
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||||
|
#
|
||||||
|
# import os
|
||||||
|
# import sys
|
||||||
|
# sys.path.insert(0, os.path.abspath('.'))
|
||||||
|
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import sphinx
|
||||||
|
|
||||||
|
import recommonmark
|
||||||
|
from recommonmark.transform import AutoStructify
|
||||||
|
|
||||||
|
# import sphinx_book_theme
|
||||||
|
# import sphinx_rtd_theme
|
||||||
|
# import furo
|
||||||
|
|
||||||
|
|
||||||
|
#choice theme default
|
||||||
|
# html_theme = 'sphinx_book_theme'
|
||||||
|
html_theme = 'sphinx_rtd_theme'
|
||||||
|
# html_theme = "furo"
|
||||||
|
|
||||||
# -- Project information -----------------------------------------------------
|
# -- Project information -----------------------------------------------------
|
||||||
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
|
|
||||||
|
|
||||||
project = 'OrbbecSDK V2 ROS2 Wrapper'
|
project = 'OrbbecSDK V2 ROS2 Wrapper'
|
||||||
copyright = '2025, ORBBEC yalian'
|
# project = """
|
||||||
author = 'ORBBEC yalian'
|
# OrbbecSDK ROS2 documentation
|
||||||
|
# """
|
||||||
|
copyright = '2025, ORBBEC INC. www.orbbec.com.'
|
||||||
|
author = 'ORBBEC INC. www.orbbec.com.'
|
||||||
|
|
||||||
|
|
||||||
# -- General configuration ---------------------------------------------------
|
# -- General configuration ---------------------------------------------------
|
||||||
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
|
# The master toctree document.
|
||||||
|
master_doc = 'index'
|
||||||
|
|
||||||
extensions = []
|
# Add any Sphinx extension module names here, as strings. They can be
|
||||||
|
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||||
|
# ones.
|
||||||
|
extensions = ['recommonmark',
|
||||||
|
'sphinx_markdown_tables',
|
||||||
|
|
||||||
|
'sphinx.ext.autosectionlabel',
|
||||||
|
|
||||||
|
# 'myst_parser',
|
||||||
|
]
|
||||||
|
|
||||||
|
# The suffix(es) of source filenames.
|
||||||
|
# You can specify multiple suffix as a list of string:
|
||||||
|
source_suffix = ['.rst', 'rest', '.md', '.MD']
|
||||||
|
|
||||||
|
|
||||||
|
# Add any paths that contain templates here, relative to this directory.
|
||||||
templates_path = ['_templates']
|
templates_path = ['_templates']
|
||||||
|
|
||||||
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
|
# for a list of supported languages.
|
||||||
|
#
|
||||||
|
# This is also used if you do content translation via gettext catalogs.
|
||||||
|
# Usually you set "language" from the command line for these cases.
|
||||||
|
# language = 'zh_CN'
|
||||||
|
language = 'en'
|
||||||
|
|
||||||
|
# List of patterns, relative to source directory, that match files and
|
||||||
|
# directories to ignore when looking for source files.
|
||||||
|
# This pattern also affects html_static_path and html_extra_path.
|
||||||
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
|
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for HTML output -------------------------------------------------
|
# -- Options for HTML output -------------------------------------------------
|
||||||
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
|
|
||||||
|
|
||||||
html_theme = 'alabaster'
|
# html_logo = "source/_static/orbbec_logo2.png"
|
||||||
html_static_path = ['_static']
|
# html_favicon = "source/_static/orbbec_logo2.png"
|
||||||
|
|
||||||
|
#html_logo = "source/_static/orbbec-light_no_colour.svg"
|
||||||
|
html_favicon = "source/_static/orbbec_footerlogo_3d_world.svg"
|
||||||
|
# html_logo = "source/_static/orbbec_footerlogo_3d_world.svg"
|
||||||
|
# html_favicon = "source/_static/orbbec_footerlogo_3d_world.svg"
|
||||||
|
|
||||||
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
|
# relative to this directory. They are copied after the builtin static files,
|
||||||
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||||
|
html_static_path = ['source/_static','source/images']
|
||||||
|
|
||||||
|
html_extra_path = ['source/images']
|
||||||
|
|
||||||
|
html_theme_options = {
|
||||||
|
# 'analytics_id': 'G-EVD5Z6G6NH',
|
||||||
|
'collapse_navigation': False,
|
||||||
|
# 启用导航栏的“粘性”头部,这样导航栏会固定在页面顶部
|
||||||
|
'sticky_navigation': True,
|
||||||
|
# 配置导航栏的深度,-1 表示显示所有层级的标题
|
||||||
|
'navigation_depth': 5,
|
||||||
|
# 'show_navbar_depth': 4,
|
||||||
|
# 导航栏显示+号
|
||||||
|
'collapse_navigation': False,
|
||||||
|
|
||||||
|
# 'analytics_anonymize_ip': False,
|
||||||
|
# 'logo_only': False,
|
||||||
|
# 'display_version': True,
|
||||||
|
# 'prev_next_buttons_location': 'bottom',
|
||||||
|
# 'style_external_links': False,
|
||||||
|
# 'vcs_pageview_mode': '',
|
||||||
|
# 'style_nav_header_background': 'white',
|
||||||
|
# # Toc options
|
||||||
|
# 'collapse_navigation': True,
|
||||||
|
# 'sticky_navigation': True,
|
||||||
|
# 'navigation_depth': 5,
|
||||||
|
# 'includehidden': True,
|
||||||
|
# 'titles_only': False
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# # 添加自定义的 JavaScript 文件
|
||||||
|
# html_js_files = ["theme.js"]
|
||||||
|
|
||||||
|
|
||||||
|
# #不需要添加_static目录,加了会不起作用
|
||||||
|
html_css_files = ["custom.css"]
|
||||||
|
|
||||||
|
# 与文档无关的其他资源的路径,由于无需构建此文件夹的文件,会自动忽略
|
||||||
|
# 默认情况下,此路径下的文件会输出到生成的html的根目录
|
||||||
|
# html_extra_path = ["_extra"]
|
||||||
|
|
||||||
|
# 在页面底部显示上一次更新于某某时间
|
||||||
|
html_last_updated_fmt = "%Y-%m-%d %H:%M:%S"
|
||||||
|
|
||||||
|
# 以下为 sphinx_book_theme 的主题配置/定制(sphinx_book_theme)
|
||||||
|
# html_theme_options = {
|
||||||
|
# # ----------------主题内容中导航栏的功能按钮配置--------
|
||||||
|
# # 添加存储库链接
|
||||||
|
# "repository_url": "https://github.com/Eugene-Forest/NoteBook",
|
||||||
|
# # 添加按钮以链接到存储库
|
||||||
|
# "use_repository_button": True,
|
||||||
|
# # 要添加按钮以打开有关当前页面的问题
|
||||||
|
# "use_issues_button": True,
|
||||||
|
# # 添加一个按钮来建议编辑
|
||||||
|
# "use_edit_page_button": True,
|
||||||
|
# # 默认情况下,编辑按钮将指向master分支,但如果您想更改此设置,请使用以下配置
|
||||||
|
# "repository_branch": "main",
|
||||||
|
# # 默认情况下,编辑按钮将指向存储库的根目录;而我们 sphinx项目的 doc文件其实是在 source 文件夹下的,包括 conf.py 和 index(.rst) 主目录
|
||||||
|
# "path_to_docs": "source",
|
||||||
|
# # 您可以添加 use_download_button 按钮,允许用户以多种格式下载当前查看的页面
|
||||||
|
# "use_download_button": True,
|
||||||
|
|
||||||
|
# # --------------------------右侧辅助栏配置---------
|
||||||
|
# # 重命名右侧边栏页内目录名,标题的默认值为Contents。
|
||||||
|
# "toc_title": "页内目录",
|
||||||
|
# # 通常,右侧边栏页内目录中仅显示页面的第 2 级标题,只有当它们是活动部分的一部分时(在屏幕上滚动时),才会显示更深的级别。可以使用以下配置显示更深的级别,指示应显示多少级别
|
||||||
|
# "show_toc_level": 2,
|
||||||
|
|
||||||
|
# # --------------------------左侧边栏配置--------------
|
||||||
|
# # logo 配置
|
||||||
|
# "logo_only": True,
|
||||||
|
# # 控制左侧边栏列表的深度展开,默认值为1,它仅显示文档的顶级部分
|
||||||
|
# "show_navbar_depth": 1,
|
||||||
|
# # 自定义侧边栏页脚,默认为 Theme by the Executable Book Project
|
||||||
|
# # "extra_navbar": "<p>Your HTML</p>",
|
||||||
|
# "home_page_in_toc": True,
|
||||||
|
# # ------------------------- 单页模式 -----------------
|
||||||
|
# # 如果您的文档只有一个页面,并且您不需要左侧导航栏,那么您可以 使用以下配置将其配置sphinx-book-theme 为以单页模式运行
|
||||||
|
# # "single_page": True,
|
||||||
|
# }
|
||||||
|
|
||||||
|
# 是否显示页面下方的由sphinx创建, 默认为True
|
||||||
|
html_show_sphinx = False
|
||||||
|
|
||||||
|
# Function to copy video files to output directory
|
||||||
|
def setup(app):
|
||||||
|
app.connect('build-finished', copy_videos)
|
||||||
|
|
||||||
|
def copy_videos(app, exception):
|
||||||
|
if exception is None: # Only copy if build succeeded
|
||||||
|
src_dir = os.path.join(app.srcdir, '_static/videos')
|
||||||
|
dest_dir = os.path.join(app.outdir, '_static/videos')
|
||||||
|
if os.path.exists(src_dir):
|
||||||
|
shutil.copytree(src_dir, dest_dir)
|
||||||
|
|
||||||
|
# 20201030
|
||||||
|
def setup(app):
|
||||||
|
app.add_config_value('recommonmark_config', {
|
||||||
|
'url_resolver': lambda url: github_doc_root + url,
|
||||||
|
'auto_toc_tree_section': 'Contents',
|
||||||
|
}, True)
|
||||||
|
app.add_transform(AutoStructify)
|
||||||
|
|||||||
@@ -12,6 +12,12 @@ documentation for details.
|
|||||||
|
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 2
|
:maxdepth: 3
|
||||||
:caption: Contents:
|
:numbered:
|
||||||
|
|
||||||
|
source/1_overview/overview.rst
|
||||||
|
source/2_installation/installation.rst
|
||||||
|
source/3_quickstarts/quickstarts.rst
|
||||||
|
source/4_application_guide/application_guide.rst
|
||||||
|
source/5_advanced_guide/advanced_guide.rst
|
||||||
|
source/6_FAQ/FAQ.rst
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# markdown suport
|
||||||
|
recommonmark
|
||||||
|
# markdown table suport
|
||||||
|
sphinx-markdown-tables
|
||||||
|
|
||||||
|
# theme default rtd
|
||||||
|
|
||||||
|
# crate-docs-theme
|
||||||
|
sphinx-rtd-theme
|
||||||
|
|
||||||
|
doc8
|
||||||
|
docutils
|
||||||
|
pip
|
||||||
|
sphinx
|
||||||
|
sphinx-copybutton
|
||||||
|
sphinx-lint
|
||||||
|
sphinx-multiversion
|
||||||
|
sphinx-rtd-theme
|
||||||
|
sphinx-tabs
|
||||||
|
sphinxcontrib-mermaid
|
||||||
@@ -8,59 +8,30 @@ If you are a user in China, it is recommended to use [gitee Repo](https://gitee.
|
|||||||
|
|
||||||
## Support Hardware Products
|
## Support Hardware Products
|
||||||
|
|
||||||
This document is based on the v2-main branch code, which is a Python Wrapper built on Orbbec SDK v2. It supports the following devices.
|
The following devices are supported by the OrbbecSDK ROS2 Wrapper v2-main branch. More devices support will be added in the near future. If you can not find your device in the table below, try the [main](https://github.com/orbbec/OrbbecSDK_ROS2) branch.
|
||||||
If your device is included in this supported list, we recommend using the v2-main branch. If not, you can use the main branch instead.
|
|
||||||
|
|
||||||
| **Products List** | **Minimal Firmware Version** |
|
For optimal performance, we strongly recommend updating to the latest firmware version. This ensures that you benefit from the most recent enhancements and bug fixes.
|
||||||
|-------------------|------------------------------|
|
|
||||||
| Gemini 435Le | 1.2.04 |
|
|
||||||
| Gemini 335Le | 1.5.31 |
|
|
||||||
| Gemini 330 | 1.2.20 |
|
|
||||||
| Gemini 330L | 1.2.20 |
|
|
||||||
| Gemini 335 | 1.2.20 |
|
|
||||||
| Gemini 335L | 1.2.20 |
|
|
||||||
| Gemini 336 | 1.2.20 |
|
|
||||||
| Gemini 336L | 1.2.20 |
|
|
||||||
| Gemini 335Lg | 1.3.46 |
|
|
||||||
| Femto Bolt | 1.1.2 |
|
|
||||||
| Femto Mega | 1.3.0 |
|
|
||||||
| Femto Mega I | 2.0.4 |
|
|
||||||
| Astra 2 | 2.8.20 |
|
|
||||||
| Gemini 2 L | 1.4.53 |
|
|
||||||
| Gemini 2 | 1.4.92 |
|
|
||||||
| Gemini 215 | 1.0.9 |
|
|
||||||
| Gemini 210 | 1.0.9 |
|
|
||||||
|
|
||||||
the main branch supports the following devices:
|
| Product List | Minimal Firmware Version | **Launch File** |
|
||||||
|
| :------------- | :----------------------- | :-------------------------- |
|
||||||
|
| Gemini 435Le | 1.2.04 | gemini435_le.launch.py |
|
||||||
| **Products List** | **Minimal Firmware Version** |
|
| Gemini 335 | 1.2.20 | gemini_330_series.launch.py |
|
||||||
|-------------------|-----------------------------|
|
| Gemini 336 | 1.2.20 | gemini_330_series.launch.py |
|
||||||
| Gemini 330 | 1.2.20 |
|
| Gemini 335L | 1.2.20 | gemini_330_series.launch.py |
|
||||||
| Gemini 330L | 1.2.20 |
|
| Gemini 336L | 1.2.20 | gemini_330_series.launch.py |
|
||||||
| Gemini 335 | 1.2.20 |
|
| Gemini 335Lg | 1.3.46 | gemini_330_series.launch.py |
|
||||||
| Gemini 335L | 1.2.20 |
|
| Gemini 335Le | 1.5.31 | gemini_330_series.launch.py |
|
||||||
| Gemini 336 | 1.2.20 |
|
| Gemini 330 | 1.2.20 | gemini_330_series.launch.py |
|
||||||
| Gemini 336L | 1.2.20 |
|
| Gemini 330L | 1.2.20 | gemini_330_series.launch.py |
|
||||||
| Femto Bolt | 1.0.6 |
|
| Gemini 2 | 1.4.92 | gemini2.launch.py |
|
||||||
| Femto Mega | 1.1.7 |
|
| Gemini 2 L | 1.4.53 | gemini2L.launch.py |
|
||||||
| Femto Mega I | 2.0.2 |
|
| Femto Bolt | 1.1.2 | femto_bolt.launch.py |
|
||||||
| Gemini 2 XL | Obox: V1.2.5 VL:1.4.54 |
|
| Femto Mega | 1.3.0 | femto_mega.launch.py |
|
||||||
| Astra 2 | 2.8.20 |
|
| Astra 2 | 2.8.20 | astra2.launch.py |
|
||||||
| Gemini 2 L | 1.4.32 |
|
| Astra Mini Pro | 2.0.01 | astra.launch.py |
|
||||||
| Gemini 2 | 1.4.60 |
|
|
||||||
| Astra+ | 1.0.19 |
|
|
||||||
| Femto | 1.6.7 |
|
|
||||||
| Femto W | 1.1.8 |
|
|
||||||
| DaBai | 2436 |
|
|
||||||
| DaBai DCW | 2460 |
|
|
||||||
| DaBai DW | 2606 |
|
|
||||||
| Astra Mini Pro | 1007 |
|
|
||||||
| Gemini E | 3460 |
|
|
||||||
| Gemini E Lite | 3606 |
|
|
||||||
| Gemini | 3018 |
|
|
||||||
| Astra Mini S Pro | 1005 |
|
|
||||||
|
|
||||||
|
All launch files are essentially similar, with the primary difference being the default values of the parameters set
|
||||||
|
for different models within the same series. Differences in USB standards, such as USB 2.0 versus USB 3.0, may require adjustments to these parameters. If you encounter a startup failure, please carefully review the specification manual. Pay special attention to the resolution settings in the launch file, as well as other parameters, to ensure compatibility and optimal performance.
|
||||||
|
|
||||||
## Support Platforms
|
## Support Platforms
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
Overview
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
This chapter provides an overview of the Orbbec SDK, including supported products, main features, and architecture.
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
introduction.md
|
||||||
|
orbbecsdk_overview.md
|
||||||
|
|
||||||
@@ -1,7 +1,5 @@
|
|||||||
### 2.2. Build from Source
|
### 2.2. Build from Source
|
||||||
|
|
||||||
If no wheel package is available, or if you want to build with the latest source code, follow these steps:
|
|
||||||
|
|
||||||
#### 2.2.1. Environment
|
#### 2.2.1. Environment
|
||||||
|
|
||||||
Install ROS 2 according to the official guide:
|
Install ROS 2 according to the official guide:
|
||||||
@@ -49,4 +47,3 @@ cd ~/ros2_ws
|
|||||||
colcon build --event-handlers console_direct+ --cmake-args -DCMAKE_BUILD_TYPE=Release
|
colcon build --event-handlers console_direct+ --cmake-args -DCMAKE_BUILD_TYPE=Release
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
Installation
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
This chapter explains how to install the Orbbec ROS2 Python SDK, including building from source, installing dependencies, and using registration scripts.
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
build_the_package.md
|
||||||
|
registration_script.md
|
||||||
|
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
## QuickStarts
|
||||||
|
|
||||||
|
### 3.1. Introduction
|
||||||
|
|
||||||
|
This section provides a quick start to using the Orbbec ROS 2 wrapper.
|
||||||
|
You will learn how to:
|
||||||
|
|
||||||
|
* Launch a camera node.
|
||||||
|
* Visualize depth/color streams in **RViz2**.
|
||||||
|
* Interact with topics and services using **ROS 2 CLI tools**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.2. Build your First Camera Application
|
||||||
|
|
||||||
|
#### Step 1: Source ROS 2 and Workspace
|
||||||
|
|
||||||
|
Make sure ROS 2 and your workspace environment are sourced:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
source /opt/ros/$ROS_DISTRO/setup.bash
|
||||||
|
source ~/ros2_ws/install/setup.bash
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 2: Launch the Camera Node
|
||||||
|
|
||||||
|
- On terminal 1
|
||||||
|
|
||||||
|
```bash
|
||||||
|
. ./install/setup.bash
|
||||||
|
ros2 run orbbec_camera list_devices_node #Check if the camera is connected
|
||||||
|
ros2 launch orbbec_camera gemini_330_series.launch.py # Or other launch file, see below table
|
||||||
|
```
|
||||||
|
|
||||||
|
If you have multiple cameras connected, you can specify the **serial number**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera gemini_330_series.launch.py serial_number:=<YourCameraSN>
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 3: Visualize in RViz2
|
||||||
|
|
||||||
|
Launch RViz2 and load the default config:
|
||||||
|
|
||||||
|
- On terminal 2
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rviz2
|
||||||
|
```
|
||||||
|
|
||||||
|
* Add an **Image** display, set topic to `/camera/color/image_raw`.
|
||||||
|
* Add another **Image** display for `/camera/depth/image_raw`.
|
||||||
|
* Optionally, add a **PointCloud2** display for `/camera/depth/points`.
|
||||||
|
|
||||||
|
You should now see the color stream, depth stream, and 3D point cloud in RViz2.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.3. Sample Features
|
||||||
|
|
||||||
|
After the node is running, try some ROS 2 CLI commands:
|
||||||
|
|
||||||
|
#### 3.3.1. List available topics / services/ parameters
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 topic list
|
||||||
|
ros2 service list
|
||||||
|
ros2 param list
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 3.3.2. Echo a topic
|
||||||
|
|
||||||
|
View depth camera data:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 topic echo /camera/depth/camera_info
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 3.3.3. Call a service
|
||||||
|
|
||||||
|
For example, get device Information:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/get_device_info orbbec_camera_msgs/srv/GetDeviceInfo '{}'
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 3.3.4. Record with rosbag2
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 bag record /camera/color/image_raw /camera/depth/image_raw
|
||||||
|
```
|
||||||
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
Quickstarts
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
This chapter provides quick start guides for the SDK, allowing users to run basic example programs quickly.
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
quickstart.md
|
||||||
|
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
Application Guide
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
This chapter introduces application development with the SDK, including launch parameter configuration, ROS2 services, and topics usage.
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
launch_parameters.md
|
||||||
|
services.md
|
||||||
|
topics.md
|
||||||
|
|
||||||
@@ -0,0 +1,262 @@
|
|||||||
|
# Launch parameters
|
||||||
|
|
||||||
|
> If you are not sure how to set the parameters, you can connect the orbbec camera and open the [OrbbecViewer](https://github.com/orbbec/OrbbecSDK/releases).
|
||||||
|
|
||||||
|
The following are the launch parameters available:
|
||||||
|
|
||||||
|
### Core & Stream Configuration
|
||||||
|
|
||||||
|
* **`camera_name`**
|
||||||
|
* Start the node namespace.
|
||||||
|
|
||||||
|
* **`depth_registration`**
|
||||||
|
* Enable alignment of the depth frame to the color frame. This field is required when the `enable_colored_point_cloud` is set to `true`.
|
||||||
|
|
||||||
|
* **`serial_number`**
|
||||||
|
* The serial number of the camera. This is required when multiple cameras are used.
|
||||||
|
|
||||||
|
* **`usb_port`**
|
||||||
|
* The USB port of the camera. This is required when multiple cameras are used.
|
||||||
|
|
||||||
|
* **`device_num`**
|
||||||
|
* The number of devices. This must be filled in if multiple cameras are required.
|
||||||
|
|
||||||
|
* **`[color|depth|left_ir|right_ir|ir]_[width|height|fps|format]`**
|
||||||
|
* The resolution and frame rate of the sensor stream.
|
||||||
|
|
||||||
|
* **`[color|depth|left_ir|right_ir|ir]_rotation`**
|
||||||
|
* Set stream image rotation.
|
||||||
|
* The possible values are `0`, `90`, `180`, `270`.
|
||||||
|
|
||||||
|
* **`[color|depth|left_ir|right_ir|ir]_flip`**
|
||||||
|
* Enable the stream image flip.
|
||||||
|
|
||||||
|
* **`[color|depth|left_ir|right_ir|ir]_mirror`**
|
||||||
|
* Enable the stream image mirror.
|
||||||
|
|
||||||
|
* **`enable_point_cloud`**
|
||||||
|
* Enable the point cloud.
|
||||||
|
|
||||||
|
* **`enable_colored_point_cloud`**
|
||||||
|
* Enable the RGB point cloud.
|
||||||
|
|
||||||
|
* **`cloud_frame_id`**
|
||||||
|
* Modify the `frame_id` name within the ros message.
|
||||||
|
|
||||||
|
* **`ordered_pc`**
|
||||||
|
* Enable filtering of invalid point clouds.
|
||||||
|
|
||||||
|
* **`align_mode`**
|
||||||
|
* The alignment mode to be used. Options are `HW` for hardware alignment and `SW` for software alignment.
|
||||||
|
|
||||||
|
* **`align_target_stream`**
|
||||||
|
* Set align target stream mode.
|
||||||
|
* The possible values are `COLOR`, `DEPTH`.
|
||||||
|
* `COLOR`: Align depth to color.
|
||||||
|
* `DEPTH`: Align color to depth.
|
||||||
|
|
||||||
|
* **`point_cloud_qos`, `[stream]_qos`, `[stream]_camera_info_qos`**
|
||||||
|
* ROS 2 Message Quality of Service (QoS) settings. The possible values are `SYSTEM_DEFAULT`, `DEFAULT`, `PARAMETER_EVENTS`, `SERVICES_DEFAULT`, `PARAMETERS`, `SENSOR_DATA` and are case-insensitive. These correspond to `rmw_qos_profile_system_default`, `rmw_qos_profile_default`, `rmw_qos_profile_parameter_events`, `rmw_qos_profile_services_default`, `rmw_qos_profile_parameters`, and `SENSOR_DATA`, respectively.
|
||||||
|
|
||||||
|
### Sensor Controls
|
||||||
|
|
||||||
|
#### Color Stream
|
||||||
|
* **`enable_color_auto_exposure`**
|
||||||
|
* Enable the Color auto exposure.
|
||||||
|
* **`enable_color_auto_exposure_priority`**
|
||||||
|
* Enable the Color auto exposure priority.
|
||||||
|
* **`color_exposure`**
|
||||||
|
* Set the Color exposure.
|
||||||
|
* **`color_gain`**
|
||||||
|
* Set the Color gain.
|
||||||
|
* **`enable_color_auto_white_balance`**
|
||||||
|
* Enable the Color auto white balance.
|
||||||
|
* **`color_white_balance`**
|
||||||
|
* Set the Color white balance.
|
||||||
|
* **`color_ae_max_exposure`**
|
||||||
|
* Set the maximum exposure value for Color auto exposure.
|
||||||
|
* **`color_brightness`**, **`color_sharpness`**, **`color_gamma`**, **`color_saturation`**, **`color_contrast`**, **`color_hue`**
|
||||||
|
* Set the Color brightness, sharpness, gamma, saturation, contrast, and hue.
|
||||||
|
* **`enable_color_backlight_compensation`**
|
||||||
|
* Enable the Color backlight compensation.
|
||||||
|
* **`color_powerline_freq`**
|
||||||
|
* Set the power line freq. The possible values are `disable`, `50hz`, `60hz`, `auto`.
|
||||||
|
* **`enable_color_decimation_filter`** / **`color_decimation_filter_scale`**
|
||||||
|
* Enable the Color decimation filter and set its scale.
|
||||||
|
* **`color_ae_roi_[left|right|top|bottom]`**
|
||||||
|
* Set Color auto exposure ROI.
|
||||||
|
|
||||||
|
#### Depth Stream
|
||||||
|
* **`enable_depth_auto_exposure_priority`**
|
||||||
|
* Enable the Depth auto exposure priority.
|
||||||
|
* **`mean_intensity_set_point`**
|
||||||
|
* Set the target mean intensity of the Depth image. For example: `mean_intensity_set_point:=100`.
|
||||||
|
> **Note:** This replaces the deprecated `depth_brightness`, which is still supported for backward compatibility.
|
||||||
|
* **`enable_depth_scale`**
|
||||||
|
* Enable the depth scale.
|
||||||
|
* **`depth_precision`**
|
||||||
|
* The depth precision should be in the format `1mm`. The default value is `1mm`.
|
||||||
|
* **`depth_ae_roi_[left|right|top|bottom]`**
|
||||||
|
* Set Depth auto exposure ROI.
|
||||||
|
|
||||||
|
#### IR Stream
|
||||||
|
* **`enable_ir_auto_exposure`**
|
||||||
|
* Enable the IR auto exposure.
|
||||||
|
* **`ir_exposure`** / **`ir_gain`**
|
||||||
|
* Set the IR exposure and gain.
|
||||||
|
* **`ir_ae_max_exposure`**
|
||||||
|
* Set the maximum exposure value for IR auto exposure.
|
||||||
|
* **`ir_brightness`**
|
||||||
|
* Set the IR brightness.
|
||||||
|
|
||||||
|
#### Laser / LDP
|
||||||
|
* **`enable_laser`**
|
||||||
|
* Enable the laser. The default value is `true`.
|
||||||
|
* **`laser_energy_level`**
|
||||||
|
* Set the laser energy level.
|
||||||
|
* **`enable_ldp`** / **`ldp_power_level`**
|
||||||
|
* Enable the LDP and set its power level.
|
||||||
|
|
||||||
|
### Device, Sync & Advanced Features
|
||||||
|
|
||||||
|
#### Multi-Camera Synchronization
|
||||||
|
* **`sync_mode`**
|
||||||
|
* Set sync mode. The default value is `standalone`.
|
||||||
|
* **`depth_delay_us`** / **`color_delay_us`**
|
||||||
|
* The delay time (microseconds) of the depth/color image capture after receiving the capture command or trigger signal.
|
||||||
|
* **`trigger2image_delay_us`**
|
||||||
|
* The delay time (microseconds) of the image capture after receiving the capture command or trigger signal. Us
|
||||||
|
* **`trigger_out_delay_us`**
|
||||||
|
* The delay time (microseconds) of the trigger signal output after receiving the capture command or trigger signal.
|
||||||
|
* **`trigger_out_enabled`**
|
||||||
|
* Enable the trigger out signal.
|
||||||
|
* **`software_trigger_enabled`** / **`software_trigger_period`**
|
||||||
|
* Enable the software trigger out signal / set the software trigger period in ms.
|
||||||
|
* **`frames_per_trigger`**
|
||||||
|
* The frame number of each stream after each trigger in triggering mode.
|
||||||
|
|
||||||
|
> Used for [multi camera synced](../5_advanced_guide/multi_camera_synced.md).
|
||||||
|
|
||||||
|
#### Network Cameras
|
||||||
|
* **`enumerate_net_device`**
|
||||||
|
* Enable automatically enumerate network devices. Used for [net camera](../orbbec_camera/examples/net_camera/README.MD).
|
||||||
|
* **`net_device_ip`** / **`net_device_port`**
|
||||||
|
* Set net device's IP address and port (Usually `8090`). Used for [net camera](../orbbec_camera/examples/net_camera/README.MD).
|
||||||
|
|
||||||
|
#### Device-Specific
|
||||||
|
* **`device_preset`**
|
||||||
|
* The default value is `Default`. Only the G330 series is supported. For more information, refer to the [G330 documentation](https://www.orbbec.com/docs/g330-use-depth-presets/). The value should be one of the preset names listed [in the table](./predefined_presets.md).
|
||||||
|
* **`enable_gmsl_trigger`** / **`gmsl_trigger_fps`**
|
||||||
|
* Enable the gmsl trigger out signal / set gmsl trigger fps. Used for [gmsl camera](../orbbec_camera/examples/gmsl_camera/README.MD).
|
||||||
|
|
||||||
|
#### Disparity
|
||||||
|
* **`disparity_to_depth_mode`**
|
||||||
|
* `HW`: use hardware disparity to depth conversion. `SW`: use software disparity to depth conversion.
|
||||||
|
* **`disparity_range_mode`**, **`disparity_search_offset`**, **`disparity_offset_config`**
|
||||||
|
* Parameters for disparity search offset. Used for [disparity search offset](../orbbec_camera/examples/disparity_search_offset/README.MD).
|
||||||
|
|
||||||
|
#### Interleave AE Mode
|
||||||
|
* **`interleave_ae_mode`**
|
||||||
|
* Set `laser` or `hdr` interleave.
|
||||||
|
* **`interleave_frame_enable`**, **`interleave_skip_enable`**, **`interleave_skip_index`**
|
||||||
|
* Parameters to control interleave frame mode.
|
||||||
|
* **`[hdr|laser]_index[0|1]_[...]`**
|
||||||
|
* In interleave frame mode, set the 0th and 1st frame parameters of hdr or laser interleaving frames.
|
||||||
|
* *All interleave parameters are used for [interleave ae mode](../orbbec_camera/examples/interleave_ae_mode/README.MD).*
|
||||||
|
|
||||||
|
### Basic & General Parameters
|
||||||
|
|
||||||
|
#### Firmware & Backend
|
||||||
|
* **`upgrade_firmware`**
|
||||||
|
* The input parameter is the firmware path.
|
||||||
|
* **`preset_firmware_path`**
|
||||||
|
* The input parameter is the preset firmware path. If multiple paths are input, each path needs to be separated by `,` and a maximum of 3 firmware paths can be input.
|
||||||
|
* **`uvc_backend`**
|
||||||
|
* Optional values: `v4l2`, `libuvc`.
|
||||||
|
* **`connection_delay`**
|
||||||
|
* The delay time in milliseconds for reopening the device. Some devices, such as Astra mini, require a longer time to initialize and reopening the device immediately can cause firmware crashes when hot plugging.
|
||||||
|
* **`retry_on_usb3_detection_failure`**
|
||||||
|
* If the camera is connected to a USB 2.0 port and is not detected, the system will attempt to reset the camera up to three times. It is recommended to set this parameter to `false` when using a USB 2.0 connection to avoid unnecessary resets.
|
||||||
|
|
||||||
|
#### TF, Extrinsics & Calibration
|
||||||
|
* **`publish_tf`** / **`tf_publish_rate`**
|
||||||
|
* Enable the TF publish and set its publication rate.
|
||||||
|
* **`enable_publish_extrinsic`**
|
||||||
|
* Enable the extrinsics publish.
|
||||||
|
* **`ir_info_url`** / **`color_info_url`**
|
||||||
|
* Set URL of the IR/color camera info.
|
||||||
|
* **`enable_color_undistortion`**
|
||||||
|
* Enable the Color undistortion.
|
||||||
|
|
||||||
|
#### Time Synchronization
|
||||||
|
* **`enable_sync_host_time`**
|
||||||
|
* Enable synchronization of the host time with the camera time. The default value is `true`. If using global time, set to `false`.
|
||||||
|
* **`time_domain`**
|
||||||
|
* Select timestamp type: `device`, `global`, and `system`.
|
||||||
|
* **`time_sync_period`**
|
||||||
|
* Interval (in seconds) for synchronizing the camera time with the host system.
|
||||||
|
> **Note**: This parameter only needs to be set when **`enable_sync_host_time = true`** and **`time_domain = device`**.
|
||||||
|
* **`enable_ptp_config`**
|
||||||
|
* Enable PTP time synchronization. Only for Gemini 335Le. Requires `enable_sync_host_time` to be `false`.
|
||||||
|
* **`enable_frame_sync`**
|
||||||
|
* Enable the frame synchronization.
|
||||||
|
|
||||||
|
#### Logging & Diagnostics
|
||||||
|
* **`log_level`**
|
||||||
|
* SDK log level. Default is `info`. Optional values: `debug`, `info`, `warn`, `error`, `fatal`.
|
||||||
|
* **`diagnostic_period`**
|
||||||
|
* Diagnostic period in seconds.
|
||||||
|
* **`enable_heartbeat`**
|
||||||
|
* Enable the heartbeat function. Default is `false`. If `true`, the camera node will send heartbeat signals to the firmware.
|
||||||
|
|
||||||
|
#### Miscellaneous
|
||||||
|
* **`config_file_path`**
|
||||||
|
* The path to the YAML configuration file. Default is `""`. If not specified, default parameters from the launch file will be used.
|
||||||
|
* **`frame_aggregate_mode`**
|
||||||
|
* Set frame aggregate output mode. Optional values: `full_frame`, `color_frame`, `ANY`, `disable`.
|
||||||
|
* **`enable_d2c_viewer`**
|
||||||
|
* Publishes the D2C overlay image (for testing only).
|
||||||
|
|
||||||
|
### IMU
|
||||||
|
|
||||||
|
* **`enable_accel`** / **`enable_gyro`**
|
||||||
|
* Enable the Accelerometer/gyroscope and output its info topic data.
|
||||||
|
* **`enable_sync_output_accel_gyro`**
|
||||||
|
* Enable the sync `accel_gyro`, and output IMU topic real-time data.
|
||||||
|
* **`accel_rate`** / **`gyro_rate`**
|
||||||
|
* The frequency of the accelerometer/gyroscope. Values range from `1.5625hz` to `32khz`.
|
||||||
|
* **`accel_range`** / **`gyro_range`**
|
||||||
|
* The range of the accelerometer (`2g`, `4g`, `8g`, `16g`) and gyroscope (`16dps` to `2000dps`).
|
||||||
|
* **`enable_accel_data_correction`** / **`enable_gyro_data_correction`**
|
||||||
|
* Enable data correction for the accelerometer/gyroscope.
|
||||||
|
* **`linear_accel_cov`** / **`angular_vel_cov`**
|
||||||
|
* Covariance of the linear acceleration and angular velocity.
|
||||||
|
|
||||||
|
### Depth Filters
|
||||||
|
|
||||||
|
* **`enable_decimation_filter`**
|
||||||
|
* Enable the Depth decimation filter. Set with `decimation_filter_scale`.
|
||||||
|
* **`enable_hdr_merge`**
|
||||||
|
* Enable the Depth hdr merge filter. Set with `hdr_merge_exposure_1`, etc.
|
||||||
|
* **`enable_sequence_id_filter`**
|
||||||
|
* Enable the Depth sequence id filter. Set with `sequence_id_filter_id`.
|
||||||
|
* **`enable_threshold_filter`**
|
||||||
|
* Enable the Depth threshold filter. Set with `threshold_filter_max`, `threshold_filter_min`.
|
||||||
|
* **`enable_hardware_noise_removal_filter`**
|
||||||
|
* Enable the Depth hardware noise removal filter.
|
||||||
|
* **`enable_noise_removal_filter`**
|
||||||
|
* Enable the Depth software noise removal filter. Set with `noise_removal_filter_min_diff`, etc.
|
||||||
|
* **`enable_spatial_filter`**
|
||||||
|
* Enable the Depth spatial filter. Set with `spatial_filter_alpha`, etc.
|
||||||
|
* **`enable_temporal_filter`**
|
||||||
|
* Enable the Depth temporal filter. Set with `temporal_filter_diff_threshold`, etc.
|
||||||
|
* **`enable_hole_filling_filter`**
|
||||||
|
* Enable the Depth hole filling filter. Set with `hole_filling_filter_mode`.
|
||||||
|
* **`enable_spatial_fast_filter`**
|
||||||
|
* Enable the Depth spatial fast filter. Set with `spatial_fast_filter_radius`.
|
||||||
|
* **`enable_spatial_moderate_filter`**
|
||||||
|
* Enable the Depth spatial moderate filter. Set with `spatial_moderate_filter_diff_threshold`, etc.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> **_IMPORTANT_**: Please carefully read the instructions regarding software filtering settings at [this link](https://www.orbbec.com/docs/g330-use-depth-post-processing-blocks/). If you are uncertain, do not modify these settings.
|
||||||
@@ -0,0 +1,209 @@
|
|||||||
|
# All available services for camera control
|
||||||
|
|
||||||
|
> **Note:** Services related to a specific stream (e.g., `/camera/set_color_*`) are only available if that stream is enabled in the launch file (e.g., `enable_color:=true`).
|
||||||
|
|
||||||
|
### Stream Control
|
||||||
|
|
||||||
|
#### Color Stream
|
||||||
|
* `/camera/toggle_color`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/toggle_color std_srvs/srv/SetBool '{data: true}'
|
||||||
|
```
|
||||||
|
* `/camera/get_color_exposure` & `/camera/get_color_gain`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/get_color_exposure orbbec_camera_msgs/srv/GetInt32 '{}'
|
||||||
|
ros2 service call /camera/get_color_gain orbbec_camera_msgs/srv/GetInt32 '{}'
|
||||||
|
```
|
||||||
|
* `/camera/set_color_auto_exposure`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/set_color_auto_exposure std_srvs/srv/SetBool '{data: true}'
|
||||||
|
```
|
||||||
|
* `/camera/set_color_exposure` & `/camera/set_color_gain`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/set_color_exposure orbbec_camera_msgs/srv/SetInt32 '{data: 1}'
|
||||||
|
ros2 service call /camera/set_color_gain orbbec_camera_msgs/srv/SetInt32 '{data: 64}'
|
||||||
|
```
|
||||||
|
* `/camera/set_color_mirror`, `/camera/set_color_flip`, `/camera/set_color_rotation`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/set_color_mirror std_srvs/srv/SetBool '{data: true}'
|
||||||
|
ros2 service call /camera/set_color_flip std_srvs/srv/SetBool '{data: true}'
|
||||||
|
ros2 service call /camera/set_color_rotation orbbec_camera_msgs/srv/SetInt32 '{data: 180}'
|
||||||
|
```
|
||||||
|
* `/camera/set_color_ae_roi`
|
||||||
|
```bash
|
||||||
|
# data_param: [Left, Right, Top, Bottom]
|
||||||
|
ros2 service call /camera/set_color_ae_roi orbbec_camera_msgs/srv/SetArrays '{data_param: [0,1279,0,719]}'
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Depth Stream
|
||||||
|
* `/camera/toggle_depth`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/toggle_depth std_srvs/srv/SetBool '{data: true}'
|
||||||
|
```
|
||||||
|
* `/camera/get_depth_exposure` & `/camera/get_depth_gain`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/get_depth_exposure orbbec_camera_msgs/srv/GetInt32 '{}'
|
||||||
|
ros2 service call /camera/get_depth_gain orbbec_camera_msgs/srv/GetInt32 '{}'
|
||||||
|
```
|
||||||
|
* `/camera/set_depth_auto_exposure`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/set_depth_auto_exposure std_srvs/srv/SetBool '{data: true}'
|
||||||
|
```
|
||||||
|
* `/camera/set_depth_exposure` & `/camera/set_depth_gain`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/set_depth_exposure orbbec_camera_msgs/srv/SetInt32 '{data: 3000}'
|
||||||
|
ros2 service call /camera/set_depth_gain orbbec_camera_msgs/srv/SetInt32 '{data: 64}'
|
||||||
|
```
|
||||||
|
* `/camera/set_depth_mirror`, `/camera/set_depth_flip`, `/camera/set_depth_rotation`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/set_depth_mirror std_srvs/srv/SetBool '{data: true}'
|
||||||
|
ros2 service call /camera/set_depth_flip std_srvs/srv/SetBool '{data: true}'
|
||||||
|
ros2 service call /camera/set_depth_rotation orbbec_camera_msgs/srv/SetInt32 '{data: 180}'
|
||||||
|
```
|
||||||
|
* `/camera/set_depth_ae_roi`
|
||||||
|
```bash
|
||||||
|
# data_param: [Left, Right, Top, Bottom]
|
||||||
|
ros2 service call /camera/set_depth_ae_roi orbbec_camera_msgs/srv/SetArrays '{data_param: [0,847,0,479]}'
|
||||||
|
```
|
||||||
|
|
||||||
|
#### IR Stream
|
||||||
|
* `/camera/toggle_ir`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/toggle_ir std_srvs/srv/SetBool '{data: true}'
|
||||||
|
```
|
||||||
|
* `/camera/get_ir_exposure` & `/camera/get_ir_gain`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/get_ir_exposure orbbec_camera_msgs/srv/GetInt32 '{}'
|
||||||
|
ros2 service call /camera/get_ir_gain orbbec_camera_msgs/srv/GetInt32 '{}'
|
||||||
|
```
|
||||||
|
* `/camera/set_ir_auto_exposure`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/set_ir_auto_exposure std_srvs/srv/SetBool '{data: true}'
|
||||||
|
```
|
||||||
|
* `/camera/set_ir_exposure` & `/camera/set_ir_gain`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/set_ir_exposure orbbec_camera_msgs/srv/SetInt32 '{data: 3000}'
|
||||||
|
ros2 service call /camera/set_ir_gain orbbec_camera_msgs/srv/SetInt32 '{data: 64}'
|
||||||
|
```
|
||||||
|
* `/camera/switch_ir`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/switch_ir orbbec_camera_msgs/srv/SetString '{data: left}'
|
||||||
|
```
|
||||||
|
|
||||||
|
#### All Streams
|
||||||
|
* `/camera/get_streams_enable` & `/camera/set_streams_enable`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/get_streams_enable orbbec_camera_msgs/srv/GetBool '{}'
|
||||||
|
ros2 service call /camera/set_streams_enable std_srvs/srv/SetBool '{data: false}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Sensor & Emitter Control
|
||||||
|
|
||||||
|
* `/camera/set_auto_white_balance` & `/camera/get_auto_white_balance`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/set_auto_white_balance std_srvs/srv/SetBool '{data: true}'
|
||||||
|
ros2 service call /camera/get_auto_white_balance orbbec_camera_msgs/srv/GetInt32 '{}'
|
||||||
|
```
|
||||||
|
* `/camera/set_white_balance` & `/camera/get_white_balance`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/set_white_balance orbbec_camera_msgs/srv/SetInt32 '{data: 2800}'
|
||||||
|
ros2 service call /camera/get_white_balance orbbec_camera_msgs/srv/GetInt32 '{}'
|
||||||
|
```
|
||||||
|
* `/camera/set_laser_enable`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/set_laser_enable std_srvs/srv/SetBool '{data: true}'
|
||||||
|
```
|
||||||
|
* `/camera/set_ldp_enable` & `/camera/get_ldp_status`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/set_ldp_enable std_srvs/srv/SetBool '{data: true}'
|
||||||
|
ros2 service call /camera/get_ldp_status orbbec_camera_msgs/srv/GetBool '{}'
|
||||||
|
```
|
||||||
|
* `/camera/set_fan_work_mode`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/set_fan_work_mode orbbec_camera_msgs/srv/SetInt32 '{data: 0}'
|
||||||
|
```
|
||||||
|
* `/camera/set_floor_enable`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/set_floor_enable std_srvs/srv/SetBool '{data: true}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Device Information & Management
|
||||||
|
|
||||||
|
* `/camera/get_device_info`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/get_device_info orbbec_camera_msgs/srv/GetDeviceInfo
|
||||||
|
```
|
||||||
|
* `/camera/get_sdk_version`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/get_sdk_version orbbec_camera_msgs/srv/GetString
|
||||||
|
```
|
||||||
|
* `/camera/reboot_device`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/reboot_device std_srvs/srv/Empty '{}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Synchronization & Triggering
|
||||||
|
|
||||||
|
* `/camera/send_software_trigger`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/send_software_trigger std_srvs/srv/SetBool '{data: true}'
|
||||||
|
```* `/camera/set_reset_timestamp`
|
||||||
|
```bash
|
||||||
|
# Only available when time_domain param is set to device
|
||||||
|
ros2 service call /camera/set_reset_timestamp std_srvs/srv/SetBool '{data: true}'
|
||||||
|
```
|
||||||
|
* `/camera/set_sync_interleaverlaser`
|
||||||
|
```bash
|
||||||
|
# Only available if interleave_ae_mode is 'laser' and interleave_frame_enable is true
|
||||||
|
ros2 service call /camera/set_sync_interleaverlaser orbbec_camera_msgs/srv/SetInt32 '{data: 0}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Depth Filter Configuration
|
||||||
|
|
||||||
|
* `/camera/set_filter`
|
||||||
|
```bash
|
||||||
|
# Set DecimationFilter
|
||||||
|
ros2 service call /camera/set_filter orbbec_camera_msgs/srv/SetFilter '{filter_name: DecimationFilter, filter_enable: false, filter_param: [5]}'
|
||||||
|
# Set SpatialAdvancedFilter
|
||||||
|
ros2 service call /camera/set_filter orbbec_camera_msgs/srv/SetFilter '{filter_name: SpatialAdvancedFilter, filter_enable: true, filter_param: [0.5,160,1,8]}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Capture & Calibration Management
|
||||||
|
|
||||||
|
* `/camera/save_images`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/save_images std_srvs/srv/Empty '{}'
|
||||||
|
```
|
||||||
|
* `/camera/save_point_cloud`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/save_point_cloud std_srvs/srv/Empty '{}'
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Note**: The following services are currently supported only on the 435Le module. Each service can store only one set of data or string at a time.
|
||||||
|
|
||||||
|
* `/camera/write_customer_data` & `/camera/read_customer_data`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/write_customer_data orbbec_camera_msgs/srv/SetString '{data: "string"}'
|
||||||
|
ros2 service call /camera/read_customer_data orbbec_camera_msgs/srv/GetString '{}'
|
||||||
|
```
|
||||||
|
* `/camera/set_user_calib_params` & `/camera/get_user_calib_params`
|
||||||
|
```bash
|
||||||
|
ros2 service call /camera/set_user_calib_params orbbec_camera_msgs/srv/SetUserCalibParams \
|
||||||
|
'{k: [614.9613647460938, 0.0, 634.91552734375,
|
||||||
|
0.0, 614.65771484375, 391.407470703125,
|
||||||
|
0.0, 0.0, 1.0],
|
||||||
|
d: [-0.03131488710641861,
|
||||||
|
0.032955970615148544,
|
||||||
|
9.096559369936585e-05,
|
||||||
|
-0.0003368517500348389,
|
||||||
|
-0.01115430984646082,
|
||||||
|
0.0, 0.0, 0.0],
|
||||||
|
rotation: [0.9999880790710449, 0.0003024190664291382, -0.004874417092651129,
|
||||||
|
-0.0002965621242765337, 0.9999992251396179, 0.001202247804030776,
|
||||||
|
0.004874777048826218, -0.0012007878394797444, 0.9999874234199524],
|
||||||
|
translation: [-0.023897956848144532,
|
||||||
|
-9.439220279455185e-05,
|
||||||
|
-6.804073229432106e-06]}'
|
||||||
|
ros2 service call /camera/get_user_calib_params orbbec_camera_msgs/srv/GetUserCalibParams '{}'
|
||||||
|
```
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
# Available Topics
|
||||||
|
|
||||||
|
Topics are organized by stream and function. By default, all topics are published under the `/camera` namespace, which can be changed with the `camera_name` launch parameter.
|
||||||
|
|
||||||
|
> **Note:** Topics for a specific stream (e.g., `/camera/color/...`) are only published if their corresponding launch parameter (e.g., `enable_color`) is set to `true`.
|
||||||
|
|
||||||
|
### Image Streams
|
||||||
|
|
||||||
|
These topics provide the raw image data and corresponding calibration information for each enabled camera stream. The pattern is consistent for `color`, `depth`, `ir`, `left_ir`, and `right_ir` streams.
|
||||||
|
|
||||||
|
* `/camera/color/image_raw`
|
||||||
|
* Raw image data from the color stream.
|
||||||
|
* `/camera/color/camera_info`
|
||||||
|
* Camera calibration data and metadata for the color stream.
|
||||||
|
* `/camera/color/metadata`
|
||||||
|
* Low-level metadata from the color stream firmware.
|
||||||
|
|
||||||
|
* `/camera/depth/image_raw`
|
||||||
|
* Raw image data from the depth stream.
|
||||||
|
* `/camera/depth/camera_info`
|
||||||
|
* Camera calibration data and metadata for the depth stream.
|
||||||
|
* `/camera/depth/metadata`
|
||||||
|
* Low-level metadata from the depth stream firmware.
|
||||||
|
|
||||||
|
* `/camera/ir/image_raw`
|
||||||
|
* Raw image data from the infrared (IR) stream.
|
||||||
|
* `/camera/ir/camera_info`
|
||||||
|
* Camera calibration data and metadata for the IR stream.
|
||||||
|
* `/camera/ir/metadata`
|
||||||
|
* Low-level metadata from the IR stream firmware.
|
||||||
|
|
||||||
|
### Point Cloud Topics
|
||||||
|
|
||||||
|
* `/camera/depth/points`
|
||||||
|
* Point cloud data generated from the depth stream.
|
||||||
|
* **Condition:** Published only when `enable_point_cloud` is `true`.
|
||||||
|
|
||||||
|
* `/camera/depth_registered/points`
|
||||||
|
* Colored point cloud data, where the depth points are registered to the color image frame.
|
||||||
|
* **Condition:** Published only when `enable_colored_point_cloud` is `true`.
|
||||||
|
|
||||||
|
### IMU Topics
|
||||||
|
|
||||||
|
The Inertial Measurement Unit (IMU) topics provide accelerometer and gyroscope data. Their behavior depends on the synchronization setting.
|
||||||
|
|
||||||
|
* `/camera/accel/sample`
|
||||||
|
* Individual accelerometer data stream.
|
||||||
|
* **Condition:** Published when `enable_accel` is `true` AND `enable_sync_output_accel_gyro` is `false`.
|
||||||
|
|
||||||
|
* `/camera/gyro/sample`
|
||||||
|
* Individual gyroscope data stream.
|
||||||
|
* **Condition:** Published when `enable_gyro` is `true` AND `enable_sync_output_accel_gyro` is `false`.
|
||||||
|
|
||||||
|
* `/camera/gyro_accel/sample`
|
||||||
|
* Synchronized data stream containing both accelerometer and gyroscope data in a single message.
|
||||||
|
* **Condition:** Published when `enable_sync_output_accel_gyro` is `true`.
|
||||||
|
|
||||||
|
### Device Status & Diagnostics
|
||||||
|
|
||||||
|
* `/camera/device_status`
|
||||||
|
* Reports the current status of the camera device.
|
||||||
|
|
||||||
|
* `/camera/depth_filter_status`
|
||||||
|
* Reports the status of the depth sensor's post-processing filters.
|
||||||
|
|
||||||
|
* `/diagnostics`
|
||||||
|
* Publishes diagnostic information about the camera node. Currently, this includes the device temperature.
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
Advanced Guide
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
This chapter covers advanced features of the SDK, including multi-camera synchronization, depth-color alignment, performance tuning, and more.
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
align_depth_color.md
|
||||||
|
benchmark.md
|
||||||
|
building_a_Debian_Package.md
|
||||||
|
configuration_of_depth_NFOV_and_WFOV_modes.md
|
||||||
|
depth_work_mode_switch.md
|
||||||
|
disparity_search_offset.md
|
||||||
|
efficient_intra_process_communication.md
|
||||||
|
fastdds_tuning.md
|
||||||
|
gmsl_camera.md
|
||||||
|
interleave_ae_mode.md
|
||||||
|
lower_cpu_usage.md
|
||||||
|
multi_camera.md
|
||||||
|
multi_camera_synced.md
|
||||||
|
multi_camera_synced_verification_tool.md
|
||||||
|
net_camera.md
|
||||||
|
point_cloud.md
|
||||||
|
predefined_presets.md
|
||||||
|
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
## Aligning Depth to Color in ROS 2
|
||||||
|
|
||||||
|
This section explains how to align depth images with color images to create an overlay image using ROS 2. This is particularly useful for applications requiring synchronized visual information from different sensor modalities.
|
||||||
|
|
||||||
|
### Commands to Align and View Depth and Color Images
|
||||||
|
|
||||||
|
1. **Basic Depth to Color Alignment:**
|
||||||
|
|
||||||
|
To simply align the depth image to the color image, use the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera gemini_330_series.launch.py depth_registration:=true
|
||||||
|
```
|
||||||
|
|
||||||
|
This command activates the depth registration feature without opening a viewer.
|
||||||
|
2. **Viewing Depth to Color Overlay:**
|
||||||
|
|
||||||
|
If you wish to view the depth to color overlay, you need to enable the viewer by using the command below:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera gemini_330_series.launch.py depth_registration:=true enable_d2c_viewer:=true
|
||||||
|
```
|
||||||
|
|
||||||
|
This launches the camera node with depth to color registration and opens a viewer to display the overlay image.
|
||||||
|
|
||||||
|
### Selecting Topics in RViz2
|
||||||
|
|
||||||
|
To visualize the aligned images in RViz2:
|
||||||
|
|
||||||
|
1. Launch RViz2 after running one of the above commands.
|
||||||
|
2. Select the topic for the depth to color overlay image. An example topic selection is shown here:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Example of Depth to Color Overlay
|
||||||
|
|
||||||
|
After selecting the appropriate topic in RViz2, you will be able to see the depth to color overlay image. Here's what it might look like:
|
||||||
|
|
||||||
|

|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
# Ob_benchmark tool
|
||||||
|
|
||||||
|
> The goal of this tool is to benchmark the performance of various OrbbecSDK_ROS2 camera configurations. The benchmark results depend on the camera and settings used.(Currently only works with ROS2 Humble)
|
||||||
|
|
||||||
|
## Usage Instructions
|
||||||
|
|
||||||
|
### Tool Configuration ([start_benchmark_params.json](../../config/tools/startbenchmark/start_benchmark_params.json))
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"start_benchmark_params": {
|
||||||
|
"camera_name": [
|
||||||
|
"camera_01",
|
||||||
|
"camera_02",
|
||||||
|
"camera_03",
|
||||||
|
"camera_04"
|
||||||
|
],
|
||||||
|
"process_name": "component_conta",
|
||||||
|
"switch_cycle": 300,
|
||||||
|
"test_cycle": 1,
|
||||||
|
"skip_number": 30
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
* `camera_name`: Names of the cameras to be configured. Example: `"camera_01"`, `"camera_02"`, etc.
|
||||||
|
* `process_name`: The name of the process to be monitored. For example, `"component_conta"` will monitor the data of the container process.
|
||||||
|
* `switch_cycle`: The cycle time for switching configurations, in seconds. For example, setting it to `300` means the configuration will switch every 300 seconds.
|
||||||
|
* `test_cycle`: The testing cycle, in seconds. For example, setting it to `1` means the tool will collect data for the monitored process every 1 second.
|
||||||
|
* `skip_number`: The number of data points to skip. For example, setting it to `30` means that the first 30 data points will be ignored.
|
||||||
|
|
||||||
|
### Camera configuration (launch files)
|
||||||
|
|
||||||
|
In the launch folder, there are multiple\.launch.py files (`ob_benchmark_0.launch.py`, `ob_benchmark_1.launch.py`, ..., `ob_benchmark_19.launch.py`). Each file corresponds to a different camera configuration.
|
||||||
|
|
||||||
|
### Running the ob_benchmark tool
|
||||||
|
|
||||||
|
To run the tool, use the following commands:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
source install/setup.bash
|
||||||
|
ros2 run orbbec_camera ob_benchmark_node
|
||||||
|
```
|
||||||
|
|
||||||
|
### Output Data Files
|
||||||
|
|
||||||
|
The output data files will be stored in the ob_benchmark folder with filenames like `0.csv`, `1.csv`, ..., 19.csv. For example:
|
||||||
|
|
||||||
|
* `0.csv` contains data from the `ob_benchmark_0.launch.py` configuration.
|
||||||
|
* `1.csv` contains data from the `ob_benchmark_1.launch.py` configuration.
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
# Building a Debian Package
|
||||||
|
|
||||||
|
## Preparing the Environment
|
||||||
|
|
||||||
|
Before starting, install the required tools:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt install debhelper fakeroot python3-bloom
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuring ROS Dependencies
|
||||||
|
|
||||||
|
Add the following YAML file to your system at `/etc/ros/rosdep/sources.list.d/00-orbbec.yaml`. Make sure to
|
||||||
|
replace `focal` with the codename of your Ubuntu version and `humble` with your ROS2 distribution name:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
orbbec_camera_msgs:
|
||||||
|
ubuntu:
|
||||||
|
focal: [ ros-humble-orbbec-camera-msgs ]
|
||||||
|
```
|
||||||
|
|
||||||
|
Next, create a new file `/etc/ros/rosdep/sources.list.d/50-orbbec.list` and add this line to specify the path to the
|
||||||
|
YAML file:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yaml file:///etc/ros/rosdep/sources.list.d/00-orbbec.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Update the rosdep database to reflect these changes:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rosdep update
|
||||||
|
```
|
||||||
|
|
||||||
|
## Building the Package
|
||||||
|
|
||||||
|
Navigate to your workspace and build the project:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/ros2_ws/
|
||||||
|
colcon build --event-handlers console_direct+ --cmake-args -DCMAKE_BUILD_TYPE=Release
|
||||||
|
. install/setup.bash
|
||||||
|
cd src/OrbbecSDK_ROS2/
|
||||||
|
bash .make_deb.sh
|
||||||
|
```
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
# Configuration of depth NFOV and WFOV modes
|
||||||
|
|
||||||
|
For the Femto Mega and Femto Bolt devices, the NFOV and WFOV modes are implemented by configuring the resolution of
|
||||||
|
Depth and IR in the launch file.
|
||||||
|
In launch file, depth_width, depth_height, ir_width, ir_height represents the resolution of the depth and the resolution of
|
||||||
|
the IR.
|
||||||
|
The frame fps and resolution of IR must be consistent with the depth. The correspondence between different modes and
|
||||||
|
resolutions is as follows:
|
||||||
|
|
||||||
|
- NFOV unbinned: 640 x 576.
|
||||||
|
- NFOV binned: 320 x 288.
|
||||||
|
- WFOV unbinned: 1024 x 1024.
|
||||||
|
- WFOV binned: 512 x 512.
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
# Depth work mode switch
|
||||||
|
|
||||||
|
Orbbec SDK ROS 2 supports the depth work mode switch. The depth work mode switch is supported by Gemini 2, Gemini 2 L,
|
||||||
|
and Femto and Femto Bolt cameras.
|
||||||
|
|
||||||
|
- Before starting the camera, depth work mode (depth_work_mode) can be configured for the corresponding xxx.launch.py
|
||||||
|
file's support.
|
||||||
|
- The depth work mode switch is supported by Gemini 2, Gemini 2 L, and Gemini 2 XL cameras.
|
||||||
|
- The default depth work mode configuration of xxx.launch.py is the camera's default configuration. If you need to
|
||||||
|
modify it, you can switch to the corresponding mode as needed.
|
||||||
|
- The specific camera depth work mode support types can be found in the comments of the depth mode.
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Depth work mode support is as follows:
|
||||||
|
# Unbinned Dense Default
|
||||||
|
# Unbinned Sparse Default
|
||||||
|
# Binned Sparse Default
|
||||||
|
# Obstacle Avoidance
|
||||||
|
DeclareLaunchArgument('depth_work_mode', default_value='')
|
||||||
|
```
|
||||||
|
|
||||||
|
- View depth work modes:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 run orbbec_camera list_depth_work_mode_node
|
||||||
|
```
|
||||||
|
|
||||||
|
* Example:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera gemini2L.launch.py depth_work_mode:="Unbinned Dense Default"
|
||||||
|
```
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
# Disparity_search_offset
|
||||||
|
|
||||||
|
> This section describes how to use the disparity_search_offset function in the Gemini330 series cameras (minimum camera firmware version [1.4.60](https://www.orbbec.com/docs/g330-firmware-release/)).Disparity_search_offset is effective only for1280×720, 1280×800 and 640×400 resolutions of depth stream.
|
||||||
|
|
||||||
|
## Function Introduction
|
||||||
|
|
||||||
|
The definition of disparity search range: For any pixel *(u_l, v)* in the left image, by default, the corresponding disparity search range in the right image is *[ (u_l - 255, v)*, *(u_l, v) ]*, where the disparity search length is 256 and the maximum integer disparity is 255. If the starting point of the search is adjusted to *[ (u_l - 255 - offset, v)*, *(u_l - offset, v) ]*, the offset is defined as the disparity shift. Therefore, our disparity search range configuration includes both the disparity search length and the search position offset (which can also be referred to as the disparity shift).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Parameter Introduction
|
||||||
|
|
||||||
|
The disparity_search_offset related parameters are set in [gemini_330_series.launch.py](../../launch/gemini_330_series.launch.py)
|
||||||
|
|
||||||
|
* `disparity_range_mode` : Disparity search length,can only be set to 64, 128 and 256.
|
||||||
|
|
||||||
|
* `disparity_search_offset` : Disparity search offset value,Disparity search offset value, can be set from 0 to 127.
|
||||||
|
|
||||||
|
* `disparity_offset_config` : Disparity search offset interleave frames.
|
||||||
|
|
||||||
|
* `offset_index0` : Frame 0 disparity search offset value.
|
||||||
|
|
||||||
|
* `offset_index1` : Frame 1 disparity search offset value.
|
||||||
|
|
||||||
|
| disparity range mode | disparity search offset | Minimum depth of inclined wall (mm) |
|
||||||
|
| :------------------: | :---------------------: | :---------------------------------: |
|
||||||
|
| 64 | 85 | Gemini 335L 388-406 |
|
||||||
|
| 64 | 127 | Gemini 335L 302-317 |
|
||||||
|
|
||||||
|
| disparity range mode | disparity search offset | Minimum depth of inclined wall (mm) |
|
||||||
|
| :------------------: | :---------------------: | :---------------------------------------------: |
|
||||||
|
| 128 | 0 | Gemini 335 233-249<br />Gemini 335L 453-475 |
|
||||||
|
| 128 | 45 | Gemini 335 172-184<br />Gemini 335L 334-349 |
|
||||||
|
| 128 | 127 | Gemini 335 117-125<br />Gemini 335L 226-236 |
|
||||||
|
|
||||||
|
| disparity range mode | disparity search offset | Minimum depth of inclined wall (mm) |
|
||||||
|
| :------------------: | :---------------------: | :---------------------------------: |
|
||||||
|
| 256 | 85 | Gemini 335L 169-178 |
|
||||||
|
| 256 | 127 | Gemini 335L 151-158 |
|
||||||
|
|
||||||
|
## Run the launch
|
||||||
|
|
||||||
|
Setting the disparity_search_offset parameter,`colcon build` again and run launch
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera gemini_330_series.launch.py
|
||||||
|
```
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
# Efficient intra-process communication:
|
||||||
|
|
||||||
|
Our ROS2 Wrapper node supports zero-copy communications if loaded in the same process as a subscriber node. This can reduce copy times on image/pointcloud topics, especially with big frame resolutions and high FPS.
|
||||||
|
|
||||||
|
You will need to launch a component container and launch our node as a component together with other component nodes. Further details on "Composing multiple nodes in a single process" can be found [here](https://docs.ros.org/en/rolling/Tutorials/Composition.html).
|
||||||
|
|
||||||
|
Further details on efficient intra-process communication can be found [here](https://docs.ros.org/en/humble/Tutorials/Intra-Process-Communication.html#efficient-intra-process-communication).
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
### Manually loading multiple components into the same process
|
||||||
|
|
||||||
|
* Start the component:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 run rclcpp_components component_container
|
||||||
|
```
|
||||||
|
* Add the wrapper:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 component load /ComponentManager orbbec_camera orbbec_camera::OBCameraNodeDriver -e use_intra_process_comms:=true
|
||||||
|
```
|
||||||
|
|
||||||
|
Load other component nodes (consumers of the wrapper topics) in the same way.
|
||||||
|
|
||||||
|
### Using a launch file
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera gemini_intra_process_demo_launch.py
|
||||||
|
```
|
||||||
|
|
||||||
|
### Limitations
|
||||||
|
|
||||||
|
* Node components are currently not supported on RCLPY
|
||||||
|
* Compressed images using `image_transport` will be disabled as this isn't supported with intra-process communication
|
||||||
@@ -0,0 +1,154 @@
|
|||||||
|
# Fast DDS Optimization for Orbbec Camera with ROS2
|
||||||
|
|
||||||
|
When operating with the default configuration, Fast DDS exhibits suboptimal transmission efficiency, resulting in
|
||||||
|
significant image transmission delays when used with the Orbbec camera in ROS2. This document provides guidance on
|
||||||
|
optimizing Fast DDS to enhance image transfer efficiency.
|
||||||
|
|
||||||
|
## Adjusting System Parameters
|
||||||
|
|
||||||
|
### IP Fragmentation Time
|
||||||
|
|
||||||
|
- **Path**: `/proc/sys/net/ipv4/ipfrag_time` (default: 30 seconds)
|
||||||
|
- **Purpose**: Defines the duration that IP fragments are kept in memory.
|
||||||
|
- **Adjustment**: Decrease this value to reduce the time window where no fragments are received, which can help reduce
|
||||||
|
delays. Consider the specific needs of your environment as this setting affects all incoming fragments.
|
||||||
|
|
||||||
|
**Example**: Set to 3 seconds.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo sysctl net.ipv4.ipfrag_time=3
|
||||||
|
```
|
||||||
|
|
||||||
|
### IP Fragmentation Memory Threshold
|
||||||
|
|
||||||
|
- **Path**: `/proc/sys/net/ipv4/ipfrag_high_thresh` (default: 262144 bytes)
|
||||||
|
- **Purpose**: Sets the maximum memory used to reassemble IP fragments.
|
||||||
|
- **Adjustment**: Increase this value to allow more memory for fragment reassembly, which can improve handling of larger
|
||||||
|
data packets.
|
||||||
|
|
||||||
|
**Example**: Increase to 128 MB.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo sysctl net.ipv4.ipfrag_high_thresh=134217728
|
||||||
|
```
|
||||||
|
|
||||||
|
### Maximum Buffer Sizes
|
||||||
|
|
||||||
|
- **Purpose**: Configures the maximum buffer sizes for receiving and sending data, which is critical for high-throughput
|
||||||
|
data transmission.
|
||||||
|
- **Adjustment**: Set the maximum buffer sizes for both receiving and sending operations.
|
||||||
|
|
||||||
|
**Commands**:
|
||||||
|
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively, make these settings permanent by adding them to the `/etc/sysctl.d/10-fastrtps-max.conf` file.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo gedit /etc/sysctl.d/10-fastrtps-max.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
add blow lines to the file:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
net.core.rmem_max=2147483647
|
||||||
|
net.core.rmem_default=2147483647
|
||||||
|
net.core.wmem_max=2147483647
|
||||||
|
net.core.wmem_default=2147483647
|
||||||
|
```
|
||||||
|
|
||||||
|
then save and exit the file. run `sudo sysctl -p` to apply the changes.
|
||||||
|
|
||||||
|
For detailed guidance, refer
|
||||||
|
to [ROS 2 DDS Tuning Documentation](https://docs.ros.org/en/foxy/How-To-Guides/DDS-tuning.html).
|
||||||
|
|
||||||
|
## Fast DDS Configuration
|
||||||
|
|
||||||
|
Below is an example of a Fast DDS configuration file optimized for ROS2 usage with the Orbbec camera. This configuration
|
||||||
|
enhances the overall data transmission by adjusting buffer sizes and transport settings.
|
||||||
|
|
||||||
|
### Configuration File: `shm_fastdds.xml`
|
||||||
|
|
||||||
|
Place this file in the `$HOME` directory.
|
||||||
|
|
||||||
|
```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>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Environment Variables
|
||||||
|
|
||||||
|
Set the following environment variables to use the custom Fast DDS profile:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
|
||||||
|
export FASTRTPS_DEFAULT_PROFILES_FILE=$HOME/shm_fastdds.xml
|
||||||
|
export RMW_FASTRTPS_USE_QOS_FROM_XML=1
|
||||||
|
```
|
||||||
|
|
||||||
|
This configuration aims to optimize the data flow and reduce transmission delays, improving the responsiveness and
|
||||||
|
reliability of the Orbbec camera system in a ROS2 environment.
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
# GMSL_camera
|
||||||
|
|
||||||
|
> This section describes how to use GMSL camera in OrbbecSDK_ROS2.Currently, only Gemini 335Lg GMSL devices are supported, and other GMSL devices will be supported in the near future.
|
||||||
|
|
||||||
|
## Single GMSL camera
|
||||||
|
|
||||||
|
The usage of GMSL camera in OrbbecSDK_ROS2 is the same as that of Gemini 330 series camera via USB.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera gemini_330_gmsl.launch.py
|
||||||
|
```
|
||||||
|
|
||||||
|
## Multi GMSL camera
|
||||||
|
|
||||||
|
To get the `usb_port` of the GMSL camera, plug in the camera and run the following command in the terminal:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 run orbbec_camera list_devices_node
|
||||||
|
```
|
||||||
|
|
||||||
|
For example, the obtained gmsl camera `usb_port`: `gmsl2-1`
|
||||||
|
|
||||||
|
Go to the [multi_gmsl_camera.launch.py](./multi_gmsl_camera.launch.py) file and change the `usb_port`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera multi_gmsl_camera.launch.py
|
||||||
|
```
|
||||||
|
|
||||||
|
> Note: By default, multi_gmsl_camera.launch.py only starts color and left_ir. If you want to start other sensors, please go to [camera_secondary_params.yaml](../../config/camera_secondary_params.yaml) to modify them.
|
||||||
|
|
||||||
|
## Multi GMSL camera synced
|
||||||
|
|
||||||
|
First, please see how to use [multi_camera_synced](../multi_camera_synced/README.MD).
|
||||||
|
|
||||||
|
In addition, GMSL multi-camera synced does not require Multi-Camera Sync Hub Pro, so there is no need to set the `primary` mode. Each GMSL camera is `secondary`.
|
||||||
|
|
||||||
|
### Additional Parameter Settings
|
||||||
|
|
||||||
|
* `gmsl_trigger_fps` : set hardware soc trigger source frame rate.
|
||||||
|
* `enable_gmsl_trigger` : enable hardware soc trigger.
|
||||||
|
|
||||||
|
### Run the launch
|
||||||
|
|
||||||
|
Please refer to the configuration in [multi_gmsl_camera_synced.launch.py.](multi_gmsl_camera_synced.launch.py)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera multi_gmsl_camera_synced.launch.py
|
||||||
|
```
|
||||||
|
|
||||||
|
> Note: By default, multi_gmsl_camera_synced.launch.py only starts color and left_ir. If you want to start other sensors, please go to [camera_secondary_params.yaml](../../config/camera_secondary_params.yaml) and [camera_params.yaml](../../config/camera_params.yaml) to modify them.
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
# Using interleave_ae with Gemini330 series cameras
|
||||||
|
|
||||||
|
> This section describes how to use interleave_ae in Gemini 330 series cameras (minimum camera firmware version [1.4.00](https://www.orbbec.com/docs/g330-firmware-release/))
|
||||||
|
|
||||||
|
## Parameter Introduction
|
||||||
|
|
||||||
|
The interleave_ae related parameters are set in [gemini_330_series.launch.py](../../launch/gemini_330_series.launch.py)
|
||||||
|
|
||||||
|
* `interleave_ae_mode` : Set laser or hdr interleave.
|
||||||
|
|
||||||
|
* `interleave_frame_enable` : enable interleave frame mode.
|
||||||
|
|
||||||
|
* `interleave_skip_enable` : enable skip frame mode.
|
||||||
|
|
||||||
|
* `interleave_skip_index` : Set 0 for skip pattern ir, set 1 for skip flood ir.
|
||||||
|
|
||||||
|
### interleave hdr
|
||||||
|
|
||||||
|
When the `interleave_ae_mode` parameter is set to `hdr` and `interleave_frame_enable `is set to `true`, interleave hdr will be enabled
|
||||||
|
|
||||||
|
* `hdr_index1_laser_control` : Frame 1 laser switch settings.
|
||||||
|
|
||||||
|
* `hdr_index1_depth_exposure` : Frame 1 depth exposure value setting, not in AE mode.
|
||||||
|
|
||||||
|
* `hdr_index1_depth_gain` : Frame 1 depth gain value setting, not in AE mode.
|
||||||
|
|
||||||
|
* `hdr_index1_ir_brightness` : Frame 1 ir gain value setting.
|
||||||
|
|
||||||
|
* `hdr_index1_ir_ae_max_exposure` : Frame 1 ir maximum exposure value setting in AE (auto exposure).
|
||||||
|
|
||||||
|
* `hdr_index0_laser_control`: Frame 0 laser switch settings.
|
||||||
|
|
||||||
|
* `hdr_index0_depth_exposure`: Frame 0 depth exposure value setting, not in AE mode.
|
||||||
|
|
||||||
|
* `hdr_index0_depth_gain` : Frame 0 depth gain value setting, not in AE mode.
|
||||||
|
|
||||||
|
* `hdr_index0_ir_brightness` : Frame 0 ir gain value setting.
|
||||||
|
|
||||||
|
* `hdr_index0_ir_ae_max_exposure` : Frame 0 ir maximum exposure value setting in AE (auto exposure).
|
||||||
|
|
||||||
|
### interleave laser
|
||||||
|
|
||||||
|
When the `interleave_ae_mode` parameter is set to `laser` and `interleave_frame_enable `is set to `true`, interleave laser will be enabled
|
||||||
|
|
||||||
|
* `laser_index1_laser_control` : Frame 1 laser switch settings.
|
||||||
|
|
||||||
|
* `laser_index1_depth_exposure` : Frame 1 depth exposure value setting, not in AE mode.
|
||||||
|
|
||||||
|
* `laser_index1_depth_gain` : Frame 1 depth gain value setting, not in AE mode.
|
||||||
|
|
||||||
|
* `laser_index1_ir_brightness` : Frame 1 ir gain value setting.
|
||||||
|
|
||||||
|
* `laser_index1_ir_ae_max_exposure` : Frame 1 ir maximum exposure value setting in AE (auto exposure).
|
||||||
|
|
||||||
|
* `laser_index0_laser_control` : Frame 0 laser switch settings.
|
||||||
|
|
||||||
|
* `laser_index0_depth_exposure` : Frame 0 depth exposure value setting, not in AE mode.
|
||||||
|
|
||||||
|
* `laser_index0_depth_gain` : Frame 0 depth gain value setting, not in AE mode.
|
||||||
|
|
||||||
|
* `laser_index0_ir_brightness` : Frame 0 ir gain value setting.
|
||||||
|
|
||||||
|
* `laser_index0_ir_ae_max_exposure` : Frame 0 ir maximum exposure value setting in AE (auto exposure).
|
||||||
|
|
||||||
|
## Run the launch
|
||||||
|
|
||||||
|
Setting the interleave_ae parameter,`colcon build` again and run launch
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera gemini_330_series.launch.py
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Example Visualization
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Multi_camera_synced + Interleave_ae
|
||||||
|
|
||||||
|
Please refer to [multi_camera_synced](../multi_camera_synced/README.MD) and [Parameter Introduction](#parameter-introduction)
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
## Reducing CPU Usage with Orbbec ROS Package
|
||||||
|
|
||||||
|
This document outlines strategies for minimizing CPU usage in the **OrbbecSDK_ROS2 v2** environment when using **Gemini 330 series cameras**. The firmware version must be **no lower than 1.4.10**, and `device` should be set to **Default**.
|
||||||
|
|
||||||
|
### Recommended Settings for Lower CPU Usage
|
||||||
|
|
||||||
|
To achieve the lowest possible CPU usage in OrbbecSDK_ROS2, it is recommended to configure the following parameters.
|
||||||
|
|
||||||
|
| Parameter | Recommendation | Note |
|
||||||
|
| :--------------: | :------------------------------------: | :--------------------------------------------: |
|
||||||
|
| `uvc_backend` | `v4l2` | Lower CPU usage compared to `libuvc` |
|
||||||
|
| `color_format` | `RGB` | Lower CPU usage than `MJPG` |
|
||||||
|
| `filter` | Only `hardware_noise_removal_filter` | Other filters significantly increase CPU usage |
|
||||||
|
|
||||||
|
### Launch Files Used for Testing
|
||||||
|
|
||||||
|
* `gemini_330_series_lower_cpu_usage.launch.py`
|
||||||
|
* `multi_camera_lower_cpu_usage.launch.py`
|
||||||
|
|
||||||
|
### Test environment
|
||||||
|
|
||||||
|
#### Hardware Configuration
|
||||||
|
|
||||||
|
* **CPU**: Intel i7-8700 @ 3.20GHz
|
||||||
|
* **Memory**: 24 GB
|
||||||
|
* **Storage**: Micron 2200S NVMe 256GB
|
||||||
|
* **GPU**: NVIDIA GeForce GTX 1660Ti
|
||||||
|
* **OS**: Ubuntu22.04
|
||||||
|
|
||||||
|
#### ROS Configuration
|
||||||
|
|
||||||
|
* **ROS Version**: ROS2 Humble
|
||||||
|
* **SDK Version**: OrbbecSDK_ROS2 v2.2.1
|
||||||
|
|
||||||
|
#### Camera Setup
|
||||||
|
|
||||||
|
* Devices: 2x Gemini 335, 1x Gemini 336, 1x Gemini 336L
|
||||||
|
* Firmware Version: 1.4.10
|
||||||
|
|
||||||
|
### Test Setup
|
||||||
|
|
||||||
|
* **Stream Settings:**
|
||||||
|
* Depth / IR Left / IR Right: 848×480 @ 30fps
|
||||||
|
* Color: 848×480 @ 30fps
|
||||||
|
|
||||||
|
Note: The following CPU usage data focuses on `uvc_backend`, `color_format` and various filter combinations.
|
||||||
|
|
||||||
|
### Test Results
|
||||||
|
|
||||||
|
#### `uvc_backend` Comparison (RGB format)
|
||||||
|
|
||||||
|
| libuvc CPU Usage | v4l2 CPU Usage | Absolute Change |
|
||||||
|
| :--------------: | :------------: | :-------------: |
|
||||||
|
| 182.8% | 118.8% | -64.0% |
|
||||||
|
|
||||||
|
The CPU usage can be significantly reduced with v4l2 backend. In our implementation, v4l2 works without requiring any patches to the Linux kernel, allowing users to easily switch between v4l2 and libuvc and maintaining full compatibility with standard Linux distributions.
|
||||||
|
|
||||||
|
#### `color_format` Comparison (MJPG vs RGB)
|
||||||
|
|
||||||
|
| Backend | MJPG CPU Usage | RGB CPU Usage | Absolute Change |
|
||||||
|
| :-----: | :------------: | :-----------: | :-------------: |
|
||||||
|
| libuvc | 347.7% | 182.8% | -164.9% |
|
||||||
|
| v4l2 | 170.0% | 118.8% | -51.2% |
|
||||||
|
|
||||||
|
The CPU usage can be reduced if the RGB format is selected instead of MJPG, since the decoding of MJPG image will consume the host CPU resource.
|
||||||
|
|
||||||
|
#### Filter Configuration Impact
|
||||||
|
|
||||||
|
| Filters Applied | libuvc CPU Usage | CPU Usage Increase | v4l2 CPU Usage | CPU Usage Increase |
|
||||||
|
| ----------------------------------------------------- | ---------------- | ------------------ | -------------- | ------------------ |
|
||||||
|
| No Filter (benchmark) | 182.8% | 0.0%(benchmark) | 118.8% | 0.0%(benchmark) |
|
||||||
|
| `(software)noise_removal_filter` | 218.0% | +35.2% | 128.5% | +9.7% |
|
||||||
|
| `(software)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% |
|
||||||
|
|
||||||
|
Based on the test results, using only the `hardware_noise_removal_filter` results in a negligible change in CPU usage for both `libuvc` (+3.5%) and `v4l2` (-3.4%) compared to the no-filter benchmark, as this filter runs internally on the camera hardware. In contrast, other filters execute on the host system. Adding the `spatial_filter` to the hardware filter leads to a moderate increase in CPU usage, while applying the software-based `noise_removal_filter` —either alone or combined with `spatial_filter` —significantly increases CPU load. To maintain low CPU usage, it is recommended to avoid software-based filters and rely solely on the `hardware_noise_removal_filter`.
|
||||||
|
|
||||||
|
### Further Optimizationa
|
||||||
|
|
||||||
|
| Parameter | Recommendation | Note |
|
||||||
|
| :----------------------------: | :----------------------------------------------: | :---------------------------------------------: |
|
||||||
|
| `depth_registration` | `false` or `true` with `align_mode=HW` | Software alignment consumes more CPU |
|
||||||
|
| `enable_point_cloud` | `false` | Disabling point cloud reduces CPU usage |
|
||||||
|
| `enable_colored_point_cloud` | `false` | Disabling colored point cloud reduces CPU usage |
|
||||||
|
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
# Multi-Camera
|
||||||
|
|
||||||
|
- To get the `usb_port` of the camera, plug in the camera and run the following command in the terminal:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 run orbbec_camera list_devices_node
|
||||||
|
```
|
||||||
|
|
||||||
|
- Set the `device_num` parameter to the number of cameras you have.
|
||||||
|
- Go to the `OrbbecSDK_ROS2/launch/multi_xxx.launch.py` file and change the `usb_port`.
|
||||||
|
- Don't forget to put the `include` tag inside the `group` tag.
|
||||||
|
Otherwise, the parameter values of different cameras may become contaminated.
|
||||||
|
|
||||||
|
```python
|
||||||
|
from launch import LaunchDescription
|
||||||
|
from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription, GroupAction, ExecuteProcess
|
||||||
|
from launch.launch_description_sources import PythonLaunchDescriptionSource
|
||||||
|
from launch_ros.actions import Node
|
||||||
|
from ament_index_python.packages import get_package_share_directory
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def generate_launch_description():
|
||||||
|
# Include launch files
|
||||||
|
package_dir = get_package_share_directory('orbbec_camera')
|
||||||
|
launch_file_dir = os.path.join(package_dir, 'launch')
|
||||||
|
launch1_include = IncludeLaunchDescription(
|
||||||
|
PythonLaunchDescriptionSource(
|
||||||
|
os.path.join(launch_file_dir, 'gemini2L.launch.py')
|
||||||
|
),
|
||||||
|
launch_arguments={
|
||||||
|
'camera_name': 'camera_01',
|
||||||
|
'usb_port': '6-2.4.4.2', # replace your usb port here
|
||||||
|
'device_num': '2'
|
||||||
|
}.items()
|
||||||
|
)
|
||||||
|
|
||||||
|
launch2_include = IncludeLaunchDescription(
|
||||||
|
PythonLaunchDescriptionSource(
|
||||||
|
os.path.join(launch_file_dir, 'gemini2L.launch.py')
|
||||||
|
),
|
||||||
|
launch_arguments={
|
||||||
|
'camera_name': 'camera_02',
|
||||||
|
'usb_port': '6-2.4.1', # replace your usb port here
|
||||||
|
'device_num': '2'
|
||||||
|
}.items()
|
||||||
|
)
|
||||||
|
|
||||||
|
# If you need more cameras, just add more launch_include here, and change the usb_port and device_num
|
||||||
|
|
||||||
|
# Launch description
|
||||||
|
ld = LaunchDescription([
|
||||||
|
GroupAction([launch1_include]),
|
||||||
|
GroupAction([launch2_include]),
|
||||||
|
])
|
||||||
|
|
||||||
|
return ld
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
- To launch the cameras, run the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera multi_camera.launch.py
|
||||||
|
```
|
||||||
|
|
||||||
|
## No Data Stream from Multiple Cameras
|
||||||
|
|
||||||
|
**Insufficient Power Supply**:
|
||||||
|
|
||||||
|
- Ensure that each camera is connected to a separate hub.
|
||||||
|
- Use a powered hub to provide sufficient power to each camera.
|
||||||
|
|
||||||
|
**High Resolution**:
|
||||||
|
|
||||||
|
- Try lowering the resolution to resolve data stream issues.
|
||||||
|
|
||||||
|
**Increase usbfs_memory_mb Value**:
|
||||||
|
|
||||||
|
- Increase the `usbfs_memory_mb` value to 128MB (this is a reference value and can be adjusted based on your system’s needs)
|
||||||
|
by running the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
echo 128 | sudo tee /sys/module/usbcore/parameters/usbfs_memory_mb
|
||||||
|
```
|
||||||
|
|
||||||
|
- To make this change permanent, check [this link](https://github.com/OpenKinect/libfreenect2/issues/807).
|
||||||
|
|
||||||
|
## Image topic frame rate too low from Multiple Cameras
|
||||||
|
|
||||||
|
Refer to the [Fast DDS Configuration](./docs/fastdds_tuning.md) file.
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
# Multi_camera synced Instructions
|
||||||
|
|
||||||
|
> The purpose of this document is to explain how to use multi-camera synced with OrbbecSDK_ROS2
|
||||||
|
|
||||||
|
## Setup instructions
|
||||||
|
|
||||||
|
* Please read the Multi-Camera Synchronization Setup Guide:[Multi-Camera Synchronization Setup](https://www.orbbec.com/docs/set-up-cameras-for-external-synchronization_v1-2/)
|
||||||
|
* Make sure the camera is correctly connected to the multi-camera synchronizer.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Checking camera port with OrbbecSDK_ROS2
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 run orbbec_camera list_devices_node
|
||||||
|
```
|
||||||
|
|
||||||
|
### OrbbecSDK_ROS2 multi-camera synced configuration
|
||||||
|
|
||||||
|
Open multi_camera_synced.launch.py, and configure the camera settings as shown below:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
1. `gemini_330_series.launch.py` is the launch file for starting the camera.
|
||||||
|
|
||||||
|
2. Set `camera_name` to `G330_0`. For example, the published color image topic will be `/G330_0/color/image_raw`.
|
||||||
|
|
||||||
|
3. Set `usb_port` to `2-2`, indicating that the camera device on port `2-2` is being used. This value can be found in the output of the `ros2 run orbbec_camera list_devices_node` command.
|
||||||
|
|
||||||
|
4. Set `device_num` to `2`, meaning two cameras will be used.
|
||||||
|
|
||||||
|
5. Set `sync_mode` to `primary` to indicate that the `2-7` camera device is in primary mode. The multi-camera sync mode options can be found in the figure below.
|
||||||
|
|
||||||
|
6. Parameters from the `config_file_path` can override the parameters set in `gemini_330_series.launch.py` (optional).
|
||||||
|
|
||||||
|
7. For slave cameras, set `trigger_out_enabled` to false.
|
||||||
|
|
||||||
|
| **Pattern Nam**e | **Setting effect description** |
|
||||||
|
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
|
| free_run | -Support different frame rate settings<br />The -8-pin synchronization interface does not support external output of synchronization-related signals |
|
||||||
|
| standalone(default) | ● Same as Primary by default<br />● Built-in RGBD frame synchronization<br />● 8-pin synchronous interface does not output signals to the outside by default |
|
||||||
|
| primary | ● Set as primary camera<br />● 8-pin synchronous interface output signal to external device |
|
||||||
|
| secondary | ● Set as secondary (passive synchronization; When there is a hardware continuous trigger signal input from the outside and the continuous trigger signal matches the currently set frame rate, the image is collected according to the external trigger signal; When there is no external trigger signal, the flow is stopped)<br />● 8-pin synchronous interface output signal to external device |
|
||||||
|
| secondary_synced | ● Set to secondary synchronization (passive synchronization; When there is a hardware continuous trigger signal input from the outside and the continuous trigger signal matches the currently set frame rate, the image is collected according to the external trigger signal; When there is no external trigger signal, the image is collected according to the internal trigger signal at the set frame rate)<br />● 8-pin synchronous interface output signal to external device |
|
||||||
|
| hardware_triggering | ● Set as hardware trigger (passive trigger; When there is a hardware trigger signal input from the outside and the trigger signal time interval is not less than the current upper limit, the image is collected according to the external trigger signal; When there is no external trigger signal, the image is not collected)<br />● 8-pin synchronous interface output signal to external device |
|
||||||
|
| software_triggering | ● Set as software trigger (passive trigger; When there is a trigger command input from the host computer and the trigger command time interval is not less than the current upper limit, the image is collected according to the trigger command; When there is no trigger command, the image is not collected)<br />● 8-pin synchronous interface output signal to external device |
|
||||||
|
|
||||||
|
* The master camera should be launched last.
|
||||||
|
* Ideally, there should be a 2-second delay between starting each camera.
|
||||||
|
|
||||||
|
### Run the following command to start the multi-camera synced
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera multi_camera_synced.launch.py
|
||||||
|
```
|
||||||
@@ -0,0 +1,159 @@
|
|||||||
|
# Multi_camera_synced_verification_tool
|
||||||
|
|
||||||
|
> This article will introduce how to verify the synchronization accuracy of multi-camera synchronization.
|
||||||
|
>
|
||||||
|
> First, please see how to use [multi_camera_synced](../multi_camera_synced/README.MD).
|
||||||
|
|
||||||
|
## Directory Structure
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
.
|
||||||
|
├── multicamera_sync/
|
||||||
|
│ ├── output/
|
||||||
|
│ ├──20250218102900/
|
||||||
|
│ ├──DevicesInfo.txt
|
||||||
|
│ ├──StreamProfileInfo.txt
|
||||||
|
│ ├── Python/
|
||||||
|
│ ├──Config.ini
|
||||||
|
├── gemini_330_series_synced_verify.launch.py
|
||||||
|
├── multi_camera_synced_verify.launch.py
|
||||||
|
```
|
||||||
|
|
||||||
|
### multicamera_sync
|
||||||
|
|
||||||
|
* `gemini_330_series_synced_verify.launch.py` : Single camera runs launch, which provides the camera running node for multi_camera_synced_verify.launch.py.
|
||||||
|
* `multi_camera_synced_verify.launch.py` : Multi camer synced + launch of save_rgbir tool.
|
||||||
|
|
||||||
|
#### output
|
||||||
|
|
||||||
|
> The `ouput` folder is the folder where the camera pictures are output
|
||||||
|
|
||||||
|
In the output example provided
|
||||||
|
|
||||||
|
* `20250218102900` : Represents the camera image information collected at 10:29:00 on February 18, 2025.
|
||||||
|
* `TotalModeFrames` : Camera image information storage directory.
|
||||||
|
* `results-2025-02-25_163648` : The result after analyzing and matching the image information of TotalModeFrames.
|
||||||
|
* `DevicesInfo.txt` : Camera equipment basic information (need to be modified).
|
||||||
|
* `StreamProfileInfo.txt` : Camera video stream information (no need to modify).
|
||||||
|
|
||||||
|
#### Python
|
||||||
|
|
||||||
|
* `Config.ini` : Configuration file for Python analysis script (need to be modified).
|
||||||
|
|
||||||
|
## Preparation for operation
|
||||||
|
|
||||||
|
### save_rgbir node
|
||||||
|
|
||||||
|
Edit multi_camera_synced_verify.launch.py and fill in the activated camera device,we can find that save_rgbir is started at the end.
|
||||||
|
|
||||||
|
> IMPORTANT
|
||||||
|
>
|
||||||
|
> If you are using ROS 2 Foxy, you need to launch the save_rgbir node first.
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Launch description
|
||||||
|
ld = LaunchDescription(
|
||||||
|
[
|
||||||
|
shared_orbbec_container,
|
||||||
|
TimerAction(period=0.0, actions=[GroupAction([launch2_include])]),
|
||||||
|
TimerAction(period=2.0, actions=[GroupAction([launch1_include])]),
|
||||||
|
# The primary camera should be launched at last
|
||||||
|
TimerAction(period=6.0, actions=[GroupAction([save_rgbir])]),
|
||||||
|
# save_rgbir is synced verification tool
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
return ld
|
||||||
|
```
|
||||||
|
|
||||||
|
save_rgbir is a tool for saving images. The configuration file of this tool is in [multi_save_rgbir_params.json](../../config/tools/multisavergbir/multi_save_rgbir_params.json).
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"save_rgbir_params": {
|
||||||
|
"time_domain": "global",
|
||||||
|
"usb_ports": [
|
||||||
|
"2-1",
|
||||||
|
"2-3"
|
||||||
|
],
|
||||||
|
"camera_name": [
|
||||||
|
"camera_01",
|
||||||
|
"camera_02"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
* `time_domain` : Timestamp Type
|
||||||
|
* `usb_ports` : "primary", "secondary 1", "secondary 2", "secondary 3", fill in as many usb_ports as there are cameras
|
||||||
|
* `camera_name` : The name of the camera setting, for example: camera_01
|
||||||
|
|
||||||
|
### DevicesInfo.txt
|
||||||
|
|
||||||
|
Edit DevicesInfo.txt. Only the `primarySerialNumber`, `index` and `serialNumber` parameters need to be changed. Other parameters do not need to be changed.Refer to the example of [20250218102900](./multicamera_sync/output/20250218102900).
|
||||||
|
|
||||||
|
* `primarySerialNumber` : The SN serial number of the primary camera
|
||||||
|
* `index` : Camera index
|
||||||
|
* `serialNumber` : The SN serial number of the camera
|
||||||
|
|
||||||
|
### Config.ini
|
||||||
|
|
||||||
|
Edit Config.ini.Modify `frameRate` and `tspRangeThreshold`.
|
||||||
|
|
||||||
|
## Run this example
|
||||||
|
|
||||||
|
### Run launch and save camera pictures
|
||||||
|
|
||||||
|
* First terminal
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera multi_camera_synced_verify.launch.py
|
||||||
|
```
|
||||||
|
|
||||||
|
* Second terminal
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 service call /save_rgbir/start_capture orbbec_camera_msgs/srv/SetInt32 '{data: 100}'
|
||||||
|
```
|
||||||
|
|
||||||
|
When the terminal displays "over", the image is saved.A new multicamera_sync folder will be generated under the workspace.
|
||||||
|
|
||||||
|
### Camera pictures naming format
|
||||||
|
|
||||||
|
Take [color_SNCP1E5420006D_Index0_g1739874543227_f0_s1739874543327_e50_d16_.jpg](./multicamera_sync/output/20250218102900/TotalModeFrames/SNCP1E5420006D_Index0/color_SNCP1E5420006D_Index0_g1739874543227_f0_s1739874543327_e50_d16_.jpg) as an example
|
||||||
|
|
||||||
|
* `color` : This image is a snapshot of the color stream.
|
||||||
|
* `SNCP1E5420006D` : The camera's SN serial number is CP1E5420006D.
|
||||||
|
* `Index0` : Camera 0 (usually referred to primary camera).
|
||||||
|
* `g1739874543227` : “g” represents the global timestamp, which means the global timestamp of this frame is 1739874543227.
|
||||||
|
* `f0` : The 0th picture of the color stream acquisition of this camera.
|
||||||
|
* `s1739874543327` : "s" represents the timestamp of the current system, which means the current system timestamp of this frame is 1739874543327.
|
||||||
|
* `e50` : The exposure of this frame is 50.
|
||||||
|
* `d16` : The gain of this frame is 16.
|
||||||
|
|
||||||
|
### Analyzing camera image data
|
||||||
|
|
||||||
|
You need to copy the modified [Python folder](./multicamera_sync/Python) to the new multi_camera_synced subdirectory, and copy the modified [DevicesInfo.txt ](./multicamera_sync/output/20250218102900/DevicesInfo.txt)and [StreamProfileInfo.txt](./multicamera_sync/output/20250218102900/StreamProfileInfo.txt) to the same level directory as the TotalModeFrames folder.
|
||||||
|
|
||||||
|
* Finally everything is ready, run the python script
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd multicamera_sync/Python
|
||||||
|
python3 SyncFramesMain.py
|
||||||
|
```
|
||||||
|
|
||||||
|
After the operation is successful, you can view the synchronization effect in the `results folder`
|
||||||
|
|
||||||
|
## Files that need to be changed
|
||||||
|
|
||||||
|
### Analysis tools
|
||||||
|
|
||||||
|
* [multi_save_rgbir_params.json](../../config/tools/multisavergbir/multi_save_rgbir_params.json)
|
||||||
|
* [DevicesInfo.txt ](./multicamera_sync/output/20250218102900/DevicesInfo.txt)
|
||||||
|
* [Config.ini](./multicamera_sync/Python/Config.ini)
|
||||||
|
|
||||||
|
### Camera Configuration
|
||||||
|
|
||||||
|
[camera_params.yaml](../../config/camera_params.yaml)(Camera startup parameter settings)
|
||||||
|
|
||||||
|
[multi_camera_synced_verify.launch.py](./multi_camera_synced_verify.launch.py)
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
# Net_camera
|
||||||
|
|
||||||
|
> This section describes how to use Net camera in OrbbecSDK_ROS2.Currently, only Femto_Mega, Gemini 335Le and Gemini 435Le devices are supported, and other Net devices will be supported in the near future.
|
||||||
|
|
||||||
|
## Femto Mega & Gemini 435Le
|
||||||
|
|
||||||
|
### Parameter Introduction
|
||||||
|
|
||||||
|
Network device settings: `enumerate_net_device` is set to true, which will automatically enumerate network devices.
|
||||||
|
|
||||||
|
If you do not want to automatically enumerate network devices,you can set `enumerate_net_device` to false, `net_device_ip` to the device's IP address, and `net_device_port` to the default value of 8090.
|
||||||
|
|
||||||
|
* `enumerate_net_device` : Enable automatically enumerate network devices.
|
||||||
|
* `net_device_ip` : Setting net device's IP address.
|
||||||
|
* `net_device_port` : Setting net device's port.Usually, you can set it to 8090.
|
||||||
|
|
||||||
|
### Single Net camera
|
||||||
|
|
||||||
|
> If you need to run Gemini 435Le, you only need to replace [femto_mega.launch.py ](../../launch/femto_mega.launch.py)in the run command with [gemini435_le.launch.py](../../launch/gemini435_le.launch.py)
|
||||||
|
|
||||||
|
For [femto_mega.launch.py](../../launch/femto_mega.launch.py) as an example:
|
||||||
|
|
||||||
|
#### automatically enumerate network devices:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera femto_mega.launch.py enumerate_net_device:=true
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Specify IP address to start the device:
|
||||||
|
|
||||||
|
Note: `net_device_ip` needs to be changed to the IP address of the device, here it is 192.168.1.10
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera femto_mega.launch.py enumerate_net_device:=false net_device_ip:=192.168.1.10 net_device_port:=8090
|
||||||
|
```
|
||||||
|
|
||||||
|
## Gemini 335Le
|
||||||
|
|
||||||
|
Network device settings: `enumerate_net_device` must be set to true, set `net_device_ip` to the IP address of the device, and set `net_device_port` to the default value of 8090.
|
||||||
|
|
||||||
|
* `enumerate_net_device` : Enable automatically enumerate network devices.
|
||||||
|
* `net_device_ip` : Setting net device's IP address.
|
||||||
|
* `net_device_port` : Setting net device's port.Usually, you can set it to 8090.
|
||||||
|
|
||||||
|
### Single Net camera
|
||||||
|
|
||||||
|
For [gemini_330_series.launch.py](../../launch/gemini_330_series.launch.py) as an example:
|
||||||
|
|
||||||
|
- **automatically enumerate network devices:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera gemini_330_series.launch.py enumerate_net_device:=true
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Specify IP address to start the device:**
|
||||||
|
|
||||||
|
Note: `net_device_ip` needs to be changed to the IP address of the device, here it is 192.168.1.10
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera gemini_330_series.launch.py enumerate_net_device:=true net_device_ip:=192.168.1.10 net_device_port:=8090
|
||||||
|
```
|
||||||
|
|
||||||
|
## Multi Net camera
|
||||||
|
|
||||||
|
For [multi_net_camera.launch.py](./multi_net_camera.launch.py) as an example:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera multi_net_camera.launch.py
|
||||||
|
```
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
## Enabling and Visualizing Point Cloud in ROS 2
|
||||||
|
|
||||||
|
This section demonstrates how to enable point cloud data output from the camera node and visualize it using RViz2, similarly to the initial camera node setup discussed in the [Starting Camera Node](../start_camera_node/start_camera_node.MD) document.
|
||||||
|
|
||||||
|
### Enabling Depth Point Cloud
|
||||||
|
|
||||||
|
#### Command to Enable Depth Point Cloud
|
||||||
|
|
||||||
|
To activate the point cloud data stream for depth information, use the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera gemini_330_series.launch.py enable_point_cloud:=true
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Visualizing Depth Point Cloud in RViz2
|
||||||
|
|
||||||
|
After running the above command, perform the following steps to visualize the depth point cloud:
|
||||||
|
|
||||||
|
1. Open RViz2.
|
||||||
|
2. Add a `PointCloud2` display.
|
||||||
|
3. Select the `/camera/depth/points` topic for visualization.
|
||||||
|
4. Set the fixed frame to `camera_link` to properly align the data.
|
||||||
|
|
||||||
|
- **Example Visualization**
|
||||||
|
|
||||||
|
Here is what the depth point cloud might look like in RViz2:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Enabling Colored Point Cloud
|
||||||
|
|
||||||
|
#### Command to Enable Colored Point Cloud
|
||||||
|
|
||||||
|
To enable the colored point cloud feature, enter the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ros2 launch orbbec_camera gemini_330_series.launch.py enable_colored_point_cloud:=true
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Visualizing Colored Point Cloud in RViz2
|
||||||
|
|
||||||
|
To visualize the colored point cloud data:
|
||||||
|
|
||||||
|
1. Launch RViz2 following the command execution.
|
||||||
|
2. Add a `PointCloud2` display panel.
|
||||||
|
3. Choose the `/camera/depth_registered/points` topic from the list.
|
||||||
|
4. Ensure the fixed frame is set to `camera_link`.
|
||||||
|
|
||||||
|
- **Example Visualization**
|
||||||
|
|
||||||
|
The result of the colored point cloud in RViz2 should look similar to this:
|
||||||
|
|
||||||
|

|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
# Predefined presets
|
||||||
|
|
||||||
|
| Preset | Features | Recommended use cases |
|
||||||
|
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||||
|
| Default | - Best visual perception``- Overall good performance in accuracy, fill rate, tiny objects, etc. | - Generic `<br>`- Robotics |
|
||||||
|
| Hand | - Clear hand and finger edges | - Gesture recognition |
|
||||||
|
| High Accuracy | - Depth of high confidence `<br>`- Barely noise depth values `<br>`- Lower fill rate | - Collision avoidance `<br>`- Object scanning |
|
||||||
|
| High Density | - Higher fill rate `<br>`- More tiny objects `<br>`- May suffer from noise depth values | - Object recognition `<br>`- Pick & place `<br>`- Foreground & background animation |
|
||||||
|
| Medium Density | - Balanced performance in fill rate and accuracy `<br>`- In comparison to Default: lower fill rate, better edge quality | - Generic and alternative to Default |
|
||||||
|
| Custom | - User defined Preset `<br>`- Derived from Presets above, with customized modifications, e.g. a new configuration for the post-processing pipeline, modified mean intensity set point of depth AE function, etc. | - Better depth performance achieved using customized configurations in comparison to using predefined presets `<br>`- For well-established custom configurations |
|
||||||
|
|
||||||
|
Choose the appropriate preset name based on your specific use case and set it as the value for the `device_preset`
|
||||||
|
parameter.
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
# Frequently Asked Questions
|
||||||
|
|
||||||
|
### Unexpected Crash
|
||||||
|
|
||||||
|
If the camera node crashes unexpectedly, it will generate a crash log in the current running directory: `Log/camera_crash_stack_trace_xx.log`. Please send this log to the support team or submit it to a GitHub issue for further assistance.
|
||||||
|
|
||||||
|
### No Data Stream from Multiple Cameras
|
||||||
|
|
||||||
|
**Insufficient Power Supply**:
|
||||||
|
|
||||||
|
- Ensure that each camera is connected to a separate hub.
|
||||||
|
- Use a powered hub to provide sufficient power to each camera.
|
||||||
|
|
||||||
|
**High Resolution**:
|
||||||
|
|
||||||
|
- Try lowering the resolution to resolve data stream issues.
|
||||||
|
|
||||||
|
**Increase usbfs_memory_mb Value**:
|
||||||
|
|
||||||
|
- Increase the `usbfs_memory_mb` value to 128MB (this is a reference value and can be adjusted based on your system’s needs) by running the following command:
|
||||||
|
|
||||||
|
```
|
||||||
|
echo 128 | sudo tee /sys/module/usbcore/parameters/usbfs_memory_mb
|
||||||
|
```
|
||||||
|
|
||||||
|
- To make this change permanent, check [this link](https://github.com/OpenKinect/libfreenect2/issues/807).
|
||||||
|
|
||||||
|
### Additional Troubleshooting
|
||||||
|
|
||||||
|
- If you encounter other issues, set the `log_level` parameter to `debug`. This will generate an SDK log file in the running directory: `Log/OrbbecSDK.log.txt`. Please provide this file to the support team for further assistance.
|
||||||
|
- If firmware logs are required, set `enable_heartbeat` to `true` to activate this feature.
|
||||||
|
|
||||||
|
### Why Are There So Many Launch Files?
|
||||||
|
|
||||||
|
- Different cameras have varying default resolutions and image formats.
|
||||||
|
- To simplify usage, each camera has its own launch file.
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
FAQ
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
This chapter collects frequently asked questions and answers related to the SDK usage.
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
FAQ.md
|
||||||
|
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
/* 让表格自动拉伸到满宽度 */
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 让表格中的每个 <th> 和 <td> 也自动拉伸 */
|
||||||
|
th,
|
||||||
|
td {
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
width: 100%;
|
||||||
|
/* 列表宽度占满整个容器 */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* 修改 Sphinx Theme 项目标题的字体大小 Book和rtd 均OK */
|
||||||
|
.wy-side-nav-search>a {
|
||||||
|
font-size: 16px;
|
||||||
|
/* 你可以根据需要调整这个值 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 修改项目标题的字体大小 Book和rtd 均OK*/
|
||||||
|
.wy-side-nav-search>div.version {
|
||||||
|
font-size: 16px;
|
||||||
|
/* 你可以根据需要调整这个值 */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.sidebar-logo {
|
||||||
|
width: 500px;
|
||||||
|
/* 或者使用百分比 */
|
||||||
|
height: auto;
|
||||||
|
max-width: 90%;
|
||||||
|
max-height: 90%;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.sidebar-content {
|
||||||
|
line-height: 1.0;
|
||||||
|
/* 行间距是字体大小的1.5倍 */
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar {
|
||||||
|
padding: 20px;
|
||||||
|
/* 内边距 */
|
||||||
|
margin-bottom: 20px;
|
||||||
|
/* 外边距 */
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-text {
|
||||||
|
font-size: 30px;
|
||||||
|
}
|
||||||
|
/* 修改侧边栏的背景颜色 */
|
||||||
|
.wy-nav-side {
|
||||||
|
background-color: #cecece !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 针对导航栏链接的选择器 */
|
||||||
|
.wy-nav-side a {
|
||||||
|
color: #000000;
|
||||||
|
/* 修改为您需要的颜色 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 如果需要,您可以添加 hover 和 active 状态的样式 */
|
||||||
|
.wy-nav-side a:hover {
|
||||||
|
color: #fffcfc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-nav-side .current>a {
|
||||||
|
color: #108bf0 !important;
|
||||||
|
font-weight: bold !important;
|
||||||
|
/* 设置为粗体 */
|
||||||
|
/* 当前活动项的颜色 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 提示:不同版本的 Sphinx 主题生成的 HTML 结构可能有所不同,请根据实际情况调整选择器 */
|
||||||
|
h1.wy-banner-title {
|
||||||
|
color: #0267da !important;
|
||||||
|
/* 将此处的颜色替换为您希望的颜色 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 如果也需要修改小标题 */
|
||||||
|
h2.wy-banner-subtitle {
|
||||||
|
color: #7b7b7b !important;
|
||||||
|
/* 替换为希望的颜色 */
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-side-nav-search>a {
|
||||||
|
color: #ffffff !important;
|
||||||
|
/* 将 #your-color 替换为你想要颜色的十六进制代码 */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* 调整最大宽度 OK */
|
||||||
|
.wy-nav-content {
|
||||||
|
max-width: 960px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* 可选:调整侧边栏宽度 */
|
||||||
|
/* .wy-side-scroll {
|
||||||
|
width: 300px;
|
||||||
|
|
||||||
|
} */
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
// custom.js 可以禁止自动折叠,但不能跳转
|
||||||
|
// document.addEventListener('DOMContentLoaded', function () {
|
||||||
|
// // 展开所有侧边栏目录项
|
||||||
|
// var toctreeItems = document.querySelectorAll('.toctree-l1');
|
||||||
|
// toctreeItems.forEach(function (item) {
|
||||||
|
// item.classList.add('current');
|
||||||
|
// });
|
||||||
|
|
||||||
|
// // 监听点击事件,确保点击标题时不会折叠其他标题,并且能够跳转到相应的文档部分
|
||||||
|
// document.querySelectorAll('.toctree-l1 a').forEach(function (link) {
|
||||||
|
// link.addEventListener('click', function (event) {
|
||||||
|
// // 阻止默认的折叠行为
|
||||||
|
// event.preventDefault();
|
||||||
|
// // 展开点击的标题
|
||||||
|
// var parentLi = this.closest('li');
|
||||||
|
// parentLi.classList.add('current');
|
||||||
|
// // 移除其他同级目录项的 'current' 类
|
||||||
|
// parentLi.parentElement.children.forEach(function (sibling) {
|
||||||
|
// if (sibling !== parentLi) {
|
||||||
|
// sibling.classList.remove('current');
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// // 跳转到相应的文档部分
|
||||||
|
// var target = this.getAttribute('href');
|
||||||
|
// if (target.startsWith('#')) {
|
||||||
|
// document.querySelector(target).scrollIntoView();
|
||||||
|
// } else {
|
||||||
|
// // 如果链接不是锚点,则在新窗口或当前窗口打开链接
|
||||||
|
// window.open(target, '_blank');
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
|
||||||
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 7.2 KiB |
|
After Width: | Height: | Size: 300 KiB |
@@ -0,0 +1,53 @@
|
|||||||
|
<svg width="240" height="45" viewBox="0 0 240 45" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M132.524 33.6127C132.524 33.3717 132.524 33.1909 132.524 33.0252C132.524 26.3818 132.524 19.7534 132.524 13.11C132.524 12.5074 132.524 12.5074 133.097 12.5074C138.4 12.5074 143.717 12.5074 149.02 12.5225C150.692 12.5225 152.319 12.7786 153.871 13.4113C155.016 13.8632 155.995 14.5261 156.793 15.4902C158.571 17.6444 158.36 20.4012 156.281 22.2541C156.025 22.4801 155.769 22.676 155.468 22.932C155.633 23.0676 155.769 23.1731 155.904 23.2936C158.586 25.4478 158.737 28.7921 156.251 31.1723C154.925 32.4377 153.313 33.0855 151.536 33.3566C150.496 33.5224 149.427 33.6127 148.372 33.6278C143.25 33.6579 138.128 33.6429 133.006 33.6429C132.886 33.6127 132.735 33.6127 132.524 33.6127ZM136.727 29.9822C136.953 29.9822 137.134 29.9822 137.33 29.9822C140.96 29.9822 144.606 29.9822 148.237 29.9822C148.915 29.9822 149.607 29.9671 150.285 29.8918C151.265 29.8014 152.199 29.5604 153.027 29.003C153.494 28.6867 153.856 28.2799 153.946 27.6924C154.082 26.8337 153.705 26.1106 152.831 25.6135C151.701 24.9657 150.466 24.7398 149.186 24.7398C146.052 24.7247 142.934 24.7398 139.801 24.7398C139.635 24.7398 139.469 24.7398 139.288 24.7398C139.288 23.5045 139.288 22.3295 139.288 21.1092C139.499 21.1092 139.665 21.1092 139.846 21.1092C142.828 21.1092 145.811 21.1243 148.794 21.0942C149.487 21.0942 150.195 21.049 150.873 20.9134C151.566 20.7628 152.259 20.5519 152.876 20.2204C154.383 19.407 154.368 17.8252 152.892 16.9665C152.575 16.7857 152.244 16.605 151.897 16.5447C150.858 16.379 149.803 16.153 148.749 16.153C144.922 16.1078 141.096 16.138 137.27 16.138C137.104 16.138 136.923 16.153 136.742 16.1681C136.727 20.7628 136.727 25.3273 136.727 29.9822Z" fill="#4A4F54"/>
|
||||||
|
<path d="M183.849 22.917C184.195 23.2183 184.542 23.4895 184.843 23.8058C186.756 25.7341 186.892 28.4909 185.144 30.5848C183.879 32.0913 182.207 32.9048 180.324 33.2512C179.194 33.4621 178.019 33.5977 176.859 33.5977C171.677 33.6279 166.51 33.6128 161.328 33.6128C161.192 33.6128 161.071 33.5977 160.906 33.5977C160.891 33.417 160.876 33.2362 160.876 33.0705C160.876 26.3969 160.876 19.7384 160.876 13.0649C160.876 12.7787 160.815 12.4924 161.282 12.4924C166.675 12.5075 172.068 12.5075 177.477 12.5226C179.134 12.5226 180.746 12.7937 182.282 13.4114C183.502 13.9085 184.557 14.6466 185.34 15.7162C186.847 17.7349 186.666 20.2205 184.888 21.9981C184.587 22.3145 184.225 22.6007 183.849 22.917ZM165.079 29.9823C165.32 29.9823 165.5 29.9823 165.696 29.9823C169.342 29.9823 173.002 29.9823 176.648 29.9823C177.311 29.9823 177.989 29.9672 178.652 29.8919C179.616 29.8015 180.535 29.5605 181.363 29.0181C182.011 28.5963 182.388 28.0088 182.312 27.1953C182.237 26.3969 181.755 25.9149 181.092 25.5533C179.992 24.9507 178.802 24.7248 177.567 24.7248C174.419 24.7097 171.285 24.7248 168.137 24.7248C167.971 24.7248 167.805 24.7248 167.624 24.7248C167.624 23.4744 167.624 22.2994 167.624 21.0942C167.85 21.0942 168.016 21.0942 168.182 21.0942C171.165 21.0942 174.147 21.1093 177.13 21.0792C177.823 21.0792 178.531 21.0038 179.209 20.8984C180.038 20.7779 180.821 20.5218 181.514 20.0247C182.599 19.2262 182.599 17.9006 181.499 17.1473C181.107 16.8762 180.67 16.6352 180.203 16.5448C179.164 16.3489 178.109 16.1531 177.07 16.138C173.243 16.0928 169.417 16.123 165.591 16.123C165.425 16.123 165.259 16.138 165.064 16.1531C165.079 20.7628 165.079 25.3424 165.079 29.9823Z" fill="#4A4F54"/>
|
||||||
|
<path d="M122.763 27.3157C124.013 28.4004 125.203 29.4248 126.378 30.4491C127.568 31.4735 128.743 32.4979 130.009 33.5826C129.828 33.6127 129.722 33.6277 129.617 33.6277C127.824 33.6277 126.032 33.6428 124.254 33.6127C124.043 33.6127 123.787 33.4922 123.606 33.3415C121.557 31.5639 119.524 29.7863 117.505 27.9936C117.249 27.7677 116.993 27.6773 116.646 27.6773C114.477 27.6923 112.308 27.6773 110.139 27.6773C109.973 27.6773 109.792 27.6773 109.596 27.6773C109.596 26.4571 109.596 25.282 109.596 24.0468C109.762 24.0468 109.928 24.0468 110.093 24.0468C113.182 24.0468 116.255 24.0468 119.343 24.0468C120.578 24.0468 121.783 23.881 122.913 23.3538C123.998 22.8567 124.841 22.1185 125.067 20.8983C125.384 19.1508 124.811 17.5992 123.064 16.8008C122.16 16.394 121.196 16.1982 120.232 16.1982C115.908 16.168 111.585 16.1831 107.276 16.1831C107.216 16.1831 107.156 16.1982 107.05 16.2132C107.05 21.998 107.05 27.7827 107.05 33.5976C105.634 33.5976 104.279 33.5976 102.893 33.5976C102.893 26.5926 102.893 19.6027 102.893 12.5827C103.013 12.5676 103.134 12.5526 103.239 12.5526C108.738 12.5526 114.236 12.5224 119.735 12.5827C122.115 12.6128 124.39 13.1552 126.453 14.4206C130.219 16.7104 130.732 22.465 127.026 25.3423C125.911 26.216 124.661 26.7885 123.29 27.1651C123.154 27.1952 123.019 27.2404 122.763 27.3157Z" fill="#4A4F54"/>
|
||||||
|
<path d="M84.7096 33.6128C83.2333 33.6128 81.772 33.673 80.2957 33.5977C77.2979 33.4471 74.6164 32.4679 72.3869 30.404C70.1423 28.3251 69.1179 25.7491 69.133 22.7061C69.148 17.2528 73.0045 14.2851 76.6953 13.1552C78.021 12.7485 79.3919 12.5376 80.7778 12.5376C83.5195 12.5225 86.2763 12.4773 89.018 12.5527C92.0309 12.6431 94.8028 13.5168 97.1077 15.5354C99.1715 17.3432 100.166 19.633 100.286 22.3446C100.572 28.7018 95.8272 32.3323 91.5941 33.2211C90.4793 33.4471 89.3193 33.5224 88.1744 33.5826C87.0145 33.6429 85.8545 33.5977 84.6795 33.5977C84.7096 33.6278 84.7096 33.6128 84.7096 33.6128ZM84.7397 29.9822C86.0654 29.9822 87.3911 29.9973 88.7168 29.9822C89.9972 29.9521 91.2325 29.681 92.3774 29.1085C94.5166 28.0239 95.9176 26.3818 96.1435 23.9414C96.3996 21.2599 95.4355 19.1057 93.1909 17.5842C91.8502 16.6803 90.3588 16.2284 88.762 16.2133C86.0805 16.1681 83.4141 16.1681 80.7326 16.2133C79.0153 16.2435 77.4335 16.7858 76.0174 17.7951C72.402 20.3561 72.3116 26.2312 76.4091 28.7168C77.7197 29.5152 79.1358 29.937 80.6573 29.9822C81.998 30.0124 83.3689 29.9822 84.7397 29.9822Z" fill="#4A4F54"/>
|
||||||
|
<path d="M189.137 12.5677C196.594 12.5677 204.035 12.5677 211.492 12.5677C211.492 13.7729 211.492 14.9479 211.492 16.1682C205.421 16.1682 199.38 16.1682 193.294 16.1682C193.294 20.7779 193.294 25.3575 193.294 29.9973C199.35 29.9973 205.406 29.9973 211.492 29.9973C211.492 31.2175 211.492 32.3926 211.492 33.5977C204.05 33.5977 196.609 33.5977 189.122 33.5977C189.137 26.5927 189.137 19.5878 189.137 12.5677Z" fill="#4A4F54"/>
|
||||||
|
<path d="M239.768 12.5677C239.768 13.7879 239.768 14.963 239.768 16.1832C239.572 16.1832 239.407 16.1832 239.226 16.1832C234.752 16.1832 230.263 16.1832 225.788 16.1832C224.237 16.1832 222.761 16.5447 221.42 17.3582C219.115 18.7592 217.955 20.823 218.091 23.5346C218.226 26.3216 219.778 28.1594 222.248 29.2742C223.303 29.7562 224.433 29.9822 225.593 29.9822C230.127 29.9973 234.676 29.9973 239.211 29.9973C239.377 29.9973 239.557 29.9973 239.768 29.9973C239.768 31.2024 239.768 32.3925 239.768 33.5977C239.663 33.6127 239.572 33.6278 239.482 33.6278C234.692 33.6278 229.901 33.7182 225.126 33.5826C221.134 33.4772 217.789 31.8201 215.515 28.4306C212.788 24.3632 212.848 16.7104 220.275 13.5921C221.902 12.9142 223.604 12.5526 225.367 12.5526C230.052 12.5225 234.737 12.5376 239.422 12.5376C239.512 12.5376 239.618 12.5526 239.768 12.5677Z" fill="#4A4F54"/>
|
||||||
|
<path d="M30.5227 11.5132C31.3965 11.7994 32.3154 12.1308 32.2552 13.2004C32.1949 14.2399 31.276 14.5261 30.3872 14.8123C30.5529 14.8876 30.7186 14.9479 30.8692 15.0232C31.6375 15.3998 31.7731 16.0175 31.2006 16.6502C31.0952 16.7707 30.9747 16.9063 30.9445 17.0419C30.583 18.5031 30.2365 19.9644 29.9804 21.0791C29.8298 20.341 29.6339 19.2262 29.3778 18.1265C29.2423 17.5239 29.1067 16.9213 28.6246 16.4543C28.2329 16.0627 28.3836 15.4902 28.8958 15.1588C29.1217 15.0082 29.3778 14.9178 29.6942 14.7521C28.7602 14.511 27.8563 14.27 27.7509 13.2607C27.6304 12.1158 28.6096 11.8296 29.4381 11.4228C29.2121 11.3626 28.9711 11.3324 28.7602 11.2571C27.7961 10.9408 26.9675 10.4738 26.7416 9.37405C26.621 8.81667 26.8169 8.34967 27.1634 7.92787C27.5852 7.41567 28.1426 7.12945 28.7753 6.94868C28.9259 6.90348 29.0615 6.85829 29.1971 6.70765C29.0012 6.66245 28.7903 6.61726 28.5945 6.57207C27.6605 6.36116 26.8018 5.98455 26.1239 5.27652C25.0092 4.14669 24.9941 2.61012 26.1089 1.46522C27.9768 -0.463032 31.9237 -0.49316 33.8219 1.40496C35.0571 2.64024 34.9818 4.35759 33.6411 5.48743C32.8577 6.15026 31.9539 6.48168 30.9596 6.64739C30.8843 6.66245 30.824 6.67752 30.7336 6.7679C30.8542 6.8131 30.9897 6.84323 31.1103 6.90348C31.6526 7.20477 32.2702 7.41568 32.7071 7.82242C33.4904 8.53044 33.4452 9.61508 32.7071 10.3834C32.1798 10.9257 31.517 11.1969 30.7939 11.3324C30.7186 11.3475 30.6583 11.3626 30.583 11.3927C30.583 11.4228 30.583 11.4379 30.5227 11.5132Z" fill="#0078F0"/>
|
||||||
|
<path d="M29.6037 30.2383C29.2874 30.0425 28.9861 29.922 28.745 29.7111C28.3684 29.3947 28.278 28.9127 28.6095 28.5963C29.1668 28.0389 29.2874 27.3309 29.438 26.6229C29.664 25.6135 29.8447 24.5892 29.9653 23.9113C30.2364 25.0411 30.5678 26.4873 30.9143 27.9335C30.9595 28.0841 31.08 28.2348 31.2005 28.3553C31.7579 28.9578 31.6374 29.6056 30.8993 29.9672C30.7637 30.0425 30.613 30.0877 30.3569 30.1931C30.5528 30.2685 30.6582 30.2986 30.7486 30.3588C31.1102 30.5547 31.532 30.6903 31.8333 30.9614C32.4358 31.4887 32.4358 32.257 31.8333 32.7842C31.4717 33.1006 31.0047 33.2813 30.5678 33.5525C30.6733 33.5826 30.7938 33.6128 30.9143 33.673C31.4566 33.9291 32.0743 34.0948 32.5413 34.4564C33.5355 35.2397 33.5355 36.5654 32.5262 37.3337C32.014 37.7254 31.3813 37.9664 30.7787 38.2827C30.839 38.2978 30.9595 38.343 31.065 38.3731C32.1044 38.5539 33.0535 38.9305 33.8067 39.6837C35.0269 40.8889 35.0119 42.5309 33.7314 43.6758C32.4961 44.7755 31.0047 45.1069 29.3928 44.9714C28.3383 44.881 27.3742 44.5646 26.5306 43.9319C24.8283 42.6514 24.8584 40.5725 26.5908 39.3222C27.2687 38.8251 28.037 38.5388 28.8656 38.3882C28.9861 38.3581 29.1217 38.3279 29.2723 38.2978C28.6998 38.0266 28.1425 37.8459 27.6755 37.5446C26.395 36.701 26.395 35.1493 27.6755 34.3057C28.0822 34.0346 28.5944 33.899 29.0614 33.7031C29.1819 33.658 29.3326 33.6278 29.5736 33.5525C28.6396 33.2211 27.7056 32.9349 27.7508 31.8502C27.796 30.7505 28.745 30.5245 29.6037 30.2383Z" fill="#0078F0"/>
|
||||||
|
<path d="M210.422 21.1394C210.422 22.3295 210.422 23.5045 210.422 24.7097C210.256 24.7247 210.106 24.7398 209.955 24.7398C205.165 24.7398 200.389 24.7398 195.599 24.7548C195.207 24.7548 195.072 24.6494 195.087 24.2427C195.117 23.3237 195.102 22.4199 195.087 21.5009C195.087 21.1996 195.192 21.1093 195.493 21.1093C200.359 21.1243 205.24 21.1093 210.106 21.1093C210.196 21.1093 210.302 21.1243 210.422 21.1394Z" fill="#4A4F54"/>
|
||||||
|
<path d="M40.1493 43.0883C39.0647 43.028 37.724 42.6815 36.7749 41.4613C36.0819 40.5575 36.1271 39.4578 36.8653 38.584C37.6938 37.5898 38.8237 37.1981 40.0439 37.0926C41.3545 36.9872 42.5898 37.2583 43.6594 38.0718C45.1055 39.1715 45.1206 40.9793 43.6895 42.1091C42.8609 42.7569 41.7763 43.0883 40.1493 43.0883Z" fill="#0078F0"/>
|
||||||
|
<path d="M15.2474 5.26147C15.2323 3.96593 15.7445 3.31816 16.4526 2.7909C18.0644 1.60081 20.8212 1.60081 22.4482 2.76077C24.1053 3.95086 24.1204 5.83392 22.4633 7.02401C20.7158 8.27436 17.8385 8.18398 16.2266 6.84324C15.5637 6.30092 15.2474 5.66821 15.2474 5.26147Z" fill="#0078F0"/>
|
||||||
|
<path d="M49.0972 38.825C47.892 38.825 46.9128 38.5689 46.0843 37.891C44.8791 36.8968 44.864 35.4205 46.0541 34.4111C47.6058 33.0855 50.468 33.1307 51.9895 34.4865C53.1646 35.541 53.0139 37.1227 51.643 38.0718C50.8446 38.6292 49.9408 38.8552 49.0972 38.825Z" fill="#0078F0"/>
|
||||||
|
<path d="M11.1501 11.5432C9.91481 11.5583 8.92056 11.2871 8.07695 10.5791C6.88686 9.5698 6.93205 8.03323 8.16733 7.0691C9.7491 5.83382 12.3553 5.84888 13.9069 7.09923C15.097 8.06336 15.1422 9.53967 13.9822 10.549C13.2441 11.2118 12.2197 11.5432 11.1501 11.5432Z" fill="#0078F0"/>
|
||||||
|
<path d="M5.03392 12.643C6.4801 12.628 7.44423 12.8991 8.21251 13.6524C9.07119 14.496 9.05612 15.6258 8.19745 16.4694C6.90191 17.7499 4.19031 17.8252 2.81944 16.6201C1.67454 15.6107 1.76493 14.2097 3.04541 13.3209C3.69318 12.869 4.47653 12.643 5.03392 12.643Z" fill="#0078F0"/>
|
||||||
|
<path d="M54.4151 27.5418C55.6052 27.5418 56.5542 27.7979 57.3225 28.536C58.2264 29.4098 58.1661 30.7053 57.202 31.5037C55.8462 32.6335 53.4359 32.6787 52.0349 31.5941C50.8448 30.6752 50.8297 29.2892 52.0047 28.3552C52.758 27.7376 53.6317 27.5267 54.4151 27.5418Z" fill="#0078F0"/>
|
||||||
|
<path d="M3.07545 24.6193C2.14146 24.6193 1.29785 24.3934 0.604884 23.7305C-0.25379 22.902 -0.193532 21.7571 0.755528 21.0189C1.96068 20.0548 3.97932 20.0096 5.24473 20.8984C6.44989 21.7571 6.44989 23.1581 5.22967 24.0017C4.61203 24.4084 3.91906 24.6193 3.07545 24.6193Z" fill="#0078F0"/>
|
||||||
|
<path d="M56.9307 20.4012C57.699 20.371 58.407 20.5518 59.0397 20.9736C60.3051 21.8172 60.3051 23.2634 59.0548 24.1221C57.8797 24.9205 55.9816 24.9205 54.8066 24.1221C53.5713 23.2785 53.5562 21.8474 54.7915 21.0037C55.4393 20.5518 56.1624 20.371 56.9307 20.4012Z" fill="#0078F0"/>
|
||||||
|
<path d="M37.332 36.9118C36.5486 36.8817 35.7653 36.7009 35.1175 36.1436C34.1835 35.3451 34.2287 34.1852 35.1777 33.4169C36.3528 32.4829 38.4467 32.498 39.6067 33.447C40.5859 34.2454 40.5407 35.5109 39.5012 36.249C38.8685 36.7009 38.1454 36.8968 37.332 36.9118Z" fill="#0078F0"/>
|
||||||
|
<path d="M22.569 12.2514C21.8911 12.2665 21.2283 12.1158 20.6257 11.7091C19.3753 10.8956 19.3753 9.4645 20.6106 8.65102C21.7405 7.91286 23.5482 7.92793 24.663 8.68115C25.8531 9.49463 25.8681 10.8203 24.7082 11.6639C24.0754 12.1158 23.3674 12.2816 22.569 12.2514Z" fill="#0078F0"/>
|
||||||
|
<path d="M54.8522 13.0799C55.5904 13.0498 56.3135 13.2758 56.9311 13.803C57.7145 14.496 57.7295 15.4752 56.9612 16.1983C55.8917 17.1925 53.7525 17.2226 52.6528 16.2585C51.7489 15.4601 51.8393 14.3152 52.8637 13.6222C53.391 13.2456 54.0086 13.0799 54.8522 13.0799Z" fill="#0078F0"/>
|
||||||
|
<path d="M5.41041 31.9407C4.43123 31.9407 3.70813 31.7448 3.09049 31.2176C2.26195 30.5095 2.27701 29.44 3.10555 28.7319C4.145 27.8582 6.14857 27.813 7.21815 28.6415C8.22747 29.4249 8.19734 30.63 7.14283 31.3682C6.58544 31.7749 5.93767 31.9557 5.41041 31.9407Z" fill="#0078F0"/>
|
||||||
|
<path d="M43.373 30.1781C44.096 30.1932 44.8191 30.389 45.4067 30.9464C46.0996 31.6092 46.0695 32.5884 45.3615 33.2061C44.2919 34.1401 42.3636 34.1551 41.279 33.2512C40.4053 32.5131 40.4354 31.4586 41.3393 30.7807C41.9268 30.3438 42.5896 30.1781 43.373 30.1781Z" fill="#0078F0"/>
|
||||||
|
<path d="M16.754 11.0914C17.4168 11.0914 18.0495 11.2571 18.5918 11.6639C19.6162 12.4171 19.6011 13.562 18.5617 14.3002C17.5524 15.0233 15.8802 15.0082 14.8558 14.3002C13.7863 13.562 13.8013 12.3267 14.886 11.6036C15.4132 11.2571 16.0158 11.0914 16.754 11.0914Z" fill="#0078F0"/>
|
||||||
|
<path d="M11.1801 37.8759C10.3816 37.891 9.67361 37.6801 9.11623 37.1076C8.55885 36.5352 8.55885 35.797 9.10117 35.1945C10.0653 34.1249 12.2798 34.1249 13.2439 35.1794C13.7862 35.782 13.7862 36.5503 13.1987 37.1227C12.6262 37.6801 11.9333 37.891 11.1801 37.8759Z" fill="#0078F0"/>
|
||||||
|
<path d="M48.841 10.5942C48.1179 10.6093 47.4852 10.4436 46.958 9.99167C46.1897 9.3439 46.1897 8.42497 46.9278 7.76213C47.907 6.90346 49.8353 6.91852 50.7693 7.7772C51.5074 8.4551 51.5074 9.3439 50.7241 9.99167C50.1818 10.4436 49.534 10.6244 48.841 10.5942Z" fill="#0078F0"/>
|
||||||
|
<path d="M47.1841 29.4098C46.4309 29.3495 45.7379 29.1838 45.2107 28.6113C44.7136 28.069 44.7136 27.3459 45.1956 26.8036C46.0995 25.7943 48.2236 25.7792 49.1576 26.7735C49.715 27.361 49.6999 28.0992 49.1274 28.6716C48.5851 29.2139 47.9072 29.3495 47.1841 29.4098Z" fill="#0078F0"/>
|
||||||
|
<path d="M12.8221 18.9551C12.0839 18.9852 11.4512 18.7894 10.9089 18.3073C10.2762 17.7198 10.2611 16.9214 10.8788 16.3188C11.7977 15.4149 13.7109 15.3999 14.6449 16.2736C15.3529 16.9214 15.3379 17.765 14.5997 18.3826C14.1026 18.8044 13.4849 18.9852 12.8221 18.9551Z" fill="#0078F0"/>
|
||||||
|
<path d="M19.2998 41.9585C18.6972 41.9284 18.1248 41.7777 17.6427 41.3861C16.9498 40.8287 16.9498 39.9399 17.6277 39.3674C18.5315 38.6142 20.1284 38.5991 21.0322 39.3524C21.7402 39.9399 21.7252 40.8739 20.987 41.4313C20.4748 41.8079 19.9024 41.9434 19.2998 41.9585Z" fill="#0078F0"/>
|
||||||
|
<path d="M40.7365 3.06208C41.2638 3.03195 41.8061 3.19766 42.3032 3.54414C43.0414 4.0714 43.0866 4.94513 42.4388 5.56278C41.5651 6.40638 39.7423 6.39132 38.8836 5.53265C38.3413 4.99033 38.3262 4.25217 38.8685 3.70985C39.3657 3.24285 39.9833 3.06208 40.7365 3.06208Z" fill="#0078F0"/>
|
||||||
|
<path d="M48.8865 24.0167C48.2236 24.0317 47.6211 23.8811 47.139 23.4291C46.5665 22.8868 46.5967 22.0733 47.2143 21.5762C48.0579 20.8682 49.5644 20.8531 50.423 21.5461C51.1612 22.1336 51.1612 22.9772 50.408 23.5647C49.9711 23.9112 49.4439 24.0317 48.8865 24.0167Z" fill="#0078F0"/>
|
||||||
|
<path d="M33.6564 32.0762C32.873 31.5942 32.9785 30.6301 33.7166 30.1028C34.5151 29.5454 35.7955 29.5454 36.5939 30.0877C37.3773 30.6301 37.4225 31.5791 36.6241 32.0913C36.2023 32.3775 34.8615 32.8295 33.6564 32.0762Z" fill="#0078F0"/>
|
||||||
|
<path d="M24.8586 15.2944C24.2259 15.3094 23.6685 15.1739 23.2015 14.737C22.6743 14.2399 22.6743 13.5318 23.1865 13.0347C24 12.2363 25.7022 12.2514 26.5007 13.0648C26.9978 13.577 26.9978 14.2248 26.4856 14.7219C26.0337 15.1588 25.4612 15.3245 24.8586 15.2944Z" fill="#0078F0"/>
|
||||||
|
<path d="M47.4704 18.6086C46.7473 18.6086 46.2502 18.4579 45.8284 18.0813C45.3012 17.5992 45.3162 16.9213 45.8435 16.4393C46.6118 15.7463 48.1032 15.7463 48.8564 16.4393C49.3384 16.8761 49.3686 17.554 48.9016 18.021C48.4647 18.4579 47.9073 18.6086 47.4704 18.6086Z" fill="#0078F0"/>
|
||||||
|
<path d="M37.9194 30.0123C37.3168 29.6056 37.3469 28.7921 37.9344 28.3401C38.6726 27.7677 39.923 27.7526 40.6611 28.3251C41.2788 28.7921 41.2938 29.6357 40.631 30.0424C40.2393 30.2835 39.0342 30.645 37.9194 30.0123Z" fill="#0078F0"/>
|
||||||
|
<path d="M20.6556 14.5563C21.2581 14.5563 21.7553 14.6768 22.162 15.0534C22.6441 15.5053 22.6441 16.123 22.1771 16.59C21.454 17.298 19.9927 17.3131 19.2546 16.6051C18.7574 16.1381 18.7725 15.4903 19.2696 15.0384C19.6764 14.6617 20.1735 14.5412 20.6556 14.5563Z" fill="#0078F0"/>
|
||||||
|
<path d="M44.4576 12.176C44.9999 12.5225 45.015 13.2305 44.548 13.6824C43.855 14.3453 42.4691 14.3302 41.7912 13.6674C41.3543 13.2305 41.3694 12.5375 41.8966 12.1911C42.9662 11.5282 44.0961 11.935 44.4576 12.176Z" fill="#0078F0"/>
|
||||||
|
<path d="M17.9442 19.9945C17.4471 20.0095 16.9952 19.8739 16.6336 19.5124C16.2269 19.1207 16.2269 18.6085 16.6186 18.2018C17.2663 17.5239 18.6673 17.5239 19.3151 18.2018C19.7068 18.6085 19.7068 19.1057 19.3 19.5124C18.9234 19.8739 18.4564 20.0095 17.9442 19.9945Z" fill="#0078F0"/>
|
||||||
|
<path d="M42.0019 25.026C42.5291 25.011 42.9961 25.1164 43.3727 25.493C43.7644 25.8847 43.7644 26.412 43.3727 26.8037C42.74 27.4514 41.3691 27.4665 40.7063 26.8187C40.2845 26.3969 40.2694 25.8998 40.6912 25.478C41.0679 25.1315 41.5198 24.9959 42.0019 25.026Z" fill="#0078F0"/>
|
||||||
|
<path d="M23.503 34.2002C24.2412 34.622 24.2412 35.4355 23.488 35.8423C22.795 36.2189 22.087 36.2038 21.4241 35.7519C20.8366 35.3602 20.8366 34.622 21.4392 34.2454C21.7706 34.0797 22.6594 33.7784 23.503 34.2002Z" fill="#0078F0"/>
|
||||||
|
<path d="M36.2474 10.5943C35.7805 10.2328 35.8407 9.67538 36.2926 9.2837C36.8802 8.78657 37.9949 8.77151 38.6126 9.25357C39.1097 9.64525 39.17 10.2478 38.6728 10.6094C38.3414 10.8655 37.3321 11.2571 36.2474 10.5943Z" fill="#0078F0"/>
|
||||||
|
<path d="M42.5895 23.4594C42.0623 23.2937 41.7007 22.887 41.7158 22.4953C41.7309 22.1187 42.1527 21.6969 42.6498 21.5613C43.1469 21.4257 43.629 21.4558 44.0809 21.6969C44.4123 21.8776 44.6835 22.1337 44.6684 22.5405C44.6534 22.9322 44.3822 23.2033 44.0357 23.354C43.7645 23.4745 43.3729 23.6402 42.5895 23.4594Z" fill="#0078F0"/>
|
||||||
|
<path d="M15.7144 23.1279C15.2022 22.7663 15.2172 22.209 15.6993 21.8022C16.2717 21.3202 17.3564 21.3202 17.9288 21.8022C18.3958 22.1939 18.3958 22.8417 17.8686 23.1731C16.9496 23.7305 16.0157 23.3539 15.7144 23.1279Z" fill="#0078F0"/>
|
||||||
|
<path d="M41.1132 19.3769C40.6914 19.0605 40.7366 18.5634 41.1433 18.232C41.6555 17.8102 42.6046 17.8102 43.1167 18.232C43.5235 18.5634 43.5837 19.0605 43.1619 19.3769C42.8908 19.5878 41.9417 19.9494 41.1132 19.3769Z" fill="#0078F0"/>
|
||||||
|
<path d="M20.7459 30.0123C20.1132 30.0123 19.601 29.6357 19.616 29.1687C19.616 28.7318 20.1132 28.3703 20.7308 28.3552C20.7459 28.3552 20.7609 28.3552 20.776 28.3552C21.4087 28.3552 21.9209 28.7168 21.9209 29.1687C21.9209 29.6508 21.4087 30.0274 20.7459 30.0123Z" fill="#0078F0"/>
|
||||||
|
<path d="M39.2451 15.0081C39.923 15.0081 40.4352 15.3847 40.4051 15.8667C40.375 16.3337 39.7272 16.7254 39.1246 16.6501C38.507 16.5748 38.04 16.2132 38.055 15.8065C38.0701 15.3545 38.5974 15.0081 39.2451 15.0081Z" fill="#0078F0"/>
|
||||||
|
<path d="M24.783 30.5245C25.3554 30.5245 25.8526 30.9011 25.8224 31.2928C25.7923 31.6996 25.1445 32.0762 24.6323 31.9858C24.075 31.8954 23.7134 31.579 23.7285 31.2024C23.7435 30.8409 24.2407 30.5245 24.783 30.5245Z" fill="#0078F0"/>
|
||||||
|
<path d="M35.2377 13.0046C35.8102 13.0046 36.3224 13.3813 36.2772 13.7729C36.2471 14.1646 35.6144 14.5412 35.1022 14.481C34.5297 14.4056 34.138 14.0592 34.1832 13.6675C34.2284 13.3059 34.7105 13.0046 35.2377 13.0046Z" fill="#0078F0"/>
|
||||||
|
<path d="M17.9138 27.0899C17.2208 27.0748 16.6635 26.6681 16.6785 26.171C16.6785 25.6889 17.2208 25.2972 17.8987 25.2671C17.9138 25.2671 17.9289 25.2671 17.9439 25.2671C18.6369 25.2671 19.1943 25.6588 19.2093 26.171C19.1943 26.6982 18.6218 27.105 17.9138 27.0899Z" fill="#0078F0"/>
|
||||||
|
<path d="M10.9992 23.9714C10.3364 23.9865 9.76396 23.8208 9.29696 23.3839C8.72451 22.8567 8.72451 22.1487 9.2819 21.6063C10.0954 20.8079 11.8127 20.7778 12.6563 21.5611C13.289 22.1486 13.274 22.8868 12.6111 23.4442C12.1441 23.8359 11.5868 24.0016 10.9992 23.9714Z" fill="#0078F0"/>
|
||||||
|
<path d="M12.4758 29.0482C11.8883 29.0633 11.3911 28.9126 10.9693 28.536C10.4722 28.069 10.4571 27.4363 10.9543 26.9693C11.6774 26.2613 13.1838 26.2462 13.937 26.9241C14.4944 27.4363 14.4793 28.0992 13.9069 28.5812C13.4851 28.9277 12.988 29.0633 12.4758 29.0482Z" fill="#0078F0"/>
|
||||||
|
<path d="M16.7089 33.206C16.1967 33.2211 15.7448 33.0855 15.3682 32.7541C14.9163 32.3473 14.9163 31.7899 15.3531 31.3681C16.0009 30.7354 17.3266 30.7204 17.9894 31.338C18.4865 31.7899 18.4715 32.3774 17.9593 32.8143C17.5977 33.1005 17.1609 33.2361 16.7089 33.206Z" fill="#0078F0"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 21 KiB |
@@ -0,0 +1,212 @@
|
|||||||
|
// 创建一个自执行的函数,用于封装模块定义和执行逻辑
|
||||||
|
!function (n) {
|
||||||
|
// 定义模块存储对象和模块导出相关函数
|
||||||
|
var e = {};
|
||||||
|
function t(i) {
|
||||||
|
// 模块缓存逻辑,避免重复执行
|
||||||
|
if (e[i]) return e[i].exports;
|
||||||
|
var o = e[i] = { i: i, l: !1, exports: {} };
|
||||||
|
// 执行模块定义函数并缓存结果
|
||||||
|
return n[i].call(o.exports, o, o.exports, t),
|
||||||
|
o.l = !0,
|
||||||
|
o.exports
|
||||||
|
}
|
||||||
|
// 初始化模块系统,定义模块数组、缓存对象、导出函数等
|
||||||
|
t.m = n,
|
||||||
|
t.c = e,
|
||||||
|
t.d = function (n, e, i) {
|
||||||
|
t.o(n, e) || Object.defineProperty(n, e, { enumerable: !0, get: i })
|
||||||
|
},
|
||||||
|
t.r = function (n) {
|
||||||
|
"undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(n, Symbol.toStringTag, { value: "Module" }),
|
||||||
|
Object.defineProperty(n, "__esModule", { value: !0 })
|
||||||
|
},
|
||||||
|
t.t = function (n, e) {
|
||||||
|
if (1 & e && (n = t(n)), 8 & e) return n;
|
||||||
|
if (4 & e && "object" == typeof n && n && n.__esModule) return n;
|
||||||
|
var i = Object.create(null);
|
||||||
|
if (t.r(i), Object.defineProperty(i, "default", { enumerable: !0, value: n }),
|
||||||
|
2 & e && "string" != typeof n) for (var o in n)
|
||||||
|
t.d(i, o, function (e) { return n[e] }.bind(null, o));
|
||||||
|
return i
|
||||||
|
},
|
||||||
|
t.n = function (n) {
|
||||||
|
var e = n && n.__esModule ? function () { return n.default } : function () { return n };
|
||||||
|
return t.d(e, "a", e), e
|
||||||
|
},
|
||||||
|
t.o = function (n, e) { return Object.prototype.hasOwnProperty.call(n, e) },
|
||||||
|
t.p = "",
|
||||||
|
// 执行入口模块
|
||||||
|
t(t.s = 0)
|
||||||
|
}([
|
||||||
|
// 定义模块数组,每个模块是一个函数
|
||||||
|
function (n, e, t) {
|
||||||
|
// 执行依赖模块并导出结果
|
||||||
|
t(1),
|
||||||
|
n.exports = t(3)
|
||||||
|
},
|
||||||
|
function (n, e, t) {
|
||||||
|
// 根据环境获取jQuery对象
|
||||||
|
(function () {
|
||||||
|
var e = "undefined" != typeof window ? window.jQuery : t(2);
|
||||||
|
// 定义并导出ThemeNav对象
|
||||||
|
n.exports.ThemeNav = {
|
||||||
|
navBar: null,
|
||||||
|
win: null,
|
||||||
|
winScroll: !1,
|
||||||
|
winResize: !1,
|
||||||
|
linkScroll: !1,
|
||||||
|
winPosition: 0,
|
||||||
|
winHeight: null,
|
||||||
|
docHeight: null,
|
||||||
|
isRunning: !1,
|
||||||
|
// 启用导航栏功能
|
||||||
|
enable: function (n) {
|
||||||
|
var t = this;
|
||||||
|
void 0 === n && (n = !0),
|
||||||
|
t.isRunning || (t.isRunning = !0,
|
||||||
|
e((function (e) {
|
||||||
|
t.init(e),
|
||||||
|
t.reset(),
|
||||||
|
t.win.on("hashchange", t.reset),
|
||||||
|
n && t.win.on("scroll", (function () {
|
||||||
|
t.linkScroll || t.winScroll || (t.winScroll = !0,
|
||||||
|
requestAnimationFrame((function () {
|
||||||
|
t.onScroll()
|
||||||
|
})))
|
||||||
|
})),
|
||||||
|
t.win.on("resize", (function () {
|
||||||
|
t.winResize || (t.winResize = !0,
|
||||||
|
requestAnimationFrame((function () {
|
||||||
|
t.onResize()
|
||||||
|
})))
|
||||||
|
})),
|
||||||
|
t.onResize()
|
||||||
|
})))
|
||||||
|
},
|
||||||
|
// 启用粘性导航栏
|
||||||
|
enableSticky: function () {
|
||||||
|
this.enable(!0)
|
||||||
|
},
|
||||||
|
// 初始化导航栏
|
||||||
|
init: function (n) {
|
||||||
|
n(document);
|
||||||
|
var e = this;
|
||||||
|
this.navBar = n("div.wy-side-scroll:first"),
|
||||||
|
this.win = n(window),
|
||||||
|
n(document).on("click", "[data-toggle='wy-nav-top']", (function () {
|
||||||
|
n("[data-toggle='wy-nav-shift']").toggleClass("shift"),
|
||||||
|
n("[data-toggle='rst-versions']").toggleClass("shift")
|
||||||
|
})).on("click", ".wy-menu-vertical .current ul li a", (function () {
|
||||||
|
var t = n(this);
|
||||||
|
n("[data-toggle='wy-nav-shift']").removeClass("shift"),
|
||||||
|
n("[data-toggle='rst-versions']").toggleClass("shift"),
|
||||||
|
e.toggleCurrent(t),
|
||||||
|
e.hashChange()
|
||||||
|
})).on("click", "[data-toggle='rst-current-version']", (function () {
|
||||||
|
n("[data-toggle='rst-versions']").toggleClass("shift-up")
|
||||||
|
})),
|
||||||
|
n("table.docutils:not(.field-list,.footnote,.citation)").wrap("<div class='wy-table-responsive'></div>"),
|
||||||
|
n("table.docutils.footnote").wrap("<div class='wy-table-responsive footnote'></div>"),
|
||||||
|
n("table.docutils.citation").wrap("<div class='wy-table-responsive citation'></div>"),
|
||||||
|
n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function () {
|
||||||
|
var t = n(this);
|
||||||
|
expand = n('<button class="toctree-expand" title="Open/close menu"></button>'),
|
||||||
|
expand.on("click", (function (n) {
|
||||||
|
return e.toggleCurrent(t),
|
||||||
|
n.stopPropagation(),
|
||||||
|
!1
|
||||||
|
})),
|
||||||
|
t.prepend(expand)
|
||||||
|
}))
|
||||||
|
},
|
||||||
|
// 重置导航栏状态
|
||||||
|
reset: function () {
|
||||||
|
var n = encodeURI(window.location.hash) || "#";
|
||||||
|
try {
|
||||||
|
var e = $(".wy-menu-vertical"),
|
||||||
|
t = e.find('[href="' + n + '"]');
|
||||||
|
if (0 === t.length) {
|
||||||
|
var i = $('.document [id="' + n.substring(1) + '"]').closest("div.section");
|
||||||
|
0 === (t = e.find('[href="#' + i.attr("id") + '"]')).length && (t = e.find('[href="#"]'))
|
||||||
|
}
|
||||||
|
if (t.length > 0) {
|
||||||
|
$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded", "false"),
|
||||||
|
t.addClass("current").attr("aria-expanded", "true"),
|
||||||
|
t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded", "true");
|
||||||
|
for (let n = 1; n <= 10; n++)
|
||||||
|
t.closest("li.toctree-l" + n).addClass("current").attr("aria-expanded", "true");
|
||||||
|
t[0].scrollIntoView()
|
||||||
|
}
|
||||||
|
} catch (n) {
|
||||||
|
console.log("Error expanding nav for anchor", n)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 滚动事件处理
|
||||||
|
onScroll: function () {
|
||||||
|
this.winScroll = !1;
|
||||||
|
var n = this.win.scrollTop(),
|
||||||
|
e = n + this.winHeight,
|
||||||
|
t = this.navBar.scrollTop() + (n - this.winPosition);
|
||||||
|
n < 0 || e > this.docHeight || (this.navBar.scrollTop(t),
|
||||||
|
this.winPosition = n)
|
||||||
|
},
|
||||||
|
// 窗口大小变化事件处理
|
||||||
|
onResize: function () {
|
||||||
|
this.winResize = !1,
|
||||||
|
this.winHeight = this.win.height(),
|
||||||
|
this.docHeight = $(document).height()
|
||||||
|
},
|
||||||
|
// hash变化事件处理
|
||||||
|
hashChange: function () {
|
||||||
|
this.linkScroll = !0,
|
||||||
|
this.win.one("hashchange", (function () {
|
||||||
|
this.linkScroll = !1
|
||||||
|
}))
|
||||||
|
},
|
||||||
|
// 切换当前导航项
|
||||||
|
toggleCurrent: function (n) {
|
||||||
|
var e = n.closest("li");
|
||||||
|
// 20201030 a
|
||||||
|
e.siblings("li.current").removeClass("current").attr("aria-expanded", "false"),
|
||||||
|
e.siblings().find("li.current").removeClass("current").attr("aria-expanded", "false");
|
||||||
|
var t = e.find("> ul li");
|
||||||
|
t.length && (t.removeClass("current").attr("aria-expanded", "false"),
|
||||||
|
e.toggleClass("current").attr("aria-expanded", (function (n, e) {
|
||||||
|
return "true" == e ? "false" : "true"
|
||||||
|
})))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"undefined" != typeof window && (window.SphinxRtdTheme = {
|
||||||
|
Navigation: n.exports.ThemeNav,
|
||||||
|
StickyNav: n.exports.ThemeNav
|
||||||
|
}),
|
||||||
|
// 实现跨浏览器的requestAnimationFrame和cancelAnimationFrame方法
|
||||||
|
function () {
|
||||||
|
for (var n = 0, e = ["ms", "moz", "webkit", "o"], t = 0; t < e.length && !window.requestAnimationFrame; ++t)
|
||||||
|
window.requestAnimationFrame = window[e[t] + "RequestAnimationFrame"],
|
||||||
|
window.cancelAnimationFrame = window[e[t] + "CancelAnimationFrame"] || window[e[t] + "CancelRequestAnimationFrame"];
|
||||||
|
window.requestAnimationFrame || (window.requestAnimationFrame = function (e, t) {
|
||||||
|
var i = (new Date).getTime(),
|
||||||
|
o = Math.max(0, 16 - (i - n)),
|
||||||
|
r = window.setTimeout((function () {
|
||||||
|
e(i + o)
|
||||||
|
}), o);
|
||||||
|
return n = i + o,
|
||||||
|
r
|
||||||
|
}),
|
||||||
|
window.cancelAnimationFrame || (window.cancelAnimationFrame = function (n) {
|
||||||
|
clearTimeout(n)
|
||||||
|
})
|
||||||
|
}()
|
||||||
|
}).call(window)
|
||||||
|
},
|
||||||
|
function (n, e) {
|
||||||
|
// 导出jQuery对象
|
||||||
|
n.exports = jQuery
|
||||||
|
},
|
||||||
|
function (n, e, t) {
|
||||||
|
// 未定义的模块体
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
|
||||||
@@ -0,0 +1,292 @@
|
|||||||
|
{# TEMPLATE VAR SETTINGS #}
|
||||||
|
{%- set url_root = pathto('', 1) %}
|
||||||
|
{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
|
||||||
|
{%- if not embedded and docstitle %}
|
||||||
|
{%- set titlesuffix = " — "|safe + docstitle|e %}
|
||||||
|
{%- else %}
|
||||||
|
{%- set titlesuffix = "" %}
|
||||||
|
{%- endif %}
|
||||||
|
{%- set lang_attr = 'en' if language == None else (language | replace('_', '-')) %}
|
||||||
|
{%- set sphinx_writer = 'writer-html5' if html5_doctype else 'writer-html4' -%}
|
||||||
|
|
||||||
|
{# Build sphinx_version_info tuple from sphinx_version string in pure Jinja #}
|
||||||
|
{%- set (_ver_major, _ver_minor) = (sphinx_version.split('.') | list)[:2] | map('int') -%}
|
||||||
|
{%- set sphinx_version_info = (_ver_major, _ver_minor, -1) -%}
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html class="{{ sphinx_writer }}" lang="{{ lang_attr }}" {% if sphinx_version_info>= (7, 2) %} data-content_root="{{
|
||||||
|
content_root }}"{% endif %}>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
{{- metatags }}
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
{%- block htmltitle %}
|
||||||
|
<title>{{ title|striptags|e }}{{ titlesuffix }}</title>
|
||||||
|
{%- endblock -%}
|
||||||
|
|
||||||
|
{#- CSS #}
|
||||||
|
{%- if sphinx_version_info
|
||||||
|
< (4, 0) -%} <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
|
||||||
|
<link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
|
||||||
|
{%- endif %}
|
||||||
|
{%- for css_file in css_files %}
|
||||||
|
{%- if css_file|attr("filename") %}
|
||||||
|
{{ css_tag(css_file) }}
|
||||||
|
{%- else %}
|
||||||
|
<link rel="stylesheet" href="{{ pathto(css_file, 1)|escape }}" type="text/css" />
|
||||||
|
{%- endif %}
|
||||||
|
{%- endfor %}
|
||||||
|
|
||||||
|
{# "extra_css_files" is a theme option and it's always a string #}
|
||||||
|
{%- for css_file in extra_css_files %}
|
||||||
|
<link rel="stylesheet" href="{{ pathto(css_file, 1)|escape }}" type="text/css" />
|
||||||
|
{%- endfor -%}
|
||||||
|
|
||||||
|
{#- FAVICON
|
||||||
|
favicon_url is the only context var necessary since Sphinx 4.
|
||||||
|
In Sphinx
|
||||||
|
<4, we use favicon but need to prepend path info. #} {%- set _favicon_url=favicon_url | default(pathto('_static/' +
|
||||||
|
(favicon or "" ), 1)) %} {%- if favicon_url or favicon %} <link rel="shortcut icon" href="{{ _favicon_url }}" />
|
||||||
|
{%- endif %}
|
||||||
|
|
||||||
|
{#- CANONICAL URL (deprecated) #}
|
||||||
|
{%- if theme_canonical_url and not pageurl %}
|
||||||
|
<link rel="canonical" href="{{ theme_canonical_url }}{{ pagename }}.html" />
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{#- CANONICAL URL #}
|
||||||
|
{%- if pageurl %}
|
||||||
|
<link rel="canonical" href="{{ pageurl|e }}" />
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{#- JAVASCRIPTS #}
|
||||||
|
{%- block scripts %}
|
||||||
|
<!--[if lt IE 9]>
|
||||||
|
<script src="{{ pathto('_static/js/html5shiv.min.js', 1) }}"></script>
|
||||||
|
<![endif]-->
|
||||||
|
{%- if not embedded %}
|
||||||
|
{# XXX Sphinx 1.8.0 made this an external js-file, quick fix until we refactor the template to inherert more blocks
|
||||||
|
directly from sphinx #}
|
||||||
|
{%- if sphinx_version_info >= (1, 8) -%}
|
||||||
|
{%- if sphinx_version_info < (4, 0) -%} <script id="documentation_options" data-url_root="{{ url_root }}"
|
||||||
|
src="{{ pathto('_static/documentation_options.js', 1) }}">
|
||||||
|
</script>
|
||||||
|
{%- endif -%}
|
||||||
|
{%- for scriptfile in script_files %}
|
||||||
|
{{ js_tag(scriptfile) }}
|
||||||
|
{%- endfor %}
|
||||||
|
{%- else %}
|
||||||
|
<script>
|
||||||
|
var DOCUMENTATION_OPTIONS = {
|
||||||
|
URL_ROOT: '{{ url_root }}',
|
||||||
|
VERSION: '{{ release|e }}',
|
||||||
|
LANGUAGE: '{{ language }}',
|
||||||
|
COLLAPSE_INDEX: false,
|
||||||
|
FILE_SUFFIX: '{{ '' if no_search_suffix else file_suffix }}',
|
||||||
|
HAS_SOURCE: {{ has_source| lower }},
|
||||||
|
SOURCELINK_SUFFIX: '{{ sourcelink_suffix }}'
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
{%- for scriptfile in script_files %}
|
||||||
|
<script src="{{ pathto(scriptfile, 1) }}"></script>
|
||||||
|
{%- endfor %}
|
||||||
|
{%- endif %}
|
||||||
|
<script src="{{ pathto('_static/js/theme.js', 1) }}"></script>
|
||||||
|
|
||||||
|
{#- OPENSEARCH #}
|
||||||
|
{%- if use_opensearch %}
|
||||||
|
<link rel="search" type="application/opensearchdescription+xml"
|
||||||
|
title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
|
||||||
|
href="{{ pathto('_static/opensearch.xml', 1) }}" />
|
||||||
|
{%- endif %}
|
||||||
|
{%- endif %}
|
||||||
|
{%- endblock %}
|
||||||
|
|
||||||
|
{%- block linktags %}
|
||||||
|
{%- if hasdoc('about') %}
|
||||||
|
<link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
|
||||||
|
{%- endif %}
|
||||||
|
{%- if hasdoc('genindex') %}
|
||||||
|
<link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" />
|
||||||
|
{%- endif %}
|
||||||
|
{%- if hasdoc('search') %}
|
||||||
|
<link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" />
|
||||||
|
{%- endif %}
|
||||||
|
{%- if hasdoc('copyright') %}
|
||||||
|
<link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
|
||||||
|
{%- endif %}
|
||||||
|
{%- if next %}
|
||||||
|
<link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}" />
|
||||||
|
{%- endif %}
|
||||||
|
{%- if prev %}
|
||||||
|
<link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}" />
|
||||||
|
{%- endif %}
|
||||||
|
{%- endblock %}
|
||||||
|
{%- block extrahead %} {% endblock %}
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="wy-body-for-nav">
|
||||||
|
|
||||||
|
{%- block extrabody %} {% endblock %}
|
||||||
|
<div class="wy-grid-for-nav">
|
||||||
|
{#- SIDE NAV, TOGGLES ON MOBILE #}
|
||||||
|
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
|
||||||
|
<div class="wy-side-scroll">
|
||||||
|
<div class="wy-side-nav-search" {% if theme_style_nav_header_background %}
|
||||||
|
style="background: {{theme_style_nav_header_background}}" {% endif %}>
|
||||||
|
{%- block sidebartitle %}
|
||||||
|
|
||||||
|
{# the logo helper function was removed in Sphinx 6 and deprecated since Sphinx 4 #}
|
||||||
|
{# the master_doc variable was renamed to root_doc in Sphinx 4 (master_doc still exists in later
|
||||||
|
Sphinx versions) #}
|
||||||
|
{%- set _logo_url = logo_url|default(pathto('_static/' + (logo or ""), 1)) %}
|
||||||
|
{%- set _root_doc = root_doc|default(master_doc) %}
|
||||||
|
<a href="{{ pathto(_root_doc) }}" {% if not theme_logo_only %} class="icon icon-home" {% endif %}>
|
||||||
|
{% if not theme_logo_only %}{{ project }}{% endif %}
|
||||||
|
{%- if logo or logo_url %}
|
||||||
|
<img src="{{ _logo_url }}" class="logo" alt="{{ _('Logo') }}" />
|
||||||
|
{%- endif %}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
{%- if theme_display_version %}
|
||||||
|
{%- set nav_version = version %}
|
||||||
|
{%- if READTHEDOCS and current_version %}
|
||||||
|
{%- set nav_version = current_version %}
|
||||||
|
{%- endif %}
|
||||||
|
{%- if nav_version %}
|
||||||
|
<div class="version">
|
||||||
|
{{ nav_version }}
|
||||||
|
</div>
|
||||||
|
{%- endif %}
|
||||||
|
{%- endif %}
|
||||||
|
|
||||||
|
{%- include "searchbox.html" %}
|
||||||
|
|
||||||
|
{%- endblock %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{%- block navigation %}
|
||||||
|
{#- Translators: This is an ARIA section label for the main navigation menu -#}
|
||||||
|
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation"
|
||||||
|
aria-label="{{ _('Navigation menu') }}">
|
||||||
|
{%- block menu %}
|
||||||
|
{%- set toctree = toctree(maxdepth=theme_navigation_depth|int,
|
||||||
|
collapse=theme_collapse_navigation|tobool,
|
||||||
|
includehidden=theme_includehidden|tobool,
|
||||||
|
titles_only=theme_titles_only|tobool) %}
|
||||||
|
{%- if toctree %}
|
||||||
|
{{ toctree }}
|
||||||
|
{%- else %}
|
||||||
|
<!-- Local TOC -->
|
||||||
|
<div class="local-toc">{{ toc }}</div>
|
||||||
|
{%- endif %}
|
||||||
|
{%- endblock %}
|
||||||
|
</div>
|
||||||
|
{%- endblock %}
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
|
||||||
|
|
||||||
|
{#- MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #}
|
||||||
|
{#- Translators: This is an ARIA section label for the navigation menu that is visible when viewing the page
|
||||||
|
on mobile devices -#}
|
||||||
|
<nav class="wy-nav-top" aria-label="{{ _('Mobile navigation menu') }}" {% if
|
||||||
|
theme_style_nav_header_background %} style="background: {{theme_style_nav_header_background}}" {% endif
|
||||||
|
%}>
|
||||||
|
{%- block mobile_nav %}
|
||||||
|
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
|
||||||
|
<a href="{{ pathto(master_doc) }}">{{ project }}</a>
|
||||||
|
{%- endblock %}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<div class="wy-nav-content">
|
||||||
|
{%- block content %}
|
||||||
|
{%- if theme_style_external_links|tobool %}
|
||||||
|
<div class="rst-content style-external-links">
|
||||||
|
{%- else %}
|
||||||
|
<div class="rst-content">
|
||||||
|
{%- endif %}
|
||||||
|
{% include "breadcrumbs.html" %}
|
||||||
|
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
|
||||||
|
{%- block document %}
|
||||||
|
<div itemprop="articleBody">
|
||||||
|
{% block body %}{% endblock %}
|
||||||
|
</div>
|
||||||
|
{%- if self.comments()|trim %}
|
||||||
|
<div class="articleComments">
|
||||||
|
{%- block comments %}{% endblock %}
|
||||||
|
</div>
|
||||||
|
{%- endif%}
|
||||||
|
</div>
|
||||||
|
{%- endblock %}
|
||||||
|
{% include "footer.html" %}
|
||||||
|
</div>
|
||||||
|
{%- endblock %}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
{% include "versions.html" -%}
|
||||||
|
|
||||||
|
<script>
|
||||||
|
jQuery(function () {
|
||||||
|
SphinxRtdTheme.Navigation.enable({{ 'true' if theme_sticky_navigation | tobool else 'false' }});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#- Do not conflict with RTD insertion of analytics script #}
|
||||||
|
{%- if not READTHEDOCS %}
|
||||||
|
{%- if theme_analytics_id %}
|
||||||
|
<!-- Theme Analytics -->
|
||||||
|
<script async src="https://www.googletagmanager.com/gtag/js?id={{ theme_analytics_id }}"></script>
|
||||||
|
<script>
|
||||||
|
window.dataLayer = window.dataLayer || [];
|
||||||
|
function gtag() { dataLayer.push(arguments); }
|
||||||
|
gtag('js', new Date());
|
||||||
|
|
||||||
|
gtag('config', '{{ theme_analytics_id }}', {
|
||||||
|
'anonymize_ip': {{ 'true' if theme_analytics_anonymize_ip | tobool else 'false' }},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{%- endif %}
|
||||||
|
{%- endif %}
|
||||||
|
|
||||||
|
{%- block footer %} {% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{% extends "!layout.html" %}
|
||||||
|
|
||||||
|
{% block body %}
|
||||||
|
{{ super() }}
|
||||||
|
<!-- 在这里添加你的自定义内容 -->
|
||||||
|
{% if theme_logo %}
|
||||||
|
<div class="logoheader">
|
||||||
|
<a href="{{ pathto(master_doc) }}">
|
||||||
|
<img src="{{ pathto('_static/' + theme_logo, 1) }}" alt="Logo" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="document-wrapper">
|
||||||
|
<div class="document">
|
||||||
|
<div class="body">
|
||||||
|
{% if pagename == 'index' %}
|
||||||
|
<h1>{{ title }}</h1>
|
||||||
|
{% else %}
|
||||||
|
<h2>{{ title }}</h2>
|
||||||
|
{% endif %}
|
||||||
|
{{ super() }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="sidebar">
|
||||||
|
{{ sidebar }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
|
After Width: | Height: | Size: 736 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 234 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 87 KiB |
|
After Width: | Height: | Size: 116 KiB |
|
After Width: | Height: | Size: 103 KiB |
@@ -0,0 +1,14 @@
|
|||||||
|
## License
|
||||||
|
|
||||||
|
Copyright 2024 Orbbec INC.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this project except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
[http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "
|
||||||
|
AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific
|
||||||
|
language governing permissions and limitations under the License.
|
||||||
|
|
||||||
|
Other names and brands may be claimed as the property of others.
|
||||||