Skip to content

Commit 1e47740

Browse files
committed
Grid trajectory search fixed longest continous segment
1 parent fa4ebd5 commit 1e47740

File tree

2 files changed

+54
-20
lines changed

2 files changed

+54
-20
lines changed

launch/grid_trajectory.launch.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,20 @@ def generate_launch_description():
1616
output='screen',
1717
parameters=[
1818
{'cloud_in_topic': LaunchConfiguration("topic")},
19-
{'position_x': -20.0},
20-
{'position_y': 0.0},
19+
{'position_x': -20.0}, # meters
20+
{'position_y': 0.0}, # meters
2121
{'verbose1': False},
2222
{'verbose2': False},
23-
{'cell_size': 0.8},
24-
{'length_x': 40.0},
25-
{'length_y': 60.0},
23+
{'cell_size': 0.2}, # meters
24+
{'length_x': 40.0}, # meters
25+
{'length_y': 60.0}, # meters
2626
#{'frame_out': 'os1_sensor'},
2727
{'mapi_topic_name': 'intensity_grid'},
2828
{'maph_topic_name': 'height_grid'},
29+
{'search_length': 4.0}, # meters
30+
{'search_range_deg': 80.0}, # degrees
31+
{'search_resolution_deg': 0.5}, # degrees
32+
{'search_start_mid_deg': -180.0}, # degrees
2933
]
3034
)
3135

src/grid_trajectory.cpp

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)