PCL v1.10.0 Release Notes
Release Date: 2020-01-19 // about 4 years ago-
๐ Starting with PCL 1.10, to ensure compatibility with future PCL releases, please ๐ use
pcl::make_shared
and theClass::Ptr
+Class::ConstPtr
type-alias instead of using direct names like{boost, std}::shared_ptr
or{boost, std}::make_shared
. There is alsopcl::shared_ptr
which offers the same abstraction for non-PCL types.New Features:
๐ Newly added functionalities.
- [sample_consensus] Add parallel RANSAC implementation with OpenMP [#3514]
- [registration] Add linear least squares version of symmetric objective function for ICP [#3390]
- [common] Add concatenate operation for
PolygonMesh
[#3316] - [common] Add
emplace[_back]
topcl::PointCloud
[#3207] - [cmake] Add
format
compilation target that appliesclang-format
to whitelisted modules [#3188] - [common] Add
pcl::make_shared
that automatically handles aligned allocations [#3163] - [modernization][cmake] Enable C++ 14 flags [#2690]
- [io] Add RSSDK 2.0 (librealsense2) grabber [#2214]
๐
Deprecated:
๐ Deprecated code scheduled to be removed after two minor releases.
- [common] Revert smart pointer type change in
PointCloud
and deprecategetMapping()
[#3563] - [common] Deprecate
getFields()
with output parameter in favor of overload with return value [#3401] - [recognition] Refactor
MaskMap
and deprecate several of its methods [#3399] - [common] Deprecate
getFieldIndex()
/getFields()
with first argument as cloud [#3365] - [common] Add
PCLPointCloud2::operator+=()
and update concatenation operation [#3320] - [segmentation] Delete unused params in
OrganizedMultiPlaneSegmentation::refine()
[#3302] - [visualization] Add new overload of
PointCloudColorHandler::getColor()
[#3187] - [modernization][io] Add
registerCallback()
overload to grabbers to support assignment ofboost::function
s with templated signatures [#3128] - [surface] Convert
MovingLeastSquaresOMP
into an alias template and deprecate [#3119] - [kdtree] Remove unnecessary FLANN includes, deprecate "kdtree/flann.h" header [#2993]
- [features] Deprecate
computeRSD()
functions that take pointclouds by pointer [#2827] - [modernization] Deprecate
pcl_isnan
,pcl_isfinite
, andpcl_isinf
in favor ofstd
methods [#2798, #3457] - [filters] Restructure and add functionality to filters templated on
PCLPointCloud2
[#3483, #3500]
๐
Removed:
๐ Removal of deprecated code.
- [segmentation] Remove
SupervoxelClustering::getColoredVoxelCloud()
[#3469] - [io] Remove FZ-API [#2747]
Behavioral changes:
๐ Changes in the expected default behavior.
- [sample_consensus] Set default min and max angle for SAC cone models [#3466]
- [tools] Do not discard data fields in
pcl_uniform_sampling
tool [#3461] - [common] Disable colored output for non-interactive terminals [#3310]
- [io] Add support for device URI in
OpenNI2Grabber
constructor [#3238] - [common] Enforce right-hand-rule on PCA eigenvectors [#2946]
- [visualization] Improve c/C command in
PCLVisualizer
[#2926] - [registration] Fix ICP misbehavior in the "failure after maximum iterations" mode [#2892]
- [common] Initialize curvature in
PointNormal
default constructor [#2674]
API changes:
๐ Changes to the API which didn't go through the proper deprecation and removal cycle.
- [gpu] Replace
uint64_type
bystd::uint64_t
[#3435] - [modernization] Migrate from
boost::tuple
tostd::tuple
[#3250] - [modernization] Migrate
boost::function
tostd::function
[#3079]
ABI changes:
๐ Changes that cause ABI incompatibility but are still API compatible.
- [modernization] Migrate from
boost::unordered_map
tostd::unordered_map
[#3107] - [modernization] Migrate to standard library type traits [#3105]
- [visualization] Minor refactoring of
pcl::visualization::Camera
and related functions [#2901] - [modernization] Migrate from
boost::thread
tostd::thread
[#3060, #3094] - [modernization] Prefer using
Ptr
typedefs and migrate tostd
smart pointers in non-API code [#2804, #2821, #2823, #2929, #3061, #3141, #3142, #3217, #3474, #3482, #3486, #3489, #3497] - [modernization] Migrate to
std
random number generators [#2956, #2962, #3069] - [filters] Restructure and add functionality to filters templated on
PCLPointCloud2
[#3483, #3500]
Migration to C++14 and code modernization:
- Convert
boost::shared_ptr
topcl::shared_ptr
[#3546] - ๐ Better indices in loops [#3543]
- Replace raw arrays with
std::vector
s inRangeImageBorderExtractor
[#3533] - โ Remove redundant calls to
std::string::c_str()
[#3517] - Convert
pcl::int_t
tostd::int_t
[#3422] - โ Remove deprecated
throw
specifier [#3384] - Prefer
numeric_limits
from standard library [#3360] - โ Add missing
std::move
orconst
reference for parameters [#3253] - [api] Migrate from
boost::tuple
tostd::tuple
[#3250] - Migrate from
boost::bind
tostd::bind
[#3249] - ๐ Use transparent functors [#3224]
- โ Add
cloexec
option tofopen
[#3223] - ๐ [deprecation] Add
registerCallback()
overload to grabbers to support assignment ofboost::function
s with templated signatures [#3128] - [abi] Migrate from
boost::unordered_map
tostd::unordered_map
[#3107] - [abi] Migrate to standard library type traits [#3105]
- โ Remove dead stores [#3095]
- [api] Migrate
boost::function
tostd::function
[#3079] - โ Remove redundant member field initialization [#3070]
- Prefer returning braced init list [#3039]
- Prefer
empty()
oversize()
when checking container state [#3033] - Prefer combined assignment operators [#3030]
- โ Remove unnecessary
nullptr
checks beforedelete
[#2990] - ๐ Improve readability of string comparisons [#2986]
- Prefer
std::isnan
over!=
comparison trick [#2977] - โ Remove deprecated Boost Filesystem code [#2966]
- Migrate from
BOOST_STATIC_ASSERT
andEIGEN_ASSERT
tostatic_assert
[#2951] - Prefer
std::log2
over custom implementation [#2950] - Migrate from
boost::this_thread::sleep
tostd::this_thread::sleep_for
[#2921] - ๐ Fix bug prone loop variables that are too small [#2829]
- Migrate from
boost::math::isnan
tostd::isnan
[#2819] - ๐ Fix "variableScope" hints from CppCheck [#2807]
- ๐ Improve performance of finding single character in strings [#2794]
- Prefer using
bool
literals [#2793] - Simplify boolean expressions [#2790]
- Prefer raw strings over escaped strings [#2789]
- Prefer
std::to_string
overboost::lexical_cast
for integer conversions [#2785] - Prefer
emplace_back
overpush_back
[#2784] - โ Remove unnecessary void parameter [#2780]
- ๐ Use
=delete
to disable special members [#2779] - ๐ Fix access to static members through instances [#2776]
- โ Remove usage of deprecated
register
storage class specifier [#2761] - โ Remove redundant string initialization with
""
[#2758] - โ Add
cloexec
option tofopen
[#2755] - ๐ Replace deprecated C library headers [#2737]
- Modernize code to use
override
[#2728] - ๐ Prefer standard
[[deprecated]]
attribute [#2699] - [new-feature] Enable C++ 14 flags [#2690]
- Revise arguments which were being passed by value instead of as a reference [#2668]
- ๐ Fix "knownConditionTrueFalse" hints from CppCheck [#2648]
- ๐ Fix "unreadVariable" hints from CppCheck [#2645]
- Replace
hash_map
withunordered_map
in 3rdparty/poisson4 [#2640] - Prefer lambdas over binds [#3136, #3171, #3173, #3178, #3189, #3192, #3199, #3209, #3231, #3243, #3254]
- Prefer range-based for loops [#2812, #2834, #2835, #2836, #2837, #2838, #2839, #2840, #2841, #2842, #2843, #2844, #2845, #2846, #2847, #2848, #2849, #2850, #2851, #2853, #2854, #2855, #2856, #2857, #2858, #2859, #2860, #2887, #3396, #3557]
- Prefer
nullptr
over 0 andNULL
[#3004, #3005, #3006, #3007, #3008, #3009, #3010, #3011, #3012, #3013, #3014, #3015, #3016, #3017, #3018, #3019, #3020, #3021, #3022, #3023, #3024, #3025, #3026, #3027, #3028, #3029] - Migrate to
std::chrono
[#2913, #2919, #3318] - [abi] Migrate from
boost::thread
tostd::thread
[#3060, #3094] - ๐ Migrate
mutex
,lock
andcsv
to modernization [#3063, #3068, #3074, #3078, #3084, #3086, #3088, #3091, #3093, #3100] - Prefer
using
overtypedef
[#3112, #3113, #3115, #3117, #3118, #3121, #3122, #3123, #3124, #3125, #3129, #3130, #3132, #3134, #3137, #3138, #3139, #3144] - Prefer
std
math functions over C functions [#3087, #3236, #3255, #3256, #3257, #3258, #3270, #3271, #3272, #3280, #3282, #3287] - [abi] Prefer using
Ptr
typedefs and migrate tostd
smart pointers in non-API code [#2804, #2821, #2823, #2929, #3061, #3141, #3142, #3217, #3474, #3482, #3486, #3489, #3497] - [abi] Migrate to
std
random number generators [#2956, #2962, #3069] - ๐ [deprecation] Deprecate
pcl_isnan
,pcl_isfinite
, andpcl_isinf
in favor ofstd
methods [#2798, #3457] - โ Add explicit
std::
prefix to standard types/functions [#3265, #3326, #3327, #3328, #3354, #3426, #3434] - โ Remove
else
afterreturn
statement [#3180, #3181, #3182, #3183, #3184, #3185, #3186] - โ Remove redundant
typename
keyword [#2896, #2897, #2927] - Prefer
#pragma once
over#ifndef
include guards [#2617, #2707] - Apply clang-format to white-listed modules [#3343, #3344, #3356, #3363, #3393, #3416]
- โ Remove default constructors/destructors [#3440, #3454]
- ๐ Fix various compiler warnings [#2665, #2775, #2778, #2781, #2782, #2822, #2898, #2907, #3001, #3075, #3076, #3153, #3155, #3208, #3212, #3214, #3342, #3345, #3348, #3366, #3372, #3375, #3377, #3385, #3388, #3409, #3425, #3427, #3507, #3509, #3554, #3555]
- Prefer
std::size_t
in loops [#3550, #3556]
Modules:
CMake:
- Set compile features on imported PCL targets [#3567]
- Create CMake imported targets for header-only modules [#3495]
- โ Add
PCL_WARNINGS_ARE_ERRORS
CMake option and enable it in Ubuntu 16.04 CI job [#3478] - Avoid using
VERSION_GREATER_EQUAL
to preserve compatibility with CMake 3.5 [#3460] - โ Remove policy push/pop from "PCLConfig.cmake" file [#3431]
- ๐ Fix link-type keywords in linked libraries in "PCLConfig.cmake" with CMake >= 3.11 [#3341]
- โก๏ธ Update prefix hints in GTest finder script [#3331]
- ๐ PCL All-in-one Installer: add process to add/remove VTK path [#3322]
- โ Add
surface
module to the list of dependencies ofexamples
[#3295] - โ Add missing install rule for "2d/kernel.hpp" header [#3278]
- [new-feature] Add
format
compilation target that appliesclang-format
to whitelisted modules [#3188] - ๐ Use
COMPONENTS
when finding VTK to avoid linking agains unnecessary modules [#3140] - โ Add thread library of the system by
Threads::Threads
instead of via-pthread
flag [#3102] - ๐ฆ Fix
find_package_handle_standard_args
incorrect argument in GTest finder script [#3098] - ๐ Fix compound target's target registration [#3090]
- Set
CMP0072
toNEW
to preferGLVND
over legacy OpenGL modules [#3066] - โ Improve parsing of
BUNDLE
option inPCL_ADD_EXECUTABLE
[#3064] - ๐ Change debug/release targets postfix on Windows [#3055]
- โ Add version info on Windows for DLLs/Exe [#3054]
- Modernize some CMake macros (Increases minimum required CMake version to 3.5) [#3044]
- โ Add newer Boost versions to
Boost_ADDITIONAL_VERSIONS
[#3003] - ๐ Refactor
PCL_MAKE_PKGCONFIG
[#2894] - โฌ๏ธ Bump Eigen minimum version to 3.1 [#2893]
- ๐ Improve compatibility with latest VTK [#2885]
- PCL All-in-one Installer: add quiet flag to msiexec installs [#2873]
- ๐ Use
-mtune
instead of-march
on non-x86 CPUs [#2868] - Prevent adding
/MP
flag for MSVC in case any other language than C/CXX will be used (e.g. CUDA) [#2862] - โ Add support for Visual Studio 2019 [#2826]
- โฌ๏ธ Drop MSVC 2013 (and below) support [#2817]
- โฌ๏ธ Drop GCC 4 support [#2760]
- Mark include directories of 3rd-party libraries as system includes [#2733]
- ๐ Fix Qt5 CMake issue [#2719]
- โฌ๏ธ Reduce unnecessary nesting in "CMakeLists.txt" [#2718]
- โฌ๏ธ Drop Qt4 support [#2716]
- Remove unnecessary
VTK_INCLUDE_DIRECTORIES
[#2713] - โ Add
MSVC_MP
CMake option to adjust number of parallel build jobs [#2705] - Set interface compile features to
cxx_std_14
on PCL targets [#2697] - Reorganize and beautify project generation for IDEs [#2691]
- [new-feature] Enable C++ 14 flags [#2690]
- โ Remove vendored "FindGLEW.cmake" and adopt imported targets; rename "FindGTest.cmake" to prevent name clash [#2679]
- โ Add compound CMake targets for examples, tools, and apps [#2673]
- Set CMake policy
CMP0074
toNEW
[#2671] - โ Remove conditional code for no longer supported versions of CMake [#2667]
- ๐ Raise minimum required Boost version to 1.55; fix deprecated Boost endians [#2801]
- Modernize FLANN finder script [#2740, #2861, #2905, #2910, #3157, #3202, #3220, #3317]
libpcl_2d:
- ๐ Fix
EIGEN_ALIGN16
positionining for point typeXYZHSV
[#3237]
libpcl_common:
- ๐ [deprecation] Revert smart pointer type change in
PointCloud
and deprecategetMapping()
[#3563] - Define
RangeImage
destructor as virtual [#3477] - ๐จ Refactor
pcl::eigen33()
to reduce potential errors (and remove bug) [#3441] - ๐ Use generic detection idiom in
isFinite()
[#3402] - ๐ [deprecation] Deprecate
getFields()
with output parameter in favor of overload with return value [#3401] - ๐จ Refactor polynomial calculations and remove memory leak [#3392]
- โ Removes deprecated usage of
getFields(cloud, fields)
[#3374] - ๐ [deprecation] Deprecate
getFieldIndex()
/getFields()
with first argument as cloud [#3365] - โ Remove
vector.reserve()
from hot path in cloud concatenation [#3361] - ๐ [deprecation] Add
PCLPointCloud2::operator+=()
and update concatenation operation [#3320] - [new-feature] Add concatenate operation for
PolygonMesh
[#3316] - Simplify the resize logic in
PCLBase
[#3315] - [behavior] Disable colored output for non-interactive terminals [#3310]
- [new-feature] Add
emplace[_back]
topcl::PointCloud
[#3207] - [new-feature] Add
pcl::make_shared
that automatically handles aligned allocations [#3163] - [behavior] Enforce right-hand-rule on PCA eigenvectors [#2946]
- ๐ Fix a bug in
CentroidPoint
[#2875] - [behavior] Initialize curvature in
PointNormal
default constructor [#2674]
libpcl_cuda:
- โ Remove code for CUDA below 7.5, update version checks [#3152]
- โ Add missing include to support CUDA 10.1 [#2883]
- โฌ๏ธ Drop CUDA 7.0 (and below) support [#2736]
libpcl_features:
- ๐ Fix numerical issue in GASD estimation [#3498]
- ๐ [deprecation] Deprecate
computeRSD()
functions that take pointclouds by pointer [#2827] - ๐ Fix data race in
NormalEstimationOMP
on Windows [#2770]
libpcl_filters:
- ๐ Merge pull request #3540 from facontidavide/fix_filter [#3540]
- ๐ Fix incorrect switch fallthrough in convolution operator [#3429]
- ๐ Use
size_t
for address computation inCropBox
filter [#3418] - ๐ Fix a bug in removed index extraction in
UniformSampling
[#3323] - ๐ Fix
CropBox
with indices; add new assertions for unit tests [#3306] - ๐ Use fixed-size Eigen block expressions in
FrustumCulling
[#2786] - ๐ [abi][deprecation] Restructure and add functionality to filters templated on
PCLPointCloud2
[#3483, #3500]
libpcl_gpu:
- ๐ Fix building of KinFu Large Scale app with Visual Studio [#3504]
- [api] Replace
uint64_type
bystd::uint64_t
[#3435] - โ Add OpenNI2 support to
kinfu_largescale
tool [#3391] - ๐ Use
constexpr
in KinFu and KinFu large scale apps [#3386] - โ Remove duplicated and unused "cutil_math.h" [#3264]
- Drop unnecessary CUDA_ARCH checks [#3154]
- โ Remove code for CUDA below 7.5, update version checks [#3152]
- โ Remove unused timer routines in "NCV.cu" [#3135]
- โ Add sync variants to CUDA vote functions to support PTX/ARCH >= 7.0 [#2981]
- Fix
-debug
option parsing inpeople_pcd_prob
tool [#2656]
libpcl_io:
- ๐ Make PLY parser more tolerant towards files not adhering to standard [#3542]
- ๐ Fix a bug in binary header generation for PCD files [#3522]
- [behavior] Add support for device URI in
OpenNI2Grabber
constructor [#3238] - Include "pcl_config.h" before checking
HAVE_OPENNI2
[#3191] - ๐จ Print descriptive error if PLY file not found [#3143]
- ๐ [deprecation] Add
registerCallback()
overload to grabbers to support assignment ofboost::function
s with templated signatures [#3128] - ๐ Fix preallocation of memory in PLY reader [#2800]
- ๐ Fix possible integer overflow while iterating
PointCloud
fields [#2754] - [removal] Remove FZ-API [#2747]
- ๐ Improve loading of massive PLY files [#2715]
- [new-feature] Add RSSDK 2.0 (librealsense2) grabber [#2214]
- ๐ Fix callback signatures in some grabbers [#3216, #3225]
libpcl_kdtree:
- ๐ [deprecation] Remove unnecessary FLANN includes, deprecate "kdtree/flann.h" header [#2993]
libpcl_keypoints:
- โ Removed all duplicated branches in
AgastKeypoint2D
[#2657]
libpcl_recognition:
- ๐ Use range-based for loops with
boost::filesystem::directory_iterator
[#3432] - ๐ [deprecation] Refactor
MaskMap
and deprecate several of its methods [#3399] - โ Add missing include in "trimmed_icp.h" [#3286]
- ๐ Use I/O helper method in
pcl::LineRGBD
[#2796]
libpcl_registration:
- ๐ Make
Registration::hasConverged()
const-qualified [#3456] - ๐ Fix debug message by reordering statements in GICP [#3398]
- [new-feature] Add linear least squares version of symmetric objective function for ICP [#3390]
- ๐ Fix the OpenMP errors/warnings in "ia_fpcs.hpp" [#3389]
- ๐ Fix
pcl::Registration::getFitnessScore()
documentation [#3082] - [behavior] Fix ICP misbehavior in the "failure after maximum iterations" mode [#2892]
libpcl_sample_consensus:
- [new-feature] Add parallel RANSAC implementation with OpenMP [#3514]
- [behavior] Set default min and max angle for SAC cone models [#3466]
- โ Add
const
qualifier to multiple methods in SAC module [#2970] - ๐ Fix regression in
pcl::SACSegmentation
line fitting [#2767]
libpcl_segmentation:
- [removal] Remove
SupervoxelClustering::getColoredVoxelCloud()
[#3469] - ๐ [deprecation] Delete unused params in
OrganizedMultiPlaneSegmentation::refine()
[#3302] - โ Add
noexcept
forboost::checked_delete<>
friend [#2942] - ๐ Fix
SupervoxelClustering
compilation problem in MSVC 2015.3 [#2867]
libpcl_simulation:
- Fix bug in
SimExample::write_depth_image_uint
trigerring-Wtype-limits
warning [#3430]
libpcl_stereo:
- ๐ Merge pull request #3566 from kunaltyagi/stereo [#3566]
libpcl_surface:
- ๐ Fix undefined behaviour in
OctNode
[#3561] - ๐ Fix memory leak in
TextureMapping
[#3549] - Prevent
memset
for empty vector in 3rdparty/poisson4 [#3537] - โ Remove incorrect tree update in
MarchingCubes
[#3240] - ๐ [deprecation] Convert
MovingLeastSquaresOMP
into an alias template and deprecate [#3119] - ๐ Fix a bug in
ConvexHull
when indices are used [#2999] - โ
Include "pcl_config.h" before testing
HAVE_QHULL
[#2979] - Throw exceptions instead of
exit(0)
in Poisson surface reconstruction [#2891] - Add check for invalid plane coefficients in
MovingLeastSquares
[#2805] - ๐ Fix the size of the lookup table in
BilateralUpsampling
[#2749] - Replace
hash_map
withunordered_map
in 3rdparty/poisson4 [#2640]
libpcl_visualization:
- โ Add a flag to disable window autoresizing in
ImageViewer
[#3394] - ๐ [deprecation] Add new overload of
PointCloudColorHandler::getColor()
[#3187] - [behavior] Improve c/C command in
PCLVisualizer
[#2926] - โ Disable VTK warning display with OpenGL rendering backend [#2912]
- [abi] Minor refactoring of
pcl::visualization::Camera
and related functions [#2901] - ๐ Fix a bug in
PCLVisualizer::setShapeRenderingProperties()
[#2900] - ๐ Fix possible integer overflow while iterating
PointCloud
fields [#2754] - Raise minimum VTK version to 6.2 [#2685]
PCL Apps:
- ๐ Fix memory leaks in OpenNI apps [#3553]
- ๐ Use range-based for loops with
boost::filesystem::directory_iterator
[#3432] - Do not use deprecated function in
stereo_ground_segmentation
[#3406] - โ Add missing
std::move
orconst
reference for parameters [#3232] - Remove magic numbers from
organized_segmentation_demo
app [#3108] - Add missing include
render_views_tesselated_sphere
app [#2909] - โ Remove Qt version checks [#2762]
- Cleanup Qt includes in Modeler app [#2756]
- Cleanup Qt includes in CloudComposer app [#2744]
- ๐ Fix MSVC compile issues in CloudComposer app [#2712]
- ๐ Fix Modeler app with OpenGL2 rendering backend [#2653]
๐
PCL Docs:
- ๐ Fix and improve documentation in
sample_consensus
module [#3301] - ๐ Fix
pcl::Registration::getFitnessScore()
documentation [#3082] - ๐ Fix source file name path stripping in Doxygen [#2714]
PCL Tutorials:
- ๐ Fix "CMakeLists.txt" in VFH tutorial [#3449]
- โก๏ธ Update information about types with RGBA data in tutorial [#3294]
- โ Add a note about adjusting passthrough limits in template alignment tutorial [#3193]
- โ Add missing shell command in "Building PCL" tutorial [#2996]
- ๐ Fix cube rendering properties in "Moment of Inertia" tutorial [#2880]
- Migrate from
boost::math::iround
tostd::lround
[#2818] - Link with
PCL_LIBRARIES
, notPCL_***_LIBRARIES
[#2799]
โ
PCL Tests:
- ๐ Move OMP version of
MovingLeastSquares
into a separate test case [#3382] - ๐ Fix
CropBox
with indices; add new assertions for unit tests [#3306] - ๐ฆ Fix
find_package_handle_standard_args
incorrect argument in GTest finder script [#3098] - โ
Do not test buffers instantiated with
char
template argument [#2980] - ๐ Remove
GTEST_USE_OWN_TR1_TUPLE
defines [#2828] - โ Add a new test for
SampleConsensusModelLine
[#2768] - โ
Split
test_registration
into three binaries [#2727]
PCL Tools:
- [behavior] Do not discard data fields in
pcl_uniform_sampling
tool [#3461] - โ Add missing includes in
ensenso_viewer.cpp
[#3035] - Do not terminate
openni_viewer
/openni2_viewer
if image viewer was not instantiated [#2698]
CI:
- โ Add
PCL_WARNINGS_ARE_ERRORS
CMake option and enable it in Ubuntu 16.04 CI job [#3478] - โ Add a new Azure pipeline for Ubuntu 19.10 [#3446]
- โ Add formatting job on CI [#3420]
- โ Add Dockerfiles for images used on CI [#3350]
- โ Publish test results on Azure pipelines [#2948]
- ๐ Build tutorials on Azure Pipelines [#2696]