Main MRPT website > C++ reference for MRPT 1.5.9
mrpt::maps::CSimplePointsMap Member List

This is the complete list of members for mrpt::maps::CSimplePointsMap, including all inherited members.

_GetBaseClass()mrpt::maps::CSimplePointsMapprotectedstatic
_init_CSimplePointsMapmrpt::maps::CSimplePointsMapprotectedstatic
addFrom(const CPointsMap &anotherMap)mrpt::maps::CPointsMapvirtual
addFrom_classSpecific(const CPointsMap &anotherMap, const size_t nPreviousPoints) MRPT_OVERRIDEmrpt::maps::CSimplePointsMapinlineprotectedvirtual
applyDeletionMask(const std::vector< bool > &mask)mrpt::maps::CPointsMap
auxParticleFilterCleanUp()mrpt::maps::CMetricMapinlinevirtual
base_copyFrom(const CPointsMap &obj)mrpt::maps::CPointsMapprotected
boundingBox(float &min_x, float &max_x, float &min_y, float &max_y, float &min_z, float &max_z) constmrpt::maps::CPointsMap
boundingBox(mrpt::math::TPoint3D &pMin, mrpt::math::TPoint3D &pMax) constmrpt::maps::CPointsMapinline
canComputeObservationLikelihood(const mrpt::obs::CObservation *obs) constmrpt::maps::CMetricMapvirtual
canComputeObservationLikelihood(const mrpt::obs::CObservationPtr &obs) constmrpt::maps::CMetricMap
canComputeObservationsLikelihood(const mrpt::obs::CSensoryFrame &sf) constmrpt::maps::CMetricMap
changeCoordinatesReference(const mrpt::poses::CPose2D &b)mrpt::maps::CPointsMap
changeCoordinatesReference(const mrpt::poses::CPose3D &b)mrpt::maps::CPointsMap
changeCoordinatesReference(const CPointsMap &other, const mrpt::poses::CPose3D &b)mrpt::maps::CPointsMap
classCMetricMapmrpt::maps::CMetricMapstatic
classCObjectmrpt::utils::CObjectstatic
classCPointsMapmrpt::maps::CPointsMapstatic
classCSerializablemrpt::utils::CSerializablestatic
classCSimplePointsMapmrpt::maps::CSimplePointsMapstatic
classinfomrpt::maps::CSimplePointsMapstatic
clear()mrpt::maps::CMetricMap
clipOutOfRange(const mrpt::math::TPoint2D &point, float maxRange)mrpt::maps::CPointsMap
clipOutOfRangeInZ(float zMin, float zMax)mrpt::maps::CPointsMap
clone() constmrpt::utils::CObjectinline
CMetricMap()mrpt::maps::CMetricMap
CObservable()mrpt::utils::CObservable
COLOR_3DSCENE_Bmrpt::maps::CPointsMapstatic
COLOR_3DSCENE_Gmrpt::maps::CPointsMapstatic
COLOR_3DSCENE_Rmrpt::maps::CPointsMapstatic
compute3DDistanceToMesh(const mrpt::maps::CMetricMap *otherMap2, const mrpt::poses::CPose3D &otherMapPose, float maxDistForCorrespondence, mrpt::utils::TMatchingPairList &correspondences, float &correspondencesRatio)mrpt::maps::CPointsMap
compute3DMatchingRatio(const mrpt::maps::CMetricMap *otherMap, const mrpt::poses::CPose3D &otherMapPose, const TMatchingRatioParams &params) const MRPT_OVERRIDEmrpt::maps::CPointsMapvirtual
computeObservationLikelihood(const mrpt::obs::CObservation *obs, const mrpt::poses::CPose3D &takenFrom)mrpt::maps::CMetricMap
computeObservationLikelihood(const mrpt::obs::CObservation *obs, const mrpt::poses::CPose2D &takenFrom)mrpt::maps::CMetricMap
computeObservationsLikelihood(const mrpt::obs::CSensoryFrame &sf, const mrpt::poses::CPose2D &takenFrom)mrpt::maps::CMetricMap
ConstPtr typedefmrpt::maps::CSimplePointsMap
copyFrom(const CPointsMap &obj) MRPT_OVERRIDEmrpt::maps::CSimplePointsMapvirtual
CPointsMap()mrpt::maps::CPointsMap
Create()mrpt::maps::CSimplePointsMapstatic
CreateFromMapDefinition(const mrpt::maps::TMetricMapInitializer &def)mrpt::maps::CSimplePointsMapstatic
CreateObject()mrpt::maps::CSimplePointsMapstatic
CSimplePointsMap()mrpt::maps::CSimplePointsMap
derived() constmrpt::math::KDTreeCapable< CPointsMap >inline
derived()mrpt::math::KDTreeCapable< CPointsMap >inline
detail::loadFromRangeImplmrpt::maps::CSimplePointsMapfriend
detail::pointmap_traitsmrpt::maps::CSimplePointsMapfriend
determineMatching2D(const mrpt::maps::CMetricMap *otherMap, const mrpt::poses::CPose2D &otherMapPose, mrpt::utils::TMatchingPairList &correspondences, const TMatchingParams &params, TMatchingExtraResults &extraResults) const MRPT_OVERRIDEmrpt::maps::CPointsMapvirtual
determineMatching3D(const mrpt::maps::CMetricMap *otherMap, const mrpt::poses::CPose3D &otherMapPose, mrpt::utils::TMatchingPairList &correspondences, const TMatchingParams &params, TMatchingExtraResults &extraResults) const MRPT_OVERRIDEmrpt::maps::CPointsMapvirtual
duplicate() constmrpt::maps::CSimplePointsMapvirtual
duplicateGetSmartPtr() constmrpt::utils::CObjectinline
empty() constmrpt::maps::CPointsMapinline
enableFilterByHeight(bool enable=true)mrpt::maps::CPointsMapinline
extractCylinder(const mrpt::math::TPoint2D &center, const double radius, const double zmin, const double zmax, CPointsMap *outMap)mrpt::maps::CPointsMap
extractPoints(const mrpt::math::TPoint3D &corner1, const mrpt::math::TPoint3D &corner2, CPointsMap *outMap, const double &R=1, const double &G=1, const double &B=1)mrpt::maps::CPointsMap
fuseWith(CPointsMap *anotherMap, float minDistForFuse=0.02f, std::vector< bool > *notFusedPoints=NULL)mrpt::maps::CPointsMap
genericMapParamsmrpt::maps::CMetricMap
getAllPoints(VECTOR &xs, VECTOR &ys, VECTOR &zs, size_t decimation=1) constmrpt::maps::CPointsMapinline
getAllPoints(CONTAINER &ps, size_t decimation=1) constmrpt::maps::CPointsMapinline
getAllPoints(std::vector< float > &xs, std::vector< float > &ys, size_t decimation=1) constmrpt::maps::CPointsMap
getAllPoints(std::vector< mrpt::math::TPoint2D > &ps, size_t decimation=1) constmrpt::maps::CPointsMapinline
getAs3DObject(mrpt::opengl::CSetOfObjectsPtr &outObj) const MRPT_OVERRIDEmrpt::maps::CPointsMapvirtual
getAsSimplePointsMap() const MRPT_OVERRIDEmrpt::maps::CSimplePointsMapinlinevirtual
getAsSimplePointsMap() MRPT_OVERRIDEmrpt::maps::CSimplePointsMapinlinevirtual
getHeightFilterLevels(double &_z_min, double &_z_max) constmrpt::maps::CPointsMapinline
getLargestDistanceFromOrigin() constmrpt::maps::CPointsMap
getLargestDistanceFromOriginNoRecompute(bool &output_is_valid) constmrpt::maps::CPointsMapinline
getLoadPLYErrorString() constmrpt::utils::PLY_Importerinline
getPCLPointCloud(POINTCLOUD &cloud) constmrpt::maps::CPointsMapinline
getPoint(size_t index, float &x, float &y, float &z) constmrpt::maps::CPointsMap
getPoint(size_t index, float &x, float &y) constmrpt::maps::CPointsMap
getPoint(size_t index, double &x, double &y, double &z) constmrpt::maps::CPointsMap
getPoint(size_t index, double &x, double &y) constmrpt::maps::CPointsMap
getPoint(size_t index, mrpt::math::TPoint2D &p) constmrpt::maps::CPointsMapinline
getPoint(size_t index, mrpt::math::TPoint3D &p) constmrpt::maps::CPointsMapinline
getPoint(size_t index, float &x, float &y, float &z, float &R, float &G, float &B) constmrpt::maps::CPointsMapinlinevirtual
getPointAllFields(const size_t index, std::vector< float > &point_data) constmrpt::maps::CPointsMapinline
getPointAllFieldsFast(const size_t index, std::vector< float > &point_data) const MRPT_OVERRIDEmrpt::maps::CSimplePointsMapinlinevirtual
getPointFast(size_t index, float &x, float &y, float &z) constmrpt::maps::CPointsMapinline
getPointsBuffer(size_t &outPointsCount, const float *&xs, const float *&ys, const float *&zs) constmrpt::maps::CPointsMap
getPointsBufferRef_x() constmrpt::maps::CPointsMapinline
getPointsBufferRef_y() constmrpt::maps::CPointsMapinline
getPointsBufferRef_z() constmrpt::maps::CPointsMapinline
getPointWeight(size_t index) constmrpt::maps::CPointsMapinlinevirtual
GetRuntimeClass() constmrpt::maps::CSimplePointsMapvirtual
getSavePLYErrorString() constmrpt::utils::PLY_Exporterinline
hasColorPoints() constmrpt::maps::CPointsMapinlinevirtual
hasSubscribers() constmrpt::utils::CObservableinlineprotected
insertAnotherMap(const CPointsMap *otherMap, const mrpt::poses::CPose3D &otherPose)mrpt::maps::CPointsMap
insertionOptionsmrpt::maps::CPointsMap
insertObservation(const mrpt::obs::CObservation *obs, const mrpt::poses::CPose3D *robotPose=NULL)mrpt::maps::CMetricMap
insertObservationPtr(const mrpt::obs::CObservationPtr &obs, const mrpt::poses::CPose3D *robotPose=NULL)mrpt::maps::CMetricMap
insertPoint(float x, float y, float z=0)mrpt::maps::CPointsMapinline
insertPoint(const mrpt::math::TPoint3D &p)mrpt::maps::CPointsMapinline
insertPoint(float x, float y, float z, float R, float G, float B)mrpt::maps::CPointsMapinlinevirtual
insertPointFast(float x, float y, float z=0) MRPT_OVERRIDEmrpt::maps::CSimplePointsMapvirtual
internal_clear() MRPT_OVERRIDEmrpt::maps::CSimplePointsMapprotectedvirtual
internal_computeObservationLikelihood(const mrpt::obs::CObservation *obs, const mrpt::poses::CPose3D &takenFrom) MRPT_OVERRIDEmrpt::maps::CPointsMapvirtual
internal_CreateFromMapDefinition(const mrpt::maps::TMetricMapInitializer &def)mrpt::maps::CSimplePointsMapstatic
internal_insertObservation(const mrpt::obs::CObservation *obs, const mrpt::poses::CPose3D *robotPose) MRPT_OVERRIDEmrpt::maps::CPointsMapprotectedvirtual
isEmpty() const MRPT_OVERRIDEmrpt::maps::CPointsMapvirtual
isFilterByHeightEnabled() constmrpt::maps::CPointsMapinline
kdtree_distance(const float *p1, const size_t idx_p2, size_t size) constmrpt::maps::CPointsMapinline
kdtree_get_bbox(BBOX &bb) constmrpt::maps::CPointsMapinline
kdtree_get_point_count() constmrpt::maps::CPointsMapinline
kdtree_get_pt(const size_t idx, int dim) constmrpt::maps::CPointsMapinline
kdtree_mark_as_outdated() constmrpt::math::KDTreeCapable< CPointsMap >inlineprotected
kdtree_search_paramsmrpt::math::KDTreeCapable< CPointsMap >
KDTreeCapable()mrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeClosestPoint2D(float x0, float y0, float &out_x, float &out_y, float &out_dist_sqr) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeClosestPoint2D(float x0, float y0, float &out_dist_sqr) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeClosestPoint2D(const TPoint2D &p0, TPoint2D &pOut, float &outDistSqr) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeClosestPoint2DsqrError(float x0, float y0) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeClosestPoint2DsqrError(const TPoint2D &p0) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeClosestPoint3D(float x0, float y0, float z0, float &out_x, float &out_y, float &out_z, float &out_dist_sqr) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeClosestPoint3D(float x0, float y0, float z0, float &out_dist_sqr) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeClosestPoint3D(const TPoint3D &p0, TPoint3D &pOut, float &outDistSqr) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeNClosestPoint2D(float x0, float y0, size_t knn, std::vector< float > &out_x, std::vector< float > &out_y, std::vector< float > &out_dist_sqr) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeNClosestPoint2D(const TPoint2D &p0, size_t N, std::vector< TPoint2D > &pOut, std::vector< float > &outDistSqr) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeNClosestPoint2DIdx(float x0, float y0, size_t knn, std::vector< size_t > &out_idx, std::vector< float > &out_dist_sqr) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeNClosestPoint2DIdx(const TPoint2D &p0, size_t N, std::vector< size_t > &outIdx, std::vector< float > &outDistSqr) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeNClosestPoint3D(float x0, float y0, float z0, size_t knn, std::vector< float > &out_x, std::vector< float > &out_y, std::vector< float > &out_z, std::vector< float > &out_dist_sqr) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeNClosestPoint3D(const TPoint3D &p0, size_t N, std::vector< TPoint3D > &pOut, std::vector< float > &outDistSqr) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeNClosestPoint3DIdx(float x0, float y0, float z0, size_t knn, std::vector< size_t > &out_idx, std::vector< float > &out_dist_sqr) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeNClosestPoint3DIdx(const TPoint3D &p0, size_t N, std::vector< size_t > &outIdx, std::vector< float > &outDistSqr) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeNClosestPoint3DWithIdx(float x0, float y0, float z0, size_t knn, std::vector< float > &out_x, std::vector< float > &out_y, std::vector< float > &out_z, std::vector< size_t > &out_idx, std::vector< float > &out_dist_sqr) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeRadiusSearch2D(const float x0, const float y0, const float maxRadiusSqr, std::vector< std::pair< size_t, float > > &out_indices_dist) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeRadiusSearch3D(const float x0, const float y0, const float z0, const float maxRadiusSqr, std::vector< std::pair< size_t, float > > &out_indices_dist) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeTwoClosestPoint2D(float x0, float y0, float &out_x1, float &out_y1, float &out_x2, float &out_y2, float &out_dist_sqr1, float &out_dist_sqr2) constmrpt::math::KDTreeCapable< CPointsMap >inline
kdTreeTwoClosestPoint2D(const TPoint2D &p0, TPoint2D &pOut1, TPoint2D &pOut2, float &outDistSqr1, float &outDistSqr2) constmrpt::math::KDTreeCapable< CPointsMap >inline
likelihoodOptionsmrpt::maps::CPointsMap
load2D_from_text_file(const std::string &file)mrpt::maps::CPointsMapinline
load2Dor3D_from_text_file(const std::string &file, const bool is_3D)mrpt::maps::CPointsMap
load3D_from_text_file(const std::string &file)mrpt::maps::CPointsMapinline
loadFromPlyFile(const std::string &filename, CStringList *file_comments=NULL, CStringList *file_obj_info=NULL)mrpt::utils::PLY_Importer
loadFromProbabilisticPosesAndObservations(const mrpt::maps::CSimpleMap &Map)mrpt::maps::CMetricMap
loadFromRangeScan(const mrpt::obs::CObservation2DRangeScan &rangeScan, const mrpt::poses::CPose3D *robotPose=NULL) MRPT_OVERRIDEmrpt::maps::CSimplePointsMapvirtual
loadFromRangeScan(const mrpt::obs::CObservation3DRangeScan &rangeScan, const mrpt::poses::CPose3D *robotPose=NULL) MRPT_OVERRIDEmrpt::maps::CSimplePointsMapvirtual
loadFromSimpleMap(const mrpt::maps::CSimpleMap &Map)mrpt::maps::CMetricMapinline
loadFromVelodyneScan(const mrpt::obs::CObservationVelodyneScan &scan, const mrpt::poses::CPose3D *robotPose=NULL)mrpt::maps::CPointsMap
loadPCDFile(const std::string &filename)mrpt::maps::CPointsMapvirtual
m_bb_max_xmrpt::maps::CPointsMapmutableprotected
m_bb_max_ymrpt::maps::CPointsMapmutableprotected
m_bb_max_zmrpt::maps::CPointsMapmutableprotected
m_bb_min_xmrpt::maps::CPointsMapmutableprotected
m_bb_min_ymrpt::maps::CPointsMapmutableprotected
m_bb_min_zmrpt::maps::CPointsMapmutableprotected
m_boundingBoxIsUpdatedmrpt::maps::CPointsMapmutableprotected
m_heightfilter_enabledmrpt::maps::CPointsMapprotected
m_heightfilter_z_maxmrpt::maps::CPointsMapprotected
m_heightfilter_z_minmrpt::maps::CPointsMapprotected
m_largestDistanceFromOriginmrpt::maps::CPointsMapmutableprotected
m_largestDistanceFromOriginIsUpdatedmrpt::maps::CPointsMapmutableprotected
m_private_map_register_idmrpt::maps::CSimplePointsMapstatic
m_scans_sincos_cachemrpt::maps::CPointsMapprotected
MapDefinition()mrpt::maps::CSimplePointsMapstatic
mark_as_modified() constmrpt::maps::CPointsMapinline
operator delete(void *ptr)mrpt::maps::CSimplePointsMapinline
operator delete(void *memory, void *ptr)mrpt::maps::CSimplePointsMapinline
operator delete(void *ptr, const std::nothrow_t &)mrpt::maps::CSimplePointsMapinline
operator delete[](void *ptr)mrpt::maps::CSimplePointsMapinline
operator new(size_t size)mrpt::maps::CSimplePointsMapinline
operator new(size_t size, void *ptr)mrpt::maps::CSimplePointsMapinlinestatic
operator new(size_t size, const std::nothrow_t &)mrpt::maps::CSimplePointsMapinline
operator new[](size_t size)mrpt::maps::CSimplePointsMapinline
operator+=(const CPointsMap &anotherMap)mrpt::maps::CPointsMapinline
PLY_export_get_face_count() const MRPT_OVERRIDEmrpt::maps::CPointsMapinlineprotectedvirtual
PLY_export_get_vertex(const size_t idx, mrpt::math::TPoint3Df &pt, bool &pt_has_color, mrpt::utils::TColorf &pt_color) const MRPT_OVERRIDEmrpt::maps::CPointsMapprotectedvirtual
PLY_export_get_vertex_count() const MRPT_OVERRIDEmrpt::maps::CPointsMapprotectedvirtual
PLY_import_set_face_count(const size_t N) MRPT_OVERRIDEmrpt::maps::CPointsMapinlineprotectedvirtual
PLY_import_set_vertex(const size_t idx, const mrpt::math::TPoint3Df &pt, const mrpt::utils::TColorf *pt_color=NULL) MRPT_OVERRIDEmrpt::maps::CPointsMapprotectedvirtual
PLY_import_set_vertex_count(const size_t N) MRPT_OVERRIDEmrpt::maps::CSimplePointsMapprotectedvirtual
Ptr typedefmrpt::maps::CSimplePointsMap
publishEvent(const mrptEvent &e) constmrpt::utils::CObservableprotected
readFromStream(mrpt::utils::CStream &in, int version)mrpt::maps::CSimplePointsMapprotectedvirtual
reserve(size_t newLength) MRPT_OVERRIDEmrpt::maps::CSimplePointsMapvirtual
resize(size_t newLength) MRPT_OVERRIDEmrpt::maps::CSimplePointsMapvirtual
save2D_to_text_file(const std::string &file) constmrpt::maps::CPointsMap
save3D_to_text_file(const std::string &file) constmrpt::maps::CPointsMap
saveMetricMapRepresentationToFile(const std::string &filNamePrefix) const MRPT_OVERRIDEmrpt::maps::CPointsMapinlinevirtual
savePCDFile(const std::string &filename, bool save_as_binary) constmrpt::maps::CPointsMapvirtual
saveToPlyFile(const std::string &filename, bool save_in_binary=false, const CStringList &file_comments=CStringList(), const CStringList &file_obj_info=CStringList()) constmrpt::utils::PLY_Exporter
self_t typedefmrpt::math::KDTreeCapable< CPointsMap >
setAllPoints(const std::vector< float > &X, const std::vector< float > &Y, const std::vector< float > &Z)mrpt::maps::CPointsMapinline
setAllPoints(const std::vector< float > &X, const std::vector< float > &Y)mrpt::maps::CPointsMapinline
setAllPointsTemplate(const VECTOR &X, const VECTOR &Y, const VECTOR &Z=VECTOR())mrpt::maps::CPointsMapinline
setFromPCLPointCloud(const POINTCLOUD &cloud)mrpt::maps::CPointsMapinline
setHeightFilterLevels(const double _z_min, const double _z_max)mrpt::maps::CPointsMapinline
setPoint(size_t index, float x, float y, float z)mrpt::maps::CPointsMapinline
setPoint(size_t index, const mrpt::math::TPoint2D &p)mrpt::maps::CPointsMapinline
setPoint(size_t index, const mrpt::math::TPoint3D &p)mrpt::maps::CPointsMapinline
setPoint(size_t index, float x, float y)mrpt::maps::CPointsMapinline
setPoint(size_t index, float x, float y, float z, float R, float G, float B)mrpt::maps::CPointsMapinlinevirtual
setPointAllFields(const size_t index, const std::vector< float > &point_data)mrpt::maps::CPointsMapinline
setPointAllFieldsFast(const size_t index, const std::vector< float > &point_data) MRPT_OVERRIDEmrpt::maps::CSimplePointsMapinlinevirtual
setPointFast(size_t index, float x, float y, float z) MRPT_OVERRIDEmrpt::maps::CSimplePointsMapvirtual
setPointWeight(size_t index, unsigned long w)mrpt::maps::CPointsMapinlinevirtual
setSize(size_t newLength) MRPT_OVERRIDEmrpt::maps::CSimplePointsMapvirtual
size() constmrpt::maps::CPointsMapinline
squareDistanceToClosestCorrespondence(float x0, float y0) const MRPT_OVERRIDEmrpt::maps::CPointsMapvirtual
squareDistanceToClosestCorrespondenceT(const mrpt::math::TPoint2D &p0) constmrpt::maps::CPointsMapinline
writeToMatlab() constmrpt::utils::CSerializableinlinevirtual
writeToStream(mrpt::utils::CStream &out, int *getVersion) constmrpt::maps::CSimplePointsMapprotectedvirtual
xmrpt::maps::CPointsMapprotected
ymrpt::maps::CPointsMapprotected
zmrpt::maps::CPointsMapprotected
~CObject()mrpt::utils::CObjectinlinevirtual
~CObservable()mrpt::utils::CObservablevirtual
~CPointsMap()mrpt::maps::CPointsMapvirtual
~CSerializable()mrpt::utils::CSerializableinlinevirtual
~CSimplePointsMap()mrpt::maps::CSimplePointsMapvirtual
~KDTreeCapable()mrpt::math::KDTreeCapable< CPointsMap >inline



Page generated by Doxygen 1.8.14 for MRPT 1.5.9 Git: 690a4699f Wed Apr 15 19:29:53 2020 +0200 at miƩ abr 15 19:30:12 CEST 2020