From 01957be6d6b281f25d75db88d36f3df86bb79773 Mon Sep 17 00:00:00 2001 From: Afloat Date: Sat, 7 Nov 2026 02:38:16 +0800 Subject: [PATCH] Reject unpaired coordinates before fitting a circle --- Mapping/circle_fitting/circle_fitting.py | 3 +++ .../3_mapping/circle_fitting/circle_fitting_main.rst | 3 +++ tests/test_circle_fitting.py | 8 ++++++++ 3 files changed, 14 insertions(+) diff --git a/Mapping/circle_fitting/circle_fitting.py b/Mapping/circle_fitting/circle_fitting.py index b5714b507c..3322266cd1 100644 --- a/Mapping/circle_fitting/circle_fitting.py +++ b/Mapping/circle_fitting/circle_fitting.py @@ -45,6 +45,9 @@ def circle_fitting(x, y): - The fitting error as a deviation metric (float). """ + if len(x) != len(y): + raise ValueError("x and y must contain the same number of points") + sumx = sum(x) sumy = sum(y) sumx2 = sum([ix ** 2 for ix in x]) diff --git a/docs/modules/3_mapping/circle_fitting/circle_fitting_main.rst b/docs/modules/3_mapping/circle_fitting/circle_fitting_main.rst index e243529a9c..76488cb6a4 100644 --- a/docs/modules/3_mapping/circle_fitting/circle_fitting_main.rst +++ b/docs/modules/3_mapping/circle_fitting/circle_fitting_main.rst @@ -3,6 +3,9 @@ Object shape recognition using circle fitting This is an object shape recognition using circle fitting. +Each range observation supplies a pair of coordinates. The two input lists +must have equal lengths so each point contributes once to the fit. + .. image:: https://github.com/AtsushiSakai/PythonRoboticsGifs/raw/master/Mapping/circle_fitting/animation.gif The blue circle is the true object shape. diff --git a/tests/test_circle_fitting.py b/tests/test_circle_fitting.py index b3888d7cc3..fc5471d331 100644 --- a/tests/test_circle_fitting.py +++ b/tests/test_circle_fitting.py @@ -1,3 +1,4 @@ +import pytest import conftest from Mapping.circle_fitting import circle_fitting as m @@ -7,5 +8,12 @@ def test_1(): m.main() +@pytest.mark.parametrize("x, y", [([0, 2, 0, 1], [0, 0, 2]), + ([0, 0, 2], [0, 2, 0, 1])]) +def test_requires_paired_coordinates(x, y): + with pytest.raises(ValueError, match="same number"): + m.circle_fitting(x, y) + + if __name__ == '__main__': conftest.run_this_test(__file__)