From a7ff7d645375b2bd3b79199e66963cfb78dee433 Mon Sep 17 00:00:00 2001 From: Michael Ferguson Date: Tue, 6 Feb 2024 18:00:53 -0500 Subject: [PATCH] migrate image_pipeline docs (#929) * Migrates image_pipeline overview page * Migrates CameraInfo wiki page * Adds links to the other packages in this stack * Updates depth_image_proc and image_proc to have the overview page properly named and in the TOC --- depth_image_proc/doc/index.rst | 5 +- image_pipeline/doc/camera_info.rst | 111 ++++++++++++ image_pipeline/doc/conf.py | 193 +++++++++++++++++++++ image_pipeline/doc/images/CameraCoords.png | Bin 0 -> 9925 bytes image_pipeline/doc/images/CameraInfo.png | Bin 0 -> 37218 bytes image_pipeline/doc/index.rst | 45 +++++ image_pipeline/package.xml | 1 + image_pipeline/rosdoc2.yaml | 20 +++ image_proc/doc/index.rst | 5 +- 9 files changed, 376 insertions(+), 4 deletions(-) create mode 100644 image_pipeline/doc/camera_info.rst create mode 100644 image_pipeline/doc/conf.py create mode 100644 image_pipeline/doc/images/CameraCoords.png create mode 100644 image_pipeline/doc/images/CameraInfo.png create mode 100644 image_pipeline/doc/index.rst create mode 100644 image_pipeline/rosdoc2.yaml diff --git a/depth_image_proc/doc/index.rst b/depth_image_proc/doc/index.rst index dd83269cc..d581149b2 100644 --- a/depth_image_proc/doc/index.rst +++ b/depth_image_proc/doc/index.rst @@ -1,5 +1,5 @@ -depth_image_proc -================ +Overview +======== ``depth_image_proc`` provides basic processing for depth images, much as ``image_proc`` does for traditional 2D images. The two packages are @@ -28,6 +28,7 @@ For an example of ``depth_image_proc`` in practice, examine the contents of .. toctree:: :maxdepth: 2 + self components tutorials changes diff --git a/image_pipeline/doc/camera_info.rst b/image_pipeline/doc/camera_info.rst new file mode 100644 index 000000000..84a1fee1f --- /dev/null +++ b/image_pipeline/doc/camera_info.rst @@ -0,0 +1,111 @@ +.. _Camera Info: + +Camera Info +=========== + +Camera Coordinate System +------------------------ +Below is a diagram of the camera coordinate system assumed by the +CameraInfo message. It is a right-handed system, with the world X +and Y aligned with the image x and y. This is the same coordinate +system used in OpenCV. It differs from the coordinate system of +Harley and Zisserman, which has Z forward, Y up, and X to the +left (looking towards +Z). + +|coords| + +.. |coords| image:: images/CameraCoords.png + +Derivation Diagram +------------------ + +Below is a diagram of the various images that are conceptually +derivable from the CameraInfo message. The boxed variables are +present in this message. + +|camera_info| + +.. |camera_info| image:: images/CameraInfo.png + +Projection Onto the Original Image +---------------------------------- +Starting with an initial 3D point X, the position of the corresponding +image point is found by going right-to-left in the upper half of the +diagram. The process is summarized by the following equations. + +.. code-block:: text + + X' = [R,t]X transform + sx = X' projection + x* = d(x) distortion + q = Kx* pixel coordinates + +This process uses the K camera matrix and D distortion vector from CameraInfo. +Ignoring the transform T, you can find the projection of a point X' into the +original camera frame using these equations. First, the 3D point X' is +projected onto the normalized, undistorted image via a projection operation +(division by Z). Then the distortion coefficients are used in the function +d() to move the point to its distorted position, still in a normalized image. +Finally, the normalized image is converted to a pixel-coordinate image by +applying the camera matrix to each image point. + +Rectification +------------- +Rectification is the process of transforming the input image into an output +image with the distortion corrected, and optionally the normalized image plane +transformed by rotation, optinain-image-plane translation, and optionally +in-image-plane scale. + +Simple Monocular Rectification +------------------------------ +In this case, there is a monocular device with distortion correction only. +To transform a pixel in the input image into one in the output image, it is +sent through the K - D - R - K' series of transformations. K - D gets to the +normalized, undistorted image; the rotation R is the identity because we +don't want to rotate the normalized undistorted image; and then K' converts +back to pixel coordinates in the output image. In this case, since there is +no need of in-image-plane translation, or scaling from the original image, +so K = K' , and only the K and D elements of CameraInfo are needed. +The ``camera_calibration`` package does monocular calibration to get K' +using OpenCV's getOptimalNewCameraMatrix() function with argument +'alpha'=0.0 that cause K' ≠ K. + +Projection onto the output image is by the P matrix, which is formed from K' +and the optional rotation and translation, in this case the identity and 0, +respectively. So if K' = K, P is redundant information, and could be formed +directly from K. + +Stereo and Complex Monocular Rectification +------------------------------------------ +After getting normalized undistorted image using K and D, here we apply a +transformation to the normalized, undistorted image: each points on this +image is rotated by R and then is passed to K' get the correspondent pixel +coordinate on the output image which is translated and scaled by K' with +respect to the original image. This transformation is important, for example, +in aligning two images of a stereo pair to lie in the same plane and have +coincident epipolar lines. + +The transform of a pixel from the input to output image is the same as in +the simple monocular case, except that R need not be the identity, and K' +need not be equal to K. As a consequence, the normalized undistorted image +can be rotated in 3D space, and the output image can be translated, scaled +relative to the original image. + +The projection matrix has an additional parameter, a translational offset t. +This parameter is used in the right stereo camera to reflect its external +position relative to the left camera. Since the point X in left camera +frame is transformed to the right camera by [I|t], that means the position +of the left camera frame origin with respect to the right camera frame is +given by the vector t in the right camera frame. + +Putting this all together, the projection matrix for the rectified output +image is given by: + +.. code-block:: text + + P = K' [I|t]. + +Note that in this case the internal camera parameters of the output image, +K', can be different from the input image, so P cannot be formed just +from K and D. And the I is the 3x3 rotation matrix representing left +camera frame in the right, not the identity. diff --git a/image_pipeline/doc/conf.py b/image_pipeline/doc/conf.py new file mode 100644 index 000000000..71dfb1c5e --- /dev/null +++ b/image_pipeline/doc/conf.py @@ -0,0 +1,193 @@ +# Copyright 2024 Open Source Robotics Foundation, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# -*- coding: utf-8 -*- +# +# Configuration file for the Sphinx documentation builder. +# +# This file does only contain a selection of the most common options. For a +# full list see the documentation: +# http://www.sphinx-doc.org/en/master/config + +# -- 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('.')) + + +# -- Project information ----------------------------------------------------- + +project = 'image_pipeline' +copyright = '2008-2024, Open Source Robotics Foundation, Inc.' # noqa +author = 'Open Source Robotics Foundation, Inc.' + +# The short X.Y version +version = '' +# The full version, including alpha/beta/rc tags +release = '3.2.1' + + +# -- General configuration --------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', + 'sphinx.ext.doctest', + 'sphinx.ext.coverage', + 'sphinx_rtd_theme', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# 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 = None + +# 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 = [] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = None + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinx_rtd_theme' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# 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 = [] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# The default sidebars (for documents that don't match any pattern) are +# defined by theme itself. Builtin themes are using these templates by +# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', +# 'searchbox.html']``. +# +# html_sidebars = {} + + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = 'image_pipeline_doc' + + +# -- Options for LaTeX output ------------------------------------------------ + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + + +# -- Options for manual page output ------------------------------------------ + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'image_pipeline', 'image_pipeline Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ---------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'image_pipeline', 'image_pipeline Documentation', + author, 'image_pipeline', 'ROS 2 components for image processing.', + 'Miscellaneous'), +] + + +# -- Options for Epub output ------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + + +# -- Extension configuration ------------------------------------------------- + +autoclass_content = 'both' + +autodoc_default_options = { + 'members': True, # document members + 'undoc-members': True, # also document members without documentation +} diff --git a/image_pipeline/doc/images/CameraCoords.png b/image_pipeline/doc/images/CameraCoords.png new file mode 100644 index 0000000000000000000000000000000000000000..82d30ce5b08256794347dc9a7119a6276efb5562 GIT binary patch literal 9925 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 CJ136- literal 0 HcmV?d00001 diff --git a/image_pipeline/doc/images/CameraInfo.png b/image_pipeline/doc/images/CameraInfo.png new file mode 100644 index 0000000000000000000000000000000000000000..655622da903fb59b1d2fe2001f2ff7f2feeb2bac GIT binary patch literal 37218 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 + depth_image_proc <../depth_image_proc/index.html#http://> + image_proc <../image_proc/index.html#http://> + image_publisher <../image_publisher/index.html#http://> + image_rotate <../image_rotate/index.html#http://> + image_view <../depth/image_view/index.html#http://> + stereo_image_proc <../depth/stereo_image_proc/index.html#http://> + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`search` diff --git a/image_pipeline/package.xml b/image_pipeline/package.xml index 06f421926..46eae3409 100644 --- a/image_pipeline/package.xml +++ b/image_pipeline/package.xml @@ -34,5 +34,6 @@ ament_cmake + rosdoc2.yaml diff --git a/image_pipeline/rosdoc2.yaml b/image_pipeline/rosdoc2.yaml new file mode 100644 index 000000000..85ac4c03c --- /dev/null +++ b/image_pipeline/rosdoc2.yaml @@ -0,0 +1,20 @@ +type: 'rosdoc2 config' +version: 1 + +--- + +settings: + generate_package_index: false + always_run_doxygen: false + enable_breathe: false + enable_exhale: false + always_run_sphinx_apidoc: false + override_build_type: 'ament_python' + python_source: 'doc' + +builders: + - sphinx: { + name: 'image_pipeline', + sphinx_sourcedir: 'doc', + output_dir: '' + } \ No newline at end of file diff --git a/image_proc/doc/index.rst b/image_proc/doc/index.rst index 139100e77..4e764ca48 100644 --- a/image_proc/doc/index.rst +++ b/image_proc/doc/index.rst @@ -1,5 +1,5 @@ -image_proc -========== +Overview +======== This package contains a number of ROS 2 components and nodes for image processing. @@ -21,6 +21,7 @@ The images above were produced using the tutorial :ref:`Using image_proc Launch .. toctree:: :maxdepth: 2 + self components tutorials changes