Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve Documentation - Fix code links and improve tutorial layout #6321

Merged
merged 33 commits into from
Sep 26, 2023
Merged
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
bf4509e
Correct code tagging in interactive_visualization tutorial.
saurabheights Aug 17, 2023
6fe1f9e
Highlight the methods that are being introduced at the start.
saurabheights Aug 17, 2023
dfd76a7
Non-Blocking VIZ - Add add_geometry step which is not optional.
saurabheights Aug 18, 2023
efabadf
Non-Blocking VIZ - Split main code to simpler function and fix code b…
saurabheights Aug 18, 2023
a4ea39e
Fix Typos
saurabheights Aug 18, 2023
3a9da1f
Update docs with new argument values.
saurabheights Aug 18, 2023
9fc5a68
Fix grammar and dedent for overly indented code
saurabheights Aug 18, 2023
4f88a16
Integrate_Custom - Optimize imports, add early return, use f-strings …
saurabheights Aug 18, 2023
91778f2
Fix default value and remove BooleanOptionalAction, its only availabl…
saurabheights Aug 18, 2023
de4f46a
Disable use of cuda for tensor based reconstruction
saurabheights Aug 18, 2023
e968505
Customized Integration - Fix code lines
saurabheights Aug 18, 2023
ee7b6ae
Ray Casting - Fix code lines
saurabheights Aug 18, 2023
5ba3035
Dense Slam - Fix code lines and slight grammar.
saurabheights Aug 18, 2023
e1ed485
Fix some f-strings and extra parantheses
saurabheights Aug 18, 2023
8295331
Make Fragments - Fix code lines
saurabheights Aug 18, 2023
d65fb67
Code for batch processing was removed long back in #521 in 2018
saurabheights Aug 18, 2023
776bb99
Register Fragments - Fix code docs
saurabheights Aug 18, 2023
9ae5d23
Register fragments - Fix code lines
saurabheights Aug 18, 2023
9f405b3
Integrate Scene - Fix code lines
saurabheights Aug 18, 2023
0724b5a
Change layout of tutorials - only done at top level.
saurabheights Aug 18, 2023
22de7e3
Add new lines before bullet/numbered list, else list rendering fails.
saurabheights Aug 18, 2023
2f9d0c2
Bugfix - Fix code lines for Integration and add filename as done in v…
saurabheights Aug 28, 2023
a522ed8
Remove python version 3.6 as supported versions by open3d.
saurabheights Aug 28, 2023
fc04d88
Fix line number using lineno-match directive.
saurabheights Aug 30, 2023
cd5cc98
Fix some typos detected automatically.
saurabheights Aug 30, 2023
0f2439d
Replace prepend with lineno-match
saurabheights Aug 30, 2023
80427df
Correct filename documented in the files
saurabheights Aug 31, 2023
9c2840e
Fix lineno-start.
saurabheights Aug 31, 2023
43ededc
Merge branch 'master' into khanduja/fix_docs_2
ssheorey Sep 13, 2023
3f10bb3
Fix PR comments
saurabheights Sep 16, 2023
3a0a6e9
Revert "Code for batch processing was removed long back in #521 in 2018"
saurabheights Sep 17, 2023
a5b5aff
Correct batch processing section documentation and native multiproces…
saurabheights Sep 20, 2023
3d345e6
Use native multiprocessing for register fragments and refinement of r…
saurabheights Sep 22, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ For more, please visit the [Open3D documentation](http://www.open3d.org/docs).
## Python quick start

Pre-built pip packages support Ubuntu 18.04+, macOS 10.15+ and Windows 10+
(64-bit) with Python 3.6-3.10.
(64-bit) with Python 3.7-3.10.

```bash
# Install
Expand Down
2 changes: 1 addition & 1 deletion cpp/open3d/core/AdvancedIndexing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ void AdvancedIndexPreprocessor::RunPreprocess() {
// If the indexed_shape_ contains a dimension of size 0 but the
// replacement shape does not, the index is out of bounds. This is because
// there is no valid number to index an empty tensor.
// Normally, out of bounds is detected in the advanded indexing kernel. We
// Normally, out of bounds is detected in the advanced indexing kernel. We
// detected here for more helpful error message.
auto contains_zero = [](const SizeVector& vals) -> bool {
return std::any_of(vals.begin(), vals.end(),
Expand Down
4 changes: 2 additions & 2 deletions cpp/open3d/core/AdvancedIndexing.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ class AdvancedIndexPreprocessor {
const Tensor& tensor, const std::vector<Tensor>& index_tensors);

/// Expand all tensors to the broadcasted shape, 0-dim tensors are ignored.
/// Thorws exception if the common broadcasted shape does not exist.
/// Throws exception if the common broadcasted shape does not exist.
static std::pair<std::vector<Tensor>, SizeVector>
ExpandToCommonShapeExceptZeroDim(const std::vector<Tensor>& index_tensors);

Expand Down Expand Up @@ -127,7 +127,7 @@ class AdvancedIndexer {
if (indexed_shape.size() != indexed_strides.size()) {
utility::LogError(
"Internal error: indexed_shape's ndim {} does not equal to "
"indexd_strides' ndim {}",
"indexed_strides' ndim {}",
indexed_shape.size(), indexed_strides.size());
}
num_indices_ = indexed_shape.size();
Expand Down
2 changes: 1 addition & 1 deletion cpp/open3d/geometry/BoundingVolume.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class AxisAlignedBoundingBox;
/// \brief A bounding box oriented along an arbitrary frame of reference.
///
/// The oriented bounding box is defined by its center position, rotation
/// maxtrix and extent.
/// matrix and extent.
class OrientedBoundingBox : public Geometry3D {
public:
/// \brief Default constructor.
Expand Down
2 changes: 1 addition & 1 deletion cpp/open3d/geometry/VoxelGrid.h
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ class VoxelGrid : public Geometry3D {
public:
/// Size of the voxel.
double voxel_size_ = 0.0;
/// Coorindate of the origin point.
/// Coordinate of the origin point.
Eigen::Vector3d origin_ = Eigen::Vector3d::Zero();
/// Voxels contained in voxel grid
std::unordered_map<Eigen::Vector3i,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ namespace impl {
/// \param texture_alignment The texture alignment in bytes. This is used
/// for allocating segments within the temporary memory.
///
/// \param filter_backrop Output array for the computed filter gradient
/// \param filter_backprop Output array for the computed filter gradient
/// with shape [depth,height,width, inp channels, out channels]
///
/// \param filter_dims The sizes of the filter dimensions. The size of
Expand Down
2 changes: 1 addition & 1 deletion cpp/open3d/ml/tensorflow/misc/BuildSpatialHashTableOps.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ The following example shows how **build_spatial_hash_table** and

radius = 1.0

# build the spatial hash table for fixex_radius_search
# build the spatial hash table for fixed_radius_search
table = ml3d.ops.build_spatial_hash_table(points,
radius,
points_row_splits=torch.LongTensor([0,5]),
Expand Down
2 changes: 1 addition & 1 deletion cpp/open3d/t/geometry/BoundingVolume.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ OrientedBoundingBox::OrientedBoundingBox(const core::Tensor &center,
utility::LogError(
"Invalid oriented bounding box. Please make sure the values of "
"extent are all positive and the rotation matrix is "
"othogonal.");
"orthogonal.");
}
}

Expand Down
4 changes: 2 additions & 2 deletions cpp/open3d/t/geometry/BoundingVolume.h
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ class AxisAlignedBoundingBox : public Geometry, public DrawableGeometry {
const utility::optional<core::Tensor> &center = utility::nullopt);

/// \brief Add operation for axis-aligned bounding box.
/// The device of ohter box must be the same as the device of the current
/// The device of other box must be the same as the device of the current
/// box.
AxisAlignedBoundingBox &operator+=(const AxisAlignedBoundingBox &other);

Expand Down Expand Up @@ -223,7 +223,7 @@ class AxisAlignedBoundingBox : public Geometry, public DrawableGeometry {
/// \brief A bounding box oriented along an arbitrary frame of reference.
///
/// - (center, rotation, extent): The oriented bounding box is defined by its
/// center position, rotation maxtrix and extent.
/// center position, rotation matrix and extent.
/// - Usage
/// - OrientedBoundingBox::GetCenter()
/// - OrientedBoundingBox::SetCenter(const core::Tensor &center)
Expand Down
2 changes: 1 addition & 1 deletion cpp/open3d/visualization/gui/Window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -707,7 +707,7 @@ Widget::DrawResult DrawChild(DrawContext& dc,
const char* name,
std::shared_ptr<Widget> child,
Mode mode) {
// Note: ImGUI's concept of a "window" is really a moveable child of the
// Note: ImGUI's concept of a "window" is really a movable child of the
// OS window. We want a child to act like a child of the OS window,
// like native UI toolkits, Qt, etc. So the top-level widgets of
// a window are drawn using ImGui windows whose frame is specified
Expand Down
6 changes: 3 additions & 3 deletions docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,13 @@ Open3D: A Modern Library for 3D Data Processing
:maxdepth: 2
:caption: Tutorial

tutorial/core/index
tutorial/geometry/index
tutorial/t_geometry/index
tutorial/data/index
tutorial/visualization/index
tutorial/pipelines/index
tutorial/t_pipelines/index
tutorial/visualization/index
tutorial/core/index
tutorial/data/index
tutorial/reconstruction_system/index
tutorial/t_reconstruction_system/index
tutorial/sensor/index
Expand Down
4 changes: 4 additions & 0 deletions docs/jupyter/core/hashmap.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -88,19 +88,23 @@
"Next we show how to insert a batch of (key, value) pairs. You'll need to prepare two tensors:\n",
"\n",
"The `keys` tensor contains all keys. \n",
"\n",
"- The `keys` tensor must be on the same device as the hash map. \n",
"- The shape of the `keys` tensor is `key_elment_shape` with `N` prefixed to the front. \n",
"\n",
"For example \n",
" \n",
"1. if `key_element_shape == ()`, `keys.shape == (N,)`; \n",
"2. if `key_element_shape == (3,)`, `keys.shape == (N, 3).`; \n",
"3. if `key_element_shape == (8, 8, 8)`, `keys.shape == (N, 8, 8, 8).`\n",
" \n",
"The `vals` tensor contains all values. \n",
" \n",
"- The `vals` tensor must be on the same device as the hash map. \n",
"- The shape of the `vals` tensor is `val_elment_shape` with `N` prefixed to the front. \n",
"\n",
"For example \n",
"\n",
"1. if `val_elment_shape == ()`, `vals.shape == (N,)`; \n",
"2. if `val_elment_shape == (3,)`, `vals.shape == (N, 3).`;\n",
"3. if `val_elment_shape == (8, 8, 8)`, `vals.shape == (N, 8, 8, 8).`"
Expand Down
4 changes: 2 additions & 2 deletions docs/tutorial/reconstruction_system/integrate_scene.rst
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ Integrate RGBD frames

.. literalinclude:: ../../../examples/python/reconstruction_system/integrate_scene.py
:language: python
:lineno-start: 38
:lines: 27,40-72
:pyobject: scalable_integrate_rgb_frames
saurabheights marked this conversation as resolved.
Show resolved Hide resolved
:linenos:
:lineno-match:

This function first reads the alignment results from both
:ref:`reconstruction_system_make_fragments` and
Expand Down
29 changes: 9 additions & 20 deletions docs/tutorial/reconstruction_system/make_fragments.rst
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ Register RGBD image pairs

.. literalinclude:: ../../../examples/python/reconstruction_system/make_fragments.py
:language: python
:lineno-start: 46
:lines: 27,47-76
:pyobject: register_one_rgbd_pair
:linenos:
:lineno-match:

The function reads a pair of RGBD images and registers the ``source_rgbd_image``
to the ``target_rgbd_image``. The Open3D function ``compute_rgbd_odometry`` is
Expand All @@ -45,9 +45,9 @@ Multiway registration

.. literalinclude:: ../../../examples/python/reconstruction_system/make_fragments.py
:language: python
:lineno-start: 76
:lines: 27,77-123
:pyobject: make_posegraph_for_fragment
:linenos:
:lineno-match:

This script uses the technique demonstrated in
:ref:`/tutorial/pipelines/multiway_registration.ipynb`. The function
Expand All @@ -61,9 +61,9 @@ function ``optimize_posegraph_for_fragment``.

.. literalinclude:: ../../../examples/python/reconstruction_system/optimize_posegraph.py
:language: python
:lineno-start: 51
:lines: 27,52-63
:pyobject: optimize_posegraph_for_fragment
:linenos:
:lineno-match:

This function calls ``global_optimization`` to estimate poses of the RGBD images.

Expand All @@ -74,24 +74,13 @@ Make a fragment

.. literalinclude:: ../../../examples/python/reconstruction_system/make_fragments.py
:language: python
:lineno-start: 124
:lines: 27,125-146
:pyobject: integrate_rgb_frames_for_fragment
:linenos:
:lineno-match:

Once the poses are estimates, :ref:`/tutorial/pipelines/rgbd_integration.ipynb`
Once the poses are estimated, :ref:`/tutorial/pipelines/rgbd_integration.ipynb`
is used to reconstruct a colored fragment from each RGBD sequence.

Batch processing
``````````````````````````````````````

.. literalinclude:: ../../../examples/python/reconstruction_system/make_fragments.py
:language: python
:lineno-start: 181
:lines: 27,182-205
:linenos:

The main function calls each individual function explained above.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we keep this section? It refers to the run() function in make_fragments.py that calls all the previous functions.

Copy link
Contributor Author

@saurabheights saurabheights Sep 16, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ssheorey The reason I removed this is because the run method calls only process_single_fragment, however process_single_fragment is never discussed in documentation before. Also, run method focuses on use of multiprocessing to speedup the code, but thats not really where open3d documentation focus is.

I dived deeper into git history and originally process_single_fragment used to be process_fragments which did all prep before calling previous functions for each fragment. It was documentated in Batch Processing section - https://github.com/isl-org/Open3D/pull/521/files.

See http://www.open3d.org/docs/0.6.0/tutorial/ReconstructionSystem/make_fragments.html#batch-processing for easy check (although code lines went a little out of sync with docs here)

See http://www.open3d.org/docs/0.7.0/tutorial/ReconstructionSystem/make_fragments.html#batch-processing where this got changed to run method.

Will it be better to revert my change but instead we show either

  • process_single_fragment. OR
  • both process_single_fragment and run method. This would go well with addition of few statements explaining use of multiprocessing to speedup.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Option 2 sounds good. Let's show both process_single_fragment and run and explain use of multiprocessing to speed up processing. Optionally the parallel execution in run() can be cleaned up in the example. joblib can be replaced with concurrent.futures.ProcessPoolExecutor or multiprocessing.pool, which is part of the Python standard library.

Copy link
Contributor Author

@saurabheights saurabheights Sep 17, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ssheorey Need your input. I tried replacing joblib, but in an earlier problem at work, I had faced similar issue where open3d hangs with multiprocessing. As per your comment here, #1552 (comment), I moved to forkserver and that is working fine. However, forkserver is not available on Windows, and in this usecase, spawn should be fine as well. Shall I go with this?

max_workers = min(max(1, multiprocessing.cpu_count()-1), n_fragments)
mp_context = multiprocessing.get_context('spawn')
with mp_context.Pool(processes=max_workers) as pool:
    args = [(fragment_id, color_files, depth_files, n_files, n_fragments, config) for fragment_id in range(n_fragments)]
    pool.starmap(process_single_fragment, args)

P.S. Was curious, and found joblib went with forkserver for same reason but later reverted back to fork -

Make joblib use the ‘forkserver’ start method by default under Python 3.4+ to avoid causing crash with 3rd party libraries (such as Apple vecLib / Accelerate or the GCC OpenMP runtime) that use an internal thread pool that is not reinitialized when a fork system call happens.

Later they implemented loky backend which circumvent this issue. https://joblib.readthedocs.io/en/latest/parallel.html#bad-interaction-of-multiprocessing-and-third-party-libraries

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, that's a good idea. This will also be a reference to users about how to use Open3D with multiprocessing.
Just add a comment saying "Linux default method 'fork' cannot be used with multithreaded Open3D."

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

python_mp_spawn is using spawn as starting method.
python_mp_forkserver is using forkserver as starting method.
python_joblib_mp_backend is using joblib with multiprocessing backend.
python_joblib_mp_backend is using joblib with loky backend.
python_single_process is just main process.

Only for 4 fragments with each fragment made of 10 images, I get following measurements:-

Code block 'python_mp_spawn' took:            79258.28545 ms
Code block 'python_mp_forkserver' took:       81994.75125 ms
Code block 'python_joblib_mp_backend' took:   92798.19047 ms
Code block 'python_joblib_loky_backend' took:  8461.00342 ms
Code block 'python_single_process' took:      28939.51906 ms
# Without over allocation of openmp threads, See https://github.com/joblib/joblib/pull/940
os.environ['OMP_NUM_THREADS'] = str((multiprocessing.cpu_count() - 1) // max_workers)
Code block 'python_mp_spawn' took:            7003.84680 ms
Code block 'python_mp_forkserver' took:       7078.38375 ms
Code block 'python_joblib_mp_backend' took:   8058.99887 ms
Code block 'python_joblib_loky_backend' took: 7350.69630 ms
Code block 'python_single_process' took:     30476.80167 ms
# I also tested with OMP_NUM_THREADS=1. Very slightly slower.
Code block 'python_mp_spawn' took:            7040.57154 ms
Code block 'python_mp_forkserver' took:       7271.84740 ms
Code block 'python_joblib_mp_backend' took:   8278.31439 ms
Code block 'python_joblib_loky_backend' took: 7983.64183 ms
Code block 'python_single_process' took:     31091.80214 ms

Didnt make much of a difference, despite with 16 cores and 4 child processes. As this is an introductory example, just setting 1 would be simpler and easier for new users IMO.

Final committed code test

Multiprocess takes Making fragments 0:05:11.274633 (15 cores)
Singleprocess takes Making fragments 0:32:18.475112 (OpenMP number of threads unchanged)

.. _reconstruction_system_make_fragments_results:

Results
Expand Down
19 changes: 9 additions & 10 deletions docs/tutorial/reconstruction_system/refine_registration.rst
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ Fine-grained registration

.. literalinclude:: ../../../examples/python/reconstruction_system/refine_registration.py
:language: python
:lineno-start: 63
:lines: 27,64-136
:linenos:
:pyobject: multiscale_icp
:lineno-match:

Two options are given for the fine-grained registration. The ``color`` option is
recommended since it uses color information to prevent drift. See [Park2017]_
Expand All @@ -33,9 +33,9 @@ Multiway registration

.. literalinclude:: ../../../examples/python/reconstruction_system/refine_registration.py
:language: python
:lineno-start: 40
:lines: 27,41-63
:linenos:
:pyobject: update_posegraph_for_scene
:lineno-match:

This script uses the technique demonstrated in :ref:`/tutorial/pipelines/multiway_registration.ipynb`. Function ``update_posegraph_for_scene`` builds a pose graph for multiway registration of all fragments. Each graph node represents a fragment and its pose which transforms the geometry to the global space.

Expand All @@ -44,21 +44,20 @@ for multiway registration.

.. literalinclude:: ../../../examples/python/reconstruction_system/optimize_posegraph.py
:language: python
:lineno-start: 63
:lines: 27,64-73
:linenos:
:pyobject: optimize_posegraph_for_scene
:lineno-match:

Main registration loop
``````````````````````````````````````

The function ``make_posegraph_for_refined_scene`` below calls all the functions
introduced above.
The function ``make_posegraph_for_refined_scene`` below calls all the functions introduced above.

.. literalinclude:: ../../../examples/python/reconstruction_system/refine_registration.py
:language: python
:lineno-start: 173
:lines: 27,174-223
:linenos:
:pyobject: make_posegraph_for_refined_scene
:lineno-match:

The main workflow is: pairwise local refinement -> multiway registration.

Expand Down
24 changes: 12 additions & 12 deletions docs/tutorial/reconstruction_system/register_fragments.rst
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ Preprocess point cloud

.. literalinclude:: ../../../examples/python/reconstruction_system/register_fragments.py
:language: python
:lineno-start: 41
:lines: 27,42-54
:pyobject: preprocess_point_cloud
:linenos:
:lineno-match:

This function downsamples a point cloud to make it sparser and regularly
distributed. Normals and FPFH feature are precomputed. See
Expand All @@ -36,9 +36,9 @@ Compute initial registration

.. literalinclude:: ../../../examples/python/reconstruction_system/register_fragments.py
:language: python
:lineno-start: 85
:lines: 27,86-114
:pyobject: compute_initial_registration
:linenos:
:lineno-match:

This function computes a rough alignment between two fragments. If the fragments
are neighboring fragments, the rough alignment is determined by an aggregating
Expand All @@ -53,9 +53,9 @@ Pairwise global registration

.. literalinclude:: ../../../examples/python/reconstruction_system/register_fragments.py
:language: python
:lineno-start: 54
:lines: 27,55-85
:pyobject: register_point_cloud_fpfh
:linenos:
:lineno-match:

This function uses :ref:`/tutorial/pipelines/global_registration.ipynb#RANSAC` or :ref:`/tutorial/pipelines/global_registration.ipynb#fast-global-registration` for pairwise global registration.

Expand All @@ -66,9 +66,9 @@ Multiway registration

.. literalinclude:: ../../../examples/python/reconstruction_system/register_fragments.py
:language: python
:lineno-start: 114
:lines: 27,115-137
:pyobject: update_posegraph_for_scene
:linenos:
:lineno-match:

This script uses the technique demonstrated in
:ref:`/tutorial/pipelines/multiway_registration.ipynb`. The function
Expand All @@ -81,9 +81,9 @@ called for multiway registration.

.. literalinclude:: ../../../examples/python/reconstruction_system/optimize_posegraph.py
:language: python
:lineno-start: 63
:lines: 27,64-73
:pyobject: optimize_posegraph_for_scene
:linenos:
:lineno-match:

Main registration loop
``````````````````````````````````````
Expand All @@ -94,9 +94,9 @@ multiway registration.

.. literalinclude:: ../../../examples/python/reconstruction_system/register_fragments.py
:language: python
:lineno-start: 167
:lines: 27,168-210
:pyobject: make_posegraph_for_scene
:linenos:
:lineno-match:

Results
``````````````````````````````````````
Expand Down
4 changes: 2 additions & 2 deletions docs/tutorial/reconstruction_system/system_overview.rst
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ Getting the example code

.. code-block:: sh

# Activate your conda enviroment, where you have installed open3d pip package.
# Activate your conda environment, where you have installed open3d pip package.
# Clone the Open3D github repository and go to the example.
cd examples/python/reconstruction_system/

Expand All @@ -69,7 +69,7 @@ Running the example with default dataset.
python run_system.py --make --register --refine --integrate

Changing the default dataset.
One may change the default dataset to other avaialble datasets.
One may change the default dataset to other available datasets.
saurabheights marked this conversation as resolved.
Show resolved Hide resolved
Currently the following datasets are available:

1. Lounge (keyword: ``lounge``) (Default)
Expand Down
Loading