├── Lidar Obstacle Detection.sdf ├── Lidar Obstacle Detection.v12.suo ├── src ├── sensors │ ├── data │ │ └── pcd │ │ │ ├── data_1 │ │ │ ├── 0000000000.pcd │ │ │ ├── 0000000001.pcd │ │ │ ├── 0000000002.pcd │ │ │ ├── 0000000003.pcd │ │ │ ├── 0000000004.pcd │ │ │ ├── 0000000005.pcd │ │ │ ├── 0000000006.pcd │ │ │ ├── 0000000007.pcd │ │ │ ├── 0000000008.pcd │ │ │ ├── 0000000009.pcd │ │ │ ├── 0000000010.pcd │ │ │ ├── 0000000011.pcd │ │ │ ├── 0000000012.pcd │ │ │ ├── 0000000013.pcd │ │ │ ├── 0000000014.pcd │ │ │ ├── 0000000015.pcd │ │ │ ├── 0000000016.pcd │ │ │ ├── 0000000017.pcd │ │ │ ├── 0000000018.pcd │ │ │ ├── 0000000019.pcd │ │ │ ├── 0000000020.pcd │ │ │ └── 0000000021.pcd │ │ │ └── simpleHighway.pcd │ └── lidar.h ├── render │ ├── box.h │ ├── render.h │ └── render.cpp ├── environment.cpp ├── processPointClouds.h ├── processPointClouds_editing.cpp └── processPointClouds.cpp ├── CMakeLists.txt ├── .project ├── Lidar Obstacle Detection.sln ├── Lidar Obstacle Detection.vcxproj.filters ├── .cproject ├── Lidar Obstacle Detection.vcxproj └── README.md /Lidar Obstacle Detection.sdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/Lidar Obstacle Detection.sdf -------------------------------------------------------------------------------- /Lidar Obstacle Detection.v12.suo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/Lidar Obstacle Detection.v12.suo -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000000.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000000.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000001.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000001.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000002.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000002.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000003.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000003.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000004.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000004.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000005.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000005.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000006.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000006.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000007.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000007.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000008.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000008.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000009.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000009.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000010.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000010.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000011.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000011.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000012.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000012.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000013.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000013.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000014.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000014.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000015.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000015.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000016.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000016.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000017.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000017.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000018.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000018.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000019.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000019.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000020.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000020.pcd -------------------------------------------------------------------------------- /src/sensors/data/pcd/data_1/0000000021.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajith3530/Udacity_Lidar_Obstacle_Detection/HEAD/src/sensors/data/pcd/data_1/0000000021.pcd -------------------------------------------------------------------------------- /src/render/box.h: -------------------------------------------------------------------------------- 1 | #ifndef BOX_H 2 | #define BOX_H 3 | #include 4 | 5 | struct BoxQ 6 | { 7 | Eigen::Vector3f bboxTransform; 8 | Eigen::Quaternionf bboxQuaternion; 9 | float cube_length; 10 | float cube_width; 11 | float cube_height; 12 | }; 13 | struct Box 14 | { 15 | float x_min; 16 | float y_min; 17 | float z_min; 18 | float x_max; 19 | float y_max; 20 | float z_max; 21 | }; 22 | #endif -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.8 FATAL_ERROR) 2 | 3 | add_definitions(-std=c++11) 4 | 5 | set(CXX_FLAGS "-Wall") 6 | set(CMAKE_CXX_FLAGS, "${CXX_FLAGS}") 7 | 8 | project(playback) 9 | 10 | find_package(PCL 1.2 REQUIRED) 11 | 12 | include_directories(${PCL_INCLUDE_DIRS}) 13 | link_directories(${PCL_LIBRARY_DIRS}) 14 | add_definitions(${PCL_DEFINITIONS}) 15 | list(REMOVE_ITEM PCL_LIBRARIES "vtkproj4") 16 | 17 | 18 | add_executable (environment src/environment.cpp src/render/render.cpp src/processPointClouds.cpp) 19 | target_link_libraries (environment ${PCL_LIBRARIES}) 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | Project1 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.cdt.managedbuilder.core.genmakebuilder 10 | clean,full,incremental, 11 | 12 | 13 | 14 | 15 | org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder 16 | full,incremental, 17 | 18 | 19 | 20 | 21 | 22 | org.eclipse.cdt.core.cnature 23 | org.eclipse.cdt.core.ccnature 24 | org.eclipse.cdt.managedbuilder.core.managedBuildNature 25 | org.eclipse.cdt.managedbuilder.core.ScannerConfigNature 26 | 27 | 28 | -------------------------------------------------------------------------------- /Lidar Obstacle Detection.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2013 4 | VisualStudioVersion = 12.0.31101.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Lidar Obstacle Detection", "Lidar Obstacle Detection.vcxproj", "{6E845524-4BD4-44DE-BD1E-BE3732C6A6D2}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Win32 = Debug|Win32 11 | Release|Win32 = Release|Win32 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {6E845524-4BD4-44DE-BD1E-BE3732C6A6D2}.Debug|Win32.ActiveCfg = Debug|Win32 15 | {6E845524-4BD4-44DE-BD1E-BE3732C6A6D2}.Debug|Win32.Build.0 = Debug|Win32 16 | {6E845524-4BD4-44DE-BD1E-BE3732C6A6D2}.Release|Win32.ActiveCfg = Release|Win32 17 | {6E845524-4BD4-44DE-BD1E-BE3732C6A6D2}.Release|Win32.Build.0 = Release|Win32 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /Lidar Obstacle Detection.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | Source Files 23 | 24 | 25 | Source Files 26 | 27 | 28 | Source Files 29 | 30 | 31 | 32 | 33 | Header Files 34 | 35 | 36 | Header Files 37 | 38 | 39 | Header Files 40 | 41 | 42 | Header Files 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/render/render.h: -------------------------------------------------------------------------------- 1 | /* \author Aaron Brown */ 2 | // Functions and structs used to render the enviroment 3 | // such as cars and the highway 4 | 5 | #ifndef RENDER_H 6 | #define RENDER_H 7 | #include 8 | #include "box.h" 9 | #include 10 | #include 11 | #include 12 | 13 | struct Color 14 | { 15 | 16 | float r, g, b; 17 | 18 | Color(float setR, float setG, float setB) 19 | : r(setR), g(setG), b(setB) 20 | {} 21 | }; 22 | 23 | struct Vect3 24 | { 25 | 26 | double x, y, z; 27 | 28 | Vect3(double setX, double setY, double setZ) 29 | : x(setX), y(setY), z(setZ) 30 | {} 31 | 32 | Vect3 operator+(const Vect3& vec) 33 | { 34 | Vect3 result(x+vec.x,y+vec.y,z+vec.z); 35 | return result; 36 | } 37 | }; 38 | 39 | enum CameraAngle 40 | { 41 | XY, TopDown, Side, FPS 42 | }; 43 | 44 | struct Car 45 | { 46 | 47 | // units in meters 48 | Vect3 position, dimensions; 49 | 50 | std::string name; 51 | Color color; 52 | 53 | Car(Vect3 setPosition, Vect3 setDimensions, Color setColor, std::string setName) 54 | : position(setPosition), dimensions(setDimensions), color(setColor), name(setName) 55 | {} 56 | 57 | void render(pcl::visualization::PCLVisualizer::Ptr& viewer) 58 | { 59 | // render bottom of car 60 | viewer->addCube(position.x-dimensions.x/2, position.x+dimensions.x/2, position.y-dimensions.y/2, position.y+dimensions.y/2, position.z, position.z+dimensions.z*2/3, color.r, color.g, color.b, name); 61 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_SURFACE, name); 62 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, color.r, color.g, color.b, name); 63 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, 1.0, name); 64 | // render top of car 65 | viewer->addCube(position.x-dimensions.x/4, position.x+dimensions.x/4, position.y-dimensions.y/2, position.y+dimensions.y/2, position.z+dimensions.z*2/3, position.z+dimensions.z, color.r, color.g, color.b, name+"Top"); 66 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_SURFACE, name+"Top"); 67 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, color.r, color.g, color.b, name+"Top"); 68 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, 1.0, name+"Top"); 69 | } 70 | 71 | // collision helper function 72 | bool inbetween(double point, double center, double range) 73 | { 74 | return (center-range <= point) && (center+range >= point); 75 | } 76 | 77 | bool checkCollision(Vect3 point) 78 | { 79 | return (inbetween(point.x,position.x,dimensions.x/2)&&inbetween(point.y,position.y,dimensions.y/2)&&inbetween(point.z,position.z+dimensions.z/3,dimensions.z/3))|| 80 | (inbetween(point.x,position.x,dimensions.x/4)&&inbetween(point.y,position.y,dimensions.y/2)&&inbetween(point.z,position.z+dimensions.z*5/6,dimensions.z/6)); 81 | 82 | } 83 | }; 84 | 85 | void renderHighway(pcl::visualization::PCLVisualizer::Ptr& viewer); 86 | void renderRays(pcl::visualization::PCLVisualizer::Ptr& viewer, const Vect3& origin, const pcl::PointCloud::Ptr& cloud); 87 | void clearRays(pcl::visualization::PCLVisualizer::Ptr& viewer); 88 | void renderPointCloud(pcl::visualization::PCLVisualizer::Ptr& viewer, const pcl::PointCloud::Ptr& cloud, std::string name, Color color = Color(1,1,1)); 89 | void renderPointCloud(pcl::visualization::PCLVisualizer::Ptr& viewer, const pcl::PointCloud::Ptr& cloud, std::string name, Color color = Color(-1,-1,-1)); 90 | void renderBox(pcl::visualization::PCLVisualizer::Ptr& viewer, Box box, int id, Color color = Color(1,0,0), float opacity=1); 91 | void renderBox(pcl::visualization::PCLVisualizer::Ptr& viewer, BoxQ box, int id, Color color = Color(1,0,0), float opacity=1); 92 | 93 | #endif 94 | -------------------------------------------------------------------------------- /src/environment.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include "sensors/lidar.h" 3 | #include "render/render.h" 4 | #include "processPointClouds.h" 5 | #include "processPointClouds.cpp" 6 | 7 | std::vector initHighway(bool renderScene, pcl::visualization::PCLVisualizer::Ptr& viewer) 8 | { 9 | 10 | Car egoCar( Vect3(0,0,0), Vect3(4,2,2), Color(0,1,0), "egoCar"); 11 | Car car1( Vect3(15,0,0), Vect3(4,2,2), Color(0,0,1), "car1"); 12 | Car car2( Vect3(8,-4,0), Vect3(4,2,2), Color(0,0,1), "car2"); 13 | Car car3( Vect3(-12,4,0), Vect3(4,2,2), Color(0,0,1), "car3"); 14 | 15 | std::vector cars; 16 | cars.push_back(egoCar); 17 | cars.push_back(car1); 18 | cars.push_back(car2); 19 | cars.push_back(car3); 20 | 21 | if(renderScene) 22 | { 23 | renderHighway(viewer); 24 | egoCar.render(viewer); 25 | car1.render(viewer); 26 | car2.render(viewer); 27 | car3.render(viewer); 28 | } 29 | 30 | return cars; 31 | } 32 | 33 | void cityBlock(pcl::visualization::PCLVisualizer::Ptr& viewer, ProcessPointClouds* pointProcessorI, const pcl::PointCloud::Ptr& inputCloud) 34 | { 35 | pcl::PointCloud::Ptr filterCloud; 36 | filterCloud = pointProcessorI->FilterCloud(inputCloud, 0.2 , Eigen::Vector4f (-15, -5, -2, 1), Eigen::Vector4f ( 30, 7, 4, 1)); 37 | std::pair::Ptr, pcl::PointCloud::Ptr> segmentCloud = pointProcessorI->RANSAC_SegmentPlane(filterCloud, 50, 0.3); 38 | renderPointCloud(viewer,segmentCloud.second,"planeCloud",Color(0,1,0)); 39 | std::vector::Ptr> cloudClusters = pointProcessorI->Clustering_Cluster(segmentCloud.first, 0.3, 10, 750); 40 | int clusterId = 0; 41 | std::vector colors = {Color(1,0,0), Color(1,1,0), Color(0,0,1)}; 42 | for(pcl::PointCloud::Ptr cluster : cloudClusters) 43 | { 44 | std::cout << "cluster size "; 45 | pointProcessorI->numPoints(cluster); 46 | renderPointCloud(viewer,cluster,"obstCloud"+std::to_string(clusterId),colors[clusterId%3]); 47 | 48 | Box box = pointProcessorI->BoundingBox(cluster); 49 | renderBox(viewer,box,clusterId); 50 | 51 | ++clusterId; 52 | } 53 | 54 | } 55 | //setAngle: SWITCH CAMERA ANGLE {XY, TopDown, Side, FPS} 56 | void initCamera(CameraAngle setAngle, pcl::visualization::PCLVisualizer::Ptr& viewer) 57 | { 58 | 59 | viewer->setBackgroundColor (0, 0, 0); 60 | 61 | // set camera position and angle 62 | viewer->initCameraParameters(); 63 | // distance away in meters 64 | int distance = 16; 65 | 66 | switch(setAngle) 67 | { 68 | case XY : viewer->setCameraPosition(-distance, -distance, distance, 1, 1, 0); break; 69 | case TopDown : viewer->setCameraPosition(0, 0, distance, 1, 0, 1); break; 70 | case Side : viewer->setCameraPosition(0, -distance, 0, 0, 0, 1); break; 71 | case FPS : viewer->setCameraPosition(-10, 0, 0, 0, 0, 1); 72 | } 73 | 74 | if(setAngle!=FPS) 75 | viewer->addCoordinateSystem (1.0); 76 | } 77 | 78 | 79 | int main (int argc, char** argv) 80 | { 81 | std::cout << "starting enviroment" << std::endl; 82 | 83 | pcl::visualization::PCLVisualizer::Ptr viewer (new pcl::visualization::PCLVisualizer ("3D Viewer")); 84 | ProcessPointClouds* pointProcessorI = new ProcessPointClouds(); 85 | std::vector stream = pointProcessorI->streamPcd("../src/sensors/data/pcd/data_1"); 86 | auto streamIterator = stream.begin(); 87 | pcl::PointCloud::Ptr inputCloudI; 88 | 89 | CameraAngle setAngle = XY; 90 | initCamera(setAngle, viewer); 91 | 92 | while (!viewer->wasStopped ()) 93 | { 94 | viewer->removeAllPointClouds(); 95 | viewer->removeAllShapes(); 96 | 97 | inputCloudI = pointProcessorI->loadPcd((*streamIterator).string()); 98 | cityBlock(viewer, pointProcessorI, inputCloudI); 99 | 100 | streamIterator++; 101 | if(streamIterator == stream.end()) 102 | streamIterator = stream.begin(); 103 | 104 | viewer->spinOnce (); 105 | } 106 | 107 | } 108 | -------------------------------------------------------------------------------- /.cproject: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /Lidar Obstacle Detection.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | 14 | {6E845524-4BD4-44DE-BD1E-BE3732C6A6D2} 15 | Win32Proj 16 | 17 | 18 | 19 | Application 20 | true 21 | v120 22 | 23 | 24 | Application 25 | false 26 | v120 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | true 40 | 41 | 42 | true 43 | 44 | 45 | 46 | WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) 47 | MultiThreadedDebugDLL 48 | Level3 49 | ProgramDatabase 50 | Disabled 51 | 52 | 53 | MachineX86 54 | true 55 | Windows 56 | 57 | 58 | 59 | 60 | WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) 61 | MultiThreadedDLL 62 | Level3 63 | ProgramDatabase 64 | 65 | 66 | MachineX86 67 | true 68 | Windows 69 | true 70 | true 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /src/sensors/lidar.h: -------------------------------------------------------------------------------- 1 | #ifndef LIDAR_H 2 | #define LIDAR_H 3 | #include "../render/render.h" 4 | #include 5 | #include 6 | 7 | const double pi = 3.1415; 8 | 9 | struct Ray 10 | { 11 | 12 | Vect3 origin; 13 | double resolution; 14 | Vect3 direction; 15 | Vect3 castPosition; 16 | double castDistance; 17 | 18 | // parameters: 19 | // setOrigin: the starting position from where the ray is cast 20 | // horizontalAngle: the angle of direction the ray travels on the xy plane 21 | // verticalAngle: the angle of direction between xy plane and ray 22 | // for example 0 radians is along xy plane and pi/2 radians is stright up 23 | // resoultion: the magnitude of the ray's step, used for ray casting, the smaller the more accurate but the more expensive 24 | 25 | Ray(Vect3 setOrigin, double horizontalAngle, double verticalAngle, double setResolution) 26 | : origin(setOrigin), resolution(setResolution), direction(resolution*cos(verticalAngle)*cos(horizontalAngle), resolution*cos(verticalAngle)*sin(horizontalAngle),resolution*sin(verticalAngle)), 27 | castPosition(origin), castDistance(0) 28 | {} 29 | 30 | void rayCast(const std::vector& cars, double minDistance, double maxDistance, pcl::PointCloud::Ptr& cloud, double slopeAngle, double sderr) 31 | { 32 | // reset ray 33 | castPosition = origin; 34 | castDistance = 0; 35 | 36 | bool collision = false; 37 | 38 | while(!collision && castDistance < maxDistance) 39 | { 40 | 41 | castPosition = castPosition + direction; 42 | castDistance += resolution; 43 | 44 | // check if there is any collisions with ground slope 45 | collision = (castPosition.z <= castPosition.x * tan(slopeAngle)); 46 | 47 | // check if there is any collisions with cars 48 | if(!collision && castDistance < maxDistance) 49 | { 50 | for(Car car : cars) 51 | { 52 | collision |= car.checkCollision(castPosition); 53 | if(collision) 54 | break; 55 | } 56 | } 57 | } 58 | 59 | if((castDistance >= minDistance)&&(castDistance<=maxDistance)) 60 | { 61 | // add noise based on standard deviation error 62 | double rx = ((double) rand() / (RAND_MAX)); 63 | double ry = ((double) rand() / (RAND_MAX)); 64 | double rz = ((double) rand() / (RAND_MAX)); 65 | cloud->points.push_back(pcl::PointXYZ(castPosition.x+rx*sderr, castPosition.y+ry*sderr, castPosition.z+rz*sderr)); 66 | } 67 | 68 | } 69 | 70 | }; 71 | 72 | struct Lidar 73 | { 74 | 75 | std::vector rays; 76 | pcl::PointCloud::Ptr cloud; 77 | std::vector cars; 78 | Vect3 position; 79 | double groundSlope; 80 | double minDistance; 81 | double maxDistance; 82 | double resoultion; 83 | double sderr; 84 | 85 | Lidar(std::vector setCars, double setGroundSlope) 86 | : cloud(new pcl::PointCloud()), position(0,0,2.6) 87 | { 88 | // TODO:: set minDistance to 5 to remove points from roof of ego car 89 | minDistance = 5; 90 | maxDistance = 50; 91 | resoultion = 0.2; 92 | // TODO:: set sderr to 0.2 to get more interesting pcd files 93 | sderr = 0.2; 94 | cars = setCars; 95 | groundSlope = setGroundSlope; 96 | 97 | // TODO:: increase number of layers to 8 to get higher resoultion pcd 98 | int numLayers = 8; 99 | // the steepest vertical angle 100 | double steepestAngle = 30.0*(-pi/180); 101 | double angleRange = 26.0*(pi/180); 102 | // TODO:: set to pi/64 to get higher resoultion pcd 103 | double horizontalAngleInc = pi/64; 104 | 105 | double angleIncrement = angleRange/numLayers; 106 | 107 | for(double angleVertical = steepestAngle; angleVertical < steepestAngle+angleRange; angleVertical+=angleIncrement) 108 | { 109 | for(double angle = 0; angle <= 2*pi; angle+=horizontalAngleInc) 110 | { 111 | Ray ray(position,angle,angleVertical,resoultion); 112 | rays.push_back(ray); 113 | } 114 | } 115 | } 116 | 117 | ~Lidar() 118 | { 119 | // pcl uses boost smart pointers for cloud pointer so we don't have to worry about manually freeing the memory 120 | } 121 | 122 | pcl::PointCloud::Ptr scan() 123 | { 124 | cloud->points.clear(); 125 | auto startTime = std::chrono::steady_clock::now(); 126 | for(Ray ray : rays) 127 | ray.rayCast(cars, minDistance, maxDistance, cloud, groundSlope, sderr); 128 | auto endTime = std::chrono::steady_clock::now(); 129 | auto elapsedTime = std::chrono::duration_cast(endTime - startTime); 130 | cout << "ray casting took " << elapsedTime.count() << " milliseconds" << endl; 131 | cloud->width = cloud->points.size(); 132 | cloud->height = 1; // one dimensional unorganized point cloud dataset 133 | return cloud; 134 | } 135 | 136 | }; 137 | 138 | #endif 139 | -------------------------------------------------------------------------------- /src/processPointClouds.h: -------------------------------------------------------------------------------- 1 | #ifndef PROCESSPOINTCLOUDS_H_ 2 | #define PROCESSPOINTCLOUDS_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include "render/box.h" 19 | #include 20 | 21 | struct Node 22 | { 23 | std::vector point; 24 | int id; 25 | Node* left; 26 | Node* right; 27 | 28 | Node(std::vector arr, int setId) 29 | : point(arr), id(setId), left(NULL), right(NULL) 30 | {} 31 | }; 32 | 33 | template 34 | struct KdTree 35 | { 36 | Node* root; 37 | KdTree() 38 | : root(NULL) 39 | {} 40 | void inserthelper(Node *&node, uint level, PointT point, int id) 41 | { 42 | uint index = level%3; 43 | 44 | if(node == NULL) 45 | { 46 | std::vector v_point(point.data, point.data+3); 47 | node = new Node(v_point,id); 48 | } 49 | else if(point.data[index] < node->point[index]) 50 | { 51 | inserthelper(node->left,level+1,point,id); 52 | } 53 | else 54 | { 55 | inserthelper(node->right,level+1,point,id); 56 | } 57 | } 58 | void insert(typename pcl::PointCloud::Ptr cloud) 59 | { 60 | for(uint index = 0; index < cloud->points.size(); index++) 61 | { 62 | inserthelper(root,0,cloud->points[index],index); 63 | } 64 | } 65 | 66 | void searchHelper(Node *&node,uint depth,std::vector *ids,PointT target, float distanceTol) 67 | { 68 | uint id = depth%3; 69 | if(node!=NULL) 70 | { 71 | if(((node->point[0]point[0]>target.data[0]-distanceTol))&& 72 | ((node->point[1]point[1]>target.data[1]-distanceTol))&& 73 | ((node->point[2]point[2]>target.data[2]-distanceTol))) 74 | { 75 | uint dis=sqrt((node->point[0]-target.data[0])*(node->point[0]-target.data[0])+ 76 | (node->point[1]-target.data[1])*(node->point[1]-target.data[1])+ 77 | (node->point[2]-target.data[2])*(node->point[2]-target.data[2])); 78 | 79 | if(dispush_back(node->id); 82 | } 83 | } 84 | if(target.data[id]-distanceTolpoint[id]) 85 | { 86 | searchHelper(node->left,depth+1,ids,target,distanceTol); 87 | } 88 | if(target.data[id]+distanceTol>node->point[id]) 89 | { 90 | searchHelper(node->right,depth+1,ids,target,distanceTol); 91 | } 92 | } 93 | } 94 | 95 | std::vector search(PointT target, float distanceTol) 96 | { 97 | std::vector ids; 98 | uint depth =0; 99 | uint maxdistance=0; 100 | 101 | searchHelper(root,depth,&ids,target,distanceTol); 102 | return ids; 103 | } 104 | 105 | 106 | }; 107 | 108 | template 109 | class ProcessPointClouds { 110 | public: 111 | 112 | //constructor 113 | ProcessPointClouds(); 114 | //deconstructor 115 | ~ProcessPointClouds(); 116 | 117 | void numPoints(typename pcl::PointCloud::Ptr cloud); 118 | 119 | typename pcl::PointCloud::Ptr FilterCloud( 120 | typename pcl::PointCloud::Ptr cloud, 121 | float filterRes, 122 | Eigen::Vector4f minPoint, 123 | Eigen::Vector4f maxPoint); 124 | 125 | std::pair::Ptr, typename pcl::PointCloud::Ptr> SeparateClouds( 126 | pcl::PointIndices::Ptr inliers, 127 | typename pcl::PointCloud::Ptr cloud); 128 | 129 | 130 | std::pair::Ptr, typename pcl::PointCloud::Ptr> RANSAC_SegmentPlane( 131 | typename pcl::PointCloud::Ptr cloud, 132 | int maxIterations, 133 | float distanceThreshold); 134 | 135 | std::vector::Ptr> Clustering_Cluster( 136 | typename pcl::PointCloud::Ptr cloud, 137 | float clusterTolerance, 138 | int minSize, 139 | int maxSize); 140 | 141 | std::vector> euclidean_Cluster( 142 | typename pcl::PointCloud::Ptr cloud, 143 | typename KdTree::KdTree* tree, 144 | float distanceTol, 145 | int minSize, 146 | int maxSize); 147 | 148 | void Proximity( 149 | typename pcl::PointCloud::Ptr cloud,std::vector &cluster, 150 | std::vector &processed_flag, 151 | int idx,typename KdTree::KdTree* tree, 152 | float distanceTol, 153 | int maxSize); 154 | 155 | Box BoundingBox( 156 | typename pcl::PointCloud::Ptr cluster); 157 | 158 | void savePcd( 159 | typename pcl::PointCloud::Ptr cloud, 160 | std::string file); 161 | 162 | typename pcl::PointCloud::Ptr loadPcd(std::string file); 163 | 164 | std::vector streamPcd(std::string dataPath); 165 | 166 | }; 167 | 168 | 169 | #endif /* PROCESSPOINTCLOUDS_H_ */ 170 | -------------------------------------------------------------------------------- /src/render/render.cpp: -------------------------------------------------------------------------------- 1 | 2 | // Functions and structs used to render the enviroment 3 | // such as cars and the highway 4 | 5 | #include "render.h" 6 | 7 | void renderHighway(pcl::visualization::PCLVisualizer::Ptr& viewer) 8 | { 9 | 10 | // units in meters 11 | double roadLength = 50.0; 12 | double roadWidth = 12.0; 13 | double roadHeight = 0.2; 14 | 15 | viewer->addCube(-roadLength/2, roadLength/2, -roadWidth/2, roadWidth/2, -roadHeight, 0, .2, .2, .2, "highwayPavement"); 16 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_SURFACE, "highwayPavement"); 17 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, .2, .2, .2, "highwayPavement"); 18 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, 1.0, "highwayPavement"); 19 | viewer->addLine(pcl::PointXYZ(-roadLength/2,-roadWidth/6, 0.01),pcl::PointXYZ(roadLength/2, -roadWidth/6, 0.01),1,1,0,"line1"); 20 | viewer->addLine(pcl::PointXYZ(-roadLength/2, roadWidth/6, 0.01),pcl::PointXYZ(roadLength/2, roadWidth/6, 0.01),1,1,0,"line2"); 21 | } 22 | 23 | int countRays = 0; 24 | void renderRays(pcl::visualization::PCLVisualizer::Ptr& viewer, const Vect3& origin, const pcl::PointCloud::Ptr& cloud) 25 | { 26 | 27 | for(pcl::PointXYZ point : cloud->points) 28 | { 29 | viewer->addLine(pcl::PointXYZ(origin.x, origin.y, origin.z), point,1,0,0,"ray"+std::to_string(countRays)); 30 | countRays++; 31 | } 32 | } 33 | 34 | void clearRays(pcl::visualization::PCLVisualizer::Ptr& viewer) 35 | { 36 | while(countRays) 37 | { 38 | countRays--; 39 | viewer->removeShape("ray"+std::to_string(countRays)); 40 | } 41 | } 42 | 43 | void renderPointCloud(pcl::visualization::PCLVisualizer::Ptr& viewer, const pcl::PointCloud::Ptr& cloud, std::string name, Color color) 44 | { 45 | 46 | viewer->addPointCloud (cloud, name); 47 | viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 4, name); 48 | viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_COLOR, color.r, color.g, color.b, name); 49 | } 50 | 51 | void renderPointCloud(pcl::visualization::PCLVisualizer::Ptr& viewer, const pcl::PointCloud::Ptr& cloud, std::string name, Color color) 52 | { 53 | 54 | if(color.r==-1) 55 | { 56 | // Select color based off of cloud intensity 57 | pcl::visualization::PointCloudColorHandlerGenericField intensity_distribution(cloud,"intensity"); 58 | viewer->addPointCloud(cloud, intensity_distribution, name); 59 | } 60 | else 61 | { 62 | // Select color based off input value 63 | viewer->addPointCloud (cloud, name); 64 | viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_COLOR, color.r, color.g, color.b, name); 65 | } 66 | 67 | viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, name); 68 | } 69 | 70 | // Draw wire frame box with filled transparent color 71 | void renderBox(pcl::visualization::PCLVisualizer::Ptr& viewer, Box box, int id, Color color, float opacity) 72 | { 73 | if(opacity > 1.0) 74 | opacity = 1.0; 75 | if(opacity < 0.0) 76 | opacity = 0.0; 77 | 78 | std::string cube = "box"+std::to_string(id); 79 | //viewer->addCube(box.bboxTransform, box.bboxQuaternion, box.cube_length, box.cube_width, box.cube_height, cube); 80 | viewer->addCube(box.x_min, box.x_max, box.y_min, box.y_max, box.z_min, box.z_max, color.r, color.g, color.b, cube); 81 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_WIREFRAME, cube); 82 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, color.r, color.g, color.b, cube); 83 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, opacity, cube); 84 | 85 | std::string cubeFill = "boxFill"+std::to_string(id); 86 | //viewer->addCube(box.bboxTransform, box.bboxQuaternion, box.cube_length, box.cube_width, box.cube_height, cubeFill); 87 | viewer->addCube(box.x_min, box.x_max, box.y_min, box.y_max, box.z_min, box.z_max, color.r, color.g, color.b, cubeFill); 88 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_SURFACE, cubeFill); 89 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, color.r, color.g, color.b, cubeFill); 90 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, opacity*0.3, cubeFill); 91 | } 92 | 93 | void renderBox(pcl::visualization::PCLVisualizer::Ptr& viewer, BoxQ box, int id, Color color, float opacity) 94 | { 95 | if(opacity > 1.0) 96 | opacity = 1.0; 97 | if(opacity < 0.0) 98 | opacity = 0.0; 99 | 100 | std::string cube = "box"+std::to_string(id); 101 | viewer->addCube(box.bboxTransform, box.bboxQuaternion, box.cube_length, box.cube_width, box.cube_height, cube); 102 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_WIREFRAME, cube); 103 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, color.r, color.g, color.b, cube); 104 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, opacity, cube); 105 | 106 | std::string cubeFill = "boxFill"+std::to_string(id); 107 | viewer->addCube(box.bboxTransform, box.bboxQuaternion, box.cube_length, box.cube_width, box.cube_height, cubeFill); 108 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_SURFACE, cubeFill); 109 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, color.r, color.g, color.b, cubeFill); 110 | viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, opacity*0.3, cubeFill); 111 | } 112 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Lidar Obstacle Detection 2 | 3 | ```diff 4 | The main goal of the project is to filter, segment, and cluster 5 | real point cloud data to detect obstacles in a driving environment. 6 | ``` 7 | ![ezgif com-video-to-gif](https://user-images.githubusercontent.com/30608533/65621434-65750100-dfcc-11e9-864f-b9a93de1b16e.gif) 8 | 9 | **Lidar** sensing gives us high resolution data by sending out thousands of laser signals. These lasers bounce off objects, returning to the sensor where we can then determine how far away objects are by timing how long it takes for the signal to return. Also we can tell a little bit about the object that was hit by measuring the intesity of the returned signal. Each laser ray is in the infrared spectrum, and is sent out at many different angles, usually in a 360 degree range. While lidar sensors gives us very high accurate models for the world around us in 3D, they are currently very expensive, upwards of $60,000 for a standard unit. 10 | 11 | **Radar data** is typically very sparse and in a limited range, however it can directly tell us how fast an object is moving in a certain direction. This ability makes radars a very pratical sensor for doing things like cruise control where its important to know how fast the car infront of you is traveling. Radar sensors are also very affordable and common now of days in newer cars. 12 | 13 | **Sensor Fusion** by combing lidar's high resoultion imaging with radar's ability to measure velocity of objects we can get a better understanding of the sorrounding environment than we could using one of the sensors alone. 14 | 15 | ```diff 16 | This project implements pipeline for converting the raw LIDAR sensor measurements into trackable objects. 17 | It implements filtering, segmentation, clustering, boundbox routines. Filtering was performed using 18 | the PCL functions. 19 | Functions were implemented for segmentation and clustering. The pipeline details are as the following. 20 | ``` 21 | 22 | 23 | ## PipeLine 24 | Following are the steps for the pipeline 25 | - Read a PCD file. 26 | - Filter the raw LIDAR data 27 | - Segment the filtered data to identify road and objects 28 | - Clustering: from objects identify the clusters. 29 | - For each cluster append a bounding box. 30 | - Rendering: Render the objects and road to the viewer. 31 | 32 | 33 | 34 | Following are the details for a few of the above steps. 35 | 36 | ## Filtering 37 | The raw LIDAR data is filtered, this helps in increasing the processing speed and reduce false targets. The following list of operations was performed. 38 | - Downsampling: points are converted to voxels to a given dimension. PCL function VoxelGrid was used for this operation. 39 | - Crop: Remove all the points that are outside the limits. PCL function CropBox was used for this operation. Limits were found by visually inspecting the scene. 40 | - RoofCrop: Remove roof points, dimensions of roof are identified by visually inspecting the scene.PCL function CropBox was used for this operation. 41 | 42 | ## Segmentation 43 | The filtered output is segmented. Segmentation divides the scene into plane and objects. Plane refers to the road surface. This step helps in differentiating the drivable area from obstacles. RANSAC algorithm was used. Following steps were performed to rrealize this function. 44 | - Randomly choose 3 points from the cloud, fit a plane using these points. 45 | - Loop through all the points in the cloud, for each of the point calculate 46 | - The distance to the plane created above. If the distance is below distanceTol then add the index to a temporary set 47 | - Store the temporary vector if the size is more than previously identified indices. 48 | - Repeat the above steps for maxIterations : 49 | 50 | maxIterations value was obtained by doing a couple of trails with different values, the value that gives the best result was choosen. 51 | 52 | ## Clustering 53 | Clustering helps in identifying different objects in the scene. Euclidean Clustering mechanism was implemented. Euclidean Clustering uses KDTree , all the points in the cloud are used to form a 3-Dimensional KDTree. After forming KDTree a point is taken from the cloud and all the points that are within a distance to this point are identified, each of the identified points is used and its adjacent points that are within a distance are identified this process is repeated until there are no points that satisfy the distance criteria are left,all the identified points form a cluster, after that a new point that is not processed is picked and the process is left. All the clusters with the number of points in the range of (minSize, maxSize) are retained and the rest are discarded. Each of these clusters forms a distinct object. 54 | 55 | ## Bounding Box 56 | For each of the cluster, a bounding box is fitted. To fit a box min and max coordinates of a cluster are used. Using renderbox function boxes are drawn. 57 | 58 | 59 | 60 | ## Installation 61 | 62 | ### Ubuntu 63 | 64 | ```bash 65 | $> sudo apt install libpcl-dev 66 | $> cd ~ 67 | $> git clone https://github.com/enginBozkurt/LidarObstacleDetection.git 68 | $> cd LidarObstacleDetection 69 | $> mkdir build && cd build 70 | $> cmake .. 71 | $> make 72 | $> ./environment 73 | ``` 74 | 75 | ### Windows 76 | 77 | http://www.pointclouds.org/downloads/windows.html 78 | 79 | ### MAC 80 | 81 | #### Install via Homebrew 82 | 1. install [homebrew](https://brew.sh/) 83 | 2. update homebrew 84 | ```bash 85 | $> brew update 86 | ``` 87 | 3. add homebrew science [tap](https://docs.brew.sh/Taps) 88 | ```bash 89 | $> brew tap brewsci/science 90 | ``` 91 | 4. view pcl install options 92 | ```bash 93 | $> brew options pcl 94 | ``` 95 | 5. install PCL 96 | ```bash 97 | $> brew install pcl 98 | ``` 99 | 100 | 101 | ## Notes about the mentioned Algorithms and Point Cloud Library (PCL) functions 102 | 103 | ![Screenshot_1](https://user-images.githubusercontent.com/30608533/65598405-013e4700-dfa4-11e9-9ee4-d48650cd486d.jpg) 104 | 105 | ![Screenshot_2](https://user-images.githubusercontent.com/30608533/65598416-0602fb00-dfa4-11e9-967b-19cb9db49b09.jpg) 106 | 107 | 108 | 109 | ***class pcl::CropBox< PointT > CropBox is a filter that allows the user to filter all the data inside of a given box.*** 110 | 111 | ![Screenshot_3](https://user-images.githubusercontent.com/30608533/65599785-44e68000-dfa7-11e9-9974-15b276202b76.jpg) 112 | 113 | 114 | 115 | ***Euclidean Cluster Extraction Tutorial*** 116 | 117 | Source: http://pointclouds.org/documentation/tutorials/cluster_extraction.php#cluster-extraction 118 | 119 | ### Point Cloud Library (PCL) functions installation guide and notes 120 | 121 | ## For Linux Ubuntu 16.04 122 | 123 | - https://larrylisky.com/2014/03/03/installing-pcl-on-ubuntu/ 124 | 125 | - libvtk needed to be updated to libvtk6-dev instead of (libvtk5-dev). The linker was having trouble locating libvtk5-dev while building, but this might not be a problem for everyone. 126 | 127 | - BUILD_visualization needed to be manually turned on, this link shows you how to do that, http://www.pointclouds.org/documentation/tutorials/building_pcl.php 128 | 129 | ## For Linux Ubuntu 18.04 130 | 131 | ```bash 132 | ### Clone latest PCL(Current is 1.9.1) 133 | sudo apt-get update 134 | sudo apt-get install -y git 135 | 136 | cd ~/Documents 137 | git clone https://github.com/PointCloudLibrary/pcl.git pcl-trunk 138 | ln -s pcl-trunk pcl 139 | cd pcl 140 | 141 | ### Install prerequisites 142 | sudo apt-get install -y g++ 143 | sudo apt-get install -y cmake cmake-gui 144 | sudo apt-get install -y doxygen 145 | sudo apt-get install -y mpi-default-dev openmpi-bin openmpi-common 146 | sudo apt-get install -y libflann1.9 libflann-dev 147 | sudo apt-get install -y libeigen3-dev 148 | sudo apt-get install -y libboost-all-dev 149 | sudo apt-get install -y libvtk6-dev libvtk6.3 libvtk6.3-qt 150 | sudo apt-get install -y 'libqhull*' 151 | sudo apt-get install -y libusb-dev 152 | sudo apt-get install -y libgtest-dev 153 | sudo apt-get install -y git-core freeglut3-dev pkg-config 154 | sudo apt-get install -y build-essential libxmu-dev libxi-dev 155 | sudo apt-get install -y libusb-1.0-0-dev graphviz mono-complete 156 | sudo apt-get install -y qt-sdk openjdk-11-jdk openjdk-11-jre 157 | sudo apt-get install -y phonon-backend-gstreamer 158 | sudo apt-get install -y phonon-backend-vlc 159 | sudo apt-get install -y libopenni-dev libopenni2-dev 160 | 161 | ### Compile and install PCL 162 | mkdir release 163 | cd release 164 | cmake -DCMAKE_BUILD_TYPE=None -DBUILD_GPU=ON -DBUILD_apps=ON -DBUILD_examples=ON .. 165 | make 166 | sudo make install 167 | 168 | ``` 169 | 170 | ## Final Notes 171 | This project is inspired by Udacity Sensor Fusion Engineer Nanodegree course. 172 | 173 | 174 | -------------------------------------------------------------------------------- /src/processPointClouds_editing.cpp: -------------------------------------------------------------------------------- 1 | // PCL lib Functions for processing point clouds 2 | 3 | #include "processPointClouds.h" 4 | #include 5 | 6 | 7 | //constructor: 8 | template 9 | ProcessPointClouds::ProcessPointClouds() {} 10 | 11 | 12 | //de-constructor: 13 | template 14 | ProcessPointClouds::~ProcessPointClouds() {} 15 | 16 | 17 | template 18 | void ProcessPointClouds::numPoints(typename pcl::PointCloud::Ptr cloud) 19 | { 20 | std::cout << cloud->points.size() << std::endl; 21 | } 22 | 23 | 24 | template 25 | 26 | typename pcl::PointCloud::Ptr ProcessPointClouds::FilterCloud(typename pcl::PointCloud::Ptr cloud, float filterRes, Eigen::Vector4f minPoint, Eigen::Vector4f maxPoint) 27 | { 28 | 29 | // Time segmentation process 30 | auto startTime = std::chrono::steady_clock::now(); 31 | 32 | // TODO:: Fill in the function to do voxel grid point reduction and region based filtering 33 | pcl::VoxelGrid vg; 34 | typename pcl::PointCloud::Ptr cloudFiltered(new pcl::PointCloud); 35 | 36 | vg.setInputCloud(cloud); 37 | vg.setLeafSize(filterRes, filterRes, filterRes); 38 | vg.filter(*cloudFiltered); 39 | 40 | typename pcl::PointCloud::Ptr cloudRegion(new pcl::PointCloud); 41 | 42 | pcl::CropBox region(true); 43 | region.setMin(minPoint); 44 | region.setMax(maxPoint); 45 | region.setInputCloud(cloudFiltered); 46 | region.filter(*cloudRegion); 47 | 48 | std::vector indices; 49 | 50 | pcl::CropBox roof(true); 51 | roof.setMin(Eigen::Vector4f(-1.5, -1.7, -1, 1)); 52 | roof.setMax(Eigen::Vector4f(2.6, 1.7, -0.4, 1)); 53 | roof.setInputCloud(cloudRegion); 54 | roof.filter(indices); 55 | 56 | pcl::PointIndices::Ptr inliers{ new pcl::PointIndices }; 57 | for (int point : indices) 58 | inliers->indices.push_back(point); 59 | 60 | pcl::ExtractIndices extract; 61 | extract.setInputCloud(cloudRegion); 62 | extract.setIndices(inliers); 63 | extract.setNegative(true); 64 | extract.filter(*cloudRegion); 65 | 66 | 67 | 68 | auto endTime = std::chrono::steady_clock::now(); 69 | auto elapsedTime = std::chrono::duration_cast(endTime - startTime); 70 | std::cout << "filtering took " << elapsedTime.count() << " milliseconds" << std::endl; 71 | 72 | return cloudRegion; 73 | 74 | } 75 | 76 | 77 | // template 78 | // std::pair::Ptr, typename pcl::PointCloud::Ptr> ProcessPointClouds::SeparateClouds(pcl::PointIndices::Ptr inliers, typename pcl::PointCloud::Ptr cloud) 79 | // { 80 | // // TODO: Create two new point clouds, one cloud with obstacles and other segmented plane 81 | 82 | // std::pair::Ptr, typename pcl::PointCloud::Ptr> segResult(cloud, cloud); 83 | // return segResult; 84 | // } 85 | 86 | 87 | template 88 | std::pair::Ptr, typename pcl::PointCloud::Ptr> ProcessPointClouds::SegmentPlane(typename pcl::PointCloud::Ptr cloud, int maxIterations, float distanceThreshold) 89 | { 90 | // Time segmentation process 91 | auto startTime = std::chrono::steady_clock::now(); 92 | std::unordered_set inliersResult; 93 | srand(time(NULL)); 94 | 95 | while (maxIterations--) 96 | { 97 | std::unordered_set inliers; 98 | srand(time(NULL)); 99 | // get three points for making a plane 100 | while (inliers.size() < 3) 101 | { // insert random indexes within the point cloud indexes 102 | inliers.insert(rand() % (cloud->points.size())); 103 | } 104 | 105 | float x1, x2, x3, y1, y2, y3, z1, z2, z3; 106 | // get the (x,y) from random indexes 107 | auto inlier_iterator = inliers.begin(); 108 | x1 = cloud->points[*inlier_iterator].x; 109 | y1 = cloud->points[*inlier_iterator].y; 110 | z1 = cloud->points[*inlier_iterator].z; 111 | inlier_iterator++; 112 | x2 = cloud->points[*inlier_iterator].x; 113 | y2 = cloud->points[*inlier_iterator].y; 114 | z2 = cloud->points[*inlier_iterator].z; 115 | inlier_iterator++; 116 | x3 = cloud->points[*inlier_iterator].x; 117 | y3 = cloud->points[*inlier_iterator].y; 118 | z3 = cloud->points[*inlier_iterator].z; 119 | 120 | float a = (((y2 - y1)*(z3 - z1)) - ((z2 - z1)*(y3 - y1))); 121 | float b = (((z2 - z1)*(x3 - x1)) - ((x2 - x1)*(z3 - z1))); 122 | float c = (((x2 - x1)*(y3 - y1)) - ((y2 - y1)*(x3 - x1))); 123 | float d = -(a*x1 + b*y1 + c*z1); 124 | float len = sqrt(a*a + b*b + c*c); 125 | 126 | for (int index = 0; index < cloud->points.size(); index++) 127 | { 128 | // if the index of the point match with the line index, ignore it. 129 | if (inliers.count(index) > 0) continue; 130 | 131 | auto point = cloud->points[index]; 132 | float test_point_x = point.x; 133 | float test_point_y = point.y; 134 | float test_point_z = point.z; 135 | 136 | float test_point_distance = fabs(a*test_point_x + b*test_point_y + c*test_point_z + d) / len; 137 | 138 | if (test_point_distance <= distanceThreshold) inliers.insert(index); 139 | } 140 | if (inliers.size() > inliersResult.size()) 141 | { 142 | inliersResult.clear(); 143 | inliersResult = inliers; 144 | } 145 | 146 | } 147 | 148 | typename pcl::PointCloud::Ptr cloudInliers(new pcl::PointCloud()); 149 | typename pcl::PointCloud::Ptr cloudOutliers(new pcl::PointCloud()); 150 | 151 | for (int index = 0; index < cloud->points.size(); index++) 152 | { 153 | PointT point = cloud->points[index]; 154 | if (inliersResult.count(index)) 155 | cloudInliers->points.push_back(point); 156 | else 157 | cloudOutliers->points.push_back(point); 158 | } 159 | std::pair::Ptr, typename pcl::PointCloud::Ptr> segmentPlaneResult(cloudOutliers, cloudInliers); 160 | 161 | 162 | auto endTime = std::chrono::steady_clock::now(); 163 | auto elapsedTime = std::chrono::duration_cast(endTime - startTime); 164 | std::cout << "plane segmentation took " << elapsedTime.count() << " milliseconds" << std::endl; 165 | 166 | return segmentPlaneResult; 167 | } 168 | 169 | 170 | template 171 | std::vector::Ptr> ProcessPointClouds::Clustering(typename pcl::PointCloud::Ptr cloud, float clusterTolerance, int minSize, int maxSize) 172 | { 173 | 174 | // Time clustering process 175 | auto startTime = std::chrono::steady_clock::now(); 176 | 177 | std::vector::Ptr> clusters; 178 | 179 | // TODO:: Fill in the function to perform euclidean clustering to group detected obstacles 180 | 181 | auto endTime = std::chrono::steady_clock::now(); 182 | auto elapsedTime = std::chrono::duration_cast(endTime - startTime); 183 | std::cout << "clustering took " << elapsedTime.count() << " milliseconds and found " << clusters.size() << " clusters" << std::endl; 184 | 185 | return clusters; 186 | } 187 | 188 | 189 | template 190 | Box ProcessPointClouds::BoundingBox(typename pcl::PointCloud::Ptr cluster) 191 | { 192 | 193 | // Find bounding box for one of the clusters 194 | PointT minPoint, maxPoint; 195 | pcl::getMinMax3D(*cluster, minPoint, maxPoint); 196 | 197 | Box box; 198 | box.x_min = minPoint.x; 199 | box.y_min = minPoint.y; 200 | box.z_min = minPoint.z; 201 | box.x_max = maxPoint.x; 202 | box.y_max = maxPoint.y; 203 | box.z_max = maxPoint.z; 204 | 205 | return box; 206 | } 207 | 208 | 209 | template 210 | void ProcessPointClouds::savePcd(typename pcl::PointCloud::Ptr cloud, std::string file) 211 | { 212 | pcl::io::savePCDFileASCII(file, *cloud); 213 | std::cerr << "Saved " << cloud->points.size() << " data points to " + file << std::endl; 214 | } 215 | 216 | 217 | template 218 | typename pcl::PointCloud::Ptr ProcessPointClouds::loadPcd(std::string file) 219 | { 220 | 221 | typename pcl::PointCloud::Ptr cloud(new pcl::PointCloud); 222 | 223 | if (pcl::io::loadPCDFile(file, *cloud) == -1) //* load the file 224 | { 225 | PCL_ERROR("Couldn't read file \n"); 226 | } 227 | std::cerr << "Loaded " << cloud->points.size() << " data points from " + file << std::endl; 228 | 229 | return cloud; 230 | } 231 | 232 | 233 | template 234 | std::vector ProcessPointClouds::streamPcd(std::string dataPath) 235 | { 236 | 237 | std::vector paths(boost::filesystem::directory_iterator{ dataPath }, boost::filesystem::directory_iterator{}); 238 | 239 | // sort files in accending order so playback is chronological 240 | sort(paths.begin(), paths.end()); 241 | 242 | return paths; 243 | 244 | } 245 | 246 | void clusterHelper(int index, const std::vector> points, std::vector& cluster, 247 | std::vector &processed, KdTree* tree, float distanceTol) 248 | { 249 | processed[index] = true; 250 | cluster.push_back(index); 251 | 252 | auto nearest = tree->search(points[index], distanceTol); 253 | // std::cout<<"nearest"<> euclideanCluster(const std::vector>& points, KdTree* tree, float distanceTol) 263 | { 264 | 265 | // TODO: Fill out this function to return list of indices for each cluster 266 | 267 | std::vector> clusters; 268 | std::vector processed(points.size(), false); 269 | 270 | int i = 0; 271 | while (i < points.size()) 272 | { 273 | if (processed[i]) 274 | { 275 | i++; 276 | continue; 277 | } 278 | std::vector cluster; 279 | clusterHelper(i, points, cluster, processed, tree, distanceTol); 280 | clusters.push_back(cluster); 281 | i++; 282 | } 283 | return clusters; 284 | 285 | } 286 | -------------------------------------------------------------------------------- /src/processPointClouds.cpp: -------------------------------------------------------------------------------- 1 | // PCL lib Functions for processing point clouds 2 | 3 | #include "processPointClouds.h" 4 | 5 | //constructor: 6 | template 7 | ProcessPointClouds::ProcessPointClouds() {} 8 | 9 | //de-constructor: 10 | template 11 | ProcessPointClouds::~ProcessPointClouds() {} 12 | 13 | template 14 | void ProcessPointClouds::numPoints(typename pcl::PointCloud::Ptr cloud) 15 | { 16 | std::cout << cloud->points.size() << std::endl; 17 | } 18 | 19 | template 20 | typename pcl::PointCloud::Ptr ProcessPointClouds::FilterCloud( 21 | typename pcl::PointCloud::Ptr cloud, 22 | float filterRes, Eigen::Vector4f minPoint, 23 | Eigen::Vector4f maxPoint) 24 | { 25 | 26 | auto startTime = std::chrono::steady_clock::now(); 27 | typename pcl::PointCloud::Ptr cloud_filtered(new pcl::PointCloud()); 28 | 29 | pcl::VoxelGrid sor; 30 | sor.setInputCloud (cloud); 31 | sor.setLeafSize (filterRes, filterRes, filterRes); 32 | sor.filter (*cloud_filtered); 33 | std::cerr << "Voxeled " << cloud_filtered->points.size () << std::endl; 34 | 35 | pcl::CropBox region; 36 | region.setMin(minPoint); 37 | region.setMax(maxPoint); 38 | region.setInputCloud(cloud_filtered); 39 | region.filter(*cloud_filtered); 40 | std::cerr << "region " << cloud_filtered->points.size () << std::endl; 41 | 42 | std::vector indices; 43 | pcl::CropBox roof_region(true); 44 | roof_region.setMin(Eigen::Vector4f(-1.5,-1.7,-1,1)); 45 | roof_region.setMax(Eigen::Vector4f(2.6, 1.7, -.4, 1)); 46 | roof_region.setInputCloud(cloud_filtered); 47 | roof_region.filter(indices); 48 | 49 | pcl::PointIndices::Ptr inliers{new pcl::PointIndices}; 50 | for(int point:indices) 51 | inliers->indices.push_back(point); 52 | 53 | pcl::ExtractIndices extract; 54 | extract.setInputCloud(cloud_filtered); 55 | extract.setIndices(inliers); 56 | extract.setNegative(true); 57 | extract.filter(*cloud_filtered); 58 | 59 | auto endTime = std::chrono::steady_clock::now(); 60 | auto elapsedTime = std::chrono::duration_cast(endTime - startTime); 61 | std::cout << "filtering took " << elapsedTime.count() << " milliseconds" << std::endl; 62 | 63 | return cloud_filtered; 64 | } 65 | 66 | template 67 | std::pair::Ptr, 68 | typename pcl::PointCloud::Ptr> ProcessPointClouds::SeparateClouds( 69 | pcl::PointIndices::Ptr inliers, 70 | typename pcl::PointCloud::Ptr cloud) 71 | { 72 | typename pcl::PointCloud::Ptr obstCloud(new pcl::PointCloud()); 73 | typename pcl::PointCloud::Ptr planeCloud(new pcl::PointCloud()); 74 | 75 | for(int it : inliers->indices) 76 | { 77 | planeCloud->points.push_back(cloud->points[it]); 78 | } 79 | 80 | pcl::ExtractIndices extract; 81 | extract.setInputCloud (cloud); 82 | extract.setIndices (inliers); 83 | extract.setNegative (true); 84 | extract.filter (*obstCloud); 85 | 86 | std::pair::Ptr, typename pcl::PointCloud::Ptr> segResult(obstCloud, planeCloud); 87 | return segResult; 88 | } 89 | 90 | template 91 | std::pair::Ptr, typename pcl::PointCloud::Ptr> ProcessPointClouds::RANSAC_SegmentPlane( 92 | typename pcl::PointCloud::Ptr cloud, 93 | int maxIterations, 94 | float distanceThreshold) 95 | { 96 | auto startTime = std::chrono::steady_clock::now(); 97 | 98 | std::unordered_set inliersResult; 99 | srand(time(NULL)); 100 | PointT point1; 101 | PointT point2; 102 | PointT point3; 103 | int idx1; 104 | int idx2; 105 | int idx3; 106 | float a,b,c,d,dis,len; 107 | 108 | for(int it=0;it temp_Indices; 111 | while(temp_Indices.size()<3) 112 | temp_Indices.insert((rand() % cloud->points.size())); 113 | auto iter = temp_Indices.begin(); 114 | idx1 = *iter; 115 | ++iter; 116 | idx2 = *iter; 117 | ++iter; 118 | idx3 = *iter; 119 | point1 = cloud->points[idx1]; 120 | point2 = cloud->points[idx2]; 121 | point3 = cloud->points[idx3]; 122 | 123 | a = (((point2.y-point1.y)*(point3.z-point1.z))-((point2.z-point1.z)*(point3.y-point1.y))); 124 | b = (((point2.z-point1.z)*(point3.x-point1.x))-((point2.x-point1.x)*(point3.z-point1.z))); 125 | c = (((point2.x-point1.x)*(point3.y-point1.y))-((point2.y-point1.y)*(point3.x-point1.x))); 126 | d = -(a*point1.x+b*point1.y+c*point1.z); 127 | len = sqrt(a*a+b*b+c*c); 128 | 129 | for(int point_count=0;point_countpoints.size();point_count++) 130 | { 131 | if(point_count!=idx1||point_count!=idx2||point_count!=idx3) 132 | { 133 | dis = (fabs(a*cloud->points[point_count].x+b*cloud->points[point_count].y+c*cloud->points[point_count].z+d)/len); 134 | if(dis<=distanceThreshold) 135 | { 136 | temp_Indices.insert(point_count); 137 | } 138 | } 139 | } 140 | if(temp_Indices.size()>inliersResult.size()) 141 | { 142 | inliersResult.clear(); 143 | inliersResult = temp_Indices; 144 | 145 | } 146 | } 147 | 148 | if (inliersResult.size () == 0) 149 | { 150 | std::cerr << "No Inliers found." << std::endl; 151 | } 152 | typename pcl::PointCloud::Ptr cloudInliers(new pcl::PointCloud()); 153 | typename pcl::PointCloud::Ptr cloudOutliers(new pcl::PointCloud()); 154 | 155 | for(int index = 0; index < cloud->points.size(); index++) 156 | { 157 | PointT point = cloud->points[index]; 158 | if(inliersResult.count(index)) 159 | cloudInliers->points.push_back(point); 160 | else 161 | cloudOutliers->points.push_back(point); 162 | } 163 | 164 | std::pair::Ptr, typename pcl::PointCloud::Ptr> segResult(cloudOutliers, cloudInliers); 165 | 166 | auto endTime = std::chrono::steady_clock::now(); 167 | auto elapsedTime = std::chrono::duration_cast(endTime - startTime); 168 | std::cout << "RANSAC plane segmentation took " << elapsedTime.count() << " milliseconds" << std::endl; 169 | 170 | return segResult; 171 | } 172 | 173 | template 174 | void ProcessPointClouds::Proximity( 175 | typename pcl::PointCloud::Ptr cloud, 176 | std::vector &cluster, 177 | std::vector &processed_flag,int idx, 178 | typename KdTree::KdTree* tree, 179 | float distanceTol, 180 | int maxSize) 181 | { 182 | if ((processed_flag[idx] == false) && 183 | (cluster.size() nearby = tree->search(cloud->points[idx],distanceTol); 188 | for(int index : nearby) 189 | { 190 | if (processed_flag[index] == false) 191 | { 192 | Proximity(cloud, cluster, processed_flag, index, tree, distanceTol, maxSize); 193 | } 194 | } 195 | } 196 | } 197 | 198 | template 199 | std::vector> ProcessPointClouds::euclidean_Cluster( 200 | typename pcl::PointCloud::Ptr cloud, 201 | typename KdTree::KdTree* tree, 202 | float distanceTol, 203 | int minSize, 204 | int maxSize) 205 | { 206 | std::vector> clusters; 207 | std::vector processed_flag(cloud->points.size(),false); 208 | 209 | for(int idx=0;idxpoints.size();idx++) 210 | { 211 | if(processed_flag[idx]==false) 212 | { 213 | std::vector cluster; 214 | Proximity(cloud, cluster,processed_flag,idx,tree,distanceTol,maxSize); 215 | if((cluster.size()>=minSize)&&cluster.size()<=maxSize) 216 | clusters.push_back(cluster); 217 | } 218 | } 219 | 220 | return clusters; 221 | } 222 | 223 | template 224 | std::vector::Ptr> ProcessPointClouds::Clustering_Cluster( 225 | typename pcl::PointCloud::Ptr cloud, 226 | float clusterTolerance, 227 | int minSize, 228 | int maxSize) 229 | { 230 | auto startTime = std::chrono::steady_clock::now(); 231 | std::vector::Ptr> clusters; 232 | typename KdTree::KdTree *tree =new KdTree; 233 | tree->insert(cloud); 234 | std::vector> cluster_indices = euclidean_Cluster(cloud, tree,clusterTolerance,minSize,maxSize); 235 | 236 | for (std::vector>::const_iterator it = cluster_indices.begin (); it != cluster_indices.end (); ++it) 237 | { 238 | typename pcl::PointCloud::Ptr cloud_cluster (new pcl::PointCloud); 239 | for (std::vector::const_iterator pit = it->begin (); pit != it->end (); ++pit) 240 | cloud_cluster->points.push_back (cloud->points[*pit]); 241 | cloud_cluster->width = cloud_cluster->points.size (); 242 | cloud_cluster->height = 1; 243 | cloud_cluster->is_dense = true; 244 | 245 | clusters.push_back(cloud_cluster); 246 | } 247 | auto endTime = std::chrono::steady_clock::now(); 248 | auto elapsedTime = std::chrono::duration_cast(endTime - startTime); 249 | std::cout << "euclidean_Clustering took " << elapsedTime.count() << " milliseconds and found " << clusters.size() << " clusters" << std::endl; 250 | 251 | return clusters; 252 | } 253 | 254 | template 255 | Box ProcessPointClouds::BoundingBox(typename pcl::PointCloud::Ptr cluster) 256 | { 257 | PointT minPoint, maxPoint; 258 | pcl::getMinMax3D(*cluster, minPoint, maxPoint); 259 | 260 | Box box; 261 | box.x_min = minPoint.x; 262 | box.y_min = minPoint.y; 263 | box.z_min = minPoint.z; 264 | box.x_max = maxPoint.x; 265 | box.y_max = maxPoint.y; 266 | box.z_max = maxPoint.z; 267 | 268 | return box; 269 | } 270 | 271 | template 272 | void ProcessPointClouds::savePcd(typename pcl::PointCloud::Ptr cloud, std::string file) 273 | { 274 | pcl::io::savePCDFileASCII (file, *cloud); 275 | std::cerr << "Saved " << cloud->points.size () << " data points to "+file << std::endl; 276 | } 277 | 278 | template 279 | typename pcl::PointCloud::Ptr ProcessPointClouds::loadPcd(std::string file) 280 | { 281 | typename pcl::PointCloud::Ptr cloud (new pcl::PointCloud); 282 | if (pcl::io::loadPCDFile (file, *cloud) == -1) 283 | { 284 | PCL_ERROR ("Couldn't read file \n"); 285 | } 286 | std::cerr<< "Loaded " << cloud->points.size () << " data points from "+file << std::endl; 287 | 288 | return cloud; 289 | } 290 | 291 | template 292 | std::vector ProcessPointClouds::streamPcd(std::string dataPath) 293 | { 294 | std::vector paths(boost::filesystem::directory_iterator{dataPath}, boost::filesystem::directory_iterator{}); 295 | sort(paths.begin(), paths.end()); 296 | 297 | return paths; 298 | } 299 | -------------------------------------------------------------------------------- /src/sensors/data/pcd/simpleHighway.pcd: -------------------------------------------------------------------------------- 1 | # .PCD v0.7 - Point Cloud Data file format 2 | VERSION 0.7 3 | FIELDS x y z 4 | SIZE 4 4 4 5 | TYPE F F F 6 | COUNT 1 1 1 7 | WIDTH 976 8 | HEIGHT 1 9 | VIEWPOINT 0 0 0 1 0 0 0 10 | POINTS 976 11 | DATA ascii 12 | 4.8446164 0.078876585 0.05669206 13 | 4.8306341 0.41179156 -0.060417511 14 | 4.7211056 0.61201733 -0.044372842 15 | 4.7367587 0.78165597 0.025846401 16 | 4.6596818 1.0150089 0.090518162 17 | 4.7196751 1.2634255 0.043531604 18 | 4.5035391 1.4788941 -0.09666767 19 | 4.4517984 1.6028937 0.060907569 20 | 4.3519521 1.8697881 -0.073969692 21 | 4.2493649 2.1992249 -0.056276403 22 | 4.2269926 2.3722868 0.022600183 23 | 4.0704799 2.5316887 0.0049296548 24 | 3.987195 2.7926555 -0.041424427 25 | 2.752552 3.9937069 0.054054983 26 | 2.4844098 4.1894684 -0.043264832 27 | 2.275147 4.2858491 0.083877511 28 | 2.013587 4.417376 0.0052712867 29 | 1.8070105 4.3589759 0.0327176 30 | 1.7536979 4.4729266 -0.087093517 31 | 1.3617122 4.5666962 -0.087308615 32 | 1.1841493 4.7305102 0.080513835 33 | 1.0827252 4.6400161 0.0080242846 34 | 0.76143223 4.7779827 0.0025792895 35 | 0.59213179 4.7603612 -0.092071712 36 | 0.317206 4.8573027 0.086234175 37 | 0.14440712 4.7334375 0.04777908 38 | -0.10124993 4.7417665 0.037644494 39 | -0.42496097 4.7421031 0.076087266 40 | -0.52012199 4.6920643 -0.054134149 41 | -0.73344177 4.6568394 0.037406199 42 | -0.94477934 4.6542168 0.031533025 43 | -1.1855577 4.5631938 0.084866174 44 | -1.495556 4.5662475 0.036915921 45 | -1.6072047 4.4171972 -0.056762792 46 | -1.8091937 4.4117217 -0.070395783 47 | -2.0280609 4.2527246 -0.0135371 48 | -2.2800729 4.0675969 0.057272635 49 | -2.5364287 3.9780054 -0.054706458 50 | -3.8507309 2.6537077 0.011360968 51 | -3.9277508 2.4384713 0.081433006 52 | -4.1035676 2.2300615 -0.00083897001 53 | -4.0753231 2.1967821 0.087073013 54 | -4.1835613 1.8666372 0.050026394 55 | -4.3293424 1.6346874 -0.053475477 56 | -4.3581953 1.4067975 -0.069449827 57 | -4.3899007 1.1617985 0.058766294 58 | -4.5538201 1.0617679 -0.085021824 59 | -4.4358807 0.69711101 0.0043848925 60 | -4.6187768 0.50681508 0.059631828 61 | -4.524394 0.3612076 0.093553245 62 | -4.548687 0.15238027 -0.081231691 63 | -4.6439867 -0.12498729 -0.084281355 64 | -4.6401224 -0.41700917 -0.0076436885 65 | -4.4620929 -0.5710842 0.051188383 66 | -4.5764217 -0.8803423 0.10007093 67 | -4.4956756 -0.95787168 -0.074834086 68 | -4.2757845 -1.3462741 0.074180193 69 | -4.3889012 -1.5742071 0.084686041 70 | -4.2020035 -1.7531245 -0.067301482 71 | -4.1494503 -1.816443 0.064011246 72 | -4.0527916 -2.0935853 0.015958216 73 | -3.9209814 -2.2663291 -0.079999767 74 | -3.7825575 -2.4462814 -0.039068755 75 | -2.4001951 -3.772723 0.075594969 76 | -2.2551737 -3.8851576 -0.0928436 77 | -2.0554769 -3.9574521 0.08514753 78 | -1.8253733 -4.0611176 0.095959045 79 | -1.6414374 -4.1396942 0.096791364 80 | -1.4426832 -4.3035502 -0.067134179 81 | -1.19212 -4.2972403 -0.084528849 82 | -1.0069722 -4.4866691 0.025968157 83 | -0.8671388 -4.4464741 -0.036554355 84 | -0.62106407 -4.5795841 -0.085095592 85 | -0.33240378 -4.6092663 0.030298634 86 | -0.12797406 -4.4766212 -0.043919381 87 | 0.10857143 -4.5327253 -0.07727167 88 | 0.3231096 -4.5524697 0.088935837 89 | 0.54790807 -4.5868545 0.069609106 90 | 0.77243626 -4.6254139 -0.030939192 91 | 1.0313874 -4.4202032 -0.053149443 92 | 1.2707479 -4.4400039 -0.0035406188 93 | 1.4178694 -4.3329897 -0.063416623 94 | 1.6991999 -4.395267 -0.017131036 95 | 1.9281955 -4.1860776 0.027600247 96 | 2.0682757 -4.1909566 0.02189339 97 | 2.3293226 -3.9785666 -0.034252897 98 | 2.5517082 -3.9711654 0.084255084 99 | 2.7345114 -3.7582133 -0.048474688 100 | 3.9944851 -2.5812922 -0.047828395 101 | 4.186305 -2.2676964 -0.081179738 102 | 4.1462526 -2.1329083 0.01541032 103 | 4.3458748 -1.8669121 -0.042172227 104 | 4.4754381 -1.732724 -0.033999369 105 | 4.4408793 -1.3793906 -0.099212065 106 | 4.6404452 -1.2920338 -0.062287576 107 | 4.6235247 -0.94539636 0.083858296 108 | 4.7395301 -0.77336359 -0.075699151 109 | 4.7629948 -0.61026734 0.054926917 110 | 4.8425865 -0.27597925 0.072455645 111 | 4.7116132 -0.071596272 0.0096806269 112 | 5.2387714 0.18098649 0.17142895 113 | 5.3478713 0.35375819 0.10474027 114 | 5.1869268 0.56242883 0.16241615 115 | 5.2217388 0.85267335 0.15928879 116 | 5.1789961 1.0686152 0.025584605 117 | 5.1609411 1.4039443 0.017311998 118 | 5.0769291 1.6019168 0.15712708 119 | 5.0214205 1.7804503 0.033893466 120 | 4.8847899 2.0062339 0.017148048 121 | 4.7541618 2.2793424 0.17587942 122 | 4.7494793 2.5658646 0.15686591 123 | 4.6061134 2.7618437 0.056494694 124 | 4.3853574 3.0091641 0.11127693 125 | 4.2119031 3.1154814 0.0040093595 126 | 3.1069977 4.2894206 0.062220018 127 | 2.9352512 4.3726358 0.0077300733 128 | 2.7483001 4.6292634 0.10621442 129 | 2.4947493 4.6994185 0.14185593 130 | 2.3120832 4.7134252 0.16610767 131 | 2.107337 4.888536 0.031069076 132 | 1.8565469 4.961729 0.15548816 133 | 1.5825397 5.0051031 0.054703049 134 | 1.404539 5.1517777 0.18646929 135 | 1.0782886 5.2592659 0.016715281 136 | 0.84233588 5.1243052 0.14615676 137 | 0.66276264 5.2130876 0.01243392 138 | 0.42747602 5.317265 -0.00066715048 139 | 0.090060964 5.3766074 0.13108218 140 | -0.21171317 5.2678661 0.16253661 141 | -0.48862392 5.1743107 0.066079542 142 | -0.69935095 5.2547178 0.15131941 143 | -0.98382884 5.0901489 0.00018481664 144 | -1.1666584 5.1803374 0.12791565 145 | -1.4146907 4.9801993 0.1074277 146 | -1.6288559 4.9826307 0.10850941 147 | -1.9093771 4.846034 0.16724502 148 | -2.1188471 4.7161398 0.11144618 149 | -2.3360844 4.6916804 0.1087396 150 | -2.6156917 4.608573 0.0035183984 151 | -2.8574307 4.4913707 0.023430258 152 | -2.9886959 4.2053633 0.15485424 153 | -4.1016703 3.1570594 0.1651559 154 | -4.2373753 3.0407784 0.12132957 155 | -4.4349756 2.714534 0.14515182 156 | -4.4423633 2.6090894 0.051131666 157 | -4.6376662 2.2544188 0.11198876 158 | -4.7629547 2.1173465 0.14595281 159 | -4.7325158 1.7853311 0.069737889 160 | -4.8930364 1.5906934 0.035699546 161 | -4.9468393 1.365469 0.02044511 162 | -4.9686275 1.0137911 0.065543294 163 | -5.0467548 0.8214972 0.1369819 164 | -5.1022396 0.63805598 0.099963635 165 | -4.9891338 0.39180598 0.15145741 166 | -5.0397444 0.062869973 0.11867817 167 | -5.1718979 -0.14705813 0.15828228 168 | -5.0307331 -0.37863052 0.093203336 169 | -5.0431876 -0.68703538 0.13327381 170 | -4.9195147 -0.87437147 0.020075519 171 | -5.0176435 -1.2452567 0.12664472 172 | -4.9189234 -1.3791815 0.12956059 173 | -4.7631655 -1.7441319 -0.0093578137 174 | -4.7242208 -1.9292247 0.12057398 175 | -4.510767 -2.1777148 0.057771251 176 | -4.4345403 -2.2652204 0.12016135 177 | -4.3800888 -2.4852142 0.026753314 178 | -4.275331 -2.7763066 0.15529183 179 | -4.0252771 -2.9040158 0.027722685 180 | -3.0069091 -4.0184798 0.16328515 181 | -2.7685168 -4.1583004 0.17599727 182 | -2.6166222 -4.2568026 0.099788941 183 | -2.2553964 -4.4685616 0.10001404 184 | -2.0272059 -4.5218363 0.1523281 185 | -1.8637477 -4.6533694 0.18856035 186 | -1.5583162 -4.811419 0.16436224 187 | -1.3862898 -4.8285441 0.14136508 188 | -1.1040481 -4.8649483 0.042057272 189 | -0.89023483 -4.9855471 0.022891279 190 | -0.60155487 -4.9501362 0.16410463 191 | -0.37548009 -5.0718083 0.1118965 192 | -0.13546854 -5.04392 0.097211659 193 | 0.028948564 -5.0635095 -0.0039069629 194 | 0.39359251 -5.0694804 0.15602218 195 | 0.60994005 -5.1319165 0.087462358 196 | 0.86129868 -5.1136646 0.15237065 197 | 1.0866302 -4.9524097 0.079924837 198 | 1.2865324 -4.9416647 0.038906865 199 | 1.5840969 -4.9530249 0.1330197 200 | 1.8588753 -4.7142229 0.1060368 201 | 2.0706656 -4.689888 0.18853332 202 | 2.2254748 -4.6675286 0.11765362 203 | 2.5602665 -4.5236011 0.033457924 204 | 2.7880599 -4.2581553 0.13708806 205 | 2.9693696 -4.2191796 0.15961765 206 | 3.2751896 -3.9707685 0.16931759 207 | 4.312953 -3.0192924 0.096848853 208 | 4.3497858 -2.7826855 0.17946443 209 | 4.5352283 -2.4865882 0.18295574 210 | 4.6040831 -2.3506842 0.14554514 211 | 4.8349524 -2.0342922 0.041017432 212 | 4.9370403 -1.7901679 0.055869516 213 | 4.9567223 -1.6335555 0.10038999 214 | 5.080462 -1.4661453 0.085092537 215 | 5.0958929 -1.1285893 0.17280489 216 | 5.1217518 -0.89003748 0.16258706 217 | 5.1450734 -0.6861791 0.029300904 218 | 5.2835855 -0.39006335 0.12481115 219 | 5.2922964 -0.24331591 0.10167471 220 | 6.1653519 0.048525169 -0.027888488 221 | 6.1141062 0.29879433 0.15306781 222 | 6.1437702 0.74738103 0.14576876 223 | 6.1737761 0.92269194 0.057925664 224 | 6.0338798 1.3398211 0.096131198 225 | 6.0643854 1.5016935 0.026907183 226 | 5.9684601 1.8301406 0.14821562 227 | 5.8483644 2.1341724 0.022926785 228 | 5.7812543 2.340641 0.14146516 229 | 5.5961838 2.7314939 0.15323727 230 | 5.3747964 2.9095688 0.0017624303 231 | 5.2321572 3.2368152 0.0035771173 232 | 5.0579686 3.408083 0.15771429 233 | 4.8643579 3.63762 -0.0076727755 234 | 4.7711926 3.9693611 0.15137348 235 | 4.5049615 4.1874447 -0.017559247 236 | 4.3587027 4.3790417 0.055646341 237 | 4.1234426 4.5334153 0.15080747 238 | 3.9531016 4.7167869 -0.024727369 239 | 3.692049 5.0241981 0.1190059 240 | 3.4340825 5.2320733 -0.024537353 241 | 3.2165403 5.2316074 0.10068768 242 | 2.9933167 5.4033742 0.14619805 243 | 2.7173567 5.5397215 -0.021637063 244 | 2.4697752 5.7524848 0.10807196 245 | 2.1756597 5.87958 0.030917304 246 | 1.907699 5.8515248 0.1302035 247 | 1.508711 5.9894032 -0.020982761 248 | 1.2013407 5.9677358 0.017159082 249 | 0.91559047 6.1049042 -0.020060183 250 | 0.77143359 6.2125578 -0.020466205 251 | 0.48230362 6.1391344 0.019723171 252 | 0.11768264 6.0863957 0.085246392 253 | -0.20142865 6.2084618 0.15354286 254 | -0.48766032 6.1399627 0.1142089 255 | -0.84275454 6.0399971 0.095046327 256 | -1.0728648 5.9397206 0.15463297 257 | -1.4008451 5.9124603 0.072855093 258 | -1.6764696 5.8535347 0.10431011 259 | -1.9097205 5.7875991 0.022133833 260 | -2.1752796 5.6586118 0.011234159 261 | -2.4356656 5.5232873 0.10504416 262 | -2.8496292 5.5071397 0.13881159 263 | -2.9911971 5.2560015 0.10192139 264 | -3.2569735 5.2023907 0.01837142 265 | -3.5539842 4.8763986 0.071205795 266 | -3.6614726 4.8012829 0.074535914 267 | -3.9001255 4.6767697 0.11567875 268 | -4.2107654 4.3521404 -0.022887578 269 | -4.479641 4.06603 0.065780193 270 | -4.6198897 3.9817379 0.1323586 271 | -4.7597685 3.6993997 -0.016019063 272 | -4.9941268 3.4597685 0.15300551 273 | -5.1825948 3.1289535 0.017301021 274 | -5.1954474 2.9758549 -0.01309896 275 | -5.2789922 2.7617614 0.0015481722 276 | -5.4965219 2.4681504 0.12383036 277 | -5.6972518 2.1552618 0.11562174 278 | -5.6431112 1.941986 -0.012389815 279 | -5.7135844 1.6604573 -0.011374575 280 | -5.881247 1.229189 0.13027792 281 | -5.9680309 1.0379798 0.023772091 282 | -5.98877 0.78134477 0.12050176 283 | -6.0259743 0.49376148 0.13738395 284 | -5.9843202 0.13905349 0.059632197 285 | -5.9584861 -0.1656138 0.033126008 286 | -5.9034414 -0.56669056 -0.015417633 287 | -5.9116044 -0.86013305 0.10030488 288 | -5.9135532 -1.0040882 0.084819287 289 | -5.8292127 -1.3364171 0.074106328 290 | -5.7297134 -1.5677539 0.12197048 291 | -5.6746087 -2.0308304 0.071316548 292 | -5.5122809 -2.2733445 0.058859326 293 | -5.4397521 -2.5256045 0.055081043 294 | -5.3371601 -2.7226601 -0.0064262636 295 | -5.0994606 -3.0942721 0.12437946 296 | -4.8757601 -3.2251711 0.15037467 297 | -4.6884789 -3.5924697 -0.022234119 298 | -4.5737634 -3.8037918 0.15390252 299 | -4.4632616 -3.9865847 0.087567627 300 | -4.1526685 -4.1392908 0.076212041 301 | -3.9838996 -4.3197398 0.083865009 302 | -3.655992 -4.633944 0.1261781 303 | -3.5312905 -4.7847056 -0.012172525 304 | -3.2016802 -4.9547029 0.11778478 305 | -2.9254754 -5.021275 0.13462171 306 | -2.7109675 -5.2105455 0.071557075 307 | -2.4635897 -5.3707051 0.084091865 308 | -2.1825848 -5.5857091 0.11951846 309 | -1.919862 -5.6707535 -0.0028823137 310 | -1.7185603 -5.6362929 0.1371856 311 | -1.3243799 -5.83424 0.10167078 312 | -1.119002 -5.9150562 0.14601593 313 | -0.86846447 -5.8910427 0.022393461 314 | -0.55413628 -5.9658551 0.099857971 315 | -0.10841963 -6.0009131 0.069712289 316 | 0.15485135 -5.8653584 -0.0032469251 317 | 0.35505971 -5.9331779 0.097233325 318 | 0.76708949 -5.9769979 0.10312857 319 | 1.0131187 -5.820734 0.13092874 320 | 1.33461 -5.930809 0.086410783 321 | 1.5933267 -5.7187009 0.12321584 322 | 1.8129878 -5.7769127 0.1443311 323 | 2.0727637 -5.6633229 0.04028653 324 | 2.4040072 -5.5165062 0.097833812 325 | 2.6071374 -5.4067621 0.14221732 326 | 2.9738901 -5.3175445 0.12948716 327 | 3.2608123 -5.1122394 0.041688628 328 | 3.440721 -4.9786644 0.088258252 329 | 3.6184263 -4.681776 0.054769184 330 | 4.0152478 -4.5443864 0.060459692 331 | 4.1583037 -4.4268684 0.013212456 332 | 4.3283749 -4.165204 0.028563133 333 | 4.5092525 -3.9155416 0.064360462 334 | 4.7752843 -3.8020217 0.14010255 335 | 4.8875937 -3.5477216 0.0052448465 336 | 5.0325775 -3.1833508 0.026079683 337 | 5.3527088 -2.9824541 0.10583478 338 | 5.3725367 -2.8451552 0.16027264 339 | 5.6260767 -2.5661819 0.14058237 340 | 5.6329484 -2.1183729 0.075552277 341 | 5.8320408 -1.9469004 0.13403863 342 | 5.9701586 -1.6156271 0.049382828 343 | 5.9096751 -1.304117 -0.00072853849 344 | 6.0708466 -1.1171045 0.037768621 345 | 6.0934596 -0.79774052 0.096402913 346 | 6.1667933 -0.50234658 0.076557279 347 | 6.0464516 -0.24436304 0.006655422 348 | 7.2689557 0.088819467 0.016856644 349 | 7.2523108 0.39368701 0.039449502 350 | 7.1988196 0.78415155 0.038288698 351 | 7.0632048 1.065063 0.13145564 352 | 7.169086 1.5883372 0.073836848 353 | 6.9734645 1.7684942 0.041434024 354 | 6.9110699 2.240509 0.10620435 355 | 6.8707361 2.4793112 -0.0023477133 356 | 6.6728635 2.7492423 0.089665778 357 | 6.6392765 3.0703509 0.14340262 358 | 6.3202605 3.5216212 0.032222088 359 | 6.1950417 3.7567379 0.076053068 360 | 6.077683 4.1552777 0.16133538 361 | 5.7448816 4.2514977 -0.019800644 362 | 5.6914506 4.7031951 -0.022471908 363 | 5.3671231 4.8250499 0.01355536 364 | 5.1976652 5.1663117 -0.015687739 365 | 4.8808322 5.3648677 0.061571993 366 | 4.6439118 5.678771 0.082250036 367 | 4.2881079 5.8876243 0.10409672 368 | 3.9758081 6.1210079 0.064617462 369 | 3.742785 6.1873822 0.15575553 370 | 3.5447619 6.3088884 0.14976396 371 | 3.2239237 6.4839511 0.15386564 372 | 2.9146051 6.6053572 0.13376981 373 | 2.5960414 6.8151469 -0.029470008 374 | 2.107718 6.8806138 0.095088251 375 | 1.7851646 7.0662642 -0.023116136 376 | 1.5356969 7.0633197 0.14399038 377 | 1.1035556 7.1636105 0.10463572 378 | 0.89073986 7.2207289 0.097145937 379 | 0.4367606 7.1233907 0.16879299 380 | 0.073075823 7.3153653 -0.010558288 381 | -0.29660133 7.2819142 0.027796088 382 | -0.66133481 7.2419219 0.045727085 383 | -1.0444814 7.1927791 0.14748687 384 | -1.3883483 7.1706166 0.0049247555 385 | -1.6043069 6.9463348 0.15466043 386 | -1.9342972 6.9973783 0.024761481 387 | -2.2921958 6.7446504 0.135309 388 | -2.6836636 6.6102614 0.060120922 389 | -2.8760488 6.5550361 0.061834645 390 | -3.1894441 6.4704537 0.046918549 391 | -3.4740944 6.1509018 0.0071233227 392 | -3.911561 6.0008974 0.15306364 393 | -4.1215549 5.800796 0.092682891 394 | -4.4195576 5.5878434 0.069951758 395 | -4.6492267 5.2871156 0.099597804 396 | -4.9176259 5.1809592 0.073608346 397 | -5.1037798 4.8370624 0.10464872 398 | -5.3666596 4.6166801 0.12723096 399 | -5.6914511 4.3129621 0.036387846 400 | -5.8007331 3.998219 0.018290225 401 | -6.1106501 3.6937892 0.053117376 402 | -6.2456303 3.4387393 0.12515023 403 | -6.4195228 3.0517337 -0.0014260745 404 | -6.4382691 2.8352852 0.074333757 405 | -6.663878 2.447602 0.077933297 406 | -6.6436691 2.239207 0.016671708 407 | -6.8330131 1.8810012 0.064954691 408 | -6.9746556 1.4843447 0.15783326 409 | -6.8768697 1.1748722 0.022868685 410 | -7.0529366 0.75512767 0.059269257 411 | -7.0300074 0.4110319 0.086892001 412 | -6.9550953 0.10363041 0.16394833 413 | -6.9909739 -0.22029373 0.16658062 414 | -6.9362731 -0.62027848 0.072691053 415 | -6.988718 -0.9182142 0.11761971 416 | -6.8205733 -1.2836181 0.086442307 417 | -6.896843 -1.5416491 0.034335658 418 | -6.708168 -2.0604441 0.12702405 419 | -6.6101766 -2.2166085 0.05504375 420 | -6.4309773 -2.7001851 0.11064468 421 | -6.3995075 -2.9284842 -0.028839294 422 | -6.1248865 -3.2659087 0.074130468 423 | -5.9580607 -3.6396723 0.0030329076 424 | -5.7738686 -3.7756176 0.080966227 425 | -5.6692829 -4.1972728 0.0082974993 426 | -5.5059719 -4.500349 0.11503983 427 | -5.1605587 -4.7454429 0.10521689 428 | -4.8545246 -4.8836336 0.11389269 429 | -4.6436548 -5.2214313 0.09871351 430 | -4.4932289 -5.4932194 0.1264825 431 | -4.0763035 -5.6620464 0.045905203 432 | -3.7886288 -5.8997712 0.1405143 433 | -3.5884397 -5.9288521 0.16587535 434 | -3.2505162 -6.1462054 0.15097755 435 | -3.0265601 -6.4453049 0.00057001901 436 | -2.6679273 -6.580843 0.023001332 437 | -2.3959768 -6.5836554 0.065358512 438 | -1.9280605 -6.7055449 0.023011563 439 | -1.6464803 -6.853559 0.084209062 440 | -1.3759035 -6.8994532 0.102235 441 | -0.87420458 -6.9874411 0.16677396 442 | -0.65056032 -7.0568628 -0.0048667709 443 | -0.33062106 -7.0046449 -0.018323537 444 | 0.015524426 -7.1018238 0.12339959 445 | 0.54677451 -7.0704441 0.12340896 446 | 0.72677666 -6.9831963 0.12973961 447 | 1.1275289 -6.9333987 0.059249148 448 | 1.5681206 -6.9309783 -0.023311453 449 | 1.7630167 -6.7674031 0.039497182 450 | 2.2149391 -6.6580367 0.13313411 451 | 2.4799039 -6.575335 -0.0013406913 452 | 2.8036237 -6.4001393 0.037648808 453 | 3.1491318 -6.4381442 0.15464838 454 | 3.4738417 -6.2643299 -0.016893744 455 | 3.7321801 -6.0939732 0.034403957 456 | 3.9816995 -5.8778973 0.1472543 457 | 4.428009 -5.594121 0.067112446 458 | 4.5935988 -5.4007735 0.12961057 459 | 4.8657331 -5.1407199 0.07905668 460 | 5.1891432 -4.9533129 0.044579603 461 | 5.3940463 -4.6211081 -0.016922859 462 | 5.6517496 -4.4801764 -0.029130191 463 | 5.735167 -4.102798 -0.021112777 464 | 6.121789 -3.9030933 0.0034200302 465 | 6.1225891 -3.5400288 0.025861101 466 | 6.1944876 -3.1258261 0.14641722 467 | 6.4950252 -2.9203305 0.010840662 468 | 6.7344275 -2.7293432 0.12256962 469 | 6.8204594 -2.324676 0.065809518 470 | 6.8397665 -2.044307 0.15518472 471 | 7.0081601 -1.5953996 0.12334554 472 | 7.0983906 -1.3132411 0.16748124 473 | 7.1595683 -0.95966446 0.11314038 474 | 7.2117729 -0.61850077 -0.027585281 475 | 7.2714167 -0.2621288 0.099119157 476 | 8.6128302 0.16122971 0.046223242 477 | 8.7100754 0.43338367 -0.024408665 478 | 8.7202559 1.002048 -0.023966819 479 | 8.6215324 1.3287061 0.054652631 480 | 8.4455404 1.7617942 0.081362188 481 | 8.5385885 2.2658324 0.019711252 482 | 8.3796854 2.5783255 0.098774455 483 | 8.2450781 3.0860851 -0.013384084 484 | 8.0366077 3.396163 0.068299331 485 | 7.868257 3.732142 0.15734626 486 | 7.6078677 4.1155329 0.11857598 487 | 7.4771523 4.5967617 0.12965812 488 | 7.2580214 4.9085879 0.088120401 489 | 7.0220928 5.1618805 0.15398873 490 | 6.8481302 5.4990473 0.036735099 491 | 6.4848504 5.8086615 0.011354412 492 | 6.2445569 6.2581134 0.091339126 493 | 5.8686652 6.4908013 0.077974349 494 | 5.5666914 6.8516831 -0.019437365 495 | 5.1332474 6.9993682 0.032939311 496 | 4.9764996 7.2599354 0.09138079 497 | 4.5694618 7.5807567 0.063498154 498 | 4.1628466 7.6906567 -0.009452628 499 | 3.7049196 7.7895746 0.025513373 500 | 3.3039956 7.9556732 0.064620987 501 | 2.9778831 8.2152491 0.093470238 502 | 2.6194046 8.3062849 0.065821983 503 | 2.1348913 8.5075254 -0.02042722 504 | 1.8319746 8.5065403 -0.021721676 505 | 1.4276007 8.5847902 0.064768642 506 | 0.87256032 8.6311474 0.16857821 507 | 0.57392836 8.6067171 0.16720028 508 | 0.046395484 8.7225065 0.06749624 509 | -0.35408914 8.7369528 0.076769277 510 | -0.71859139 8.71595 0.080942057 511 | -1.2419549 8.5423193 -0.0073532006 512 | -1.533428 8.5908041 0.06286478 513 | -2.0485055 8.5415621 0.021640481 514 | -2.4447954 8.3814526 0.086859852 515 | -2.8363626 8.213336 0.15809225 516 | -3.1344554 8.0899057 0.023953948 517 | -3.5208058 7.8699713 0.034290981 518 | -3.8996706 7.7260623 0.15003148 519 | -4.3684669 7.3856845 0.09056586 520 | -4.6173325 7.284306 0.041152906 521 | -5.0505071 7.0615792 0.069797732 522 | -5.3596277 6.7469382 0.019124778 523 | -5.5853782 6.5133619 0.011743199 524 | -6.0384307 6.2752647 0.15689738 525 | -6.2116036 5.8320546 0.066419967 526 | -6.4981837 5.4709582 0.0045203147 527 | -6.9028754 5.296556 0.093849242 528 | -7.0805783 4.9082718 0.029174928 529 | -7.3253021 4.607234 0.032314774 530 | -7.4117088 4.2035751 0.16005218 531 | -7.7292447 3.7023535 0.10827817 532 | -7.7993937 3.4161825 0.0017330074 533 | -8.1010609 3.0162106 0.13750871 534 | -8.190589 2.6621625 0.12644805 535 | -8.3151236 2.2202241 -0.02190057 536 | -8.3100233 1.7626088 -0.011498506 537 | -8.346489 1.3561707 0.15750249 538 | -8.4731169 1.0122495 0.083572716 539 | -8.4437857 0.44759583 0.065478444 540 | -8.5906067 0.0037588268 0.011258984 541 | -8.5889568 -0.36765718 0.033126414 542 | -8.4183731 -0.83699006 0.15499757 543 | -8.3337002 -1.2538979 0.071007244 544 | -8.2927437 -1.6247523 0.034065958 545 | -8.2425117 -2.0033963 0.16230358 546 | -8.1205158 -2.4793148 0.045082401 547 | -7.968277 -2.7134264 0.13762638 548 | -7.8275151 -3.2154357 0.10549653 549 | -7.7415276 -3.6490679 0.12999435 550 | -7.4548903 -4.0102525 0.13295573 551 | -7.2041864 -4.3703437 -0.013196401 552 | -7.113831 -4.7802291 -0.0073942756 553 | -6.8843637 -4.9455953 0.0007569099 554 | -6.5222321 -5.329833 0.054270383 555 | -6.1810136 -5.7432022 0.14131354 556 | -5.8961935 -5.9332795 0.15957639 557 | -5.713932 -6.2889266 0.14484926 558 | -5.4252014 -6.6404405 0.022251431 559 | -4.9554458 -6.8610864 0.052227851 560 | -4.6488395 -6.9683318 0.098363325 561 | -4.3277507 -7.2158108 0.15198006 562 | -3.9421532 -7.5811114 0.15262628 563 | -3.5409777 -7.7418604 0.13330498 564 | -3.1227839 -7.7815905 0.062794931 565 | -2.8431399 -7.9368305 0.098814189 566 | -2.4694655 -8.0789766 0.050732225 567 | -2.0715072 -8.3249311 0.13832055 568 | -1.4832355 -8.3818779 0.15035169 569 | -1.2135141 -8.4817228 0.0016683732 570 | -0.71077138 -8.3997955 -0.010980922 571 | -0.3598581 -8.5330095 0.15493281 572 | 0.045692082 -8.4274416 0.16380604 573 | 0.45189136 -8.4772654 0.0019063243 574 | 1.0377549 -8.4743528 -0.028489044 575 | 1.3510791 -8.3652668 0.13795592 576 | 1.6973834 -8.2630882 0.094814822 577 | 2.1915638 -8.1497269 0.11844011 578 | 2.5682976 -8.0401344 -0.022271827 579 | 2.9510469 -8.0571785 0.0094455816 580 | 3.3781312 -7.771203 -0.025143296 581 | 3.7846346 -7.7364378 0.038187295 582 | 4.14819 -7.4996781 0.017510986 583 | 4.510848 -7.260736 0.13670352 584 | 4.90095 -7.0394335 0.027791845 585 | 5.2491407 -6.9068255 -0.023683637 586 | 5.5514278 -6.6274776 0.15486065 587 | 5.7974238 -6.2500992 0.15427113 588 | 6.2531238 -5.8877649 0.15066709 589 | 6.5534534 -5.7291465 -0.0024300294 590 | 6.0788321 -4.8382258 0.21236834 591 | 6.1681957 -4.514936 0.31538689 592 | 6.1358953 -3.90325 0.52376634 593 | 6.2115364 -3.6163223 0.50445771 594 | 6.1820979 -3.103549 0.68050861 595 | 6.5660386 -2.9603338 0.62903869 596 | 7.4211917 -2.8433053 0.22165954 597 | 8.266181 -2.7236042 0.11579139 598 | 8.3843002 -2.3543117 0.11491548 599 | 8.4789772 -1.9699987 0.16676289 600 | 8.6004457 -1.5399288 0.10427199 601 | 8.6824875 -1.0996836 0.14773189 602 | 8.5885668 -0.78693533 0.083345458 603 | 8.7654476 -0.42337 0.10618874 604 | 10.721854 0.11078494 0.066238932 605 | 10.69451 0.60436916 0.13267533 606 | 10.648459 1.1042768 0.09152475 607 | 10.603305 1.5877924 0.068872012 608 | 10.660713 2.2530725 0.014427272 609 | 10.492002 2.6952684 0.13718872 610 | 10.350169 3.1600506 0.077871971 611 | 10.121215 3.6271088 0.042603754 612 | 9.9114857 4.1397896 0.1008414 613 | 9.81359 4.5883489 0.10136591 614 | 9.5152702 5.0938497 0.012150848 615 | 9.3374996 5.572742 0.092258081 616 | 9.0040884 6.0309296 0.14927399 617 | 8.6081247 6.4938564 0.16932929 618 | 8.3688345 6.8885126 0.13796508 619 | 8.0552025 7.213026 0.037118521 620 | 7.6452603 7.7182875 0.095629588 621 | 7.3578005 7.9408908 0.12324598 622 | 6.8177867 8.3234253 0.17426127 623 | 6.5196815 8.6006794 -0.0055968212 624 | 6.0067673 8.9947186 0.051618051 625 | 5.5903378 9.248065 0.13143051 626 | 5.0407825 9.4264793 0.02636794 627 | 4.7361088 9.6881886 0.15546924 628 | 4.2404847 10.009971 0.065795816 629 | 3.7036457 10.13687 0.10353319 630 | 3.257288 10.391193 0.066714264 631 | 2.6619687 10.513227 0.090881042 632 | 2.088011 10.667367 0.15503547 633 | 1.760046 10.711574 0.17379299 634 | 1.0484451 10.646154 0.084612407 635 | 0.59153515 10.781739 0.16820183 636 | 0.013173553 10.798345 0.17170578 637 | -0.47025183 10.752954 0.0011182182 638 | -1.0233142 10.665653 0.13978034 639 | -1.4635284 10.705172 0.016588604 640 | -2.0622296 10.570817 0.18320093 641 | -2.4927299 10.521317 0.13195848 642 | -3.0928106 10.384563 0.11993419 643 | -3.4212666 10.211909 0.062438652 644 | -3.9222951 10.023893 0.075306967 645 | -4.5026555 9.6781836 0.18515918 646 | -4.9884233 9.4551048 0.098722555 647 | -5.4585552 9.2501631 0.17974029 648 | -5.8860435 8.993082 0.012010852 649 | -6.3605709 8.5948639 0.14796853 650 | -6.742959 8.293973 0.039201021 651 | -7.1424074 8.0543671 -0.0041928776 652 | -7.375814 7.7010403 0.15550199 653 | -7.8030462 7.299016 0.10701612 654 | -8.0687037 6.8679671 0.059221849 655 | -8.5015974 6.5196695 0.078206442 656 | -8.8039665 5.9387093 0.1098696 657 | -8.9713717 5.5296221 -0.004951553 658 | -9.2356825 5.1228886 0.10368142 659 | -9.6450253 4.6582689 0.11603353 660 | -9.6951427 4.2137008 0.15010716 661 | -10.030249 3.7569506 0.087085761 662 | -9.9986153 3.1815462 0.079855375 663 | -10.354455 2.6458893 0.15531324 664 | -10.347915 2.124475 0.044328962 665 | -10.563925 1.6878133 -0.0015516776 666 | -10.53549 1.2470009 0.00034234903 667 | -10.649777 0.71685517 0.036186017 668 | -10.653178 0.1796536 0.12156674 669 | -10.522206 -0.3310703 0.010734033 670 | -10.553175 -0.87809592 0.1347457 671 | -10.524454 -1.3689309 0.091271885 672 | -10.333294 -2.0457153 0.026740229 673 | -10.171655 -2.5475097 0.075554125 674 | -10.062054 -2.9215672 0.11462142 675 | -10.038805 -3.4144645 0.033718273 676 | -9.8372021 -4.0060172 0.032473058 677 | -9.6099243 -4.4633842 0.02407752 678 | -9.323534 -4.9002304 0.0027411403 679 | -9.1290617 -5.4067955 -0.0050560352 680 | -8.8233433 -5.769628 0.16312371 681 | -8.5722113 -6.3535862 0.16095059 682 | -8.1438761 -6.6206594 -0.0012990793 683 | -7.7601752 -7.0246172 0.04634589 684 | -7.5085869 -7.4415092 0.025370803 685 | -6.9997292 -7.7814054 0.009466703 686 | -6.7544866 -8.0893145 0.091309227 687 | -6.2941585 -8.5625172 -0.0047628442 688 | -5.8268905 -8.7643929 0.13076814 689 | -5.3666568 -9.0088339 0.016052783 690 | -4.9009843 -9.4059954 0.18159382 691 | -4.4549966 -9.6312437 -0.0080324076 692 | -4.000174 -9.7274847 0.14872907 693 | -3.4977481 -9.9587374 0.098666996 694 | -2.939003 -10.075733 0.011563822 695 | -2.5937579 -10.23901 0.14621769 696 | -2.0581596 -10.329131 0.11554613 697 | -1.4356941 -10.547067 0.13436066 698 | -0.9055205 -10.500996 0.053316511 699 | -0.43728954 -10.612099 0.0084495936 700 | 0.11749256 -10.488082 0.024963139 701 | 0.63781929 -10.560733 0.052072048 702 | 1.1672604 -10.632256 -0.004482606 703 | 1.6509438 -10.464993 0.0965086 704 | 2.280792 -10.411453 0.045068979 705 | 2.6185193 -10.29283 0.17028914 706 | 3.2846501 -10.1253 0.12035657 707 | 3.7126412 -10.027362 0.14221349 708 | 4.1507792 -9.6954803 0.074406639 709 | 4.6980271 -9.5945807 0.13414633 710 | 5.1894064 -9.2398901 0.13084573 711 | 5.6851692 -9.0664339 0.042097729 712 | 5.994812 -8.8644619 0.04332212 713 | 6.4336038 -8.4778891 0.14768901 714 | 6.9580574 -8.1575031 0.016013484 715 | 7.2147455 -7.7911849 0.088135533 716 | 7.5793719 -7.4451056 -0.01200894 717 | 8.0758686 -7.1508083 0.021358473 718 | 6.1228814 -4.8413787 0.71098119 719 | 6.0904355 -4.4938307 0.82355821 720 | 6.2917123 -3.9277999 0.85511279 721 | 6.2643094 -3.5283039 1.0017079 722 | 6.3235049 -3.2697124 1.0697803 723 | 6.5112834 -2.9761829 0.92745674 724 | 7.5343351 -2.9701614 0.84033757 725 | 8.4200811 -2.8922887 0.52952737 726 | 10.333385 -2.9583633 0.013105595 727 | 10.475804 -2.4928234 0.039053075 728 | 10.626624 -2.064342 0.12837741 729 | 10.728786 -1.5419589 0.1488643 730 | 10.67053 -0.86717904 0.12343252 731 | 10.770678 -0.44455665 0.091514409 732 | 13.235025 0.037880272 0.29223558 733 | 13.200225 0.69834745 0.19041388 734 | 14.217457 1.4157885 0.087381251 735 | 14.121697 2.1121247 0.0071362914 736 | 13.919068 2.9060609 0.15220712 737 | 13.794387 3.4958036 0.057419516 738 | 13.662567 4.1130867 0.079456151 739 | 13.387432 4.9328818 0.10719286 740 | 13.100671 5.4186416 0.08924517 741 | 12.956964 6.1528225 0.170928 742 | 12.550508 6.8329535 0.0088082748 743 | 12.342106 7.4780755 0.060677301 744 | 11.802628 7.9919443 0.088693291 745 | 11.513986 8.4761705 0.12333891 746 | 11.117703 9.0562525 0.067218892 747 | 10.640126 9.642272 0.12279349 748 | 10.042488 10.058909 0.12589037 749 | 9.6427679 10.594275 0.088922843 750 | 9.0478783 11.067704 0.089345455 751 | 8.6134024 11.452668 -0.011368509 752 | 8.0402908 11.916221 0.14731357 753 | 7.286109 12.285535 0.14646091 754 | 6.7662601 12.657893 0.072355017 755 | 6.0583482 12.911667 0.11430139 756 | 5.570498 13.165859 -0.011525675 757 | 4.8134737 13.364863 0.12244861 758 | 4.3005323 13.613288 0.16974652 759 | 3.5807858 13.932644 0.073214635 760 | 2.8157828 13.950223 -0.0038135513 761 | 2.2445469 14.04771 0.076563671 762 | 1.567591 14.106502 0.020329904 763 | 0.84597236 14.164273 0.16160555 764 | 0.12182602 14.27277 0.13268931 765 | -0.67642778 14.259967 0.045077492 766 | -1.2310632 14.16055 0.13002141 767 | -1.9081843 14.118525 0.16384324 768 | -2.646328 13.989668 0.028077547 769 | -3.3305216 13.777364 0.026295507 770 | -4.1029611 13.645011 0.089805029 771 | -4.7425299 13.393479 0.13196632 772 | -5.2902322 13.12258 0.14782242 773 | -5.8811178 12.991595 0.17029667 774 | -6.5161462 12.600353 0.084181391 775 | -7.1640148 12.2755 0.0022849105 776 | -7.6819615 11.859806 0.072061189 777 | -8.2960167 11.428341 -0.015155855 778 | -8.8559341 11.116042 0.087542318 779 | -9.3299809 10.571239 0.13016112 780 | -9.9829063 10.09849 0.025738424 781 | -10.348206 9.6219225 0.087734737 782 | -10.846073 9.0231276 0.12889658 783 | -11.30172 8.4471369 0.12065256 784 | -11.707499 8.0365477 0.033578612 785 | -11.971034 7.3638105 0.16414481 786 | -12.287211 6.7427287 0.050767578 787 | -10.037076 4.7983022 0.65272689 788 | -10.069427 4.3457317 0.65965128 789 | -10.167185 3.7530279 0.77564675 790 | -9.9912901 3.2201245 0.69804305 791 | -11.997272 3.0901659 0.48268121 792 | -13.754525 2.9405625 -0.005299578 793 | -13.920381 2.1260517 0.0065599722 794 | -14.060741 1.5009451 -0.024033923 795 | -14.054233 0.78078866 0.059723094 796 | -14.083092 0.085355498 0.12702355 797 | -13.99122 -0.51390463 0.1320039 798 | -14.010012 -1.3025352 0.06262245 799 | -13.824381 -1.9761684 0.17107177 800 | -13.725462 -2.6905241 0.1077624 801 | -13.707139 -3.3483753 -0.013385586 802 | -13.543077 -4.0860929 0.16370919 803 | -13.306342 -4.6609006 0.010984183 804 | -13.025631 -5.2794538 0.12285112 805 | -12.744001 -6.0272641 0.007606423 806 | -12.34778 -6.5722346 0.091650046 807 | -12.054175 -7.2262473 0.071158223 808 | -11.726334 -7.7325768 0.15509012 809 | -11.239511 -8.3193302 0.055103127 810 | -10.816842 -8.9055901 0.12547338 811 | -10.431113 -9.4040852 0.016054358 812 | -9.9412575 -9.9008961 0.038695827 813 | -9.4501867 -10.354776 0.14640941 814 | -8.8889322 -10.752712 0.083962686 815 | -8.3941689 -11.324203 0.10904933 816 | -7.7943301 -11.584463 0.0099291801 817 | -7.0914941 -12.065227 0.061484858 818 | -6.5916119 -12.360618 -0.0061323098 819 | -5.9917154 -12.739193 0.10770729 820 | -5.2772188 -12.89175 -0.01681727 821 | -4.6792955 -13.28092 0.086423308 822 | -3.9792967 -13.427248 -0.0037890878 823 | -3.2467508 -13.553113 0.13136101 824 | -2.5981996 -13.810795 0.1225486 825 | -2.0054364 -13.888059 0.1698548 826 | -1.3825774 -13.899862 0.15711777 827 | -0.65549082 -13.961958 0.03547607 828 | 0.12482981 -14.094713 0.16104867 829 | 0.837538 -14.014155 0.020573061 830 | 1.4624169 -14.020313 0.0092360415 831 | 2.1594329 -13.842937 0.058915049 832 | 2.9546897 -13.791654 -0.019660465 833 | 3.4530849 -13.644104 0.16133372 834 | 4.2783475 -13.492944 0.036996864 835 | 4.884901 -13.201065 0.15429509 836 | 5.5272756 -12.943906 0.14494988 837 | 6.1438646 -12.621189 0.12472632 838 | 6.824234 -12.382037 -0.011102338 839 | 7.4141021 -12.094819 0.11666909 840 | 8.0459642 -11.646521 -0.012741235 841 | 8.4475441 -11.362561 0.15025511 842 | 9.0784893 -10.940665 0.045827542 843 | 9.6092253 -10.472074 0.13678691 844 | 10.098055 -9.8227301 -0.0063423309 845 | 10.638433 -9.4026012 0.12451755 846 | 6.2070694 -4.9726558 1.2288042 847 | 6.0978451 -4.3418856 1.2809074 848 | 6.0944347 -3.9810765 1.4233621 849 | 6.1298995 -3.441407 1.3105972 850 | 6.2685852 -3.0648298 1.474435 851 | 6.4096522 -2.8323207 1.4492811 852 | 7.4515605 -2.9179037 1.3092278 853 | 8.5713768 -2.8530316 1.1110474 854 | 9.9888363 -2.9434721 0.84666157 855 | 13.767369 -3.4100428 0.061827678 856 | 14.068383 -2.6046662 0.080342889 857 | 14.073959 -2.0235651 -0.0090348246 858 | 14.225009 -1.2886114 0.053285651 859 | 13.266062 -0.48886922 0.23469824 860 | 13.223549 0.15910748 0.99153793 861 | 13.157823 0.81203729 0.98717141 862 | 20.574823 2.1767426 0.12165201 863 | 20.417929 3.0365965 0.11760241 864 | 20.432362 4.0500593 0.0013873326 865 | 20.188782 5.0715981 0.034118686 866 | 19.804625 6.0296926 -0.0057933917 867 | 19.591419 7.0600042 0.050716016 868 | 19.242035 7.9394283 0.15248826 869 | 18.709051 8.9716978 0.11253606 870 | 18.330315 9.8053694 0.071643531 871 | 17.888474 10.765658 0.041184481 872 | 17.199633 11.661733 -0.0044709267 873 | 16.763025 12.297261 0.0046198885 874 | 16.082445 13.090748 0.029358881 875 | 15.447227 14.031003 0.087518759 876 | 14.60791 14.623822 0.12773211 877 | 13.893534 15.485953 0.036644891 878 | 13.202285 16.126335 0.080114119 879 | 12.381274 16.605696 0.030005524 880 | 11.490701 17.321718 0.10897385 881 | 10.731619 17.853725 0.067065537 882 | 9.916523 18.396051 0.065619215 883 | 8.8323393 18.841053 0.071704447 884 | 7.9359932 19.183588 0.072886512 885 | 7.0453625 19.506449 0.047467194 886 | 5.9961452 19.841492 0.081389219 887 | 5.1727109 20.148037 0.079110511 888 | 4.0461097 20.281946 0.055711292 889 | 3.1532786 20.544455 0.088592254 890 | 2.2030437 20.695192 0.054336458 891 | 1.1269028 20.69297 0.010259364 892 | 0.0064126467 20.70715 0.009309886 893 | -0.91552621 20.692013 -0.0019984071 894 | -1.8289433 20.656712 0.11879845 895 | -2.9363086 20.426165 -0.0020506603 896 | -3.8618026 20.258829 0.094434515 897 | -4.9436798 20.195337 0.027322127 898 | -5.8157611 19.945137 0.072189756 899 | -6.8968153 19.552345 0.0063872216 900 | -7.7282462 19.167618 0.16731213 901 | -8.7749138 18.670805 0.051469583 902 | -9.6444092 18.220984 0.12490561 903 | -10.491426 17.817806 0.008010827 904 | -11.324201 17.268559 0.1302667 905 | -12.208566 16.575729 0.14589365 906 | -12.984172 16.115303 0.16727199 907 | -13.831764 15.322702 0.1469954 908 | -14.51309 14.597242 0.14657031 909 | -15.114405 13.917205 0.070972413 910 | -15.944694 13.117239 0.17506878 911 | -16.375639 12.364936 -0.0073051876 912 | -17.082502 11.61814 0.015777595 913 | -17.674606 10.677899 0.1347979 914 | -18.14097 9.7349634 0.046321724 915 | -10.032653 4.8398533 1.2595717 916 | -9.8996277 4.3700552 1.2491665 917 | -9.9134884 3.6274793 1.3075924 918 | -9.9167652 3.1467211 1.3388215 919 | -12.007537 3.1047535 1.145797 920 | -20.224174 4.0982728 0.1371917 921 | -20.397469 3.0970821 0.0094154356 922 | -20.503969 2.1649249 0.16278793 923 | -20.537922 1.1776582 0.03148064 924 | -20.603209 0.020820465 0.038356703 925 | -20.507267 -0.98089355 0.12707612 926 | -20.359903 -2.0094182 0.1204498 927 | -20.398718 -2.8409419 0.1377738 928 | -20.155176 -3.8933203 0.031231808 929 | -19.856894 -4.9645743 0.097875126 930 | -19.65103 -5.9279218 0.16895254 931 | -19.371401 -6.8769155 0.036637746 932 | -18.972748 -7.7916117 -0.022738131 933 | -18.574799 -8.6466522 0.14059208 934 | -18.063221 -9.7207861 0.15950076 935 | -17.500927 -10.500311 -0.010883846 936 | -17.007278 -11.381328 0.00019346501 937 | -16.478924 -12.197419 -0.015133766 938 | -15.893319 -12.913405 0.11499141 939 | -15.17583 -13.721371 0.16200086 940 | -14.554863 -14.560103 0.021728573 941 | -13.827668 -15.201639 0.094104864 942 | -12.999404 -15.772073 -0.0033138937 943 | -12.198978 -16.516438 0.17011145 944 | -11.405608 -16.96454 0.17404036 945 | -10.565709 -17.508101 0.079656102 946 | -9.6706352 -18.057091 0.15991737 947 | -8.7410479 -18.616938 0.052138604 948 | -7.8055305 -18.969217 0.026821088 949 | -6.9208608 -19.419485 0.16045615 950 | -5.9724302 -19.700218 -0.01109885 951 | -4.9498367 -19.939573 0.074209362 952 | -3.8427832 -20.069214 0.050657772 953 | -3.0234449 -20.347984 0.10589586 954 | -2.0233815 -20.412132 0.096265838 955 | -1.0145103 -20.442455 0.084985957 956 | 0.10242237 -20.609154 0.023993887 957 | 1.0996232 -20.501091 0.058600996 958 | 2.1866133 -20.533655 0.15144263 959 | 3.043421 -20.3769 0.15861218 960 | 4.0265775 -20.184113 0.0028462994 961 | 5.0284886 -19.895985 0.077959098 962 | 6.1036382 -19.640671 0.045449879 963 | 7.1408138 -19.316244 0.10744207 964 | 8.01649 -18.950041 0.029389288 965 | 8.8635206 -18.539011 -0.0043461379 966 | 9.878027 -18.178528 0.020213498 967 | 10.608117 -17.589424 0.12812321 968 | 11.547267 -17.080685 0.1291108 969 | 12.35165 -16.478928 0.16302922 970 | 13.133599 -15.851925 0.01674092 971 | 13.928256 -15.172732 0.13683601 972 | 14.764651 -14.557633 0.042280901 973 | 15.333396 -13.831863 0.15462327 974 | 16.12731 -12.941949 0.068836123 975 | 16.604752 -12.099368 -0.016178632 976 | 7.1468368 -4.5918636 1.5436789 977 | 7.2458301 -4.1331048 1.6792623 978 | 7.2255049 -3.7972589 1.5819148 979 | 7.1797061 -3.2930374 1.7033191 980 | 7.5255036 -2.8907211 1.6035538 981 | 8.4413099 -2.9877381 1.5954254 982 | 19.941557 -5.7948551 0.1412912 983 | 20.078979 -4.9717741 0.16868363 984 | 20.280529 -4.004303 0.11925592 985 | 20.547544 -2.9728754 0.11413547 986 | 20.680378 -1.91363 0.06316977 987 | 13.25393 -0.63311118 0.9742983 988 | --------------------------------------------------------------------------------