diff --git a/include/adc_geometries.h b/include/adc_geometries.h index a8aaa9961f66cb0eb1ccd6722682d065fa3ecd78..9ff6ae3c8e4d8b4670aee1108d725304d82c581b 100644 --- a/include/adc_geometries.h +++ b/include/adc_geometries.h @@ -12,30 +12,30 @@ class CAdcGeometry double y; double heading; + virtual void debug_param(void) = 0; virtual bool get_local_pose(double s, double t, double heading, double &u, double &v, double &yaw) = 0; public: CAdcGeometry(); CAdcGeometry(double min_s, double max_s, double x, double y, double heading); - ~CAdcGeometry(); + virtual ~CAdcGeometry(); bool get_world_pose(double s, double t, double heading, double &x, double &y, double &yaw); bool on_range(double s); - void debug_base(void); - virtual void debug(void) = 0; + void debug(void); }; class CAdcGeoLine: public CAdcGeometry { private: protected: + void debug_param(void); bool get_local_pose(double s, double t, double heading, double &u, double &v, double &yaw); public: CAdcGeoLine(); CAdcGeoLine(double min_s, double max_s, double x, double y, double heading); ~CAdcGeoLine(); - void debug(void); }; class CAdcGeoSpiral: public CAdcGeometry @@ -45,6 +45,7 @@ class CAdcGeoSpiral: public CAdcGeometry double curv_end; protected: + void debug_param(void); bool get_local_pose(double s, double t, double heading, double &u, double &v, double &yaw); public: @@ -53,7 +54,6 @@ class CAdcGeoSpiral: public CAdcGeometry CAdcGeoSpiral(double min_s, double max_s, double x, double y, double heading, double curv_start, double curv_end); ~CAdcGeoSpiral(); void set_params(double curv_start, double curv_end); - void debug(void); }; class CAdcGeoArc: public CAdcGeometry @@ -62,6 +62,7 @@ class CAdcGeoArc: public CAdcGeometry double curvature; protected: + void debug_param(void); bool get_local_pose(double s, double t, double heading, double &u, double &v, double &yaw); public: @@ -70,7 +71,6 @@ class CAdcGeoArc: public CAdcGeometry CAdcGeoArc(double min_s, double max_s, double x, double y, double heading, double curvature); ~CAdcGeoArc(); void set_params(double curvature); - void debug(void); }; typedef struct @@ -87,6 +87,7 @@ class CAdcGeoPoly3: public CAdcGeometry Adc_poly3_param param; protected: + void debug_param(void); bool get_local_pose(double s, double t, double heading, double &u, double &v, double &yaw); public: @@ -95,7 +96,6 @@ class CAdcGeoPoly3: public CAdcGeometry CAdcGeoPoly3(double min_s, double max_s, double x, double y, double heading, Adc_poly3_param param); ~CAdcGeoPoly3(); void set_params(Adc_poly3_param param); - void debug(void); }; class CAdcGeoParamPoly3: public CAdcGeometry @@ -106,6 +106,7 @@ class CAdcGeoParamPoly3: public CAdcGeometry bool normalized; protected: + void debug_param(void); bool get_local_pose(double s, double t, double heading, double &u, double &v, double &yaw); public: @@ -114,6 +115,5 @@ class CAdcGeoParamPoly3: public CAdcGeometry CAdcGeoParamPoly3(double min_s, double max_s, double x, double y, double heading, Adc_poly3_param u_param, Adc_poly3_param v_param, bool normalized = true); ~CAdcGeoParamPoly3(); void set_params(Adc_poly3_param u_param, Adc_poly3_param v_param, bool normalized = true); - void debug(void); }; #endif \ No newline at end of file diff --git a/include/adc_road.h b/include/adc_road.h index bee76224e9dc0644c6647251ac6c6cd4e1273406..006728da4d359087c57299fb9859ef0de7db04b8 100644 --- a/include/adc_road.h +++ b/include/adc_road.h @@ -22,6 +22,7 @@ class CAdcRoad void clear_geometries(void); void add_geometry(CAdcGeometry* geometry); + void delete_geometries(void); void clear_signals(void); void add_signal(CAdcSignals sign); void set_id(int id); diff --git a/src/adc_circuit.cpp b/src/adc_circuit.cpp index c2edbd1f972681a86697361d561b15425d8a7c5f..1de10c830cd229861d04388c5c8f5cf0261b5e88 100644 --- a/src/adc_circuit.cpp +++ b/src/adc_circuit.cpp @@ -8,6 +8,8 @@ CAdcCircuit::CAdcCircuit() CAdcCircuit::~CAdcCircuit() { + for (unsigned int i = 0; i < this->roads.size(); i++) + this->roads[i].delete_geometries(); clear_roads(); } diff --git a/src/adc_geometries.cpp b/src/adc_geometries.cpp index 4a15e914fb08573c7ddedeb23e030011d6a5bd02..f4256cef8c5367058c3949a37cc5b3602334bf2e 100644 --- a/src/adc_geometries.cpp +++ b/src/adc_geometries.cpp @@ -49,10 +49,11 @@ bool CAdcGeometry::on_range(double s) return false; } -void CAdcGeometry::debug_base(void) +void CAdcGeometry::debug(void) { std::cout << " Geometry from " << this->min_s << " to " << this->max_s << std::endl; std::cout << " pose: x = " << this->x << ", y = " << this->y << ", yaw = " << this->heading << std::endl; + debug_param(); } @@ -81,9 +82,9 @@ bool CAdcGeoLine::get_local_pose(double s, double t, double heading, double &u, return true; } -void CAdcGeoLine::debug(void) +void CAdcGeoLine::debug_param(void) { - debug_base(); + } @@ -128,9 +129,8 @@ bool CAdcGeoSpiral::get_local_pose(double s, double t, double heading, double &u return false; } -void CAdcGeoSpiral::debug(void) +void CAdcGeoSpiral::debug_param(void) { - debug_base(); std::cout << " params: start_curvature = " << this->curv_start << ", end_curvature = " << this->curv_end << std::endl; } @@ -174,9 +174,8 @@ bool CAdcGeoArc::get_local_pose(double s, double t, double heading, double &u, d return true; } -void CAdcGeoArc::debug(void) +void CAdcGeoArc::debug_param(void) { - debug_base(); std::cout << " params: curvature = " << this->curvature << std::endl; } @@ -230,9 +229,8 @@ bool CAdcGeoPoly3::get_local_pose(double s, double t, double heading, double &u, return false; } -void CAdcGeoPoly3::debug(void) +void CAdcGeoPoly3::debug_param(void) { - debug_base(); std::cout << " params: a = " << this->param.a << ", b = " << this->param.b << ", c = " << this->param.c << ", d = " << this->param.d << std::endl; } @@ -311,9 +309,8 @@ bool CAdcGeoParamPoly3::get_local_pose(double s, double t, double heading, doubl return true; } -void CAdcGeoParamPoly3::debug(void) +void CAdcGeoParamPoly3::debug_param(void) { - debug_base(); std::cout << " U params: a = " << this->u_param.a << ", b = " << this->u_param.b << ", c = " << this->u_param.c << ", d = " << this->u_param.d << std::endl; std::cout << " V params: a = " << this->v_param.a << ", b = " << this->v_param.b << ", c = " << this->v_param.c << ", d = " << this->v_param.d << std::endl; } diff --git a/src/adc_road.cpp b/src/adc_road.cpp index 223ccd64dbbace14f28f1ab4af0edfcef174ee91..76041e7bc4b8250016e9d6e05a907863667e43f2 100644 --- a/src/adc_road.cpp +++ b/src/adc_road.cpp @@ -33,10 +33,16 @@ void CAdcRoad::clear_geometries(void) std::vector<CAdcGeometry*>().swap(this->geometries); } +void CAdcRoad::delete_geometries(void) +{ + for (unsigned int i = 0; i < this->geometries.size(); i++) + delete this->geometries[i]; + std::vector<CAdcGeometry*>().swap(this->geometries); +} + void CAdcRoad::add_geometry(CAdcGeometry* geometry) { this->geometries.push_back(geometry); - // this->geometries.emplace_back(geometry); } void CAdcRoad::clear_signals(void) diff --git a/src/open_drive_format.cpp b/src/open_drive_format.cpp index f576c15fd4609e8053be61685d9c632d6137eb7f..5a3b049fd2bfe18a2aab2ba42fb16781f19af284 100644 --- a/src/open_drive_format.cpp +++ b/src/open_drive_format.cpp @@ -46,33 +46,27 @@ void COpenDriveFormat::load(std::string &filename, bool debug) for (planView::geometry_iterator geo_it(road_it->planView().geometry().begin()); geo_it != road_it->planView().geometry().end(); ++geo_it) { double min_s = (geo_it->s().present() ? geo_it->s().get() : 0.0); - double max_s = (geo_it->length().present() ? geo_it->length().get() : 0.0); + double max_s = min_s + (geo_it->length().present() ? geo_it->length().get() : 0.0); double x = (geo_it->x().present() ? geo_it->x().get() : 0.0); double y = (geo_it->y().present() ? geo_it->y().get() : 0.0); double heading = (geo_it->hdg().present() ? geo_it->hdg().get() : 0.0); if (geo_it->line().present()) { - CAdcGeoLine line(min_s, max_s, x, y, heading); - CAdcGeometry* geo; - geo = &line; - road.add_geometry(geo); + CAdcGeoLine *line = new CAdcGeoLine(min_s, max_s, x, y, heading); + road.add_geometry(line); } else if (geo_it->spiral().present()) { double curv_start = (geo_it->spiral().get().curvStart().present() ? geo_it->spiral().get().curvStart().get() : 0.0); double curv_end = (geo_it->spiral().get().curvEnd().present() ? geo_it->spiral().get().curvEnd().get() : 0.0); - CAdcGeoSpiral spi(min_s, max_s, x, y, heading, curv_start, curv_end); - CAdcGeometry* geo; - geo = &spi; - road.add_geometry(geo); + CAdcGeoSpiral *spi = new CAdcGeoSpiral(min_s, max_s, x, y, heading, curv_start, curv_end); + road.add_geometry(spi); } else if (geo_it->arc().present()) { double curvature = (geo_it->arc().get().curvature().present() ? geo_it->arc().get().curvature().get() : 0.0); - CAdcGeoArc arc(min_s, max_s, x, y, heading, curvature); - CAdcGeometry* geo; - geo = &arc; - road.add_geometry(geo); + CAdcGeoArc *arc = new CAdcGeoArc(min_s, max_s, x, y, heading, curvature); + road.add_geometry(arc); } else if (geo_it->poly3().present()) { @@ -81,10 +75,8 @@ void COpenDriveFormat::load(std::string &filename, bool debug) param.b = (geo_it->poly3().get().b().present() ? geo_it->poly3().get().b().get() : 0.0); param.c = (geo_it->poly3().get().c().present() ? geo_it->poly3().get().c().get() : 0.0); param.d = (geo_it->poly3().get().d().present() ? geo_it->poly3().get().d().get() : 0.0); - CAdcGeoPoly3 poly3(min_s, max_s, x, y, heading, param); - CAdcGeometry* geo; - geo = &poly3; - road.add_geometry(geo); + CAdcGeoPoly3 *poly3 = new CAdcGeoPoly3(min_s, max_s, x, y, heading, param); + road.add_geometry(poly3); } else if (geo_it->paramPoly3().present()) { @@ -101,12 +93,8 @@ void COpenDriveFormat::load(std::string &filename, bool debug) bool normalized = true; if (geo_it->paramPoly3().get().pRange().present() && geo_it->paramPoly3().get().pRange().get() == pRange::arcLength) normalized = false; - CAdcGeoParamPoly3 parampoly3(min_s, max_s, x, y, heading, u_param, v_param, normalized); - CAdcGeometry* geo; - geo = ¶mpoly3; - - // geo->debug(); - road.add_geometry(geo); + CAdcGeoParamPoly3 *parampoly3 = new CAdcGeoParamPoly3(min_s, max_s, x, y, heading, u_param, v_param, normalized); + road.add_geometry(parampoly3); } }