Skip to content

Commit a2c9d72

Browse files
committed
Add parameter to enable/disable fitting two lines
1 parent 1a86cea commit a2c9d72

File tree

4 files changed

+34
-14
lines changed

4 files changed

+34
-14
lines changed

crates/ransac/src/lib.rs

+26-12
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ impl<Frame> Ransac<Frame> {
159159
&mut self,
160160
random_number_generator: &mut impl Rng,
161161
iterations: usize,
162+
fit_two_lines: bool,
162163
maximum_score_distance: f32,
163164
maximum_inclusion_distance: f32,
164165
) -> RansacResult<Frame> {
@@ -184,14 +185,27 @@ impl<Frame> Ransac<Frame> {
184185

185186
let best_feature = (0..iterations)
186187
.map(|_| {
187-
let mut points = self
188-
.unused_points
189-
.choose_multiple(random_number_generator, 3);
190-
let feature = RansacFeature::from_points(
191-
*points.next().unwrap(),
192-
*points.next().unwrap(),
193-
*points.next().unwrap(),
194-
);
188+
let feature = if fit_two_lines {
189+
let mut points = self
190+
.unused_points
191+
.choose_multiple(random_number_generator, 3);
192+
193+
RansacFeature::from_points(
194+
*points.next().unwrap(),
195+
*points.next().unwrap(),
196+
*points.next().unwrap(),
197+
)
198+
} else {
199+
let mut points = self
200+
.unused_points
201+
.choose_multiple(random_number_generator, 2);
202+
203+
RansacFeature::Line(Line::from_points(
204+
*points.next().unwrap(),
205+
*points.next().unwrap(),
206+
))
207+
};
208+
195209
let score = feature.score(
196210
self.unused_points.iter(),
197211
maximum_score_distance,
@@ -232,7 +246,7 @@ mod test {
232246
let mut ransac = Ransac::<SomeFrame>::new(vec![]);
233247
let mut rng = ChaChaRng::from_entropy();
234248
assert_eq!(
235-
ransac.next_feature(&mut rng, 10, 5.0, 5.0),
249+
ransac.next_feature(&mut rng, 10, false, 5.0, 5.0),
236250
RansacResult::default()
237251
);
238252
}
@@ -242,7 +256,7 @@ mod test {
242256
let mut ransac = Ransac::<SomeFrame>::new(vec![]);
243257
let mut rng = ChaChaRng::from_entropy();
244258
assert_eq!(
245-
ransac.next_feature(&mut rng, 10, 5.0, 5.0),
259+
ransac.next_feature(&mut rng, 10, false, 5.0, 5.0),
246260
RansacResult::default()
247261
);
248262
}
@@ -256,7 +270,7 @@ mod test {
256270
let RansacResult {
257271
feature,
258272
used_points,
259-
} = ransac.next_feature(&mut rng, 10, 5.0, 5.0);
273+
} = ransac.next_feature(&mut rng, 10, false, 5.0, 5.0);
260274
println!("{feature:#?}");
261275
println!("{used_points:#?}");
262276

@@ -282,7 +296,7 @@ mod test {
282296

283297
let mut ransac = Ransac::<SomeFrame>::new(points.clone());
284298
let mut rng = ChaChaRng::from_entropy();
285-
let result = ransac.next_feature(&mut rng, 15, 1.0, 1.0);
299+
let result = ransac.next_feature(&mut rng, 15, false, 1.0, 1.0);
286300

287301
if let RansacFeature::Line(line) = result.feature {
288302
assert_relative_eq!(line.slope(), slope, epsilon = 0.0001);

crates/vision/src/field_border_detection.rs

+2
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ fn find_border_lines(
113113
let result = ransac.next_feature(
114114
random_state,
115115
20,
116+
false,
116117
first_line_association_distance,
117118
first_line_association_distance,
118119
);
@@ -126,6 +127,7 @@ fn find_border_lines(
126127
let result = ransac.next_feature(
127128
random_state,
128129
20,
130+
false,
129131
second_line_association_distance,
130132
second_line_association_distance,
131133
);

crates/vision/src/line_detection.rs

+2
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ pub struct CycleContext {
7575
minimum_number_of_points_on_line:
7676
Parameter<usize, "line_detection.$cycler_instance.minimum_number_of_points_on_line">,
7777
ransac_iterations: Parameter<usize, "line_detection.$cycler_instance.ransac_iterations">,
78+
ransac_fit_two_lines: Parameter<bool, "line_detection.$cycler_instance.ransac_fit_two_lines">,
7879

7980
camera_matrix: RequiredInput<Option<CameraMatrix>, "camera_matrix?">,
8081
filtered_segments: Input<FilteredSegments, "filtered_segments">,
@@ -173,6 +174,7 @@ impl LineDetection {
173174
let ransac_result = ransac.next_feature(
174175
&mut self.random_state,
175176
*context.ransac_iterations,
177+
*context.ransac_fit_two_lines,
176178
*context.maximum_fit_distance_in_ground,
177179
*context.maximum_fit_distance_in_ground + *context.margin_for_point_inclusion,
178180
);

etc/parameters/default.json

+4-2
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,8 @@
155155
"end": 0.1
156156
},
157157
"minimum_number_of_points_on_line": 10,
158-
"ransac_iterations": 50
158+
"ransac_iterations": 50,
159+
"ransac_fit_two_lines": false
159160
},
160161
"vision_bottom": {
161162
"use_horizontal_segments": true,
@@ -182,7 +183,8 @@
182183
"end": 0.1
183184
},
184185
"minimum_number_of_points_on_line": 10,
185-
"ransac_iterations": 50
186+
"ransac_iterations": 50,
187+
"ransac_fit_two_lines": false
186188
}
187189
},
188190
"field_border_detection": {

0 commit comments

Comments
 (0)