@@ -99,6 +99,10 @@ class PointCloudToGrid : public rclcpp::Node
9999 {
100100 search_start_mid_deg = param.as_double ();
101101 }
102+ if (param.get_name () == " search_length" )
103+ {
104+ search_length = param.as_double ();
105+ }
102106 // grid_map.frame_out = config.frame_out;
103107 grid_map.paramRefresh ();
104108 }
@@ -123,6 +127,7 @@ class PointCloudToGrid : public rclcpp::Node
123127 this ->declare_parameter <double >(" search_range_deg" , search_range_deg);
124128 this ->declare_parameter <double >(" search_resolution_deg" , search_resolution_deg);
125129 this ->declare_parameter <double >(" search_start_mid_deg" , search_start_mid_deg);
130+ this ->declare_parameter <double >(" search_length" , search_length);
126131
127132 this ->get_parameter (" mapi_topic_name" , grid_map.mapi_topic_name );
128133 this ->get_parameter (" maph_topic_name" , grid_map.maph_topic_name );
@@ -139,6 +144,7 @@ class PointCloudToGrid : public rclcpp::Node
139144 this ->get_parameter (" search_range_deg" , search_range_deg);
140145 this ->get_parameter (" search_resolution_deg" , search_resolution_deg);
141146 this ->get_parameter (" search_start_mid_deg" , search_start_mid_deg);
147+ this ->get_parameter (" search_length" , search_length);
142148
143149 grid_map.paramRefresh ();
144150
@@ -182,7 +188,7 @@ class PointCloudToGrid : public rclcpp::Node
182188 // initialize grid vectors: -128
183189 for (auto &p : hpoints)
184190 {
185- p = -128 ;
191+ p = -1 ;
186192 }
187193 for (auto &p : ipoints)
188194 {
@@ -200,7 +206,7 @@ class PointCloudToGrid : public rclcpp::Node
200206 if (cell.x < grid_map.cell_num_x && cell.y < grid_map.cell_num_y )
201207 {
202208 ipoints[cell.y * grid_map.cell_num_x + cell.x ] = char (p.intensity * grid_map.intensity_factor );
203- hpoints[cell.y * grid_map.cell_num_x + cell.x ] = +99 ; // char(p.z * grid_map.height_factor);
209+ hpoints[cell.y * grid_map.cell_num_x + cell.x ] = +99 ; // char(p.z * grid_map.height_factor);
204210 }
205211 else
206212 {
@@ -218,42 +224,65 @@ class PointCloudToGrid : public rclcpp::Node
218224 std::vector<bool > search_results (loop_increment);
219225 double x_start = -0.6 ;
220226 double y_start = 0.0 ;
221- double length = 10.0 ;
222227 for (int loop = 0 ; loop < loop_increment; loop++)
223228 {
224229 double search_ang = -0.5 * search_range + double (loop) * search_resolution;
225- search_results[loop] = grid_map.drawline (hpoints, x_start, y_start, search_start_mid + search_ang, length );
230+ search_results[loop] = grid_map.drawline (hpoints, x_start, y_start, search_start_mid + search_ang, search_length );
226231 }
227232 // find the longest continous true (free) segment in search_results
228233 int max_true = 0 ;
229234 int max_true_start = 0 ;
230235 int max_true_end = 0 ;
231- int true_start = 0 ;
236+ int true_count = 0 ;
232237 int true_end = 0 ;
233238 for (int loop = 0 ; loop < loop_increment; loop++)
234239 {
235240 if (search_results[loop])
236241 {
237- true_end = loop;
238- if (true_end - true_start > max_true)
242+ true_count += 1 ;
243+ }
244+ else
245+ {
246+ if (loop >= 1 and search_results[loop - 1 ])
247+ {
248+ true_end = loop - 1 ;
249+ }
250+ if (true_count > max_true)
239251 {
240- max_true = true_end - true_start;
241- max_true_start = true_start ;
252+
253+ max_true = true_count ;
242254 max_true_end = true_end;
243255 }
256+ true_count = 0 ;
257+ }
258+ }
259+ // if everything is true (false else never evaluated)
260+ if (true_count > max_true){
261+ max_true = true_count;
262+ max_true_end = loop_increment - 1 ;
263+ }
264+ max_true_start = max_true_end - max_true + 1 ;
265+
266+ // this for loop is only fro visualization
267+ // true and false segments (green and red)
268+ for (int i = 0 ; i < loop_increment; i++)
269+ {
270+ if (search_results[i])
271+ {
272+ hpoints[(grid_map.cell_num_y /2 + i - loop_increment / 2 ) * grid_map.cell_num_x ] = 110 ;
244273 }
245274 else
246275 {
247- true_start = loop ;
276+ hpoints[(grid_map. cell_num_y / 2 + i - loop_increment / 2 ) * grid_map. cell_num_x ] = - 128 ;
248277 }
249278 }
250279
251280 // RCLCPP_INFO_STREAM(this->get_logger(), "max_true: " << max_true << " max_true_start: " << max_true_start << " max_true_end: " << max_true_end);
252- int max_true_center = (max_true_start + max_true_start)/ 2 ;
281+ int max_true_center = (max_true_start + max_true_end) / 2 ;
253282 double max_true_angle = -0.5 * search_range + search_start_mid + double (max_true_center) * search_resolution;
254283
255- double x_end = x_start + length * cos (max_true_angle);
256- double y_end = y_start + length * sin (max_true_angle);
284+ double x_end = x_start + search_length * cos (max_true_angle);
285+ double y_end = y_start + search_length * sin (max_true_angle);
257286
258287 visualization_msgs::msg::MarkerArray mark_array;
259288 visualization_msgs::msg::Marker debug1_marker;
@@ -286,7 +315,8 @@ class PointCloudToGrid : public rclcpp::Node
286315 OnSetParametersCallbackHandle::SharedPtr callback_handle_;
287316 std::string cloud_in_topic = " nonground" ;
288317 bool verbose1 = true , verbose2 = false ;
289- double search_range_deg = 120 , search_resolution_deg = 10 , search_start_mid_deg = -180 ;
318+ double search_range_deg = 120 , search_resolution_deg = 10 , search_start_mid_deg = -180 ;
319+ double search_length = 10.0 ;
290320 // nav_msgs::msg::OccupancyGrid::Ptr intensity_grid = std::make_shared<nav_msgs::msg::OccupancyGrid>();
291321 // nav_msgs::msg::OccupancyGrid::Ptr intensity_grid(new nav_msgs::msg::OccupancyGrid);
292322 // nav_msgs::msg::OccupancyGrid::Ptr height_grid = std::make_shared<nav_msgs::msg::OccupancyGrid>();
@@ -300,4 +330,4 @@ int main(int argc, char **argv)
300330 rclcpp::spin (std::make_shared<PointCloudToGrid>());
301331 rclcpp::shutdown ();
302332 return 0 ;
303- }
333+ }
0 commit comments