Skip to content

Commit

Permalink
refactor:organise methods into separate files #1
Browse files Browse the repository at this point in the history
  • Loading branch information
dobaybalazs committed Feb 24, 2022
1 parent 33883d6 commit b67d0d4
Show file tree
Hide file tree
Showing 9 changed files with 490 additions and 584 deletions.
3 changes: 2 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ include_directories(
${catkin_INCLUDE_DIRS}
)

add_executable(lidar_road src/lidarSegmentation.cpp src/main.cpp)
add_executable(lidar_road src/lidar_segmentation.cpp src/main.cpp src/star_shaped_search.cpp
src/x_zero_method.cpp src/z_zero_method.cpp src/blind_spots.cpp)
add_dependencies(lidar_road ${PROJECT_NAME}_gencfg)
target_link_libraries(lidar_road ${catkin_LIBRARIES})
4 changes: 2 additions & 2 deletions cfg/LidarFilters.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env python
PACKAGE = "lidar_filters_pkg"
PACKAGE = "urban_road_filter"

from dynamic_reconfigure.parameter_generator_catkin import *

Expand Down Expand Up @@ -79,4 +79,4 @@ gen.add("poly_z_manual", double_t, 0, "Set a constant polygon height", -1.5, -5,
#Egyszerusitett polygon z-koordinatai atlagbol (CSP)
gen.add("poly_z_avg_allow", bool_t, 0, "Set polygon height to average value", True)

exit(gen.generate(PACKAGE, "lidar_filters_pkg", "LidarFilters"))
exit(gen.generate(PACKAGE, "lidar_filters_pkg", "LidarFilters"))
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <math.h>
#include <cmath>
#include <vector>
#include <memory>

/*Includes for ROS.*/
#include <ros/ros.h>
Expand All @@ -24,6 +25,7 @@
#include <pcl/point_cloud.h>
#include <pcl_ros/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/filters/conditional_removal.h>

/*ramer-douglas-peucker*/
#include <boost/geometry.hpp>
Expand Down Expand Up @@ -82,6 +84,26 @@ extern bool zavg_allow; /*egyszerűsített polygon
extern float polysimp; /*polygon-egyszerűsítési tényező (Ramer-Douglas-Peucker)*/
extern float polyz; /*manuálisan megadott z-koordináta (polygon)*/

/*For pointcloud filtering*/
template <typename PointT>
class FilteringCondition : public pcl::ConditionBase<PointT>
{
public:
typedef std::shared_ptr<FilteringCondition<PointT>> Ptr;
typedef std::shared_ptr<const FilteringCondition<PointT>> ConstPtr;
typedef std::function<bool(const PointT&)> FunctorT;

FilteringCondition(FunctorT evaluator):
pcl::ConditionBase<PointT>(),_evaluator( evaluator )
{}

virtual bool evaluate (const PointT &point) const {
// just delegate ALL the work to the injected std::function
return _evaluator(point);
}
private:
FunctorT _evaluator;
};

class Detector{
public:
Expand All @@ -93,13 +115,15 @@ class Detector{

//void filtered(const pcl::PointCloud<pcl::PointXYZI> &cloud);

void filter(const pcl::PointCloud<pcl::PointXYZI> &cloud);
void filtered(const pcl::PointCloud<pcl::PointXYZI> &cloud);

void starShapedSearch(std::vector<Point2D>& array2D);

void xZeroMethod(std::vector<std::vector<Point3D>>& array3D,int index,int* indexArray);

void zZeroMethod(std::vector<std::vector<Point3D>>& array3D,int index,int* indexArray);

void blindSpots(std::vector<std::vector<Point3D>>& array3D,int index,int* indexArray,float* maxDistance);

private:
ros::Publisher pub_road;
Expand Down
282 changes: 282 additions & 0 deletions src/blind_spots.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,282 @@
#include "urban_road_filter/data_structures.hpp"

bool blind_spots; /*Vakfolt javító algoritmus.*/

void Detector::blindSpots(std::vector<std::vector<Point3D>>& array3D,int index,int* indexArray,float* maxDistance){
/*Vakfolt keresés:
Megvizsgáljuk a második körvonalat. (Az elsővel pontatlan.)
Főleg a [90°-180° --- 180°-270°] tartomány és a [0°-90° --- 270°-360°] tartomány a lényeg, az autó két oldalán.
Mind a kettő tartományban keresünk 2db magaspontot. Ha az adott tartományban az első körvonalon van két magaspont,
a közte lévő terület nagy valószínűséggel egy vakfolt lesz.*/
float q1 = 0, q2 = 180, q3 = 180, q4 = 360; /*A kör négy része. (1. 2. 3. 4. negyed.)*/
int c1 = -1, c2 = -1, c3 = -1, c4 = -1; /*A talált pontok ID-ja az első körvonalon.*/
int i,j,k,l; /*Segéd változók*/

if (blind_spots)
{
for (int i = 0; i < indexArray[1]; i++)
{
if(array3D[1][i].isCurbPoint==2)
{
if (array3D[1][i].alpha >= 0 && array3D[1][i].alpha < 90)
{
if (array3D[1][i].alpha > q1)
{
q1 = array3D[1][i].alpha;
c1 = i;
}
}
else if (array3D[1][i].alpha >= 90 && array3D[1][i].alpha < 180)
{
if (array3D[1][i].alpha < q2)
{
q2 = array3D[1][i].alpha;
c2 = i;
}
}
else if (array3D[1][i].alpha >= 180 && array3D[1][i].alpha < 270)
{
if (array3D[1][i].alpha > q3)
{
q3 = array3D[1][i].alpha;
c3 = i;
}
}
else
{
if (array3D[1][i].alpha < q4)
{
q4 = array3D[1][i].alpha;
c4 = i;
}
}
}
}
}

float arcDistance; /*Körív mérete, a megadott foknál. Fontos minden körön, ugyanakkora körív méretet vizsgálni.*/
int notRoad; /*Ha az adott köríven, az adott szakaszon, található magaspont, akkor 1-es értéket vesz fel, amúgy 0-át.*/
int blindSpot; /*Vakfoltok az autó mellett.*/
float currentDegree; /*Az aktuális köríven, a szög nagysága.*/

/*A körív méret meghatározása.*/
arcDistance = ((maxDistance[0] * M_PI) / 180) * beamZone;

/*0°-tól 360° - beamZone-ig.*/
for (int i = 0; i <= 360 - beamZone; i++)
{
blindSpot = 0;

if (blind_spots)
{
/*Ha ezek a feltételek teljesülnek, akkor egy vakfoltba léptünk és itt nem vizsgálódunk.*/
if (xDirection == 0)
{
/*+-X irányba is vizsgáljuk a pontokat.*/
if ((q1 != 0 && q4 != 360 && (i <= q1 || i >= q4)) || (q2 != 180 && q3 != 180 && i >= q2 && i <= q3))
{
blindSpot = 1;
}
}
else if (xDirection == 1)
{
/*+X irányba vizsgáljuk a pontokat.*/
if ((q2 != 180 && i >= q2 && i <= 270) || (q1 != 0 && (i <= q1 || i >= 270)))
{
blindSpot = 1;
}
}
else
{
/*-X vizsgáljuk a pontokat.*/
if ((q4 != 360 && (i >= q4 || i <= 90)) || (q3 != 180 && i <= q3 && i >= 90))
{
blindSpot = 1;
}
}
}

if (blindSpot == 0)
{
/*Alap beállítás, hogy az adott szakaszon nincs magaspont.*/
notRoad = 0;

/*Az első kör adott szakaszának vizsgálata.*/
for (j = 0; array3D[0][j].alpha <= i + beamZone && j < indexArray[0]; j++)
{
if (array3D[0][j].alpha >= i)
{
/*Nem vizsgáljuk tovább az adott szakaszt, ha találunk benne magaspontot.*/
if (array3D[0][j].isCurbPoint == 2)
{
notRoad = 1;
break;
}
}
}

/*Ha nem találtunk az első kör, adott szakaszán magaspontot, továbbléphetünk a következő körre.*/
if (notRoad == 0)
{
/*Az első kör szakaszát elfogadjuk.*/
for (j = 0; array3D[0][j].alpha <= i + beamZone && j < indexArray[0]; j++)
{
if (array3D[0][j].alpha >= i)
{
array3D[0][j].isCurbPoint = 1;
}
}

/*A további körök vizsgálata.*/
for (k = 1; k < index; k++)
{
/*Új szöget kell meghatározni, hogy a távolabbi körvonalakon is, ugyanakkora körív hosszt vizsgáljunk.*/
if (i == 360 - beamZone)
{
currentDegree = 360;
}
else
{
currentDegree = i + arcDistance / ((maxDistance[k] * M_PI) / 180);
}

/*Az új kör pontjait vizsgáljuk.*/
for (l = 0; array3D[k][l].alpha <= currentDegree && l < indexArray[k]; l++)
{
if (array3D[k][l].alpha >= i)
{
/*Nem vizsgáljuk tovább az adott szakaszt, ha találunk benne magaspontot.*/
if (array3D[k][l].isCurbPoint == 2)
{
notRoad = 1;
break;
}
}
}

/*A többi kört nem vizsgáljuk, ha a sugár, elakadt egy magasponton.*/
if (notRoad == 1)
break;

/*Egyébként, elfogadjuk az adott kör, adott szakaszát.*/
for (l = 0; array3D[k][l].alpha <= currentDegree && l < indexArray[k]; l++)
{
if (array3D[k][l].alpha >= i)
{
array3D[k][l].isCurbPoint = 1;
}
}
}
}
}
}

/*Ugyanaz, mint az előző, csak itt 360°-tól 0° + beamZone-ig vizsgáljuk a pontokat.*/
for (i = 360; i >= 0 + beamZone; --i)
{
blindSpot = 0;

if (blind_spots)
{
/*Ha ezek a feltételek teljesülnek, akkor egy vakfoltba léptünk és itt nem vizsgálódunk.*/
if (xDirection == 0)
{
/*+-X irányba is vizsgáljuk a pontokat.*/
if ((q1 != 0 && q4 != 360 && (i <= q1 || i >= q4)) || (q2 != 180 && q3 != 180 && i >= q2 && i <= q3))
{
blindSpot = 1;
}
}
else if (xDirection == 1)
{
/*+X irányba vizsgáljuk a pontokat.*/
if ((q2 != 180 && i >= q2 && i <= 270) || (q1 != 0 && (i <= q1 || i >= 270)))
{
blindSpot = 1;
}
}
else
{
/*-X vizsgáljuk a pontokat.*/
if ((q4 != 360 && (i >= q4 || i <= 90)) || (q3 != 180 && i <= q3 && i >= 90))
{
blindSpot = 1;
}
}
}

if (blindSpot == 0)
{
/*Alap beállítás, hogy az adott szakaszon nincs magaspont.*/
notRoad = 0;

/*Az első kör adott szakaszának vizsgálata.*/
for (j = indexArray[0] - 1; array3D[0][j].alpha >= i - beamZone && j >= 0; --j)
{
if (array3D[0][j].alpha <= i)
{
/*Nem vizsgáljuk tovább az adott szakaszt, ha találunk benne magaspontot.*/
if (array3D[0][j].isCurbPoint == 2)
{
notRoad = 1;
break;
}
}
}

/*Ha nem találtunk az első kör, adott szakaszán magaspontot, továbbléphetünk a következő körre.*/
if (notRoad == 0)
{
/*Az első kör szakaszát elfogadjuk.*/
for (j = indexArray[0] - 1; array3D[0][j].alpha >= i - beamZone && j >= 0; --j)
{
if (array3D[0][j].alpha <= i)
{
array3D[0][j].isCurbPoint = 1;
}
}

/*A további körök vizsgálata.*/
for (k = 1; k < index; k++)
{
/*Új szöget kell meghatározni, hogy a távolabbi körvonalakon is, ugyanakkora körív hosszt vizsgáljunk.*/
if (i == 0 + beamZone)
{
currentDegree = 0;
}
else
{
currentDegree = i - arcDistance / ((maxDistance[k] * M_PI) / 180);
}

/*Az új kör pontjait vizsgáljuk.*/
for (l = indexArray[k] - 1; array3D[k][l].alpha >= currentDegree && l >= 0; --l)
{
if (array3D[k][l].alpha <= i)
{
/*Nem vizsgáljuk tovább az adott szakaszt, ha találunk benne magaspontot.*/
if (array3D[k][l].isCurbPoint == 2)
{
notRoad = 1;
break;
}
}
}

/*A többi kört nem vizsgáljuk, ha a sugár, elakadt egy magasponton.*/
if (notRoad == 1)
break;

/*Egyébként, elfogadjuk az adott kör, adott szakaszát.*/
for (l = indexArray[k] - 1; array3D[k][l].alpha >= currentDegree && l >= 0; --l)
{
if (array3D[k][l].alpha <= i)
{
array3D[k][l].isCurbPoint = 1;
}
}
}
}
}
}
}
Loading

0 comments on commit b67d0d4

Please sign in to comment.