From 829f1d2ffd1dcb16acd00faa68ff31889c4ccc67 Mon Sep 17 00:00:00 2001
From: jj <957713278@qq.com>
Date: Tue, 24 Dec 2024 22:12:33 +0800
Subject: [PATCH] Restore docs
---
.gitignore | 2 -
docs/.gitignore | 2 -
docs/.gitlab-ci.yml | 16 -
docs/.nojekyll | 0
docs/Makefile | 20 -
docs/README.md | 87 --
docs/align_depth_color.MD | 40 +
docs/align_depth_color_CN.MD | 40 +
docs/autobuild.sh | 172 ---
docs/backup_index.txt | 106 --
docs/conf.py | 200 ---
.../{source/5_advanced => }/fastdds_tuning.md | 24 +-
docs/{source/image => images}/image1.jpg | Bin
docs/{source/image => images}/image2.jpg | Bin
docs/{source/image => images}/image3.png | Bin
docs/{source/image => images}/image4.jpg | Bin
docs/{source/image => images}/image5.jpg | Bin
docs/{source/image => images}/image6.jpg | Bin
docs/index.rst | 35 -
docs/make.bat | 35 -
docs/multi_camera.MD | 108 ++
docs/multi_camera_CN.MD | 109 ++
docs/openHtml.bat | 13 -
docs/point_cloud.MD | 53 +
docs/point_cloud_CN.MD | 53 +
docs/requirements.txt | 20 -
docs/source/1_overview/overview.rst | 51 -
docs/source/1_overview/supported_cameras.md | 48 -
docs/source/1_overview/supported_platforms.md | 26 -
.../source/1_overview/typical_applications.md | 23 -
.../2_installation/build_the_package.md | 156 ---
docs/source/2_installation/installation.rst | 30 -
.../2_installation/package_description.md | 354 ------
.../3_start_single_camera/single_camera.rst | 31 -
.../start_single_camera.md | 267 ----
.../4_start_multi_camera/multi_camera.rst | 30 -
.../start_multi_camera.md | 97 --
docs/source/5_advanced/advanced.rst | 35 -
docs/source/5_advanced/backward_ros.md | 44 -
docs/source/5_advanced/component_node.md | 157 ---
docs/source/5_advanced/cyclonedds_tuning.md | 56 -
docs/source/5_advanced/gdb_debug.md | 37 -
.../image/multi_camera_sync/1731474090291.png | Bin 75366 -> 0 bytes
docs/source/5_advanced/multi_camera_sync.md | 128 --
docs/source/5_advanced/zero_copy.md | 54 -
docs/source/6_tools/tool.rst | 31 -
docs/source/6_tools/tools.md | 122 --
docs/source/7_help_center/FAQ.md | 69 -
docs/source/7_help_center/help_center.rst | 31 -
docs/source/7_help_center/issues.md | 5 -
docs/source/7_help_center/purchase.md | 15 -
.../source/7_help_center/technical_support.md | 12 -
docs/source/8_license/license.md | 14 -
docs/source/8_license/sdk_license.rst | 28 -
docs/source/LICENSE.txt | 1115 -----------------
docs/source/_static/custom.css | 135 --
docs/source/_static/custom.js | 34 -
.../source/_static/orbbec-light_no_colour.svg | 1 -
.../_static/orbbec_footerlogo_3d_world.svg | 1 -
docs/source/_static/orbbec_logo.png | Bin 49791 -> 0 bytes
docs/source/_static/orbbec_logo2.png | Bin 7325 -> 0 bytes
docs/source/_static/orbbec_logo4.png | Bin 306891 -> 0 bytes
.../_static/orbbec_only_english_logo.svg | 53 -
docs/source/_static/theme.js | 212 ----
docs/source/_static/web_html_logo.png | Bin 17518 -> 0 bytes
docs/source/_templates/disable-layout.html | 292 -----
docs/source/image/3d-vision-for-a-world-2.png | Bin 28093 -> 0 bytes
docs/source/image/3d-vision-for-a-world.png | Bin 16559 -> 0 bytes
docs/source/image/Linux_Install_1.png | Bin 41858 -> 0 bytes
docs/source/image/Linux_Install_2.png | Bin 60713 -> 0 bytes
docs/source/image/Linux_Install_3.png | Bin 36356 -> 0 bytes
docs/source/image/Linux_Install_4.png | Bin 38994 -> 0 bytes
docs/source/image/Linux_Install_5.png | Bin 20709 -> 0 bytes
docs/source/image/MultiStream.png | Bin 808974 -> 0 bytes
docs/source/image/Multi_camera1.png | Bin 77715 -> 0 bytes
docs/source/image/Multi_camera3.png | Bin 78239 -> 0 bytes
docs/source/image/Multi_camera4.png | Bin 26269 -> 0 bytes
docs/source/image/Multi_camera5.png | Bin 79420 -> 0 bytes
docs/source/image/Multi_camera6.png | Bin 91823 -> 0 bytes
docs/source/image/Multi_camera7.png | Bin 93088 -> 0 bytes
docs/source/image/Multi_camera7_1.png | Bin 93621 -> 0 bytes
docs/source/image/Multi_camera7_2.png | Bin 19308 -> 0 bytes
docs/source/image/Multi_camera8.png | Bin 82300 -> 0 bytes
docs/source/image/OrbbecSDK-Architecture.png | Bin 339771 -> 0 bytes
.../OrbbecSDK-Get-Frame-Sequence-Diagram.png | Bin 403870 -> 0 bytes
.../OrbbecSDK_C++_API_user_guide-v1.0.pdf | Bin 455726 -> 0 bytes
docs/source/image/OrbbecViewer.png | Bin 451176 -> 0 bytes
docs/source/image/Sync_connect.png | Bin 23740 -> 0 bytes
docs/source/image/backward_ros.png | Bin 311078 -> 0 bytes
docs/source/image/faq_1.png | Bin 128780 -> 0 bytes
docs/source/image/flameGraph.png | Bin 1051845 -> 0 bytes
docs/source/image/gdb_1.png | Bin 32900 -> 0 bytes
docs/source/image/gdb_2.png | Bin 72665 -> 0 bytes
docs/source/image/gmsl_1.png | Bin 100468 -> 0 bytes
docs/source/image/image10.png | Bin 190256 -> 0 bytes
docs/source/image/image7.png | Bin 121575 -> 0 bytes
docs/source/image/image8.png | Bin 276698 -> 0 bytes
docs/source/image/image9.png | Bin 132777 -> 0 bytes
.../image/list_camera_profile_mode_node.png | Bin 255758 -> 0 bytes
.../image/list_depth_work_mode_node.png | Bin 31749 -> 0 bytes
docs/source/image/list_devices_node.png | Bin 41261 -> 0 bytes
docs/source/image/metadata_export_params.png | Bin 55894 -> 0 bytes
docs/source/image/metadata_save_params.png | Bin 40689 -> 0 bytes
docs/source/image/multi_save_rgbir_node.png | Bin 80926 -> 0 bytes
docs/source/image/multi_save_rgbir_node1.png | Bin 41448 -> 0 bytes
docs/source/image/opdk_logo.png | Bin 7163 -> 0 bytes
docs/source/image/orbbec_driver_000.png | Bin 6225 -> 0 bytes
docs/source/image/orbbec_metadata.png | Bin 12688 -> 0 bytes
docs/source/image/orbbec_opencv_001.png | Bin 7544 -> 0 bytes
docs/source/image/orbbec_opencv_002.png | Bin 53153 -> 0 bytes
docs/source/image/orbbec_opencv_003.png | Bin 12929 -> 0 bytes
docs/source/image/orbbec_sample_005.png | Bin 12423 -> 0 bytes
docs/source/image/orbbec_sample_006.png | Bin 8437 -> 0 bytes
docs/source/image/orbbec_sample_007.png | Bin 20376 -> 0 bytes
docs/source/image/orbbec_sample_008.png | Bin 21081 -> 0 bytes
docs/source/image/orbbec_sample_009.png | Bin 38679 -> 0 bytes
docs/source/image/orbbec_sample_010.png | Bin 165646 -> 0 bytes
docs/source/image/orbbec_sample_011.png | Bin 112391 -> 0 bytes
docs/source/image/orbbec_sample_013.png | Bin 38573 -> 0 bytes
docs/source/image/orbbec_sample_014.png | Bin 136382 -> 0 bytes
docs/source/image/orbbec_sample_linux_001.png | Bin 12024 -> 0 bytes
docs/source/image/orbbec_sample_linux_002.png | Bin 72371 -> 0 bytes
docs/source/image/orbbec_sample_linux_003.png | Bin 7128 -> 0 bytes
docs/source/image/overview.png | Bin 129476 -> 0 bytes
docs/source/image/product_h1.png | Bin 433470 -> 0 bytes
docs/source/image/product_h11.png | Bin 192603 -> 0 bytes
docs/source/image/product_h2.png | Bin 532886 -> 0 bytes
docs/source/image/product_h3.png | Bin 763785 -> 0 bytes
docs/source/image/product_h4.png | Bin 393806 -> 0 bytes
docs/source/image/product_h5.png | Bin 325041 -> 0 bytes
docs/source/image/product_h6.png | Bin 234291 -> 0 bytes
docs/source/image/product_h7.png | Bin 155514 -> 0 bytes
docs/source/image/product_h8.png | Bin 331240 -> 0 bytes
docs/source/image/product_h9.png | Bin 220099 -> 0 bytes
docs/source/image/sdk_licensediagram.png | Bin 15156 -> 0 bytes
.../source/image/sdk_licenseiagram_future.png | Bin 13050 -> 0 bytes
docs/source/image/single_cam_tf.png | Bin 265333 -> 0 bytes
docs/source/image/supported_cameras.png | Bin 149645 -> 0 bytes
.../image/view_display_gemini335_336.png | Bin 836424 -> 0 bytes
.../source/image/view_model_gemini335_336.png | Bin 485555 -> 0 bytes
docs/source/image/windows_install_1.png | Bin 93583 -> 0 bytes
docs/source/image/windows_install_2.png | Bin 177056 -> 0 bytes
docs/source/image/windows_install_3.png | Bin 74206 -> 0 bytes
docs/source/image/windows_install_4.png | Bin 89513 -> 0 bytes
docs/source/image/windows_install_5.png | Bin 69407 -> 0 bytes
docs/source/image/windows_install_6.png | Bin 30224 -> 0 bytes
docs/source/image/yaml-config.png | Bin 73523 -> 0 bytes
docs/start_camera_node.MD | 83 ++
docs/start_camera_node_CN.MD | 82 ++
.../launch/multi_camera_synced.launch.py | 2 +-
150 files changed, 581 insertions(+), 4515 deletions(-)
delete mode 100755 docs/.gitignore
delete mode 100755 docs/.gitlab-ci.yml
delete mode 100755 docs/.nojekyll
delete mode 100755 docs/Makefile
delete mode 100755 docs/README.md
create mode 100644 docs/align_depth_color.MD
create mode 100644 docs/align_depth_color_CN.MD
delete mode 100755 docs/autobuild.sh
delete mode 100755 docs/backup_index.txt
delete mode 100755 docs/conf.py
rename docs/{source/5_advanced => }/fastdds_tuning.md (88%)
mode change 100755 => 100644
rename docs/{source/image => images}/image1.jpg (100%)
mode change 100755 => 100644
rename docs/{source/image => images}/image2.jpg (100%)
mode change 100755 => 100644
rename docs/{source/image => images}/image3.png (100%)
mode change 100755 => 100644
rename docs/{source/image => images}/image4.jpg (100%)
mode change 100755 => 100644
rename docs/{source/image => images}/image5.jpg (100%)
mode change 100755 => 100644
rename docs/{source/image => images}/image6.jpg (100%)
mode change 100755 => 100644
delete mode 100755 docs/index.rst
delete mode 100755 docs/make.bat
create mode 100644 docs/multi_camera.MD
create mode 100644 docs/multi_camera_CN.MD
delete mode 100755 docs/openHtml.bat
create mode 100644 docs/point_cloud.MD
create mode 100644 docs/point_cloud_CN.MD
delete mode 100755 docs/requirements.txt
delete mode 100755 docs/source/1_overview/overview.rst
delete mode 100755 docs/source/1_overview/supported_cameras.md
delete mode 100755 docs/source/1_overview/supported_platforms.md
delete mode 100755 docs/source/1_overview/typical_applications.md
delete mode 100755 docs/source/2_installation/build_the_package.md
delete mode 100755 docs/source/2_installation/installation.rst
delete mode 100755 docs/source/2_installation/package_description.md
delete mode 100755 docs/source/3_start_single_camera/single_camera.rst
delete mode 100755 docs/source/3_start_single_camera/start_single_camera.md
delete mode 100755 docs/source/4_start_multi_camera/multi_camera.rst
delete mode 100755 docs/source/4_start_multi_camera/start_multi_camera.md
delete mode 100755 docs/source/5_advanced/advanced.rst
delete mode 100755 docs/source/5_advanced/backward_ros.md
delete mode 100755 docs/source/5_advanced/component_node.md
delete mode 100755 docs/source/5_advanced/cyclonedds_tuning.md
delete mode 100755 docs/source/5_advanced/gdb_debug.md
delete mode 100644 docs/source/5_advanced/image/multi_camera_sync/1731474090291.png
delete mode 100755 docs/source/5_advanced/multi_camera_sync.md
delete mode 100755 docs/source/5_advanced/zero_copy.md
delete mode 100755 docs/source/6_tools/tool.rst
delete mode 100755 docs/source/6_tools/tools.md
delete mode 100755 docs/source/7_help_center/FAQ.md
delete mode 100755 docs/source/7_help_center/help_center.rst
delete mode 100755 docs/source/7_help_center/issues.md
delete mode 100755 docs/source/7_help_center/purchase.md
delete mode 100755 docs/source/7_help_center/technical_support.md
delete mode 100755 docs/source/8_license/license.md
delete mode 100755 docs/source/8_license/sdk_license.rst
delete mode 100755 docs/source/LICENSE.txt
delete mode 100755 docs/source/_static/custom.css
delete mode 100755 docs/source/_static/custom.js
delete mode 100755 docs/source/_static/orbbec-light_no_colour.svg
delete mode 100755 docs/source/_static/orbbec_footerlogo_3d_world.svg
delete mode 100755 docs/source/_static/orbbec_logo.png
delete mode 100755 docs/source/_static/orbbec_logo2.png
delete mode 100755 docs/source/_static/orbbec_logo4.png
delete mode 100755 docs/source/_static/orbbec_only_english_logo.svg
delete mode 100755 docs/source/_static/theme.js
delete mode 100755 docs/source/_static/web_html_logo.png
delete mode 100755 docs/source/_templates/disable-layout.html
delete mode 100755 docs/source/image/3d-vision-for-a-world-2.png
delete mode 100755 docs/source/image/3d-vision-for-a-world.png
delete mode 100755 docs/source/image/Linux_Install_1.png
delete mode 100755 docs/source/image/Linux_Install_2.png
delete mode 100755 docs/source/image/Linux_Install_3.png
delete mode 100755 docs/source/image/Linux_Install_4.png
delete mode 100755 docs/source/image/Linux_Install_5.png
delete mode 100755 docs/source/image/MultiStream.png
delete mode 100755 docs/source/image/Multi_camera1.png
delete mode 100755 docs/source/image/Multi_camera3.png
delete mode 100755 docs/source/image/Multi_camera4.png
delete mode 100644 docs/source/image/Multi_camera5.png
delete mode 100644 docs/source/image/Multi_camera6.png
delete mode 100644 docs/source/image/Multi_camera7.png
delete mode 100644 docs/source/image/Multi_camera7_1.png
delete mode 100644 docs/source/image/Multi_camera7_2.png
delete mode 100644 docs/source/image/Multi_camera8.png
delete mode 100755 docs/source/image/OrbbecSDK-Architecture.png
delete mode 100755 docs/source/image/OrbbecSDK-Get-Frame-Sequence-Diagram.png
delete mode 100755 docs/source/image/OrbbecSDK_C++_API_user_guide-v1.0.pdf
delete mode 100755 docs/source/image/OrbbecViewer.png
delete mode 100644 docs/source/image/Sync_connect.png
delete mode 100644 docs/source/image/backward_ros.png
delete mode 100644 docs/source/image/faq_1.png
delete mode 100755 docs/source/image/flameGraph.png
delete mode 100755 docs/source/image/gdb_1.png
delete mode 100644 docs/source/image/gdb_2.png
delete mode 100644 docs/source/image/gmsl_1.png
delete mode 100644 docs/source/image/image10.png
delete mode 100644 docs/source/image/image7.png
delete mode 100644 docs/source/image/image8.png
delete mode 100644 docs/source/image/image9.png
delete mode 100644 docs/source/image/list_camera_profile_mode_node.png
delete mode 100644 docs/source/image/list_depth_work_mode_node.png
delete mode 100644 docs/source/image/list_devices_node.png
delete mode 100644 docs/source/image/metadata_export_params.png
delete mode 100644 docs/source/image/metadata_save_params.png
delete mode 100755 docs/source/image/multi_save_rgbir_node.png
delete mode 100644 docs/source/image/multi_save_rgbir_node1.png
delete mode 100644 docs/source/image/opdk_logo.png
delete mode 100755 docs/source/image/orbbec_driver_000.png
delete mode 100755 docs/source/image/orbbec_metadata.png
delete mode 100755 docs/source/image/orbbec_opencv_001.png
delete mode 100755 docs/source/image/orbbec_opencv_002.png
delete mode 100755 docs/source/image/orbbec_opencv_003.png
delete mode 100755 docs/source/image/orbbec_sample_005.png
delete mode 100755 docs/source/image/orbbec_sample_006.png
delete mode 100755 docs/source/image/orbbec_sample_007.png
delete mode 100755 docs/source/image/orbbec_sample_008.png
delete mode 100755 docs/source/image/orbbec_sample_009.png
delete mode 100755 docs/source/image/orbbec_sample_010.png
delete mode 100755 docs/source/image/orbbec_sample_011.png
delete mode 100755 docs/source/image/orbbec_sample_013.png
delete mode 100755 docs/source/image/orbbec_sample_014.png
delete mode 100755 docs/source/image/orbbec_sample_linux_001.png
delete mode 100755 docs/source/image/orbbec_sample_linux_002.png
delete mode 100755 docs/source/image/orbbec_sample_linux_003.png
delete mode 100755 docs/source/image/overview.png
delete mode 100755 docs/source/image/product_h1.png
delete mode 100755 docs/source/image/product_h11.png
delete mode 100755 docs/source/image/product_h2.png
delete mode 100755 docs/source/image/product_h3.png
delete mode 100755 docs/source/image/product_h4.png
delete mode 100755 docs/source/image/product_h5.png
delete mode 100755 docs/source/image/product_h6.png
delete mode 100755 docs/source/image/product_h7.png
delete mode 100755 docs/source/image/product_h8.png
delete mode 100755 docs/source/image/product_h9.png
delete mode 100755 docs/source/image/sdk_licensediagram.png
delete mode 100755 docs/source/image/sdk_licenseiagram_future.png
delete mode 100755 docs/source/image/single_cam_tf.png
delete mode 100755 docs/source/image/supported_cameras.png
delete mode 100644 docs/source/image/view_display_gemini335_336.png
delete mode 100644 docs/source/image/view_model_gemini335_336.png
delete mode 100755 docs/source/image/windows_install_1.png
delete mode 100755 docs/source/image/windows_install_2.png
delete mode 100755 docs/source/image/windows_install_3.png
delete mode 100755 docs/source/image/windows_install_4.png
delete mode 100755 docs/source/image/windows_install_5.png
delete mode 100755 docs/source/image/windows_install_6.png
delete mode 100644 docs/source/image/yaml-config.png
create mode 100644 docs/start_camera_node.MD
create mode 100644 docs/start_camera_node_CN.MD
diff --git a/.gitignore b/.gitignore
index 2181d2b6..f0ca0d45 100644
--- a/.gitignore
+++ b/.gitignore
@@ -764,8 +764,6 @@ FodyWeavers.xsd
# JetBrains Rider
*.sln.iml
-docs/
-_html/
### VisualStudio Patch ###
# Additional files built by Visual Studio
diff --git a/docs/.gitignore b/docs/.gitignore
deleted file mode 100755
index e76724e0..00000000
--- a/docs/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-_build
-.vscode
diff --git a/docs/.gitlab-ci.yml b/docs/.gitlab-ci.yml
deleted file mode 100755
index 6781d05b..00000000
--- a/docs/.gitlab-ci.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-# This file is a template, and might need editing before it works on your project.
-# Full project: https://gitlab.com/pages/plain-html
-pages:
- tags:
- - html
- stage: deploy
- script:
- - mkdir .public
- - cp -r * .public
- - mv .public public
- artifacts:
- paths:
- - public
- only:
- - master
-
diff --git a/docs/.nojekyll b/docs/.nojekyll
deleted file mode 100755
index e69de29b..00000000
diff --git a/docs/Makefile b/docs/Makefile
deleted file mode 100755
index d4bb2cbb..00000000
--- a/docs/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-# Minimal makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line, and also
-# from the environment for the first two.
-SPHINXOPTS ?=
-SPHINXBUILD ?= sphinx-build
-SOURCEDIR = .
-BUILDDIR = _build
-
-# Put it first so that "make" without argument is like "make help".
-help:
- @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
-
-.PHONY: help Makefile
-
-# Catch-all target: route all unknown targets to Sphinx using the new
-# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
-%: Makefile
- @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/README.md b/docs/README.md
deleted file mode 100755
index 581b5679..00000000
--- a/docs/README.md
+++ /dev/null
@@ -1,87 +0,0 @@
-# Docs应用文档
-
-**编译:**
-
-```bash
-cd docs
-./autobuild.sh all
-
-```
-
-**打开文档:**
-
-```bash
-cd docs
-./autobuild.sh run
-
-```
-
-或
-
-进入_html目录,手动点击index.html打开
-
-# Docs应用文档详细说明
-
-**采用方式:**
-
-1、文档格式 markdown
-
-2、文档转换工具 Sphinx
-
-3、托管 github
-
-
-# gitlab:
-
-本项目源码地址: https://code.orbbec.com.cn/OrbbecSDK/OrbbecSDK_ROS2.git
-
-# github (待上线)
-
-本项目源码地址 : 待上线
-本应用文档阅读链接 : 待上线
-
-
-# 文档编写规范
-
-1、框图、软件框架建议原则上采用processon、visio工具绘图,目的是为了保持风格统一(特殊图除外)
-
-2、采用标准markdown格式,可使用vscode的Editor插件编辑
-
-
-# 编译环境
-
-pip3 install sphinx
-
-pip3 install recommonmark
-
-pip3 install sphinx_markdown_tables
-
-pip3 install sphinx_rtd_theme
-
-pip3 install sphinx_book_theme
-
-# 编译
-
-- 执行编译脚本 ./autobuild 编译(推荐,该脚本编译后会打包docs文档及渲染设置)。 也支持sphinx原生编译指令make html
-- 打开docs/index.html查看效果
-
-
-# 提交
-
-git add 、git commit 添加注释、git push提交代码
-
-提交完后,务必要上线网页打开检查一下,检查网页效果无误
-
-
-# 定制化部分
-
-说明:定制化的配置都在**conf.py**中设置。也需要安装一些支持库
-
-1. 更改样式主题。我这里以 `sphinx_rtd_theme`为例子,其他主题可自行百度。
-
-* 安装 `sphinx_rtd_theme`: ` pip install sphinx_rtd_theme`
-
-2. 安装markdown语法支持插件:`pip install myst-parser`
-3. 安装支持mermaid渲染插件: `pip install sphinxcontrib.mermaid`
-4. 安装代码块一键复制按钮插件:`pip install sphinx_copybutton`
-5. 可以使用vscode 编辑markdown文件文档,推荐安装markdown预览编辑插件
diff --git a/docs/align_depth_color.MD b/docs/align_depth_color.MD
new file mode 100644
index 00000000..b4f57ced
--- /dev/null
+++ b/docs/align_depth_color.MD
@@ -0,0 +1,40 @@
+## 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:
+
+
diff --git a/docs/align_depth_color_CN.MD b/docs/align_depth_color_CN.MD
new file mode 100644
index 00000000..32ef58a5
--- /dev/null
+++ b/docs/align_depth_color_CN.MD
@@ -0,0 +1,40 @@
+## 在ROS 2中将深度图像与彩色图像对齐
+
+本节介绍如何使用ROS 2将深度图像与彩色图像对齐,以创建叠加图像。这对于需要来自不同传感器模态的同步视觉信息的应用程序特别有用。
+
+### 对齐并查看深度和彩色图像的命令
+
+1. **基本的深度到彩色对齐:**
+
+ 要简单地将深度图像对齐到彩色图像,使用以下命令:
+
+ ```bash
+ ros2 launch orbbec_camera gemini_330_series.launch.py depth_registration:=true
+ ```
+
+ 此命令激活深度注册功能,但不打开查看器。
+
+2. **查看深度到彩色叠加:**
+
+ 如果您希望查看深度到彩色叠加,您需要通过使用以下命令来启用查看器:
+
+ ```bash
+ ros2 launch orbbec_camera gemini_330_series.launch.py depth_registration:=true enable_d2c_viewer:=true
+ ```
+
+ 这将启动具有深度到彩色注册的相机节点,并打开一个查看器以显示叠加图像。
+
+### 在RViz2中选择主题
+
+要在RViz2中可视化对齐的图像:
+
+1. 在运行上述命令之一后启动RViz2。
+2. 选择深度到彩色叠加图像的主题。这里显示了一个示例主题选择:
+
+ 
+
+### 深度到彩色叠加示例
+
+在RViz2中选择合适的主题后,您将能够看到深度到彩色叠加图像。这是它可能看起来的样子:
+
+
\ No newline at end of file
diff --git a/docs/autobuild.sh b/docs/autobuild.sh
deleted file mode 100755
index e9d7ad8b..00000000
--- a/docs/autobuild.sh
+++ /dev/null
@@ -1,172 +0,0 @@
-#!/bin/bash
-
-#set -e
-
-##################################################################
-
-##################################################################
-#Function List
-print_help()
-{
- echo ""
- echo "------------------------ help menu --------------------------"
- echo " help menu option: "
- echo "./autobuild.sh all ------build all"
- echo "./autobuild.sh senddoc ----- send doc to server"
- echo "./autobuild.sh syncdoc -----syncdoc"
- echo "./autobuild.sh clean ----clean all"
- echo "./autobuild.sh run ---- open html"
- echo "./autobuild.sh help (-h, --help) show help menu"
- echo "-------------------------------------------------------------"
-}
-
-echo_autobuild_start()
-{
- echo ""
- echo -e "\e[32m*********** ./autobuild.sh $1 **************\e[0m"
-}
-
-build_all()
-{
- echo "make clean && make html"
- make clean
- rm -rf _html
- rm -rf _build
- rm -rf docs
- make html
- cp -R _build/html _html
- cp .nojekyll _html/
- cp _html/ docs/ -af
- echo "create _html finished"
-}
-
-clean()
-{
- echo "clean all"
- make clean
-}
-
-sync_doc_old()
-{
- echo "copy ../robot_sdk/ ../robot_ref/ ../robot_actuator file to robot_doc/source/syncdoc/"
- echo "search README.md"
- readme_files=$(find ../robot_sdk/ ../robot_ref/ ../robot_actuator/ -name 'README.md')
- for file in $readme_files; do
- dir=$(dirname "$file")
-
- new_dir=$(echo "$dir" | cut -d'/' -f2-)
- #echo "copy $file to source/syncdoc/$new_dir/README.md"
- echo "source/syncdoc/$new_dir/README.md"
- mkdir -p "source/syncdoc/$new_dir"
- cp -r "$file" "source/syncdoc/$new_dir/"
- if [ -d "$dir/image" ]; then
- cp -r "$dir/image" "source/syncdoc/$new_dir/"
- fi
- done
-}
-sync_doc()
-{
- echo "search *.rst and *.md from source code"
- # readme_files=$(find ../robot_sdk/ ../robot_ref/ ../robot_actuator/ -name 'README.rst')
- # readme_files=$(find ../robot_sdk/ ../robot_ref/ ../robot_actuator/ -name '*.rst' -o -name '*.md')
- readme_files=$(find ../robot_sdk/ ../robot_ref/ ../robot_actuator/ -name 'README.rst' -o -name 'README.md')
- for file in $readme_files; do
- dir=$(dirname "$file")
- new_dir=$(echo "$dir" | cut -d'/' -f2-)
- #echo "copy $file to source/syncdoc/$new_dir/README.md"
- mkdir -p "source/syncdoc/$new_dir"
- cp -r "$file" "source/syncdoc/$new_dir/"
- echo "copy $file --> source/syncdoc/$new_dir/README.rst"
- echo "search image in $dir"
- find "$dir" -type f \( -name "*.png" -o -name "*.gif" -o -name "*.jpg" \) | while read -r serach_file; do
- target_path="source/syncdoc/$new_dir/$(echo "$serach_file" | sed "s|^$dir/||")"
- mkdir -p "$(dirname "$target_path")"
- cp "$serach_file" "$target_path"
- echo "copy $serach_file --> $target_path"
- done
- done
-}
-
-#####################################################################
-# 初始化
-#####################################################################
-
-datetime=$(date +%Y%m%d_%H%M)
-echo_autobuild_start;
-
-##################################################################
-if [ "$#" -eq "0" ]; then
- echo "unknown option: $1 [$#]. pls enter correct cmd:"
- print_help;
- exit 0
-fi
-
-while [ $# -gt 0 ]; do
- echo "option=$1 total=$#:"
- case $1 in
-
- -h | --help | help | h | --h)
- print_help
- ;;
-
- clear | clean | cl)
- clean
- ;;
-
- build | all)
- build_all
- ;;
-
- syncdoc | sync | sd)
- sync_doc
- ;;
-
- run | r)
- echo "open html"
- # Google Chrome的完整路径
- CHROME_PATH="/usr/bin/google-chrome"
- # get full path name of html.html
- HTML_FILE="$(pwd)/_build/html/index.html"
- # 使用绝对路径确保脚本在任何目录下都能正确执行
- CHROME_EXECUTABLE="$(which "$CHROME_PATH")"
- # 使用绝对路径确保脚本在任何目录下都能正确执行
- CHROME_EXECUTABLE="$(which "$CHROME_PATH")"
- # x-www-browser _build/html/index
- # open -a /Applications/Firefox.app _build/html/index
- "$CHROME_EXECUTABLE" "$HTML_FILE"
- ;;
- senddoc | send)
- echo "send doc update to 20.13"
- # echo "send doc update to 10.8.170.85"
- # sshpass -p pwd@123 scp -r _html/* orbbec@10.8.170.85:/var/www/html/robot_doc/
- OUT_IMAGE_SERVER_FOLDER=orbbec_sdk_ros2_doc
- sshpass -p 123 ssh guojia@10.8.180.197 "[ -d /home/orbbec/.SDKBuild/20_13_build_sdk/${OUT_IMAGE_SERVER_FOLDER} ] && echo 20.13 server ready || mkdir -p /home/orbbec/.SDKBuild/20_13_build_sdk/${OUT_IMAGE_SERVER_FOLDER}"
- sshpass -p 123 scp -r _html guojia@10.8.180.197:/home/orbbec/.SDKBuild/20_13_build_sdk/orbbec_sdk_ros2_doc/
-
- ;;
- test1 )
- echo "test1"
-
- ;;
- test2 )
- echo "test2"
-
- ;;
- test3 )
- echo "test3"
-
- ;;
- *)
- echo "unknown option: $1"
- print_help
- ;;
- esac
- shift
-done
-
-
-
-echo "autobuild.sh end"
-
-##################################################################
-
diff --git a/docs/backup_index.txt b/docs/backup_index.txt
deleted file mode 100755
index 2e4f2aa3..00000000
--- a/docs/backup_index.txt
+++ /dev/null
@@ -1,106 +0,0 @@
-.. [奥比中光]OrbbecSDK ROS2 应用文档.用户手册
-.. 这一页是目录树
-
-OrbbecSDK ROS2 application docs
-======================================================
-
-
-.. toctree::
- :maxdepth: 2
- :caption: 1.Overview
- :titlesonly:
- :numbered:
-
- source/overview/typical_applications.md
- source/overview/supported_cameras.md
- source/overview/supported_platforms.md
-
-
-.. toctree::
- :maxdepth: 2
- :caption: 2.Installation
- :titlesonly:
- :numbered:
-
- source/installation/build_the_package.md
- source/installation/package_description.md
- .. source/installation/prerequisites.md
-
-.. toctree::
- :maxdepth: 2
- :caption: 3.Start single camera
- :titlesonly:
- :numbered:
-
- source/start_single_camera.md
-
-
-.. toctree::
- :maxdepth: 1
- :caption: 4.Start multi camera
- :titlesonly:
- :numbered:
-
- source/start_multi_camera.md
-
-
-.. toctree::
- :maxdepth: 2
- :caption: 5.Robot integrations
- :titlesonly:
- :numbered:
-
- source/robot_integrations.md
-
-
-.. toctree::
- :maxdepth: 2
- :caption: 6.Advanced
- :titlesonly:
- :numbered:
-
- source/advanced/multi_camera_sync.md
- source/advanced/component_node.md
- source/advanced/zero_copy.md
- source/advanced/gdb_debug.md
- source/advanced/backward_ros.md
-
-
-.. toctree::
- :maxdepth: 2
- :caption: 7.Tools
- :titlesonly:
- :numbered:
-
- source/tools.md
-
-.. toctree::
- :maxdepth: 2
- :caption: 8.Help center
- :titlesonly:
- :numbered:
-
- source/help_center/question_and_answer.md
- source/help_center/issues.md
-
-.. toctree::
- :maxdepth: 2
- :caption: 9.(参考,待移除)
- :titlesonly:
- :numbered:
-
- source/temp/point_cloud.md
- source/temp/align_depth_color.md
- source/temp/fastdds_tuning.md
- .. source/temp/necessary_configurations.md
- source/temp/orbbec_viewer_tool.md
- .. source/temp/data_display_with_rviz2.md
-
-
-.. toctree::
- :maxdepth: 1
- :caption: 10.license
-
- source/license.md
- LICENSE
-
diff --git a/docs/conf.py b/docs/conf.py
deleted file mode 100755
index 335f40d6..00000000
--- a/docs/conf.py
+++ /dev/null
@@ -1,200 +0,0 @@
-# Configuration file for the Sphinx documentation builder.
-#
-# 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
-
-# -- 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 = 'OrbbecSDK ROS2'
-# project = """
-# OrbbecSDK ROS2 documentation
-# """
-copyright = '2023, ORBBEC INC. www.orbbec.com.cn'
-author = 'ORBBEC INC. www.orbbec.com.cn'
-
-
-# -- General configuration ---------------------------------------------------
-# The master toctree document.
-master_doc = 'index'
-
-# 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']
-
-# 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']
-
-
-# -- Options for HTML output -------------------------------------------------
-
-# html_logo = "source/_static/orbbec_logo2.png"
-# html_favicon = "source/_static/orbbec_logo2.png"
-
-html_logo = "source/_static/orbbec-light_no_colour.svg"
-html_favicon = "source/_static/web_html_logo.png"
-# 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/image']
-
-html_extra_path = ['source/image']
-
-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": "
Your HTML
",
-# "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)
\ No newline at end of file
diff --git a/docs/source/5_advanced/fastdds_tuning.md b/docs/fastdds_tuning.md
old mode 100755
new mode 100644
similarity index 88%
rename from docs/source/5_advanced/fastdds_tuning.md
rename to docs/fastdds_tuning.md
index 0ae3fbfd..1e1ad021
--- a/docs/source/5_advanced/fastdds_tuning.md
+++ b/docs/fastdds_tuning.md
@@ -1,12 +1,12 @@
-# FastDDS tuning
+# Fast DDS Optimization for Orbbec Camera with ROS2
-When operating with the default configuration, FastDDS exhibits suboptimal transmission efficiency, resulting in
+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 FastDDS to enhance image transfer efficiency.
+optimizing Fast DDS to enhance image transfer efficiency.
-## Adjusting system parameters
+## 1. Adjusting System Parameters
-### IP fragmentation time
+### IP Fragmentation Time
- **Path**: `/proc/sys/net/ipv4/ipfrag_time` (default: 30 seconds)
- **Purpose**: Defines the duration that IP fragments are kept in memory.
@@ -19,7 +19,7 @@ optimizing FastDDS to enhance image transfer efficiency.
sudo sysctl net.ipv4.ipfrag_time=3
```
-### IP fragmentation memory threshold
+### 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.
@@ -32,7 +32,7 @@ optimizing FastDDS to enhance image transfer efficiency.
sudo sysctl net.ipv4.ipfrag_high_thresh=134217728
```
-### Maximum buffer sizes
+### Maximum Buffer Sizes
- **Purpose**: Configures the maximum buffer sizes for receiving and sending data, which is critical for high-throughput
data transmission.
@@ -67,12 +67,12 @@ 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).
-## 2. FastDDS configuration
+## 2. Fast DDS Configuration
-Below is an example of a FastDDS configuration file optimized for ROS2 usage with the Orbbec camera. This 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`
+### Configuration File: `shm_fastdds.xml`
Place this file in the `$HOME` directory.
@@ -140,9 +140,9 @@ Place this file in the `$HOME` directory.
```
-### Environment variables
+### Environment Variables
-Set the following environment variables to use the custom FastDDS profile:
+Set the following environment variables to use the custom Fast DDS profile:
```bash
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
diff --git a/docs/source/image/image1.jpg b/docs/images/image1.jpg
old mode 100755
new mode 100644
similarity index 100%
rename from docs/source/image/image1.jpg
rename to docs/images/image1.jpg
diff --git a/docs/source/image/image2.jpg b/docs/images/image2.jpg
old mode 100755
new mode 100644
similarity index 100%
rename from docs/source/image/image2.jpg
rename to docs/images/image2.jpg
diff --git a/docs/source/image/image3.png b/docs/images/image3.png
old mode 100755
new mode 100644
similarity index 100%
rename from docs/source/image/image3.png
rename to docs/images/image3.png
diff --git a/docs/source/image/image4.jpg b/docs/images/image4.jpg
old mode 100755
new mode 100644
similarity index 100%
rename from docs/source/image/image4.jpg
rename to docs/images/image4.jpg
diff --git a/docs/source/image/image5.jpg b/docs/images/image5.jpg
old mode 100755
new mode 100644
similarity index 100%
rename from docs/source/image/image5.jpg
rename to docs/images/image5.jpg
diff --git a/docs/source/image/image6.jpg b/docs/images/image6.jpg
old mode 100755
new mode 100644
similarity index 100%
rename from docs/source/image/image6.jpg
rename to docs/images/image6.jpg
diff --git a/docs/index.rst b/docs/index.rst
deleted file mode 100755
index f69ec8fa..00000000
--- a/docs/index.rst
+++ /dev/null
@@ -1,35 +0,0 @@
-.. [奥比中光]OrbbecSDK ROS2 应用文档.用户手册
-.. 这一页是目录树
-.. :titlesonly:
-
-
-
-.. image:: source/image/product_h5.png
-
-======================================================
-
-
-OrbbecSDK_ROS2
-======================================================
-
-
-.. toctree::
- :maxdepth: 2
- :caption: Table of Contents
- :numbered:
-
- source/1_overview/overview.rst
- source/2_installation/installation.rst
- source/3_start_single_camera/single_camera.rst
- source/4_start_multi_camera/multi_camera.rst
- source/5_advanced/advanced.rst
- source/6_tools/tool.rst
- source/7_help_center/help_center.rst
- source/8_license/sdk_license.rst
-
-
-
-
-======================================================
-
-.. image:: source/image/product_h1.png
diff --git a/docs/make.bat b/docs/make.bat
deleted file mode 100755
index 2119f510..00000000
--- a/docs/make.bat
+++ /dev/null
@@ -1,35 +0,0 @@
-@ECHO OFF
-
-pushd %~dp0
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
- set SPHINXBUILD=sphinx-build
-)
-set SOURCEDIR=.
-set BUILDDIR=_build
-
-if "%1" == "" goto help
-
-%SPHINXBUILD% >NUL 2>NUL
-if errorlevel 9009 (
- echo.
- echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
- echo.installed, then set the SPHINXBUILD environment variable to point
- echo.to the full path of the 'sphinx-build' executable. Alternatively you
- echo.may add the Sphinx directory to PATH.
- echo.
- echo.If you don't have Sphinx installed, grab it from
- echo.http://sphinx-doc.org/
- exit /b 1
-)
-
-%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-goto end
-
-:help
-%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-
-:end
-popd
diff --git a/docs/multi_camera.MD b/docs/multi_camera.MD
new file mode 100644
index 00000000..15a67f29
--- /dev/null
+++ b/docs/multi_camera.MD
@@ -0,0 +1,108 @@
+## Using Multiple Cameras with the Orbbec ROS 2 Package
+
+This section describes how to configure and use multiple Orbbec cameras simultaneously in a ROS 2 environment.
+
+### Identifying Camera USB Ports
+
+#### Script to List Connected Cameras
+
+To determine which USB ports the cameras are connected to, you can use the following bash script. This script lists all Orbbec devices attached to the system along with their USB port and serial number.
+
+```bash
+#!/bin/bash
+
+VID="2bc5"
+
+for dev in /sys/bus/usb/devices/*; do
+ if [ -e "$dev/idVendor" ]; then
+ vid=$(cat "$dev/idVendor")
+ if [ "$vid" == "${VID}" ]; then
+ port=$(basename $dev)
+ product=$(cat "$dev/product" 2>/dev/null) # product name
+ serial=$(cat "$dev/serial" 2>/dev/null) # serial number
+ echo "Found Orbbec device $product, usb port $port, serial number $serial"
+ fi
+ fi
+done
+```
+
+Save this script to a file and execute it in your terminal to output a list of connected cameras.
+
+### Launching Multiple Cameras
+
+#### Setup for Multiple Camera Launch
+
+You can launch multiple cameras by specifying different USB ports for each camera. Below is an example Python script that uses the ROS 2 launch system to start two cameras with individual configurations.
+
+```python
+from launch import LaunchDescription
+from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription, GroupAction, ExecuteProcess
+from launch.launch_description_sources from ament_index_python.packages import get_package_share_directory
+import os
+
+def generate_launch_description():
+ 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, 'gemini_330_series.launch.py')),
+ launch_arguments={'camera_name': 'camera_01', 'usb_port': '2-3.4.4.4.1', 'device_num': '2', 'sync_mode': 'free_run'}.items()
+ )
+
+ launch2_include = IncludeLaunchDescription(
+ PythonLaunchDescriptionSource(os.path.join(launch_file_dir, 'gemini_330_series.launch.py')),
+ launch_arguments={'camera_name': 'camera_02', 'usb_port': '2-3.4.4.4.3', 'device_num': '2', 'sync_mode': 'free_run'}.items()
+ )
+
+ ld = LaunchDescription([
+ GroupAction([launch1_include]),
+ GroupAction([launch2_include])
+ ])
+
+ return ld
+```
+
+#### Running the Launch File
+
+To execute the launch configuration for multiple cameras, use the command:
+
+```bash
+ros2 launch orbbec_camera multi_camera.launch.py
+```
+
+### Configuring the TF Tree for Multiple Cameras
+
+#### Example TF Configuration for Two Cameras
+
+When using multiple cameras, it's essential to calibrate them and publish a static TF tree for each camera. The following Python script configures the TF tree based on your calibration results:
+
+```python
+from launch import LaunchDescription
+from launch_ros.actions import Node
+
+def generate_launch_description():
+ ld = LaunchDescription([
+ Node(
+ package='tf2_ros',
+ executable='static_transform_publisher',
+ name='camera_01_tf',
+ arguments=['0', '0', '0', '0', '0', '0', 'base_link', 'camera_01_link'],
+ output='screen'
+ ),
+ Node(
+ package='tf2_ros',
+ executable='static_transform_publisher',
+ name='camera_02_tf',
+ arguments=['0', '0', '0', '0', '0', '0', 'base_link', 'camera_02_link'],
+ output='screen'
+ )
+ ])
+
+ return ld
+```
+
+Save this configuration as `multi_camera_tf.launch.py` in the launch directory of the Orbbec camera package. To run it, use:
+
+```bash
+ros2 launch orbbec_camera multi_camera_tf.launch.py
+```
diff --git a/docs/multi_camera_CN.MD b/docs/multi_camera_CN.MD
new file mode 100644
index 00000000..7ca6b054
--- /dev/null
+++ b/docs/multi_camera_CN.MD
@@ -0,0 +1,109 @@
+## 使用Orbbec ROS 2包配置多个摄像头
+
+本节介绍如何在ROS 2环境中同时配置和使用多个Orbbec摄像头。
+
+### 识别摄像头USB端口
+
+#### 列出连接的摄像头的脚本
+
+要确定摄像头连接到哪些USB端口,您可以使用以下bash脚本。该脚本列出了连接到系统的所有Orbbec设备及其USB端口和序列号。
+
+```bash
+#!/bin/bash
+
+VID="2bc5"
+
+for dev in /sys/bus/usb/devices/*; do
+ if [ -e "$dev/idVendor" ]; then
+ vid=$(cat "$dev/idVendor")
+ if [ "$vid" == "${VID}" ]; then
+ port=$(basename $dev)
+ product=$(cat "$dev/product" 2>/dev/null) # 产品名称
+ serial=$(cat "$dev/serial" 2>/dev/null) # 序列号
+ echo "发现Orbbec设备 $product,usb端口 $port,序列号 $serial"
+ fi
+ fi
+done
+```
+
+将此脚本保存为一个文件,并在您的终端中执行,以输出连接的摄像头列表。
+
+### 启动多个摄像头
+
+#### 多摄像头启动配置
+
+您可以通过为每个摄像头指定不同的USB端口来启动多个摄像头。下面是一个使用ROS 2启动系统启动两个摄像头的Python脚本示例。
+
+```python
+from launch import LaunchDescription
+from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription, GroupAction, ExecuteProcess
+from launch.launch_description_sources import PythonLaunchDescriptionSource
+from ament_index_python.packages import get_package_share_directory
+import os
+
+def generate_launch_description():
+ 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, 'gemini_330_series.launch.py')),
+ launch_arguments={'camera_name': 'camera_01', 'usb_port': '2-3.4.4.4.1', 'device_num': '2', 'sync_mode': 'free_run'}.items()
+ )
+
+ launch2_include = IncludeLaunchDescription(
+ PythonLaunchDescriptionSource(os.path.join(launch_file_dir, 'gemini_330_series.launch.py')),
+ launch_arguments={'camera_name': 'camera_02', 'usb_port': '2-3.4.4.4.3', 'device_num': '2', 'sync_mode': 'free_run'}.items()
+ )
+
+ ld = LaunchDescription([
+ GroupAction([launch1_include]),
+ GroupAction([launch2_include])
+ ])
+
+ return ld
+```
+
+#### 运行启动文件
+
+要执行多摄像头的启动配置,请使用命令:
+
+```bash
+ros2 launch orbbec_camera multi_camera.launch.py
+```
+
+### 配置多摄像头的TF树
+
+#### 两个摄像头的TF配置示例
+
+使用多个摄像头时,校准它们并为每个摄像头发布静态TF树是必不可少的。以下Python脚本基于您的校准结果配置TF树:
+
+```python
+from launch import LaunchDescription
+from launch_ros.actions import Node
+
+def generate_launch_description():
+ ld = LaunchDescription([
+ Node(
+ package='tf2_ros',
+ executable='static_transform_publisher',
+ name='camera_01_tf',
+ arguments=['0', '0', '0', '0', '0', '0', 'base_link', 'camera_01_link'],
+ output='screen'
+ ),
+ Node(
+ package='tf2_ros',
+ executable='static_transform_publisher',
+ name='camera_02_tf',
+ arguments=['0', '0', '0', '0', '0', '0', 'base_link', 'camera_02_link'],
+ output='screen'
+ )
+ ])
+
+ return ld
+```
+
+将此配置保存为 `multi_camera_tf.launch.py` 在Orbbec摄像头包的启动目录中。运行它,请使用:
+
+```bash
+ros2 launch orbbec_camera multi_camera_tf.launch.py
+```
\ No newline at end of file
diff --git a/docs/openHtml.bat b/docs/openHtml.bat
deleted file mode 100755
index db0fa7d0..00000000
--- a/docs/openHtml.bat
+++ /dev/null
@@ -1,13 +0,0 @@
-@echo off
-
-echo *****************************************
-echo *** jacky.li tools ***
-echo *****************************************
-set CURRENT_TIME=%time:~0,2%:%time:~3,2%:%time:~6,2%
-Echo %CURRENT_TIME%
-
-
-echo current patch %~dp0%
-start chrome.exe "file://%~dp0%_html\index.html"
-
-echo start chrome.exe "file://%~dp0%_html\index.html"
\ No newline at end of file
diff --git a/docs/point_cloud.MD b/docs/point_cloud.MD
new file mode 100644
index 00000000..692e9991
--- /dev/null
+++ b/docs/point_cloud.MD
@@ -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.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:
+
+
diff --git a/docs/point_cloud_CN.MD b/docs/point_cloud_CN.MD
new file mode 100644
index 00000000..8ebb419b
--- /dev/null
+++ b/docs/point_cloud_CN.MD
@@ -0,0 +1,53 @@
+## 在ROS 2中启用和可视化点云
+
+本节演示如何从相机节点启用点云数据输出,并使用RViz2进行可视化,类似于之前讨论的[启动相机节点](./start_camera_node.MD)文档中的初始相机节点设置。
+
+### 启用深度点云
+
+#### 启用深度点云的命令
+
+要激活深度信息的点云数据流,请使用以下命令:
+
+```bash
+ros2 launch orbbec_camera gemini_330_series.launch.py enable_point_cloud:=true
+```
+
+#### 在RViz2中可视化深度点云
+
+运行上述命令后,执行以下步骤来可视化深度点云:
+
+1. 打开RViz2。
+2. 添加一个`PointCloud2`显示。
+3. 选择`/camera/depth/points`主题进行可视化。
+4. 将固定帧设置为`camera_link`以正确对齐数据。
+
+##### 示例可视化
+
+以下是在RViz2中可能看到的深度点云的样子:
+
+
+
+### 启用彩色点云
+
+#### 启用彩色点云的命令
+
+要启用彩色点云功能,请输入以下命令:
+
+```bash
+ros2 launch orbbec_camera gemini_330_series.launch.py enable_colored_point_cloud:=true
+```
+
+#### 在RViz2中可视化彩色点云
+
+要可视化彩色点云数据:
+
+1. 在执行命令后启动RViz2。
+2. 添加一个`PointCloud2`显示面板。
+3. 从列表中选择`/camera/depth_registered/points`主题。
+4. 确保固定帧设置为`camera_link`。
+
+##### 示例可视化
+
+在RViz2中彩色点云的结果应类似于这样:
+
+
\ No newline at end of file
diff --git a/docs/requirements.txt b/docs/requirements.txt
deleted file mode 100755
index ea30deb3..00000000
--- a/docs/requirements.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# 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
\ No newline at end of file
diff --git a/docs/source/1_overview/overview.rst b/docs/source/1_overview/overview.rst
deleted file mode 100755
index 599224b4..00000000
--- a/docs/source/1_overview/overview.rst
+++ /dev/null
@@ -1,51 +0,0 @@
-.. 这一页是模块目录树
-
-
-.. image:: ../image/product_h5.png
-
-======================================================
-
-
-Overview
-======================================================
-
-.. image:: http://badges.github.io/stability-badges/dist/stable.svg
-.. image:: https://img.shields.io/badge/version-2.0.8-green
-
--------------------------------------------------------------------
-
-OrbbecSDK_ROS2 is a wrapper for the Orbbec 3D camera that provides seamless integration with the ROS2 environment. It
-supports ROS2 Foxy, Humble, Iron, and Jazzy distributions.
-
-
-OrbbecSDK ROS2 souce code link:
-`https://github.com/orbbec/OrbbecSDK_ROS2/tree/v2-main `_
-
-With the major update of the new branch v2-main in October 2024, OrbbecSDK_ROS2 is connected to the open source version of OrbbecSDK v2,
-which will make OrbbecSDK_ROS2 more flexible and extensible. This update in v2-main ensures compatibility with all new Orbbec USB products
-that comply with the UVC standard. However, OrbbecSDK_ROS2 v2 no longer supports Orbbec's traditional OpenNI protocol devices.
-We encourage you to check whether your device is supported by OrbbecSDK_ROS2 v2 and use the new version if supported.
-
-
-For the usage of orbbecSDK, please refer to the link for more detailed introduction:
-
-OrbbecSDK souce code link:
-`https://github.com/orbbec/OrbbecSDK_v2 `_
-
-
-
-======================================================
-
-.. toctree::
- :maxdepth: 2
- :caption: This Section Covers:
-
- supported_cameras.md
- supported_platforms.md
-
-
-
-
-======================================================
-
-.. image:: ../image/product_h1.png
\ No newline at end of file
diff --git a/docs/source/1_overview/supported_cameras.md b/docs/source/1_overview/supported_cameras.md
deleted file mode 100755
index 91ebdd94..00000000
--- a/docs/source/1_overview/supported_cameras.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# Supported cameras
-
-> **Important**
->
-> Welcome to the OrbbecSDK ROS2 Wrapper. Before you begin using this version of ROS2 wrapper, it's crucial to check the following device support list to verify the compatibility.
-
-
-OrbbecSDK ROS2 Wrapper provides seamless integration of Orbbec cameras with ROS 2 environment. It supports ROS2 Foxy, Humble, and Jazzy distributions.
-
-With a major update in October 2024, we release the [OrbbecSDK ROS2 Wrapper v2](https://github.com/orbbec/OrbbecSDK_ROS2/tree/v2-main) connected to the open source [OrbbecSDK v2](https://github.com/orbbec/OrbbecSDK_v2/releases) with enhanced flexibility and extensibility. This update ensures compatibility with all Orbbec USB products adhering to UVC standard. However, it no longer supports Orbbec's traditional OpenNI protocol devices. We strongly encourage you to use the v2-main branch if your device is supported.
-
-Here is the device support list of main branch (v1.x) and v2-main branch (v2.x):
-
-| Product Series | Product | [Branch main](https://github.com/orbbec/OrbbecSDK_ROS2/tree/main) | [Branch v2-main](https://github.com/orbbec/OrbbecSDK_ROS2/tree/v2-main) |
-| -------------- | --------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------------- |
-| Gemini 330 | Gemini 335 | full maintenance | recommended for new designs |
-| Gemini 336 | full maintenance | recommended for new designs | |
-| Gemini 330 | full maintenance | recommended for new designs | |
-| Gemini 335L | full maintenance | recommended for new designs | |
-| Gemini 336L | full maintenance | recommended for new designs | |
-| Gemini 330L | full maintenance | recommended for new designs | |
-| Gemini 335Lg | not supported | recommended for new designs | |
-| Gemini 2 | Gemini 2 | full maintenance | recommended for new designs |
-| Gemini 2 L | full maintenance | recommended for new designs | |
-| Gemini 2 XL | recommended for new designs | to be supported | |
-| Femto | Femto Bolt | full maintenance | recommended for new designs |
-| Femto Mega | full maintenance | recommended for new designs | |
-| Femto Mega I | full maintenance | to be supported | |
-| Astra | Astra 2 | full maintenance | recommended for new designs |
-| Astra+ | limited maintenance | not supported | |
-| Astra Pro Plus | limited maintenance | not supported | |
-| Astra Mini | Astra Mini Pro | full maintenance | not supported |
-
- **Note** : If you do not find your device, please contact our FAE or sales representative for help.
-
- **Definition** :
-
-1. recommended for new designs: we will provide full supports with new features, bug fix and performance optimization;
-2. full maintenance: we will provide bug fix support;
-3. limited maintenance: we will provide critical bug fix support;
-4. not supported: we will not support specific device in this version;
-5. to be supported: we will add support in the near future.
-
-
-
-- For more product information, please refer to the official website link:[https://www.orbbec.com/products](https://www.orbbec.com/products/)
-
-
diff --git a/docs/source/1_overview/supported_platforms.md b/docs/source/1_overview/supported_platforms.md
deleted file mode 100755
index 4f3531af..00000000
--- a/docs/source/1_overview/supported_platforms.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# Supported platforms
-
-
-
-- The verified supported platforms and OS are as follows:
-
-| No. | Platform | CPU | OS | ROS2 |
-| --- | ------------------------ | --- | ------------ | -------- |
-| 1 | X64 PC | X86 | Ubuntu 20.04 | humble |
-| 2 | X64 PC | X86 | Ubuntu 22.04 | humble |
-| 3 | X64 PC | X86 | Ubuntu 24.04 | foxy |
-| 4 | NVIDIA Jetson Orin Nano | Arm | Ubuntu 20.04 | humble |
-| 5 | NVIDIA Jetson Orin NX | Arm | Ubuntu 20.04 | humble |
-| 6 | NVIDIA Jetson AGX Orin | Arm | Ubuntu 20.04 | humble |
-| 7 | NVIDIA Jetson AGX Orin | Arm | Ubuntu 22.04 | humble |
-| 8 | NVIDIA Jetson AGX Xavier | Arm | Ubuntu 20.04 | humble |
-| 9 | Qualcomm RB5 | Arm | Ubuntu 20.04 | humble |
-| 10 | RK3399 | Arm | Ubuntu 20.04 | humble |
-| 11 | RK3588 | Arm | Ubuntu 20.04 | Galactic |
-| 12 | RK3588 | Arm | Ubuntu 22.04 | humble |
-
-
-
-
-
-
diff --git a/docs/source/1_overview/typical_applications.md b/docs/source/1_overview/typical_applications.md
deleted file mode 100755
index a2a622d5..00000000
--- a/docs/source/1_overview/typical_applications.md
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-# Typical applications
-
-OrbbecSDK_ROS2 is a wrapper for the Orbbec 3D camera that provides seamless integration with the ROS2 environment. It
-supports ROS2 Foxy, Humble, and Jazzy distributions.
-
-**Applications scenarios:**
-
-* Depth Sensing
-* Object Detection
-* Body Tracking
-* Positional Tracking
-* Geo Tracking
-* Spatial Mapping
-* Camera Control
-* Plane Detection
-* Multi Camera Fusion
-* [OPDK ](https://www.orbbec.com/opdk/)
-
-
diff --git a/docs/source/2_installation/build_the_package.md b/docs/source/2_installation/build_the_package.md
deleted file mode 100755
index 01439a39..00000000
--- a/docs/source/2_installation/build_the_package.md
+++ /dev/null
@@ -1,156 +0,0 @@
-
-
-# Build the package
-
-This section provides a comprehensive guide to installing, compiling, and running the OrbbecSDK_ROS2, covering all necessary steps for setup.
-
-- Table of contents
- - [Get source code of OrbbecSDK_ROS2](#get-source-code-of-orbbecsdk-ros2)
- - [Install environment](#install-environment)
- - [Build project](#build-project)
- - [Performance Optimization Suggestions](#performance-ptimization-suggestions)
-
-## Get source code of OrbbecSDK_ROS2
-
-**Get source code from github:** [https://github.com/orbbec/OrbbecSDK_ROS2](https://github.com/orbbec/OrbbecSDK_ROS2)
-
-```bash
-mkdir -p ~/ros2_ws/src # Create colcon workspace on your local disk
-cd ~/ros2_ws/src
-git clone -b v2-main https://github.com/orbbec/OrbbecSDK_ROS2.git #Get source code
-```
-
-
-## Install environment
-
-**Install ROS 2 environment**, refer to the official documentation: [ROS2 installation guide: https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html](https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html)
-
-```bash
-# Tips: If your ROS2 command does not auto-complete, put the following two lines into your `.bashrc` or `.zshrc`
-
-eval "$(register-python-argcomplete3 ros2)"
-eval "$(register-python-argcomplete3 colcon)"
-```
-
-**Install deb dependencies:**
-
-```bash
-# assume you have sourced ROS environment, same blow
-sudo apt install libgflags-dev nlohmann-json3-dev \
-ros-$ROS_DISTRO-image-transport ros-$ROS_DISTRO-image-publisher ros-$ROS_DISTRO-camera-info-manager \
-ros-$ROS_DISTRO-diagnostic-updater ros-$ROS_DISTRO-diagnostic-msgs ros-$ROS_DISTRO-statistics-msgs \
-ros-$ROS_DISTRO-backward-ros libdw-dev ros-$ROS_DISTRO-image-transport \
-ros-$ROS_DISTRO-image-transport-plugins ros-$ROS_DISTRO-compressed-image-transport \
-ros-$ROS_DISTRO-rqt-tf-tree -y
-```
-
-**Install udev rules:**
-
-```bash
-tar -zxvf OrbbecSDK_ROS2_xxx.tar.gz -C ~/ros2_ws/src
-cd ~/ros2_ws/src/OrbbecSDK_ROS2/orbbec_camera/scripts
-sudo bash install_udev_rules.sh
-sudo udevadm control --reload-rules && sudo udevadm trigger
-```
-
-## Build project
-
-```bash
-cd ~/ros2_ws/
-colcon build --event-handlers console_direct+ --cmake-args -DCMAKE_BUILD_TYPE=Release
-```
-
-Verify the build results.
-[start single camera](../3_start_single_camera/start_single_camera.md)
-
-## Performance Optimization Suggestions
-
-### Optimization of usbfs_memory Parameters in USB Camera
-
-**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).
- There are two ways to persist the configuration: by modifying GRUB or by adding a systemd service.
-
-**by modifying GRUB**
-
-Open /etc/default/grub file,Find and replace
-
-```bash
-GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
-```
-
- with this
-
-```bash
-GRUB_CMDLINE_LINUX_DEFAULT="quiet splash usbcore.usbfs_memory_mb=128"
-```
-
- Update grub
-
-```bash
-$ sudo update-grub
-```
-
- Reboot and check
-
-```bash
-$ cat /sys/module/usbcore/parameters/usbfs_memory_mb
-```
-
-**by adding a systemd service**
-
- Create the `/etc/systemd/system/usbfs-memory.service` file
-
-```bash
-sudo vi /etc/systemd/system/usbfs-memory.service
-```
-
- Paste the following content into the file:
-
-```bash
-[Unit]
-Description=Set USBFS memory limit
-After=multi-user.target
-
-[Service]
-ExecStart=/bin/bash -c 'echo 128 | tee /sys/module/usbcore/parameters/usbfs_memory_mb'
-ExecStartPost=/bin/bash -c 'echo "USBFS memory limit set to 128 MB"'
-
-[Install]
-WantedBy=multi-user.target
-```
-
- Reload the systemd configuration to apply the new service
-
-```bash
-sudo systemctl daemon-reload
-sudo systemctl enable usbfs-memory.service
-sudo systemctl start usbfs-memory.service
-```
-
- Verify the service status
-
-```bash
-sudo systemctl status usbfs-memory.service
-cat /sys/module/usbcore/parameters/usbfs_memory_mb
-```
-
-### Optimizing ROS DDS Configuration
-
-**CycloneDDS Tuning**
-
-If you use CycloneDDS, please refer to the [CycloneDDS Tuning](../6_advanced/cyclonedds_tuning.md) file.
-
-The default DDS settings may not be optimal for data transmission. Different DDS settings can have varying performance. For more detailed information, please refer to the [CycloneDDS official website](https://docs.ros.org/en/humble/How-To-Guides/DDS-tuning.html).
-
-**FastDDS Tuning**
-
-If you use FastDDS, please refer to the [FastDDS Tuning](../6_advanced/fastdds_tuning.md) file.
diff --git a/docs/source/2_installation/installation.rst b/docs/source/2_installation/installation.rst
deleted file mode 100755
index bae1c230..00000000
--- a/docs/source/2_installation/installation.rst
+++ /dev/null
@@ -1,30 +0,0 @@
-.. 这一页是模块目录树
-
-.. image:: ../image/product_h5.png
-
-======================================================
-
-
-Installation
-======================================================
-
-
-This section provides instructions for setting up OrbbecSDK_ROS2, including environment preparation, compilation, installation, and detailed configuration options for customized deployments.
-
-======================================================
-
-
-
-.. toctree::
- :maxdepth: 2
- :caption: This Section Covers:
-
- build_the_package.md
- package_description.md
-
-
-
-
-======================================================
-
-.. image:: ../image/product_h1.png
\ No newline at end of file
diff --git a/docs/source/2_installation/package_description.md b/docs/source/2_installation/package_description.md
deleted file mode 100755
index aa05aada..00000000
--- a/docs/source/2_installation/package_description.md
+++ /dev/null
@@ -1,354 +0,0 @@
-
-
-# Package description
-
-This section provides a detailed overview of the topics, services, launch scripts, and YAML configuration parameters encompassed within the OrbbecSDK_ROS2 package.
-
-- Table of contents
- - [All available topics](#all-available-topics)
- - [All available services](#all-available-services)
- - [All available launch files](#all-available-launch-files)
- - [All available yaml files](#all-available-yaml-files)
- - [Coordinate systems](#coordinate-systems)
- - [Useful configurations](#useful-configurations)
-
-## All available topics
-
-When orbbec camera starts, it will, by default, publish the following topics:
-
-| No. | Published topics | Type | description |
-| --- | :-------------------------------------- | :-------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------- |
-| 1 | /camera/color/image_raw | [sensor_msgs/msg/Image] | The color stream image |
-| 2 | /camera/color/image_raw/compressed | [sensor_msgs/msg/CompressedImage] | The color stream image compressed |
-| 3 | /camera/color/image_raw/compressedDepth | [sensor_msgs/msg/CompressedImage] | |
-| 4 | /camera/color/image_raw/theora | [theora_image_transport/msg/Packet] | The color image metadata |
-| 5 | /camera/color/metadata | [orbbec_camera_msgs/msg/Metadata] | |
-| 6 | /camera/depth/camera_info | [sensor_msgs/msg/CameraInfo] | The depth camera information |
-| 7 | /camera/depth/image_raw | [sensor_msgs/msg/Image] | The depth stream image |
-| 8 | /camera/depth/image_raw/compressed | [sensor_msgs/msg/CompressedImage] | The depth stream image compressed |
-| 9 | /camera/depth/image_raw/compressedDepth | [sensor_msgs/msg/CompressedImage] | |
-| 10 | /camera/depth/image_raw/theora | [theora_image_transport/msg/Packet] | |
-| 11 | /camera/depth/metadata | [orbbec_camera_msgs/msg/Metadata] | The depth image metadata |
-| 12 | /camera/left_ir/camera_info | [sensor_msgs/msg/CameraInfo] | The left_ir camera information |
-| 13 | /camera/left_ir/image_raw | [sensor_msgs/msg/Image] | The left ir stream image |
-| 14 | /camera/left_ir/metadata | [orbbec_camera_msgs/msg/Metadata] | |
-| 15 | /camera/right_ir/camera_info | [sensor_msgs/msg/CameraInfo] | The right_ir camera information |
-| 16 | /camera/right_ir/image_raw | [sensor_msgs/msg/Image] | The right ir stream image |
-| 17 | /camera/right_ir/metadata | [orbbec_camera_msgs/msg/Metadata] | |
-| 18 | /camera/ir/camera_info | [sensor_msgs/msg/CameraInfo] | The ir camera information |
-| 19 | /camera/ir/image_raw | [sensor_msgs/msg/Image] | The ir stream image |
-| 20 | /camera/depth/points | [sensor_msgs/msg/PointCloud2] | The point cloud, only available when `enable_point_cloud` is `true` |
-| 21 | /camera/depth_filter_status | [std_msgs/msg/String] | The depth filter status |
-| 22 | /camera/depth_registered/points | [sensor_msgs/msg/PointCloud2] | The colored point cloud, only available when `enable_colored_point_cloud` is `true`. |
-| 23 | /camera/depth_to_color | [orbbec_camera_msgs/msg/Extrinsics] | |
-| 24 | /camera/depth_to_left_ir | [orbbec_camera_msgs/msg/Extrinsics] | |
-| 25 | /camera/depth_to_right_ir | [orbbec_camera_msgs/msg/Extrinsics] | |
-| 26 | /camera/depth_to_accel | [orbbec_camera_msgs/msg/Extrinsics] | |
-| 27 | /camera/depth_to_gyro | [orbbec_camera_msgs/msg/Extrinsics] | |
-| 28 | /camera/gyro/imu_info | [orbbec_camera_msgs/msg/IMUInfo] | The imu information |
-| 29 | /camera/gyro_accel/sample | [sensor_msgs/msg/Imu] | Synchronized data stream of acceleration and gyroscope,`enable_sync_output_accel_gyro` `turned on` |
-| 30 | /clicked_point | [geometry_msgs/msg/PointStamped] | |
-| 31 | /diagnostics | [diagnostic_msgs/msg/DiagnosticArray] | The diagnostic information of the camera, Currently, the diagnostic information only includes the temperature of the camera. |
-| 32 | /goal_pose | [geometry_msgs/msg/PoseStamped] | |
-| 33 | /initialpose | [geometry_msgs/msg/PoseWithCovarianceStamped] | |
-| 34 | /parameter_events | [rcl_interfaces/msg/ParameterEvent] | |
-| 35 | /rosout | [rcl_interfaces/msg/Log] 8 | |
-| 36 | /tf | [tf2_msgs/msg/TFMessage] | |
-| 37 | /tf_static | [tf2_msgs/msg/TFMessage] | |
-
-## All available services
-
-The name of the following services already expresses its function.
-However, it should be noted that the corresponding `set_[ir|depth|color]*`
-and `get[ir|depth|color]*` **services are only available if you set** `enable[ir|depth|color]` to `true` in the stream that corresponds to the argument of the launch file.
-
-Servies can be called like this:
-
-```bash
-# Get device info
-ros2 service call /camera/get_device_info orbbec_camera_msgs/srv/GetDeviceInfo '{}'
-# Get SDK version
-ros2 service call /camera/get_sdk_version orbbec_camera_msgs/srv/GetString '{}'
-# Set auto exposure
-ros2 service call /camera/set_color_auto_exposure std_srvs/srv/SetBool '{data: false}'
-# Save point cloud
-ros2 service call /camera/save_point_cloud std_srvs/srv/Empty "{}"
-```
-
-| No. | Service | type | description |
-| --- | :------------------------------- | :------------------------------------- | :-------------------------- |
-| 1 | /camera/get_auto_white_balance | [orbbec_camera_msgs/srv/GetInt32] | Get auto white balance |
-| 2 | /camera/get_color_exposure | [orbbec_camera_msgs/srv/GetInt32] | Get color exposure |
-| 3 | /camera/get_color_gain | [orbbec_camera_msgs/srv/GetInt32] | Get color gain |
-| 4 | /camera/get_depth_exposure | [orbbec_camera_msgs/srv/GetInt32] | Get depth exposure |
-| 5 | /camera/get_depth_gain | [orbbec_camera_msgs/srv/GetInt32] | Get depth information |
-| 6 | /camera/get_device_info | [orbbec_camera_msgs/srv/GetDeviceInfo] | Get device information |
-| 7 | /camera/get_ldp_measure_distance | [orbbec_camera_msgs/srv/GetInt32] | Get ldp distance |
-| 8 | /camera/get_ldp_status | [orbbec_camera_msgs/srv/GetBool] | Get ldp status |
-| 9 | /camera/get_sdk_version | [orbbec_camera_msgs/srv/GetString] | Get sdk version |
-| 10 | /camera/get_white_balance | [orbbec_camera_msgs/srv/GetInt32] | Get white balance |
-| 11 | /camera/reboot_device | [std_srvs/srv/Empty] | Reboot device |
-| 12 | /camera/save_images | [std_srvs/srv/Empty] | Save images |
-| 13 | /camera/save_point_cloud | [std_srvs/srv/Empty] | Save point cloud |
-| 14 | /camera/set_auto_white_balance | [std_srvs/srv/SetBool] | Set auto white balance |
-| 15 | /camera/set_color_auto_exposure | [std_srvs/srv/SetBool] | Set color auto exposure |
-| 16 | /camera/set_color_exposure | [orbbec_camera_msgs/srv/SetInt32] | Set color exposure |
-| 17 | /camera/set_color_gain | [orbbec_camera_msgs/srv/SetInt32] | Set color gain |
-| 18 | /camera/set_color_mirror | [std_srvs/srv/SetBool] | Set color mirror |
-| 19 | /camera/set_depth_auto_exposure | [std_srvs/srv/SetBool] | Set depth auto exposure |
-| 20 | /camera/set_depth_exposure | [orbbec_camera_msgs/srv/SetInt32] | Set depth exposure |
-| 21 | /camera/set_depth_gain | [orbbec_camera_msgs/srv/SetInt32] | Set depth gain |
-| 22 | /camera/set_depth_mirror | [std_srvs/srv/SetBool] | Set depth mirror |
-| 23 | /camera/set_fan_work_mode | [orbbec_camera_msgs/srv/SetInt32] | Set fan work mode |
-| 24 | /camera/set_floor_enable | [std_srvs/srv/SetBool] | Set floor enable |
-| 25 | /camera/set_ir_long_exposure | [std_srvs/srv/SetBool] | Set ir long exposure |
-| 26 | /camera/set_laser_enable | [std_srvs/srv/SetBool] | Set laser enable |
-| 27 | /camera/set_ldp_enable | [std_srvs/srv/SetBool] | Set ldp enable |
-| 28 | /camera/set_white_balance | [orbbec_camera_msgs/srv/SetInt32] | Set white balance |
-| 29 | /camera/switch_ir | [orbbec_camera_msgs/srv/SetString] | switch left ir and right ir |
-| 30 | /camera/toggle_color | [std_srvs/srv/SetBool] | Toggle color |
-| 31 | /camera/toggle_depth | [std_srvs/srv/SetBool] | Toggle depth |
-
-## All available launch files
-
-| launch file list | description |
-| ---------------------------- | ------------------------------------------------- |
-| orbbec_camera.launch.py | Generic ros launch script for a 3D camera product |
-| orbbec_multicamera.launch.py | Multicamera devices startup example script |
-
-**Run Command:**
-
-**1. Launch Script for Specifying Device Type:**
-The `orbbec_camera.launch.py` supports two optional input parameters: camera_model and config_file_path.
-
-```bash
-ros2 launch orbbec_camera orbbec_camera.launch.py camera_model:=gemini330_series
-```
-
-or
-
-```bash
-# default startup script
-ros2 launch orbbec_camera orbbec_camera.launch.py config_file_path:=gemini330_series.yaml
-```
-
-**Note:**
-**camera_model:**
-
-* The value of the camera_model parameter is the product type corresponding to the camera product being used.
-
-**config_file_path:**
-
-* The YAML configuration file located in the `config/` directory is used. By default, `gemini330_series.yaml` is selected.
-* The value of the config_file_path parameter is the path to the yaml configuration file corresponding to the camera product being used.
-* Supports the transmission of both absolute paths and relative paths to the config, or YAML files under the config can be specified without a path.
-* Supports use intra-process communication. config param use_intra_process_comms: true
-
-**2.multicamera launch:**
-The multicamera startup
-
-```bash
-ros2 launch orbbec_camera orbbec_multicamera.launch.py
-```
-
-or
-
-```bash
-ros2 launch orbbec_camera orbbec_multicamera.launch.py config_file_path:=multicamera.yaml
-```
-
-**Note:**
-
-1. Multiple devices default config reference config/multicamera.yaml
-2. Multiple cameras synced config reference config/multicamera_synced.yaml
-
-## All available yaml files
-
-| product serials | yaml file | description |
-| :--------------- | :-------------------- | :------------------------------------- |
-| astra2 | astra2.yaml | astra2 camera default params |
-| femto | femto.yaml | femto camera default params |
-| femtomega | femtomega.yaml | femtomega camera default params |
-| femtobolt | femtobolt.yaml | femtobolt camera default params |
-| gemini2 | gemini2.yaml | gemini2 camera default params |
-| gemini2L | gemini2L.yaml | gemini2L camera default params |
-| gemini330 series | gemini330_series.yaml | gemini330_series camera default params |
-
-*All yaml files are fundamentally similar, with the primary differences being the default parameter values set for various models within the same series.
-Differences in USB standards, such as USB 2.0 versus USB 3.0, may require parameter adjustments. In case of startup issues, please refer to the specification manual carefully. Pay particular attention to resolution settings and other parameters in the YAML file to ensure compatibility and optimal performance.*
-
-Relationship Between Product yaml Configuration File and common.yaml Configuration File, and a Rough Flowchart of Their Invocation Process
-
-
-
-**yaml Configuration Instructions:**
-
-1.common.yaml
-
-Contains all basic default parameters and common default values.
-
-2.product xxx.yaml
-
-The yaml corresponding to a specific product, such as gemini2.yaml, will configure its product-specific difference parameters and default values based on common.yaml.
-
-3.yaml Loading order description:
-
-Orbbec_camera.launch.py When started, it will load first.commcon.yaml. Reload the corresponding product yaml. For example gemini2.yaml The same parameter value will overwrite the corresponding default parameter value in common.yaml.
-
-**Launch Startup Instructions:**
-
-1.orbbec_camera.launch.py Command line parameters have the highest priority. That is, parameters carried in the command line will override the default values of the same parameters in the yaml file.
-
-2.orbbec_multicamera.launch.py The command line configuration corresponds to multicamera.yaml or multicamera_synced.yaml. For multi-machine yaml configuration, you can refer to the modification guide to modify the multi-machine configuration.
-
-## Coordinate systems
-
-### ROS2(Robot) vs Optical(Camera) coordination systems
-
-* Point Of View:
- * Imagine we are standing behind of the camera, and looking forward.
- * Always use this point of view when talking about coordinates, left vs right IRs, position of sensor, etc..
-
-
-
-* ROS2 Coordinate System: (X: Forward, Y:Left, Z: Up)
-* Camera Optical Coordinate System: (X: Right, Y: Down, Z: Forward)
-* All data published in our wrapper topics is optical data taken directly from our camera sensors.
-* static and dynamic TF topics publish optical CS and ROS CS to give the user the ability to move from one CS to other CS.
-
-### Camera sensor structure
-
-
-
-
-
-### TF from coordinate A to coordinate B:
-
-In Orbbec cameras, the origin point (0,0,0) is taken from the camera_link position
-
-Our wrapper provide static TFs between each sensor coordinate to the camera base (camera_link)
-
-Also, it provides TFs from each sensor ROS coordinates to its corrosponding optical coordinates.
-
-Example of static TFs of RGB sensor and right infra sensor of Gemini335 module as it shown in rviz2:
-
-```bash
-ros2 launch orbbec_description view_model.launch.py model:=gemini_335_336.urdf.xacro
-```
-
-
-
-## Useful configurations
-
-### Use V4L2 backend
-
-To enable the V4L2 backend for the Gemini2 series cameras, follow these steps:
-
-1. The Gemini2 series cameras support the V4L2 backend.
-2. Open the `config/OrbbecSDKConfig_v2.0.xml` file.
-3. Set the navigation option to `LinuxUVCBackend`.
-4. Change the backend setting to `V4L2`.
-
-Note: The V4L2 backend is not enabled by default.
-
-Config V4L2 in `config/OrbbecSDKConfig_v2.0.xml` file.
-
-```
-
-
-
-
- false
-
-
- Auto
-
-
-
- V4L2
-
-```
-
-### Predefined presets
-
-| Preset | Features | Recommended use cases |
-| :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Default | - Best visual perception - Overall good performance in accuracy, fill rate, tiny objects, etc. | - Generic - Robotics |
-| Hand | - Clear hand and finger edges | - Gesture recognition |
-| High Accuracy | - Depth of high confidence - Barely noise depth values - Lower fill rate | - Collision avoidance - Object scanning |
-| High Density | - Higher fill rate - More tiny objects - May suffer from noise depth values | - Object recognition - Pick & place - Foreground & background animation |
-| Medium Density | - Balanced performance in fill rate and accuracy - In comparison to Default: lower fill rate, better edge quality | - Generic and alternative to Default |
-| Custom | - User defined Preset - 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
- 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.
-
-### Depth work mode switch
-
-OrbbecSDK_ROS2 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
-```
-
-### 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.
-
-### Network device enumeration
-
-Currently, the network device enumeration function is supported only by the Femto Mega device. When accessing this
-device over the network, if `enumerate_net_device` is set to `true`, the device will be automatically enumerated,
-eliminating the need to configure the IP address in advance or set the enable switch to true. The specific configuration
-methods are as follows:
-
-- `enumerate_net_device`: enumeration network device automatically, only supported by Femto Mega.
- if `enumerate_net_device` set to `true`, the device will be enumerated automatically,No need to set
- the `net_device_ip`
- and `net_device_port` parameters.
-- `net_device_ip`: The IP address of the device.
-- `net_device_port`: The port number of the device.
-
-### Compressed Image
-
-You can use image_transport to compress the image using jpeg. Below is an example of how to use it:
-To access the compressed color image, you can use the following command:
-
-```bash
-ros2 topic echo /camera/color/image_raw/compressed --no-arr
-```
-
-This command will allow you to receive the compressed color image from the specified topic.
-
-**Note:** The compressed topic for depth is /camera/depth/image_raw/compressedDepth. The compressed topics for color and IR are /camera/color/image_raw/compressed and /camera/ir/image_raw/compressed, respectively.
diff --git a/docs/source/3_start_single_camera/single_camera.rst b/docs/source/3_start_single_camera/single_camera.rst
deleted file mode 100755
index 3e36451c..00000000
--- a/docs/source/3_start_single_camera/single_camera.rst
+++ /dev/null
@@ -1,31 +0,0 @@
-.. 这一页是模块目录树
-
-.. .. image:: ../image/product_h7.png
-
-.. image:: ../image/product_h5.png
-
-======================================================
-
-Single camera
-======================================================
-
-This guide provides instructions on how to launch the camera node with a colored point cloud feature enabled using ROS 2.
-
-
-
-
-======================================================
-
-.. toctree::
- :maxdepth: 2
- :caption: This Section Covers:
-
-
- start_single_camera.md
-
-
-
-
-======================================================
-
-.. image:: ../image/product_h1.png
diff --git a/docs/source/3_start_single_camera/start_single_camera.md b/docs/source/3_start_single_camera/start_single_camera.md
deleted file mode 100755
index e961b3d8..00000000
--- a/docs/source/3_start_single_camera/start_single_camera.md
+++ /dev/null
@@ -1,267 +0,0 @@
-# Single camera
-
-This guide provides instructions on how to launch the camera node with a colored point cloud feature enabled using ROS 2.
-
-- Table of contents
- - [Start single camera](#start-single-camera)
- - [Visualizing data in rviz2](#visualizing-data-in-rviz2)
- - [Display view topics service](#display-view-topics-service)
- - [Example visualizations](#example-visualizations)
- - [TF tree diagram](#tf-tree-diagram)
-
-## Start single camera
-
-For how to compile and build methods, please refer to Chapter `Installation/Build_the_package `documentation and follow the steps provided
-[build_the_package](../2_installation/build_the_package.md)
-
-- Command to start single camera node
-
-On terminal 1: Launch camera node, example of gemini330 series :
-
-```bash
-cd ~/ros2_ws/
-source /opt/ros/$ROS_DISTRO/setup.bash
-source install/setup.bash
-ros2 launch orbbec_camera orbbec_camera.launch.py config_file_path:=gemini330_series.yaml
-```
-
-config_file_path:=gemini330_series.yaml means orbbec_camera.launch.py uses the parameters set in gemini330_series.yaml
-
-## Launch parameters
-
-For the definition and function of launch parameters, please refer to common.yaml. All open parameters are in common.yaml.The following is a partial common.yaml display:
-
-```yaml
-# config/*.yaml files are used to configure the camera parameters
----
-orbbec_ros:
- camera_parameters:
- general:
- # Camera model. upport product models by referencing config/*.yaml
- camera_model: "gemini330_series"
- # The configuration file for yaml params.
- config_file_path: "gemini330_series.yaml"
- # Log level. Supported levels are 'debug', 'info', 'warning' and 'error'. Default is 'none'.
- log_level: "none"
-
- deivce:
- # camera name, usually overwritten by launch file
- camera_name: "camera"
- # camera serial number, usually overwritten by launch file
- serial_number: ""
- # The USB port of the camera. This parameter is required when using multiple cameras.
- usb_port: ""
- # Number of devices. If multiple cameras are required, this parameter must be filled in launch file
- device_num: 1
- # Optional values: v4l2, libuvc
- uvc_backend: "libuvc"
- # Usually no need to change
- vendor_id: "0x2bc5"
-```
-
-Notice:If you run orbbec_camera.launch.py, the default combination of launch parameters used is common.yaml+gemini330_series.yaml, and the parameters in gemini330_series.yaml have higher priority than common.yaml
-
-## Visualizing data in rviz2
-
-- view_display launch
-
-`view_display.launch.py` supports loading different `.rviz` files through yaml configuration. For example, loading the default `.rviz` file to display four streams. config in different `.model.yaml `files through yaml configuration.
-
-On terminal 2:
-
-```bash
-cd ~/ros2_ws/
-source /opt/ros/$ROS_DISTRO/setup.bash
-source install/setup.bash
-ros2 launch orbbec_description view_display.launch.py camera_model:=gemini335_336
-```
-
-
-
-- view_model launch
-
-`view_model.launch.py` supports loading different `.model.yaml `files through yaml configuration. For example, loading the default model file to display gemini335_336 model .
-
-On terminal 3:
-
-```bash
-cd ~/ros2_ws/
-source /opt/ros/$ROS_DISTRO/setup.bash
-source install/setup.bash
-ros2 launch orbbec_description view_model.launch.py camera_model:=gemini335_336
-```
-
-
-
-- Or you can run rviz2 and configure it by yourself
-
-```bash
-cd ~/ros2_ws/
-source /opt/ros/$ROS_DISTRO/setup.bash
-source install/setup.bash
-rviz2
-```
-
-When runing rviz2, select the topic you wish to visualize from the list of published topics.
-Add the selected topic to rviz2 to start viewing the data.
-
-## Display view topic/service/param
-
-Once the camera node is running, it will publish data on several ROS topics. Below is a list of the available topics:
-By executing `ros2 topic list`, the following topics are displayed:
-
-On terminal 4:
-
-```bash
-ros2 topic list
-```
-
-Other , to display services/ parameters , example as follows
-
-```bash
-ros2 service list
-ros2 param list
-```
-
-Get device info:
-
-```bash
-ros2 service call /camera/get_device_info orbbec_camera_msgs/srv/GetDeviceInfo '{}'
-```
-
-Get SDK version:
-
-```bash
-ros2 service call /camera/get_sdk_version orbbec_camera_msgs/srv/GetString '{}'
-```
-
-Set auto exposure:
-
-```bash
-ros2 service call /camera/set_color_auto_exposure std_srvs/srv/SetBool '{data: false}'
-```
-
-Save point cloud:
-
-```bash
-ros2 service call /camera/save_point_cloud std_srvs/srv/Empty "{}"
-```
-
-
-
-## Example visualizations
-
-Here are examples of how the visualization might appear in rviz2:
-
-- **PointCloud Visualization**
-
-
-
-
-
-- **Image Data Visualization**
-
-
-
-
-
-## Aligning Depth to Color
-
-### 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:
-
- ```shell
- 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:
-
- ```shell
- 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:
-
-
-
-## Enabling and Visualizing Point Cloud
-
-### Enabling Depth Point Cloud
-
-#### Command to Enable Depth Point Cloud
-
-To activate the point cloud data stream for depth information, use the following command:
-
-```shell
-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:
-
-```shell
-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:
-
-
-
-## TF tree diagram
-
-To get the TF tree
-
-```bash
-ros2 run rqt_tf_tree rqt_tf_tree --force-discover
-```
-
-
-
-The TF tree diagram for the OrbbecSDK_ROS2 is illustrated below:
- ``
diff --git a/docs/source/4_start_multi_camera/multi_camera.rst b/docs/source/4_start_multi_camera/multi_camera.rst
deleted file mode 100755
index f6002251..00000000
--- a/docs/source/4_start_multi_camera/multi_camera.rst
+++ /dev/null
@@ -1,30 +0,0 @@
-.. 这一页是模块目录树
-
-.. .. image:: ../image/product_h4.png
-
-.. image:: ../image/product_h5.png
-
-======================================================
-
-Multiple cameras
-======================================================
-
- This section describes how to configure and use multiple Orbbec cameras simultaneously in a ROS 2 environment.
-
-
-
-======================================================
-
-.. toctree::
- :maxdepth: 2
- :caption: This Section Covers:
-
-
-
- start_multi_camera.md
-
-
-
-======================================================
-
-.. image:: ../image/product_h1.png
\ No newline at end of file
diff --git a/docs/source/4_start_multi_camera/start_multi_camera.md b/docs/source/4_start_multi_camera/start_multi_camera.md
deleted file mode 100755
index 5fafa46f..00000000
--- a/docs/source/4_start_multi_camera/start_multi_camera.md
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
-# Multiple cameras
-
-This section describes how to configure and use multiple Orbbec cameras simultaneously in a ROS 2 environment.
-
-- Table of contents
- - [Script to list connected cameras](#script-to-list-connected-cameras)
- - [Setup for multiple camera launch](#setup-for-multiple-camera-launch)
- - [Running the launch file](#running-the-launch-file)
- - [Configuring the TF tree for multiple cameras](#configuring-the-tf-tree-for-multiple-cameras)
- - [Example TF configuration for two cameras](#example-tf-configuration-for-two-cameras)
-
-
-## List connected cameras
-
-To determine which USB ports the cameras are connected to, you can execute the following command.
-This Command lists all Orbbec devices attached to the system along with their USB port and serial number:
-
-```bash
-$ ros2 run orbbec_camera list_devices_node
-
-```
-
-As follows:
-
-```
-USB port_id: 4-1.1-3
-Modified USB port_id: 4-1.1
-[INFO]serial: CP7X54P0004D
-[INFO]usb port: 4-1.1
-[INFO]usb connect type: USB3.2
-USB port_id: 4-1.2-5
-Modified USB port_id: 4-1.2
-[INFO]serial: CP7X54P000AA
-[INFO]usb port: 4-1.2
-[INFO]usb connect type: USB3.2
-```
-
-From the log above, it appears that the two USB cameras you are connected to are using USB ports **4-1.1 and 4-1.2**.
-
-## Setup for multiple camera launch
-
-You can launch multiple cameras by specifying different USB ports for each camera. You can refer to orbbec_multicamera.launch.py to implement the multicamera launch script you need..
-
-## Running the launch file
-
-To execute the launch configuration for multiple cameras, use the command:
-
-```
-ros2 launch orbbec_camera orbbec_multicamera.launch.py config_file_path:=multicamera.yaml
-```
-
-**Note:**
-
-1. Multiple devices default config reference config/multicamera.yaml
-2. Multiple cameras synced config reference config/multicamera_synced.yaml
-
-## Example TF configuration for two cameras
-
-When using multiple cameras, it's essential to calibrate them and publish a static TF tree for each camera. The following Python script configures the TF tree based on your calibration results:
-
-```python
-from launch import LaunchDescription
-from launch_ros.actions import Node
-
-# Define the extrinsics for each camera (x, y, z, roll, pitch, yaw)
-camera_01_transform = ['0.1', '0', '0.2', '0', '0', '1.57'] # Example parameters
-camera_02_transform = ['-0.1', '0', '0.2', '0', '0', '-1.57'] # Example parameters
-
-def generate_launch_description():
- ld = LaunchDescription([
- Node(
- package='tf2_ros',
- executable='static_transform_publisher',
- name='camera_01_tf',
- arguments=camera_01_transform + ['base_link', 'camera_01_link'],
- output='screen'
- ),
- Node(
- package='tf2_ros',
- executable='static_transform_publisher',
- name='camera_02_tf',
- arguments=camera_02_transform + ['base_link', 'camera_02_link'],
- output='screen'
- )
- ])
-
- return ld
-
-```
-
-Save this configuration as `multi_camera_tf.launch.py` in the launch directory of the Orbbec camera package. To run it, use:
-
-```bash
-ros2 launch orbbec_camera multi_camera_tf.launch.py
-```
diff --git a/docs/source/5_advanced/advanced.rst b/docs/source/5_advanced/advanced.rst
deleted file mode 100755
index a3199c7a..00000000
--- a/docs/source/5_advanced/advanced.rst
+++ /dev/null
@@ -1,35 +0,0 @@
-.. 这一页是模块目录树
-
-.. .. image:: ../image/product_h9.png
-
-.. image:: ../image/product_h5.png
-
-======================================================
-
-
-Advanced
-======================================================
-
-This section explores the advanced usage of Orbbec SDK ROS2, specifically tailored for product application scenarios. It offers comprehensive guidance on how to fully harness the SDK's capabilities, enabling you to unlock the potential of your robotics projects. Discover the optimal ways to enhance your projects using the cutting-edge features provided by Orbbec SDK ROS2 environments.
-
-
-======================================================
-
-.. toctree::
- :maxdepth: 2
- :caption: This Section Covers:
-
-
- multi_camera_sync.md
- component_node.md
- zero_copy.md
- gdb_debug.md
- backward_ros.md
- cyclonedds_tuning.md
- fastdds_tuning.md
-
-
-
-======================================================
-
-.. image:: ../image/product_h1.png
\ No newline at end of file
diff --git a/docs/source/5_advanced/backward_ros.md b/docs/source/5_advanced/backward_ros.md
deleted file mode 100755
index 8312b723..00000000
--- a/docs/source/5_advanced/backward_ros.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# Backward ros
-
-To use the `backward_ros` package for debugging your ROS2 project named `OrbbecSDK_ROS2`, you can follow these steps:
-
-## Add `backward_ros` as a dependency:
-
- In your `package.xml`, add `backward_ros` as a dependency:
-
-xml
-
-```
-backward_ros
-```
-
-## Configure `CMakeLists.txt`:
-
- In your `CMakeLists.txt`, find the `backward_ros` package and link it to your executable:
-
-cmake
-
-```
-find_package(backward_ros REQUIRED)
-include_directories(${backward_INCLUDE_DIRS})
-add_executable(your_node src/your_node.cpp)
-target_link_libraries(your_node ${backward_LIBRARIES})
-```
-
-## Build your project with debug information:
-
- Use `colcon build` with the `RelWithDebInfo` or `Debug` option to ensure that your executable is built with debug information:
-
-```
-colcon build --cmake-args '-DCMAKE_BUILD_TYPE=RelWithDebInfo'
-```
-
-## Run your node:
-
- After building, you can run your node as you normally would with ROS 2. If your node crashes, `backward_ros` will automatically generate a stack trace with detailed information, including line numbers, to help you debug the issue.
-
-## Example `backward_ros`
-
- When your program crashes, you can go to the Log folder under the workspace to find the stack trace of the crash.
-
-
diff --git a/docs/source/5_advanced/component_node.md b/docs/source/5_advanced/component_node.md
deleted file mode 100755
index e8a75ad6..00000000
--- a/docs/source/5_advanced/component_node.md
+++ /dev/null
@@ -1,157 +0,0 @@
-# Component node
-
-In ROS2, component nodes enable efficient resource management and modularity by allowing multiple nodes to be loaded into a single process, called a component container. Here’s an overview of setting up a component node and adding it to a container, both for a single node and through a `launch.py` file.
-
-### Creating a component node
-
-To define a node as a component, the following steps are required:
-
-1. **Create a node class**: The node class should inherit from `rclcpp::Node` (C++) or `Node` (Python) and implement the core functionalities within it.
-2. **Add plugin export**: In `CMakeLists.txt`, export the node as a plugin by adding it to a component library using `rclcpp_components`. For example:
-
- ```cmake
- # CMakeLists.txt
- find_package(rclcpp_components REQUIRED)
-
- add_library(my_component SHARED src/my_component.cpp)
- target_link_libraries(my_component PUBLIC rclcpp::rclcpp)
- ament_target_dependencies(my_component rclcpp rclcpp_components)
-
- rclcpp_components_register_nodes(my_component "mypackage::MyComponent")
- ```
-3. **Declare the plugin in package.xml**: Add the node as a plugin in the package manifest:
-
-```xml
-
-
-
-
-
-```
-
-### Loading a single node into a component container
-
-To load a node directly into a component container, use the ComponentManager node. Run the command:
-
-```bash
- ros2 run rclcpp_components component_container
-```
-
-Then load the component into this container with the load_component service:
-
-```bash
- ros2 component load /ComponentManager mypackage my_component
-```
-
-Replace /ComponentManager with the actual name of your container, if different.
-3. Adding Component Nodes via a Launch File
-In launch.py, you can define a component container and load nodes into it. Here’s an example launch.py file:
-
-```python
-from launch import LaunchDescription
-from launch_ros.actions import ComposableNodeContainer
-from launch_ros.descriptions import ComposableNode
-
-def generate_launch_description():
- container = ComposableNodeContainer(
- name='my_container',
- namespace='',
- package='rclcpp_components',
- executable='component_container_mt', # use 'component_container' for single-threaded
- composable_node_descriptions=[
- ComposableNode(
- package='mypackage',
- plugin='mypackage::MyComponent',
- name='my_component'
- ),
- ComposableNode(
- package='another_package',
- plugin='another_package::AnotherComponent',
- name='another_component'
- )
- ],
- output='screen',
- )
-
- return LaunchDescription([container])
-```
-
-**explanation**
-
-- ComposableNodeContainer: This creates a component container to hold nodes. Use component_container_mt for multi-threading or component_container for - single-threaded operation.
-- ComposableNode: Specifies each component to load, with arguments for the package name, plugin type, and node name.
-- output: Set to 'screen' to display output in the terminal.
- Running the Launch File
- To run the launch file, use the command:
-
-```bash
-ros2 launch mypackage my_launch_file.launch.py
-```
-
-This starts the component container and loads the specified nodes into it, enabling efficient component management in ROS2.
-
-### Loading a launch.py into a component container
-
-```python
-from launch import LaunchDescription
-from launch.actions import DeclareLaunchArgument
-from launch.conditions import UnlessCondition
-from launch_ros.actions import Node, IncludeLaunchDescription
-from launch.launch_description_sources import PythonLaunchDescriptionSource
-import os
-
-def generate_launch_description():
- bringup_dir = os.path.join(get_package_share_directory('mypackage'))
-
- # Define the shared container name
- shared_container_name = "shared_nvblox_container"
-
- # Create the shared component container
- shared_container = Node(
- name=shared_container_name,
- package='rclcpp_components',
- executable='component_container_mt', # or 'component_container' for single-threaded
- output='screen'
- )
-
- # Include another launch file to attach nodes to the shared container
- orbbec_launch = IncludeLaunchDescription(
- PythonLaunchDescriptionSource([os.path.join(
- bringup_dir, 'launch', 'sensors', 'orbbec.launch.py')]),
- launch_arguments={
- 'attach_to_shared_component_container': 'True',
- 'component_container_name': shared_container_name
- }.items(),
- condition=UnlessCondition(LaunchConfiguration('from_bag'))
- )
-
- # Declare any required launch arguments
- from_bag_arg = DeclareLaunchArgument(
- 'from_bag',
- default_value='false',
- description='Condition to use data from a bag file'
- )
-
- # Return LaunchDescription with shared container and nodes attached
- return LaunchDescription([from_bag_arg, shared_container, orbbec_launch])
-```
-
-**Explanation**
-
-- **shared_container_name**: The name of the shared container, which other nodes can reference for attaching.
-- **shared_container**: Defines the shared container as a `Node`, using `component_container_mt` for multi-threading. This container will host multiple component nodes.
-- **IncludeLaunchDescription**: Loads and attaches nodes from another launch file (in this example, orbbec.launch.py) to the shared container.
- - launch_arguments: The arguments passed to the included launch file.
- - **attach_to_shared_component_container**: Set to `'True'`, specifying that nodes in `orbbec.launch.py` should be added to the existing shared container.
- - **component_container_name**: References the `shared_container_name`, linking nodes from the included launch file to the shared container.
- - **condition**: Only includes the `orbbec.launch.py` nodes in the shared container if the `from_bag` parameter is `false`.
-
-**Running the launch File**
-
-Execute the following command to start the launch file:
-
-```
-ros2 launch mypackage my_main_launch_file.launch.py
-```
-
-This command will start the shared component container and attach the nodes specified in `orbbec.launch.py` to it if the `from_bag` condition is not met.
diff --git a/docs/source/5_advanced/cyclonedds_tuning.md b/docs/source/5_advanced/cyclonedds_tuning.md
deleted file mode 100755
index ae14694d..00000000
--- a/docs/source/5_advanced/cyclonedds_tuning.md
+++ /dev/null
@@ -1,56 +0,0 @@
-# CycloneDDS tuning
-
-● Edit cyclonedds configuration file
-
-```bash
-sudo gedit /etc/cyclonedds/config.xml
-```
-
-Add
-
-```xml
-
-
-
-
- lo
- false
-
-
- 16MB
-
-
- auto
- 30
-
-
-
-
-
-
-```
-
-● Set the environment variables, add to `.zshrc` or `.bashrc`
-
-```bash
-export ROS_DOMAIN_ID=42 # Numbers from 0 to 232
-export ROS_LOCALHOST_ONLY=1
-export CYCLONEDDS_URI=file:///etc/cyclonedds/config.xml
-```
-
-Tips:to understand why the maximum ROS_DOMAIN_ID is 232, please visit [The ROS DOMAIN ID](https://docs.ros.org/en/humble/Concepts/About-Domain-ID.html)
-
-● Increase UDP receive buffer size
-Edit
-
-```bash
-/etc/sysctl.d/10-cyclone-max.conf
-```
-
-Add
-
-```bash
-net.core.rmem_max=2147483647
-net.core.rmem_default=2147483647
-```
diff --git a/docs/source/5_advanced/gdb_debug.md b/docs/source/5_advanced/gdb_debug.md
deleted file mode 100755
index d5eecce9..00000000
--- a/docs/source/5_advanced/gdb_debug.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# GDB debug
-
-Debugging ROS 2 programs with GDB involves several steps:
-
-## Config debug
-
-Set `CMAKE_BUILD_TYPE` to `Debug` in ` orbbec_camera/CMakeLists.txt`
-
-```
-set(CMAKE_BUILD_TYPE Debug)
-```
-
-## Use xterm terminal to open gdb debugging
-
-Install xterm
-
-```bash
-sudo apt install xterm
-```
-
-Take orbbec_camera.launch.py as an example to use xterm terminal to open gdb
-
-```python
- def create_composable_node(camera_name, params, use_intra_process):
- common_arguments = [{'use_intra_process_comms': use_intra_process}]
- composable_node = ComposableNode(
- namespace=camera_name,
- name=camera_name,
- package=default_package_name,
- plugin='orbbec_camera::OBCameraNodeDriver',
- parameters=params,
- #extra_arguments=[{'use_intra_process_comms': LaunchConfiguration("use_intra_process_comms")}],
- extra_arguments=common_arguments,
- prefix=['xterm -e gdb -ex run --args'],
- )
- return composable_node
-```
diff --git a/docs/source/5_advanced/image/multi_camera_sync/1731474090291.png b/docs/source/5_advanced/image/multi_camera_sync/1731474090291.png
deleted file mode 100644
index 730aed4e4057aefb206c8bda6772aa3b014c982e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 75366
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