diff --git a/ONA2.rviz b/ONA2.rviz
new file mode 100644
index 0000000000000000000000000000000000000000..644ddd8e1b255ca8d52aca435af6c0076bf45753
--- /dev/null
+++ b/ONA2.rviz
@@ -0,0 +1,153 @@
+Panels:
+  - Class: rviz/Displays
+    Help Height: 78
+    Name: Displays
+    Property Tree Widget:
+      Expanded:
+        - /Global Options1
+        - /Status1
+        - /Grid1
+        - /PointCloud21
+      Splitter Ratio: 0.5
+    Tree Height: 617
+  - Class: rviz/Selection
+    Name: Selection
+  - Class: rviz/Tool Properties
+    Expanded:
+      - /2D Pose Estimate1
+      - /2D Nav Goal1
+      - /Publish Point1
+    Name: Tool Properties
+    Splitter Ratio: 0.5886790156364441
+  - Class: rviz/Views
+    Expanded:
+      - /Current View1
+    Name: Views
+    Splitter Ratio: 0.5
+  - Class: rviz/Time
+    Experimental: false
+    Name: Time
+    SyncMode: 0
+    SyncSource: PointCloud2
+Preferences:
+  PromptSaveOnExit: true
+Toolbars:
+  toolButtonStyle: 2
+Visualization Manager:
+  Class: ""
+  Displays:
+    - Alpha: 0.5
+      Cell Size: 1
+      Class: rviz/Grid
+      Color: 160; 160; 164
+      Enabled: true
+      Line Style:
+        Line Width: 0.029999999329447746
+        Value: Lines
+      Name: Grid
+      Normal Cell Count: 0
+      Offset:
+        X: 0
+        Y: 0
+        Z: 0
+      Plane: XY
+      Plane Cell Count: 10
+      Reference Frame: <Fixed Frame>
+      Value: true
+    - Alpha: 1
+      Autocompute Intensity Bounds: true
+      Autocompute Value Bounds:
+        Max Value: 10
+        Min Value: -10
+        Value: true
+      Axis: Z
+      Channel Name: intensity
+      Class: rviz/PointCloud2
+      Color: 255; 255; 255
+      Color Transformer: RGB8
+      Decay Time: 0
+      Enabled: true
+      Invert Rainbow: false
+      Max Color: 255; 255; 255
+      Min Color: 0; 0; 0
+      Name: PointCloud2
+      Position Transformer: XYZ
+      Queue Size: 10
+      Selectable: true
+      Size (Pixels): 3
+      Size (m): 0.019999999552965164
+      Style: Flat Squares
+      Topic: /iri_ground_segmentation/lidar_points_ground_segmented
+      Unreliable: false
+      Use Fixed Frame: true
+      Use rainbow: true
+      Value: true
+    - Class: rviz/MarkerArray
+      Enabled: false
+      Marker Topic: /iri_ground_segmentation/roadmap_markers
+      Name: MarkerArray
+      Namespaces:
+        {}
+      Queue Size: 100
+      Value: false
+  Enabled: true
+  Global Options:
+    Background Color: 48; 48; 48
+    Default Light: true
+    Fixed Frame: ona2/base_link
+    Frame Rate: 30
+  Name: root
+  Tools:
+    - Class: rviz/Interact
+      Hide Inactive Objects: true
+    - Class: rviz/MoveCamera
+    - Class: rviz/Select
+    - Class: rviz/FocusCamera
+    - Class: rviz/Measure
+    - Class: rviz/SetInitialPose
+      Theta std deviation: 0.2617993950843811
+      Topic: /initialpose
+      X std deviation: 0.5
+      Y std deviation: 0.5
+    - Class: rviz/SetGoal
+      Topic: /move_base_simple/goal
+    - Class: rviz/PublishPoint
+      Single click: true
+      Topic: /clicked_point
+  Value: true
+  Views:
+    Current:
+      Angle: 1.1175870895385742e-8
+      Class: rviz/TopDownOrtho
+      Enable Stereo Rendering:
+        Stereo Eye Separation: 0.05999999865889549
+        Stereo Focal Distance: 1
+        Swap Stereo Eyes: false
+        Value: false
+      Invert Z Axis: false
+      Name: Current View
+      Near Clip Distance: 0.009999999776482582
+      Scale: 96.46293640136719
+      Target Frame: <Fixed Frame>
+      Value: TopDownOrtho (rviz)
+      X: 0.03260824829339981
+      Y: -0.33336418867111206
+    Saved: ~
+Window Geometry:
+  Displays:
+    collapsed: true
+  Height: 914
+  Hide Left Dock: true
+  Hide Right Dock: false
+  QMainWindow State: 000000ff00000000fd000000040000000000000156000002f4fc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073000000003d000002f4000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f000002f4fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000003d000002f4000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e100000197000000030000064d0000003efc0100000002fb0000000800540069006d006501000000000000064d000002eb00fffffffb0000000800540069006d0065010000000000000450000000000000000000000538000002f400000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
+  Selection:
+    collapsed: false
+  Time:
+    collapsed: false
+  Tool Properties:
+    collapsed: false
+  Views:
+    collapsed: false
+  Width: 1613
+  X: 67
+  Y: 27
diff --git a/launch/ONA2_iri_ground_segmentation.launch b/launch/ONA2_iri_ground_segmentation.launch
new file mode 100644
index 0000000000000000000000000000000000000000..2ea84981318c8982e68eb96ff879180e64ef2e89
--- /dev/null
+++ b/launch/ONA2_iri_ground_segmentation.launch
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<launch>
+  <env name="LIBGL_ALWAYS_SOFTWARE" value="1" /> <!-- for running the rviz in virtual box, comment this if you do not use a VM-->
+  <rosparam command="load" file="$(find iri_ground_segmentation)/params/ONA2_iri_ground_segmentation.yaml" />
+  <remap from="/iri_ground_segmentation/lidar_points" to="/ona2/traversability/robosense_fused_ext_points"/>  
+  <node pkg="iri_ground_segmentation" type="iri_ground_segmentation" name="iri_ground_segmentation" output="screen" respawn="false">
+  </node>
+</launch>
diff --git a/launch/iri_ground_segmentation.launch b/launch/iri_ground_segmentation.launch
index ea82d23278a159723d4ece321d4a10e5b8f6b2bf..35eefcdb515003b7557ab8a22c46e8ed7b07ee15 100644
--- a/launch/iri_ground_segmentation.launch
+++ b/launch/iri_ground_segmentation.launch
@@ -3,7 +3,7 @@
   <env name="LIBGL_ALWAYS_SOFTWARE" value="1" /> <!-- for running the rviz in virtual box, comment this if you do not use a VM-->
   <rosparam command="load" file="$(find iri_ground_segmentation)/params/iri_ground_segmentation.yaml" />
   <remap from="/iri_ground_segmentation/lidar_points" to="/kitti/velo/pointcloud"/> 
-  <remap from="/iri_ground_segmentation/ground_truth_lidar_points" to="/velodyne_points"/> 
+  <remap from="/iri_ground_segmentation/ground_truth_lidar_points" to="/velodyne_points"/>
   <node pkg="iri_ground_segmentation" type="iri_ground_segmentation" name="iri_ground_segmentation" output="screen" respawn="false">
   </node>
 </launch>
diff --git a/params/ONA2_iri_ground_segmentation.yaml b/params/ONA2_iri_ground_segmentation.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..8bb4e7a7725ba7f530b4c6ab6759ace38dbeedf7
--- /dev/null
+++ b/params/ONA2_iri_ground_segmentation.yaml
@@ -0,0 +1,66 @@
+iri_ground_segmentation: {
+  rate: 10.00,
+  
+  # Robot related geometric parameters
+  sensor_height: 0.3,      ## Ground is expected to be at z = -1*sensor_height
+  robot_height: 1.5,       ## All obstacle points above this value (w.r.t the z ground predicted by the algorithm) are treated as overhanging obstacles 
+
+  # Parameters affecting the exploration of the pointcloud
+  ROI_delta_x_and_y: 3.0, #4.0,   ## This value sets the size of the ROIs: ROI_size = (2*ROI_delta_x_and_y)^2
+  ROI_shadow_area:   3.0, #6.5,   ## This value is the same that the above, but only used in the root vertex to overcome the shadow area
+
+  ground_reference_search_resolution_deg: 12.00, ## It is the angular resolution when generating new ground references (graph nodes),
+                                                 ## it will affect the number of nodes in the graph: lower values generate more nodes
+
+  elevation_grid_resolution: 2.1, #1.2, #1.5, #1.0 #0.5,   ## This value is used to create the "elevation point cloud" which is a reduction of the original pointcloud, where
+                                          ## only the lowest z values in each cell are stored (along with a vector of indexes pointing to the remaining points
+                                          ## in the cell, so that the original pointcloud can be recovered or labeled using the info in the "elevation cloud").
+                                          ## Big values can speed up the algorithm but generates a lower resolution ground model, on the other hand, small values
+                                          ## can produce outliers because we would like to have only ground points in the elevation cloud (however these outliers
+                                          ## are usually succesfully rejected by the mahalanobis threshold and the "prior" information)
+
+  # Kalman filter noise parameters
+  ## initial uncertainties
+  z_initial_std_dev: 0.05,          ## Uncertainty in z = -1*sensor_height
+  initial_angular_std_dev_deg: 1.5, ## Used to initialize x_slope and y_slope variances
+
+  ## propagation additive noises
+  propagation_z_additive_noise_per_meter:   0.01, ## Uncertainty added to var_z as a function of the distance with the parent vertex
+  propagation_additive_noise_deg_per_meter: 0.4,  ## Uncertainty added to x_slope and y_slope as a function of the distance with the parent vertex 
+                                                  ## (it is expressed in degrees per meter, but inside the code it is converted to slope per meter)
+  # measurement noise
+  z_observation_std_dev: 0.3, #0.15, #0.3, #0.45, for elevation_grid_resolution = 0.5              ## Uncertainty in the Lidar observations
+
+  # threshold for outlier rejection and classification
+  mahalanobis_threshold: 3.0, #2.7, #3.0,       ## To classify points as obstacles or ground (a small value will cause false obstacle points, 
+                                    ## and a big value will increase the number of false ground points)
+
+  # Neural Network related parameters
+  use_neural_network: false,
+  extract_data_to_external_training_of_the_network: false,
+  dataset_filename_with_global_path: '/home/idelpino/Documentos/dataset.csv', # This is the filename with path where the data for neural net training is dumped
+  neural_net_filename_with_global_path: '/home/idelpino/iri-lab/ground_segmentation_ws/src/iri_ground_segmentation/shallow_neural_nets/veg_terrain_and_obs_13_features_39_neurons.csv',
+  neural_net_number_of_features: 13,
+  neural_net_number_of_neurons_in_hidden_layer: 39,
+  neural_net_number_of_neurons_in_output_layer: 2,
+  
+  # labeling parameters
+  max_pred_std_dev_for_labelling: 0.333,                 ## ONLY IN USE TO GIVE COLOUR TO DENSE RECONSTRUCTION
+  score_threshold: 0.0, #0.0 when using neural net       ## for assigning ground class label: one means maha. dist. equal to zero, zero means mahalanobis dist equal to maha. thres
+  classify_not_labeled_points_as_obstacles: false,       ## when a point has no reference satisfying the max_pred_std_dev_for_labelling threshold we can leave as unknown or label it as obstacle
+  ground_threshold_in_not_analyzed_areas: 0.1,           ## when it is not possible to make a local analysis of the data, we will use the lowest point (the one in elevation_cloud) as ground height, and
+                                                         ## all the points above it and below this threshold will be classified as ground 
+                           
+  # low obstacle detection parameters
+  use_low_obstacle_detection: true,
+  low_obstacle_min_height: 0.07,
+  sensor_best_resolution_deg: 0.2, # Best resolution, either horizontal or vertical
+  max_navigation_slope: 0.3,                           
+                                                         
+  # visualization and debug parameters
+  evaluate_segmentation: false,
+  only_road_is_traversable: true,        # If set to false terrain and vegetation will be considered non-traversable, but sidewalks, parkings, etc will be considered to be traversable
+  measure_performance: false,            ## (feature still not debugged) Flag to measure number of execution and execution times of the different functions of the algorithm 
+  show_dense_reconstruction: false,      ## To show a dense ground surface reconstruction using the predictions of the ground mode (colored using the std_dev of z coordinate)   
+                                         ## or alternatively the "elevation point cloud" (useful for parameter tunning) 
+}
diff --git a/params/iri_ground_segmentation.yaml b/params/iri_ground_segmentation.yaml
index 594e5870456276c4860b20b08251b1cd5e994f5f..70507e82b6df63f7a624d412512d3e7ce7cbc8b7 100644
--- a/params/iri_ground_segmentation.yaml
+++ b/params/iri_ground_segmentation.yaml
@@ -55,10 +55,10 @@ iri_ground_segmentation: {
   use_low_obstacle_detection: true,
   low_obstacle_min_height: 0.1,
   sensor_best_resolution_deg: 0.2, # Best resolution, either horizontal or vertical
-  max_navigation_slope: 0.2,                           
+  max_navigation_slope: 0.15,                           
                                                          
   # visualization and debug parameters
-  evaluate_segmentation: true,
+  evaluate_segmentation: false,
   only_road_is_traversable: true,        # If set to false terrain and vegetation will be considered non-traversable, but sidewalks, parkings, etc will be considered to be traversable
   measure_performance: false,            ## (feature still not debugged) Flag to measure number of execution and execution times of the different functions of the algorithm 
   show_dense_reconstruction: false,      ## To show a dense ground surface reconstruction using the predictions of the ground mode (colored using the std_dev of z coordinate)   
diff --git a/src/ground_segmentation_alg_node.cpp b/src/ground_segmentation_alg_node.cpp
index 84b8e67324664579804f3f71f4a8e4e677487c42..4c9f07b1fadb3d2f99f3f1f0521ece698c86a2c8 100644
--- a/src/ground_segmentation_alg_node.cpp
+++ b/src/ground_segmentation_alg_node.cpp
@@ -471,7 +471,7 @@ void GroundSegmentationAlgNode::convertInputsToSuitableFormats(void)
 //
 //  std::cout << "DATA_C_0_RGB_CAST_INTO_FLOAT = " << lidar_pcl_cloud_.points[100].data_c[DATA_C_0_RGB_CAST_INTO_FLOAT] << std::endl;
 //  std::cout << "DATA_C_1_ID_CLASS = " << lidar_pcl_cloud_.points[100].data_c[DATA_C_1_ID_CLASS] << std::endl;
-//  std::cout << "DATA_C_2_MEAN_INTENSITY = " << lidar_pcl_cloud_.points[100].data_c[DATA_C_2_MEAN_INTENSITY] << std::endl;
+//  std::cout << "DATA_C_2_MEAN_INTENSITY = " << lidar_pcl_cloud_.points[100].data_c[DATA_C_2_INDEX_OF_GROUND_REF_THAT_MADE_THE_LABEL] << std::endl;
 //  std::cout << "DATA_C_3_ORIGINAL_INDEX = " << lidar_pcl_cloud_.points[100].data_c[DATA_C_3_ORIGINAL_INDEX] << std::endl;
 
   if (flag_new_ground_truth_lidar_data_)
@@ -728,11 +728,11 @@ void GroundSegmentationAlgNode::detectLowObstacles(float h, float res_deg, float
   float cell_side = r_max / sqrt(8.0); // This comes from here: sqrt((r_max/2)^2 / 2)
   int num_of_cells = (d_max * 2.0 / cell_side);
 
-  //std::cout << "r_max = "       << r_max << std::endl;
-  //std::cout << "K = "            << K << std::endl;
-  //std::cout << "d_max = "        << d_max << std::endl;
-  //std::cout << "cell_side = "    << cell_side << std::endl;
-  //std::cout << "num_of_cells = " << num_of_cells << std::endl;
+//  std::cout << "r_max = "       << r_max << std::endl;
+//  std::cout << "K = "            << K << std::endl;
+//  std::cout << "d_max = "        << d_max << std::endl;
+//  std::cout << "cell_side = "    << cell_side << std::endl;
+//  std::cout << "num_of_cells = " << num_of_cells << std::endl;
 
   std::vector < std::vector < Cell >> grid(num_of_cells, std::vector < Cell > (num_of_cells));
 
@@ -853,7 +853,7 @@ void GroundSegmentationAlgNode::evaluateSegmentation(void)
     else
     {
       if (detected_class == VEGETATION || detected_class == CLASS_UNKNOWN || detected_class == CLASS_OBSTACLE
-          || detected_class == CLASS_OVERHANGING_OBSTACLE || detected_class == TERRAIN)
+          || detected_class == CLASS_OVERHANGING_OBSTACLE || detected_class == TERRAIN || detected_class == CLASS_LOW_OBSTACLE)
         detected_class = CLASS_OBSTACLE;
       else
         detected_class = CLASS_GROUND;
@@ -977,7 +977,7 @@ void GroundSegmentationAlgNode::cb_lidar(const sensor_msgs::PointCloud2::ConstPt
 {
   this->mutex_enter();
   lidar_ros_cloud_ = *msg;
-//std::cout << "GroundSegmentationAlgNode::cb_lidar --> lidar msg received!" << std::endl;
+  //std::cout << "GroundSegmentationAlgNode::cb_lidar --> lidar msg received!" << std::endl;
   assert(msg != NULL && "Null pointer!!! in function cb_lidar!");
 
   flag_new_lidar_data_ = true;