No version for distro humble showing lyrical. Known supported distros are highlighted in the buttons above.
Package symbol

fsm_localisation package from fsm_localisation repo

fsm_localisation

ROS Distro
lyrical

Package Summary

Version 1.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/fourier-scan-matcher/fsm-localisation.git
VCS Type git
VCS Version lyrical-devel
Last Updated 2026-11-01
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Correspondenceless scan matching of panoramic 2D lidar scans in the frequency domain, in two modes: lidar odometry from consecutive scans, and correction of a pose estimate against an occupancy grid.

Additional Links

Maintainers

  • Alexandros Filotheou

Authors

  • Alexandros Filotheou
README
No README found. See repository README.
CHANGELOG

Changelog for package fsm_localisation

Forthcoming

  • Declares as test dependencies the packages that the Python tests import: launch, launch_ros, launch_testing, python3-pytest, rcl_interfaces, rclpy and tf2_msgs. Before, the tests got them only through other packages.

1.0.0 (2026-11-01)

  • Declares libfftw3-dev as a build dependency and libfftw3 as a run dependency. ros/rosdistro #54634 split the libfftw3 rule: that key now installs the run time libraries only, and the new key libfftw3-dev installs the headers. Thus rosdep installs each dependency, and the install steps and docker/Dockerfile no longer install libfftw3-dev by name or skip a key.
  • Switches the translation bound off in params_amelioration.yaml. On the rb1 recording, the estimate was up to 0.25 m and 10 degrees out on every third frame. There the bound refused 510 to 670 of 2223 frames. It also let through 17 to 57 answers more than 0.5 m or 10 degrees out. With the bound off, no frame was refused and 1 to 49 answers were that far out. With the estimate on the logged pose, the median heading gap fell from 0.587 to 0.503 degrees.
  • Unpacks the spectrum of an odd count of rays correctly. It unpacked each spectrum as if its length was even. Thus at an odd length it removed the imaginary part of the highest coefficient and gave one coefficient too few. This changed each rotation that the matcher found for such a scan. In the test room the start was 0.14 m and 4.6 degrees out. From there a scan of 269 rays now comes to 0.067 degrees and 0.35 cm from the truth. Before, it came to 0.23 degrees and 1.1 cm. A scan laid out as the 1073 rays of the rb1 recording now comes to 0.012 degrees, where it came to 0.39 degrees. At an odd length the arithmetic no longer agrees with the ROS 1 package.
  • Lays the map out from the first ray of the scan. The matcher cast its window of a turn from the start of that window. Thus it matched a scan whose first ray was at a different angle up to half a ray out. In the test room, the heading of a whole turn symmetric about the heading was 0.5 degrees out. On a narrower scan where the turn less its rays is odd, as on the rb1 recording, the finer casts of the rotation step were half a ray out. Now each cast lies along the rays of the scan, at each count of rays. In the test room the error is less than 4e-15 radians, and on the rb1 layout less than 2e-7.
  • Corrector::correct takes a fifth argument, first_ray_angle. It is the angle of the first range from the heading of the sensor, and a caller must supply it. The node supplies the angle_min of the scan. FSM::Reference increases from 32 to 40 bytes.
  • Refuses a scan whose angle_min is not a number.
  • Refuses an estimate stamped before zero with a sentence and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such estimate.
  • Ignores a scan stamped before zero in odometry mode, with a warning, and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such scan.
  • Makes the node's start and stop flag safe to read and write from several executor threads at once. The flag was a plain bool, written by start and stop and read on other executor threads. A ThreadSanitizer run of the start, stop and correction tests reported that race seven times before and none after.
  • Lays the optional map scan over the scan the sensor reported, ray for ray, whatever the sensor covers. It spread the scan's ray count over a whole turn from half a turn behind the heading, but carried the scan's own angles. Thus for a sensor that covers less than a turn, it did not lie over the scan. Each ray is now cast along the matching ray of the scan. In the test room it now disagrees with a 270 degree scan by 0.026 m a ray, where it disagreed by 0.56 m.
  • No longer says that a non-zero rng_seed makes a run repeat. The README and both parameter files said so. Each executor thread seeds its own generator, and any of them may run a match. Thus which draw a recovery gets depends on the thread schedule. On a recording from a real robot, three odometry runs at rng_seed 1 over 2000 scans differed from step 79.
  • Reads a sensor mounted upside down from the transform tree, with nothing to set. The correction read the rotation of the sensor's placement on the robot as a heading and nothing more, so a lidar mounted half a turn about its forward axis was taken for an upright one and its scan was matched as the mirror image of the room. On a recording from a robot whose lidar is mounted that way, none of twenty estimates pushed 0.1 m and 5 degrees off the logged pose was put back within 0.1 m and 2 degrees of it. The whole rotation is now read. Where the sensor's z axis points down the ranges are taken in reverse order and laid out from the sensor's heading less the sum of the scan's first and last angles, which is exact for any scan the node accepts. Reversing the ranges alone would turn the answer by one ray on a scan beginning at minus pi. A setup that flipped the scan in its driver while its transform tree carries the half turn of roll is now read mirrored, and should drop one of the two. The optional map scan now runs in the order the sensor reports its rays, where for such a sensor it was drawn as the mirror image of the scan.
  • Corrects a defect that answered a narrower sensor confidently and wrongly. Corrector::correct was never told what the sensor covered, so it read the map over a whole turn and matched it against a measurement covering less of one. That converges rather than failing, so every signal a caller can read said the correction was fine. The map is now read over a whole turn at the sensor's own angular spacing and windowed to what the sensor could have seen. The aperture is a required argument with no default, since a default of

File truncated at 100 lines see the full file

Launch files

  • launch/fsm_localisation.launch.xml
      • namespace [default: /]
      • node_name [default: fsm_localisation]
      • params [default: $(find-pkg-share fsm_localisation)/config/params_odometry.yaml]

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged fsm_localisation at Robotics Stack Exchange

No version for distro jazzy showing lyrical. Known supported distros are highlighted in the buttons above.
Package symbol

fsm_localisation package from fsm_localisation repo

fsm_localisation

ROS Distro
lyrical

Package Summary

Version 1.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/fourier-scan-matcher/fsm-localisation.git
VCS Type git
VCS Version lyrical-devel
Last Updated 2026-11-01
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Correspondenceless scan matching of panoramic 2D lidar scans in the frequency domain, in two modes: lidar odometry from consecutive scans, and correction of a pose estimate against an occupancy grid.

Additional Links

Maintainers

  • Alexandros Filotheou

Authors

  • Alexandros Filotheou
README
No README found. See repository README.
CHANGELOG

Changelog for package fsm_localisation

Forthcoming

  • Declares as test dependencies the packages that the Python tests import: launch, launch_ros, launch_testing, python3-pytest, rcl_interfaces, rclpy and tf2_msgs. Before, the tests got them only through other packages.

1.0.0 (2026-11-01)

  • Declares libfftw3-dev as a build dependency and libfftw3 as a run dependency. ros/rosdistro #54634 split the libfftw3 rule: that key now installs the run time libraries only, and the new key libfftw3-dev installs the headers. Thus rosdep installs each dependency, and the install steps and docker/Dockerfile no longer install libfftw3-dev by name or skip a key.
  • Switches the translation bound off in params_amelioration.yaml. On the rb1 recording, the estimate was up to 0.25 m and 10 degrees out on every third frame. There the bound refused 510 to 670 of 2223 frames. It also let through 17 to 57 answers more than 0.5 m or 10 degrees out. With the bound off, no frame was refused and 1 to 49 answers were that far out. With the estimate on the logged pose, the median heading gap fell from 0.587 to 0.503 degrees.
  • Unpacks the spectrum of an odd count of rays correctly. It unpacked each spectrum as if its length was even. Thus at an odd length it removed the imaginary part of the highest coefficient and gave one coefficient too few. This changed each rotation that the matcher found for such a scan. In the test room the start was 0.14 m and 4.6 degrees out. From there a scan of 269 rays now comes to 0.067 degrees and 0.35 cm from the truth. Before, it came to 0.23 degrees and 1.1 cm. A scan laid out as the 1073 rays of the rb1 recording now comes to 0.012 degrees, where it came to 0.39 degrees. At an odd length the arithmetic no longer agrees with the ROS 1 package.
  • Lays the map out from the first ray of the scan. The matcher cast its window of a turn from the start of that window. Thus it matched a scan whose first ray was at a different angle up to half a ray out. In the test room, the heading of a whole turn symmetric about the heading was 0.5 degrees out. On a narrower scan where the turn less its rays is odd, as on the rb1 recording, the finer casts of the rotation step were half a ray out. Now each cast lies along the rays of the scan, at each count of rays. In the test room the error is less than 4e-15 radians, and on the rb1 layout less than 2e-7.
  • Corrector::correct takes a fifth argument, first_ray_angle. It is the angle of the first range from the heading of the sensor, and a caller must supply it. The node supplies the angle_min of the scan. FSM::Reference increases from 32 to 40 bytes.
  • Refuses a scan whose angle_min is not a number.
  • Refuses an estimate stamped before zero with a sentence and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such estimate.
  • Ignores a scan stamped before zero in odometry mode, with a warning, and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such scan.
  • Makes the node's start and stop flag safe to read and write from several executor threads at once. The flag was a plain bool, written by start and stop and read on other executor threads. A ThreadSanitizer run of the start, stop and correction tests reported that race seven times before and none after.
  • Lays the optional map scan over the scan the sensor reported, ray for ray, whatever the sensor covers. It spread the scan's ray count over a whole turn from half a turn behind the heading, but carried the scan's own angles. Thus for a sensor that covers less than a turn, it did not lie over the scan. Each ray is now cast along the matching ray of the scan. In the test room it now disagrees with a 270 degree scan by 0.026 m a ray, where it disagreed by 0.56 m.
  • No longer says that a non-zero rng_seed makes a run repeat. The README and both parameter files said so. Each executor thread seeds its own generator, and any of them may run a match. Thus which draw a recovery gets depends on the thread schedule. On a recording from a real robot, three odometry runs at rng_seed 1 over 2000 scans differed from step 79.
  • Reads a sensor mounted upside down from the transform tree, with nothing to set. The correction read the rotation of the sensor's placement on the robot as a heading and nothing more, so a lidar mounted half a turn about its forward axis was taken for an upright one and its scan was matched as the mirror image of the room. On a recording from a robot whose lidar is mounted that way, none of twenty estimates pushed 0.1 m and 5 degrees off the logged pose was put back within 0.1 m and 2 degrees of it. The whole rotation is now read. Where the sensor's z axis points down the ranges are taken in reverse order and laid out from the sensor's heading less the sum of the scan's first and last angles, which is exact for any scan the node accepts. Reversing the ranges alone would turn the answer by one ray on a scan beginning at minus pi. A setup that flipped the scan in its driver while its transform tree carries the half turn of roll is now read mirrored, and should drop one of the two. The optional map scan now runs in the order the sensor reports its rays, where for such a sensor it was drawn as the mirror image of the scan.
  • Corrects a defect that answered a narrower sensor confidently and wrongly. Corrector::correct was never told what the sensor covered, so it read the map over a whole turn and matched it against a measurement covering less of one. That converges rather than failing, so every signal a caller can read said the correction was fine. The map is now read over a whole turn at the sensor's own angular spacing and windowed to what the sensor could have seen. The aperture is a required argument with no default, since a default of

File truncated at 100 lines see the full file

Launch files

  • launch/fsm_localisation.launch.xml
      • namespace [default: /]
      • node_name [default: fsm_localisation]
      • params [default: $(find-pkg-share fsm_localisation)/config/params_odometry.yaml]

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged fsm_localisation at Robotics Stack Exchange

No version for distro kilted showing lyrical. Known supported distros are highlighted in the buttons above.
Package symbol

fsm_localisation package from fsm_localisation repo

fsm_localisation

ROS Distro
lyrical

Package Summary

Version 1.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/fourier-scan-matcher/fsm-localisation.git
VCS Type git
VCS Version lyrical-devel
Last Updated 2026-11-01
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Correspondenceless scan matching of panoramic 2D lidar scans in the frequency domain, in two modes: lidar odometry from consecutive scans, and correction of a pose estimate against an occupancy grid.

Additional Links

Maintainers

  • Alexandros Filotheou

Authors

  • Alexandros Filotheou
README
No README found. See repository README.
CHANGELOG

Changelog for package fsm_localisation

Forthcoming

  • Declares as test dependencies the packages that the Python tests import: launch, launch_ros, launch_testing, python3-pytest, rcl_interfaces, rclpy and tf2_msgs. Before, the tests got them only through other packages.

1.0.0 (2026-11-01)

  • Declares libfftw3-dev as a build dependency and libfftw3 as a run dependency. ros/rosdistro #54634 split the libfftw3 rule: that key now installs the run time libraries only, and the new key libfftw3-dev installs the headers. Thus rosdep installs each dependency, and the install steps and docker/Dockerfile no longer install libfftw3-dev by name or skip a key.
  • Switches the translation bound off in params_amelioration.yaml. On the rb1 recording, the estimate was up to 0.25 m and 10 degrees out on every third frame. There the bound refused 510 to 670 of 2223 frames. It also let through 17 to 57 answers more than 0.5 m or 10 degrees out. With the bound off, no frame was refused and 1 to 49 answers were that far out. With the estimate on the logged pose, the median heading gap fell from 0.587 to 0.503 degrees.
  • Unpacks the spectrum of an odd count of rays correctly. It unpacked each spectrum as if its length was even. Thus at an odd length it removed the imaginary part of the highest coefficient and gave one coefficient too few. This changed each rotation that the matcher found for such a scan. In the test room the start was 0.14 m and 4.6 degrees out. From there a scan of 269 rays now comes to 0.067 degrees and 0.35 cm from the truth. Before, it came to 0.23 degrees and 1.1 cm. A scan laid out as the 1073 rays of the rb1 recording now comes to 0.012 degrees, where it came to 0.39 degrees. At an odd length the arithmetic no longer agrees with the ROS 1 package.
  • Lays the map out from the first ray of the scan. The matcher cast its window of a turn from the start of that window. Thus it matched a scan whose first ray was at a different angle up to half a ray out. In the test room, the heading of a whole turn symmetric about the heading was 0.5 degrees out. On a narrower scan where the turn less its rays is odd, as on the rb1 recording, the finer casts of the rotation step were half a ray out. Now each cast lies along the rays of the scan, at each count of rays. In the test room the error is less than 4e-15 radians, and on the rb1 layout less than 2e-7.
  • Corrector::correct takes a fifth argument, first_ray_angle. It is the angle of the first range from the heading of the sensor, and a caller must supply it. The node supplies the angle_min of the scan. FSM::Reference increases from 32 to 40 bytes.
  • Refuses a scan whose angle_min is not a number.
  • Refuses an estimate stamped before zero with a sentence and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such estimate.
  • Ignores a scan stamped before zero in odometry mode, with a warning, and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such scan.
  • Makes the node's start and stop flag safe to read and write from several executor threads at once. The flag was a plain bool, written by start and stop and read on other executor threads. A ThreadSanitizer run of the start, stop and correction tests reported that race seven times before and none after.
  • Lays the optional map scan over the scan the sensor reported, ray for ray, whatever the sensor covers. It spread the scan's ray count over a whole turn from half a turn behind the heading, but carried the scan's own angles. Thus for a sensor that covers less than a turn, it did not lie over the scan. Each ray is now cast along the matching ray of the scan. In the test room it now disagrees with a 270 degree scan by 0.026 m a ray, where it disagreed by 0.56 m.
  • No longer says that a non-zero rng_seed makes a run repeat. The README and both parameter files said so. Each executor thread seeds its own generator, and any of them may run a match. Thus which draw a recovery gets depends on the thread schedule. On a recording from a real robot, three odometry runs at rng_seed 1 over 2000 scans differed from step 79.
  • Reads a sensor mounted upside down from the transform tree, with nothing to set. The correction read the rotation of the sensor's placement on the robot as a heading and nothing more, so a lidar mounted half a turn about its forward axis was taken for an upright one and its scan was matched as the mirror image of the room. On a recording from a robot whose lidar is mounted that way, none of twenty estimates pushed 0.1 m and 5 degrees off the logged pose was put back within 0.1 m and 2 degrees of it. The whole rotation is now read. Where the sensor's z axis points down the ranges are taken in reverse order and laid out from the sensor's heading less the sum of the scan's first and last angles, which is exact for any scan the node accepts. Reversing the ranges alone would turn the answer by one ray on a scan beginning at minus pi. A setup that flipped the scan in its driver while its transform tree carries the half turn of roll is now read mirrored, and should drop one of the two. The optional map scan now runs in the order the sensor reports its rays, where for such a sensor it was drawn as the mirror image of the scan.
  • Corrects a defect that answered a narrower sensor confidently and wrongly. Corrector::correct was never told what the sensor covered, so it read the map over a whole turn and matched it against a measurement covering less of one. That converges rather than failing, so every signal a caller can read said the correction was fine. The map is now read over a whole turn at the sensor's own angular spacing and windowed to what the sensor could have seen. The aperture is a required argument with no default, since a default of

File truncated at 100 lines see the full file

Launch files

  • launch/fsm_localisation.launch.xml
      • namespace [default: /]
      • node_name [default: fsm_localisation]
      • params [default: $(find-pkg-share fsm_localisation)/config/params_odometry.yaml]

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged fsm_localisation at Robotics Stack Exchange

Package symbol

fsm_localisation package from fsm_localisation repo

fsm_localisation

ROS Distro
lyrical

Package Summary

Version 1.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/fourier-scan-matcher/fsm-localisation.git
VCS Type git
VCS Version lyrical-devel
Last Updated 2026-11-01
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Correspondenceless scan matching of panoramic 2D lidar scans in the frequency domain, in two modes: lidar odometry from consecutive scans, and correction of a pose estimate against an occupancy grid.

Additional Links

Maintainers

  • Alexandros Filotheou

Authors

  • Alexandros Filotheou
README
No README found. See repository README.
CHANGELOG

Changelog for package fsm_localisation

Forthcoming

  • Declares as test dependencies the packages that the Python tests import: launch, launch_ros, launch_testing, python3-pytest, rcl_interfaces, rclpy and tf2_msgs. Before, the tests got them only through other packages.

1.0.0 (2026-11-01)

  • Declares libfftw3-dev as a build dependency and libfftw3 as a run dependency. ros/rosdistro #54634 split the libfftw3 rule: that key now installs the run time libraries only, and the new key libfftw3-dev installs the headers. Thus rosdep installs each dependency, and the install steps and docker/Dockerfile no longer install libfftw3-dev by name or skip a key.
  • Switches the translation bound off in params_amelioration.yaml. On the rb1 recording, the estimate was up to 0.25 m and 10 degrees out on every third frame. There the bound refused 510 to 670 of 2223 frames. It also let through 17 to 57 answers more than 0.5 m or 10 degrees out. With the bound off, no frame was refused and 1 to 49 answers were that far out. With the estimate on the logged pose, the median heading gap fell from 0.587 to 0.503 degrees.
  • Unpacks the spectrum of an odd count of rays correctly. It unpacked each spectrum as if its length was even. Thus at an odd length it removed the imaginary part of the highest coefficient and gave one coefficient too few. This changed each rotation that the matcher found for such a scan. In the test room the start was 0.14 m and 4.6 degrees out. From there a scan of 269 rays now comes to 0.067 degrees and 0.35 cm from the truth. Before, it came to 0.23 degrees and 1.1 cm. A scan laid out as the 1073 rays of the rb1 recording now comes to 0.012 degrees, where it came to 0.39 degrees. At an odd length the arithmetic no longer agrees with the ROS 1 package.
  • Lays the map out from the first ray of the scan. The matcher cast its window of a turn from the start of that window. Thus it matched a scan whose first ray was at a different angle up to half a ray out. In the test room, the heading of a whole turn symmetric about the heading was 0.5 degrees out. On a narrower scan where the turn less its rays is odd, as on the rb1 recording, the finer casts of the rotation step were half a ray out. Now each cast lies along the rays of the scan, at each count of rays. In the test room the error is less than 4e-15 radians, and on the rb1 layout less than 2e-7.
  • Corrector::correct takes a fifth argument, first_ray_angle. It is the angle of the first range from the heading of the sensor, and a caller must supply it. The node supplies the angle_min of the scan. FSM::Reference increases from 32 to 40 bytes.
  • Refuses a scan whose angle_min is not a number.
  • Refuses an estimate stamped before zero with a sentence and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such estimate.
  • Ignores a scan stamped before zero in odometry mode, with a warning, and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such scan.
  • Makes the node's start and stop flag safe to read and write from several executor threads at once. The flag was a plain bool, written by start and stop and read on other executor threads. A ThreadSanitizer run of the start, stop and correction tests reported that race seven times before and none after.
  • Lays the optional map scan over the scan the sensor reported, ray for ray, whatever the sensor covers. It spread the scan's ray count over a whole turn from half a turn behind the heading, but carried the scan's own angles. Thus for a sensor that covers less than a turn, it did not lie over the scan. Each ray is now cast along the matching ray of the scan. In the test room it now disagrees with a 270 degree scan by 0.026 m a ray, where it disagreed by 0.56 m.
  • No longer says that a non-zero rng_seed makes a run repeat. The README and both parameter files said so. Each executor thread seeds its own generator, and any of them may run a match. Thus which draw a recovery gets depends on the thread schedule. On a recording from a real robot, three odometry runs at rng_seed 1 over 2000 scans differed from step 79.
  • Reads a sensor mounted upside down from the transform tree, with nothing to set. The correction read the rotation of the sensor's placement on the robot as a heading and nothing more, so a lidar mounted half a turn about its forward axis was taken for an upright one and its scan was matched as the mirror image of the room. On a recording from a robot whose lidar is mounted that way, none of twenty estimates pushed 0.1 m and 5 degrees off the logged pose was put back within 0.1 m and 2 degrees of it. The whole rotation is now read. Where the sensor's z axis points down the ranges are taken in reverse order and laid out from the sensor's heading less the sum of the scan's first and last angles, which is exact for any scan the node accepts. Reversing the ranges alone would turn the answer by one ray on a scan beginning at minus pi. A setup that flipped the scan in its driver while its transform tree carries the half turn of roll is now read mirrored, and should drop one of the two. The optional map scan now runs in the order the sensor reports its rays, where for such a sensor it was drawn as the mirror image of the scan.
  • Corrects a defect that answered a narrower sensor confidently and wrongly. Corrector::correct was never told what the sensor covered, so it read the map over a whole turn and matched it against a measurement covering less of one. That converges rather than failing, so every signal a caller can read said the correction was fine. The map is now read over a whole turn at the sensor's own angular spacing and windowed to what the sensor could have seen. The aperture is a required argument with no default, since a default of

File truncated at 100 lines see the full file

Launch files

  • launch/fsm_localisation.launch.xml
      • namespace [default: /]
      • node_name [default: fsm_localisation]
      • params [default: $(find-pkg-share fsm_localisation)/config/params_odometry.yaml]

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged fsm_localisation at Robotics Stack Exchange

No version for distro rolling showing lyrical. Known supported distros are highlighted in the buttons above.
Package symbol

fsm_localisation package from fsm_localisation repo

fsm_localisation

ROS Distro
lyrical

Package Summary

Version 1.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/fourier-scan-matcher/fsm-localisation.git
VCS Type git
VCS Version lyrical-devel
Last Updated 2026-11-01
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Correspondenceless scan matching of panoramic 2D lidar scans in the frequency domain, in two modes: lidar odometry from consecutive scans, and correction of a pose estimate against an occupancy grid.

Additional Links

Maintainers

  • Alexandros Filotheou

Authors

  • Alexandros Filotheou
README
No README found. See repository README.
CHANGELOG

Changelog for package fsm_localisation

Forthcoming

  • Declares as test dependencies the packages that the Python tests import: launch, launch_ros, launch_testing, python3-pytest, rcl_interfaces, rclpy and tf2_msgs. Before, the tests got them only through other packages.

1.0.0 (2026-11-01)

  • Declares libfftw3-dev as a build dependency and libfftw3 as a run dependency. ros/rosdistro #54634 split the libfftw3 rule: that key now installs the run time libraries only, and the new key libfftw3-dev installs the headers. Thus rosdep installs each dependency, and the install steps and docker/Dockerfile no longer install libfftw3-dev by name or skip a key.
  • Switches the translation bound off in params_amelioration.yaml. On the rb1 recording, the estimate was up to 0.25 m and 10 degrees out on every third frame. There the bound refused 510 to 670 of 2223 frames. It also let through 17 to 57 answers more than 0.5 m or 10 degrees out. With the bound off, no frame was refused and 1 to 49 answers were that far out. With the estimate on the logged pose, the median heading gap fell from 0.587 to 0.503 degrees.
  • Unpacks the spectrum of an odd count of rays correctly. It unpacked each spectrum as if its length was even. Thus at an odd length it removed the imaginary part of the highest coefficient and gave one coefficient too few. This changed each rotation that the matcher found for such a scan. In the test room the start was 0.14 m and 4.6 degrees out. From there a scan of 269 rays now comes to 0.067 degrees and 0.35 cm from the truth. Before, it came to 0.23 degrees and 1.1 cm. A scan laid out as the 1073 rays of the rb1 recording now comes to 0.012 degrees, where it came to 0.39 degrees. At an odd length the arithmetic no longer agrees with the ROS 1 package.
  • Lays the map out from the first ray of the scan. The matcher cast its window of a turn from the start of that window. Thus it matched a scan whose first ray was at a different angle up to half a ray out. In the test room, the heading of a whole turn symmetric about the heading was 0.5 degrees out. On a narrower scan where the turn less its rays is odd, as on the rb1 recording, the finer casts of the rotation step were half a ray out. Now each cast lies along the rays of the scan, at each count of rays. In the test room the error is less than 4e-15 radians, and on the rb1 layout less than 2e-7.
  • Corrector::correct takes a fifth argument, first_ray_angle. It is the angle of the first range from the heading of the sensor, and a caller must supply it. The node supplies the angle_min of the scan. FSM::Reference increases from 32 to 40 bytes.
  • Refuses a scan whose angle_min is not a number.
  • Refuses an estimate stamped before zero with a sentence and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such estimate.
  • Ignores a scan stamped before zero in odometry mode, with a warning, and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such scan.
  • Makes the node's start and stop flag safe to read and write from several executor threads at once. The flag was a plain bool, written by start and stop and read on other executor threads. A ThreadSanitizer run of the start, stop and correction tests reported that race seven times before and none after.
  • Lays the optional map scan over the scan the sensor reported, ray for ray, whatever the sensor covers. It spread the scan's ray count over a whole turn from half a turn behind the heading, but carried the scan's own angles. Thus for a sensor that covers less than a turn, it did not lie over the scan. Each ray is now cast along the matching ray of the scan. In the test room it now disagrees with a 270 degree scan by 0.026 m a ray, where it disagreed by 0.56 m.
  • No longer says that a non-zero rng_seed makes a run repeat. The README and both parameter files said so. Each executor thread seeds its own generator, and any of them may run a match. Thus which draw a recovery gets depends on the thread schedule. On a recording from a real robot, three odometry runs at rng_seed 1 over 2000 scans differed from step 79.
  • Reads a sensor mounted upside down from the transform tree, with nothing to set. The correction read the rotation of the sensor's placement on the robot as a heading and nothing more, so a lidar mounted half a turn about its forward axis was taken for an upright one and its scan was matched as the mirror image of the room. On a recording from a robot whose lidar is mounted that way, none of twenty estimates pushed 0.1 m and 5 degrees off the logged pose was put back within 0.1 m and 2 degrees of it. The whole rotation is now read. Where the sensor's z axis points down the ranges are taken in reverse order and laid out from the sensor's heading less the sum of the scan's first and last angles, which is exact for any scan the node accepts. Reversing the ranges alone would turn the answer by one ray on a scan beginning at minus pi. A setup that flipped the scan in its driver while its transform tree carries the half turn of roll is now read mirrored, and should drop one of the two. The optional map scan now runs in the order the sensor reports its rays, where for such a sensor it was drawn as the mirror image of the scan.
  • Corrects a defect that answered a narrower sensor confidently and wrongly. Corrector::correct was never told what the sensor covered, so it read the map over a whole turn and matched it against a measurement covering less of one. That converges rather than failing, so every signal a caller can read said the correction was fine. The map is now read over a whole turn at the sensor's own angular spacing and windowed to what the sensor could have seen. The aperture is a required argument with no default, since a default of

File truncated at 100 lines see the full file

Launch files

  • launch/fsm_localisation.launch.xml
      • namespace [default: /]
      • node_name [default: fsm_localisation]
      • params [default: $(find-pkg-share fsm_localisation)/config/params_odometry.yaml]

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged fsm_localisation at Robotics Stack Exchange

No version for distro github showing lyrical. Known supported distros are highlighted in the buttons above.
Package symbol

fsm_localisation package from fsm_localisation repo

fsm_localisation

ROS Distro
lyrical

Package Summary

Version 1.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/fourier-scan-matcher/fsm-localisation.git
VCS Type git
VCS Version lyrical-devel
Last Updated 2026-11-01
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Correspondenceless scan matching of panoramic 2D lidar scans in the frequency domain, in two modes: lidar odometry from consecutive scans, and correction of a pose estimate against an occupancy grid.

Additional Links

Maintainers

  • Alexandros Filotheou

Authors

  • Alexandros Filotheou
README
No README found. See repository README.
CHANGELOG

Changelog for package fsm_localisation

Forthcoming

  • Declares as test dependencies the packages that the Python tests import: launch, launch_ros, launch_testing, python3-pytest, rcl_interfaces, rclpy and tf2_msgs. Before, the tests got them only through other packages.

1.0.0 (2026-11-01)

  • Declares libfftw3-dev as a build dependency and libfftw3 as a run dependency. ros/rosdistro #54634 split the libfftw3 rule: that key now installs the run time libraries only, and the new key libfftw3-dev installs the headers. Thus rosdep installs each dependency, and the install steps and docker/Dockerfile no longer install libfftw3-dev by name or skip a key.
  • Switches the translation bound off in params_amelioration.yaml. On the rb1 recording, the estimate was up to 0.25 m and 10 degrees out on every third frame. There the bound refused 510 to 670 of 2223 frames. It also let through 17 to 57 answers more than 0.5 m or 10 degrees out. With the bound off, no frame was refused and 1 to 49 answers were that far out. With the estimate on the logged pose, the median heading gap fell from 0.587 to 0.503 degrees.
  • Unpacks the spectrum of an odd count of rays correctly. It unpacked each spectrum as if its length was even. Thus at an odd length it removed the imaginary part of the highest coefficient and gave one coefficient too few. This changed each rotation that the matcher found for such a scan. In the test room the start was 0.14 m and 4.6 degrees out. From there a scan of 269 rays now comes to 0.067 degrees and 0.35 cm from the truth. Before, it came to 0.23 degrees and 1.1 cm. A scan laid out as the 1073 rays of the rb1 recording now comes to 0.012 degrees, where it came to 0.39 degrees. At an odd length the arithmetic no longer agrees with the ROS 1 package.
  • Lays the map out from the first ray of the scan. The matcher cast its window of a turn from the start of that window. Thus it matched a scan whose first ray was at a different angle up to half a ray out. In the test room, the heading of a whole turn symmetric about the heading was 0.5 degrees out. On a narrower scan where the turn less its rays is odd, as on the rb1 recording, the finer casts of the rotation step were half a ray out. Now each cast lies along the rays of the scan, at each count of rays. In the test room the error is less than 4e-15 radians, and on the rb1 layout less than 2e-7.
  • Corrector::correct takes a fifth argument, first_ray_angle. It is the angle of the first range from the heading of the sensor, and a caller must supply it. The node supplies the angle_min of the scan. FSM::Reference increases from 32 to 40 bytes.
  • Refuses a scan whose angle_min is not a number.
  • Refuses an estimate stamped before zero with a sentence and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such estimate.
  • Ignores a scan stamped before zero in odometry mode, with a warning, and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such scan.
  • Makes the node's start and stop flag safe to read and write from several executor threads at once. The flag was a plain bool, written by start and stop and read on other executor threads. A ThreadSanitizer run of the start, stop and correction tests reported that race seven times before and none after.
  • Lays the optional map scan over the scan the sensor reported, ray for ray, whatever the sensor covers. It spread the scan's ray count over a whole turn from half a turn behind the heading, but carried the scan's own angles. Thus for a sensor that covers less than a turn, it did not lie over the scan. Each ray is now cast along the matching ray of the scan. In the test room it now disagrees with a 270 degree scan by 0.026 m a ray, where it disagreed by 0.56 m.
  • No longer says that a non-zero rng_seed makes a run repeat. The README and both parameter files said so. Each executor thread seeds its own generator, and any of them may run a match. Thus which draw a recovery gets depends on the thread schedule. On a recording from a real robot, three odometry runs at rng_seed 1 over 2000 scans differed from step 79.
  • Reads a sensor mounted upside down from the transform tree, with nothing to set. The correction read the rotation of the sensor's placement on the robot as a heading and nothing more, so a lidar mounted half a turn about its forward axis was taken for an upright one and its scan was matched as the mirror image of the room. On a recording from a robot whose lidar is mounted that way, none of twenty estimates pushed 0.1 m and 5 degrees off the logged pose was put back within 0.1 m and 2 degrees of it. The whole rotation is now read. Where the sensor's z axis points down the ranges are taken in reverse order and laid out from the sensor's heading less the sum of the scan's first and last angles, which is exact for any scan the node accepts. Reversing the ranges alone would turn the answer by one ray on a scan beginning at minus pi. A setup that flipped the scan in its driver while its transform tree carries the half turn of roll is now read mirrored, and should drop one of the two. The optional map scan now runs in the order the sensor reports its rays, where for such a sensor it was drawn as the mirror image of the scan.
  • Corrects a defect that answered a narrower sensor confidently and wrongly. Corrector::correct was never told what the sensor covered, so it read the map over a whole turn and matched it against a measurement covering less of one. That converges rather than failing, so every signal a caller can read said the correction was fine. The map is now read over a whole turn at the sensor's own angular spacing and windowed to what the sensor could have seen. The aperture is a required argument with no default, since a default of

File truncated at 100 lines see the full file

Launch files

  • launch/fsm_localisation.launch.xml
      • namespace [default: /]
      • node_name [default: fsm_localisation]
      • params [default: $(find-pkg-share fsm_localisation)/config/params_odometry.yaml]

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged fsm_localisation at Robotics Stack Exchange

No version for distro galactic showing lyrical. Known supported distros are highlighted in the buttons above.
Package symbol

fsm_localisation package from fsm_localisation repo

fsm_localisation

ROS Distro
lyrical

Package Summary

Version 1.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/fourier-scan-matcher/fsm-localisation.git
VCS Type git
VCS Version lyrical-devel
Last Updated 2026-11-01
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Correspondenceless scan matching of panoramic 2D lidar scans in the frequency domain, in two modes: lidar odometry from consecutive scans, and correction of a pose estimate against an occupancy grid.

Additional Links

Maintainers

  • Alexandros Filotheou

Authors

  • Alexandros Filotheou
README
No README found. See repository README.
CHANGELOG

Changelog for package fsm_localisation

Forthcoming

  • Declares as test dependencies the packages that the Python tests import: launch, launch_ros, launch_testing, python3-pytest, rcl_interfaces, rclpy and tf2_msgs. Before, the tests got them only through other packages.

1.0.0 (2026-11-01)

  • Declares libfftw3-dev as a build dependency and libfftw3 as a run dependency. ros/rosdistro #54634 split the libfftw3 rule: that key now installs the run time libraries only, and the new key libfftw3-dev installs the headers. Thus rosdep installs each dependency, and the install steps and docker/Dockerfile no longer install libfftw3-dev by name or skip a key.
  • Switches the translation bound off in params_amelioration.yaml. On the rb1 recording, the estimate was up to 0.25 m and 10 degrees out on every third frame. There the bound refused 510 to 670 of 2223 frames. It also let through 17 to 57 answers more than 0.5 m or 10 degrees out. With the bound off, no frame was refused and 1 to 49 answers were that far out. With the estimate on the logged pose, the median heading gap fell from 0.587 to 0.503 degrees.
  • Unpacks the spectrum of an odd count of rays correctly. It unpacked each spectrum as if its length was even. Thus at an odd length it removed the imaginary part of the highest coefficient and gave one coefficient too few. This changed each rotation that the matcher found for such a scan. In the test room the start was 0.14 m and 4.6 degrees out. From there a scan of 269 rays now comes to 0.067 degrees and 0.35 cm from the truth. Before, it came to 0.23 degrees and 1.1 cm. A scan laid out as the 1073 rays of the rb1 recording now comes to 0.012 degrees, where it came to 0.39 degrees. At an odd length the arithmetic no longer agrees with the ROS 1 package.
  • Lays the map out from the first ray of the scan. The matcher cast its window of a turn from the start of that window. Thus it matched a scan whose first ray was at a different angle up to half a ray out. In the test room, the heading of a whole turn symmetric about the heading was 0.5 degrees out. On a narrower scan where the turn less its rays is odd, as on the rb1 recording, the finer casts of the rotation step were half a ray out. Now each cast lies along the rays of the scan, at each count of rays. In the test room the error is less than 4e-15 radians, and on the rb1 layout less than 2e-7.
  • Corrector::correct takes a fifth argument, first_ray_angle. It is the angle of the first range from the heading of the sensor, and a caller must supply it. The node supplies the angle_min of the scan. FSM::Reference increases from 32 to 40 bytes.
  • Refuses a scan whose angle_min is not a number.
  • Refuses an estimate stamped before zero with a sentence and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such estimate.
  • Ignores a scan stamped before zero in odometry mode, with a warning, and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such scan.
  • Makes the node's start and stop flag safe to read and write from several executor threads at once. The flag was a plain bool, written by start and stop and read on other executor threads. A ThreadSanitizer run of the start, stop and correction tests reported that race seven times before and none after.
  • Lays the optional map scan over the scan the sensor reported, ray for ray, whatever the sensor covers. It spread the scan's ray count over a whole turn from half a turn behind the heading, but carried the scan's own angles. Thus for a sensor that covers less than a turn, it did not lie over the scan. Each ray is now cast along the matching ray of the scan. In the test room it now disagrees with a 270 degree scan by 0.026 m a ray, where it disagreed by 0.56 m.
  • No longer says that a non-zero rng_seed makes a run repeat. The README and both parameter files said so. Each executor thread seeds its own generator, and any of them may run a match. Thus which draw a recovery gets depends on the thread schedule. On a recording from a real robot, three odometry runs at rng_seed 1 over 2000 scans differed from step 79.
  • Reads a sensor mounted upside down from the transform tree, with nothing to set. The correction read the rotation of the sensor's placement on the robot as a heading and nothing more, so a lidar mounted half a turn about its forward axis was taken for an upright one and its scan was matched as the mirror image of the room. On a recording from a robot whose lidar is mounted that way, none of twenty estimates pushed 0.1 m and 5 degrees off the logged pose was put back within 0.1 m and 2 degrees of it. The whole rotation is now read. Where the sensor's z axis points down the ranges are taken in reverse order and laid out from the sensor's heading less the sum of the scan's first and last angles, which is exact for any scan the node accepts. Reversing the ranges alone would turn the answer by one ray on a scan beginning at minus pi. A setup that flipped the scan in its driver while its transform tree carries the half turn of roll is now read mirrored, and should drop one of the two. The optional map scan now runs in the order the sensor reports its rays, where for such a sensor it was drawn as the mirror image of the scan.
  • Corrects a defect that answered a narrower sensor confidently and wrongly. Corrector::correct was never told what the sensor covered, so it read the map over a whole turn and matched it against a measurement covering less of one. That converges rather than failing, so every signal a caller can read said the correction was fine. The map is now read over a whole turn at the sensor's own angular spacing and windowed to what the sensor could have seen. The aperture is a required argument with no default, since a default of

File truncated at 100 lines see the full file

Launch files

  • launch/fsm_localisation.launch.xml
      • namespace [default: /]
      • node_name [default: fsm_localisation]
      • params [default: $(find-pkg-share fsm_localisation)/config/params_odometry.yaml]

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged fsm_localisation at Robotics Stack Exchange

No version for distro iron showing lyrical. Known supported distros are highlighted in the buttons above.
Package symbol

fsm_localisation package from fsm_localisation repo

fsm_localisation

ROS Distro
lyrical

Package Summary

Version 1.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/fourier-scan-matcher/fsm-localisation.git
VCS Type git
VCS Version lyrical-devel
Last Updated 2026-11-01
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Correspondenceless scan matching of panoramic 2D lidar scans in the frequency domain, in two modes: lidar odometry from consecutive scans, and correction of a pose estimate against an occupancy grid.

Additional Links

Maintainers

  • Alexandros Filotheou

Authors

  • Alexandros Filotheou
README
No README found. See repository README.
CHANGELOG

Changelog for package fsm_localisation

Forthcoming

  • Declares as test dependencies the packages that the Python tests import: launch, launch_ros, launch_testing, python3-pytest, rcl_interfaces, rclpy and tf2_msgs. Before, the tests got them only through other packages.

1.0.0 (2026-11-01)

  • Declares libfftw3-dev as a build dependency and libfftw3 as a run dependency. ros/rosdistro #54634 split the libfftw3 rule: that key now installs the run time libraries only, and the new key libfftw3-dev installs the headers. Thus rosdep installs each dependency, and the install steps and docker/Dockerfile no longer install libfftw3-dev by name or skip a key.
  • Switches the translation bound off in params_amelioration.yaml. On the rb1 recording, the estimate was up to 0.25 m and 10 degrees out on every third frame. There the bound refused 510 to 670 of 2223 frames. It also let through 17 to 57 answers more than 0.5 m or 10 degrees out. With the bound off, no frame was refused and 1 to 49 answers were that far out. With the estimate on the logged pose, the median heading gap fell from 0.587 to 0.503 degrees.
  • Unpacks the spectrum of an odd count of rays correctly. It unpacked each spectrum as if its length was even. Thus at an odd length it removed the imaginary part of the highest coefficient and gave one coefficient too few. This changed each rotation that the matcher found for such a scan. In the test room the start was 0.14 m and 4.6 degrees out. From there a scan of 269 rays now comes to 0.067 degrees and 0.35 cm from the truth. Before, it came to 0.23 degrees and 1.1 cm. A scan laid out as the 1073 rays of the rb1 recording now comes to 0.012 degrees, where it came to 0.39 degrees. At an odd length the arithmetic no longer agrees with the ROS 1 package.
  • Lays the map out from the first ray of the scan. The matcher cast its window of a turn from the start of that window. Thus it matched a scan whose first ray was at a different angle up to half a ray out. In the test room, the heading of a whole turn symmetric about the heading was 0.5 degrees out. On a narrower scan where the turn less its rays is odd, as on the rb1 recording, the finer casts of the rotation step were half a ray out. Now each cast lies along the rays of the scan, at each count of rays. In the test room the error is less than 4e-15 radians, and on the rb1 layout less than 2e-7.
  • Corrector::correct takes a fifth argument, first_ray_angle. It is the angle of the first range from the heading of the sensor, and a caller must supply it. The node supplies the angle_min of the scan. FSM::Reference increases from 32 to 40 bytes.
  • Refuses a scan whose angle_min is not a number.
  • Refuses an estimate stamped before zero with a sentence and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such estimate.
  • Ignores a scan stamped before zero in odometry mode, with a warning, and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such scan.
  • Makes the node's start and stop flag safe to read and write from several executor threads at once. The flag was a plain bool, written by start and stop and read on other executor threads. A ThreadSanitizer run of the start, stop and correction tests reported that race seven times before and none after.
  • Lays the optional map scan over the scan the sensor reported, ray for ray, whatever the sensor covers. It spread the scan's ray count over a whole turn from half a turn behind the heading, but carried the scan's own angles. Thus for a sensor that covers less than a turn, it did not lie over the scan. Each ray is now cast along the matching ray of the scan. In the test room it now disagrees with a 270 degree scan by 0.026 m a ray, where it disagreed by 0.56 m.
  • No longer says that a non-zero rng_seed makes a run repeat. The README and both parameter files said so. Each executor thread seeds its own generator, and any of them may run a match. Thus which draw a recovery gets depends on the thread schedule. On a recording from a real robot, three odometry runs at rng_seed 1 over 2000 scans differed from step 79.
  • Reads a sensor mounted upside down from the transform tree, with nothing to set. The correction read the rotation of the sensor's placement on the robot as a heading and nothing more, so a lidar mounted half a turn about its forward axis was taken for an upright one and its scan was matched as the mirror image of the room. On a recording from a robot whose lidar is mounted that way, none of twenty estimates pushed 0.1 m and 5 degrees off the logged pose was put back within 0.1 m and 2 degrees of it. The whole rotation is now read. Where the sensor's z axis points down the ranges are taken in reverse order and laid out from the sensor's heading less the sum of the scan's first and last angles, which is exact for any scan the node accepts. Reversing the ranges alone would turn the answer by one ray on a scan beginning at minus pi. A setup that flipped the scan in its driver while its transform tree carries the half turn of roll is now read mirrored, and should drop one of the two. The optional map scan now runs in the order the sensor reports its rays, where for such a sensor it was drawn as the mirror image of the scan.
  • Corrects a defect that answered a narrower sensor confidently and wrongly. Corrector::correct was never told what the sensor covered, so it read the map over a whole turn and matched it against a measurement covering less of one. That converges rather than failing, so every signal a caller can read said the correction was fine. The map is now read over a whole turn at the sensor's own angular spacing and windowed to what the sensor could have seen. The aperture is a required argument with no default, since a default of

File truncated at 100 lines see the full file

Launch files

  • launch/fsm_localisation.launch.xml
      • namespace [default: /]
      • node_name [default: fsm_localisation]
      • params [default: $(find-pkg-share fsm_localisation)/config/params_odometry.yaml]

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged fsm_localisation at Robotics Stack Exchange

No version for distro melodic showing lyrical. Known supported distros are highlighted in the buttons above.
Package symbol

fsm_localisation package from fsm_localisation repo

fsm_localisation

ROS Distro
lyrical

Package Summary

Version 1.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/fourier-scan-matcher/fsm-localisation.git
VCS Type git
VCS Version lyrical-devel
Last Updated 2026-11-01
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Correspondenceless scan matching of panoramic 2D lidar scans in the frequency domain, in two modes: lidar odometry from consecutive scans, and correction of a pose estimate against an occupancy grid.

Additional Links

Maintainers

  • Alexandros Filotheou

Authors

  • Alexandros Filotheou
README
No README found. See repository README.
CHANGELOG

Changelog for package fsm_localisation

Forthcoming

  • Declares as test dependencies the packages that the Python tests import: launch, launch_ros, launch_testing, python3-pytest, rcl_interfaces, rclpy and tf2_msgs. Before, the tests got them only through other packages.

1.0.0 (2026-11-01)

  • Declares libfftw3-dev as a build dependency and libfftw3 as a run dependency. ros/rosdistro #54634 split the libfftw3 rule: that key now installs the run time libraries only, and the new key libfftw3-dev installs the headers. Thus rosdep installs each dependency, and the install steps and docker/Dockerfile no longer install libfftw3-dev by name or skip a key.
  • Switches the translation bound off in params_amelioration.yaml. On the rb1 recording, the estimate was up to 0.25 m and 10 degrees out on every third frame. There the bound refused 510 to 670 of 2223 frames. It also let through 17 to 57 answers more than 0.5 m or 10 degrees out. With the bound off, no frame was refused and 1 to 49 answers were that far out. With the estimate on the logged pose, the median heading gap fell from 0.587 to 0.503 degrees.
  • Unpacks the spectrum of an odd count of rays correctly. It unpacked each spectrum as if its length was even. Thus at an odd length it removed the imaginary part of the highest coefficient and gave one coefficient too few. This changed each rotation that the matcher found for such a scan. In the test room the start was 0.14 m and 4.6 degrees out. From there a scan of 269 rays now comes to 0.067 degrees and 0.35 cm from the truth. Before, it came to 0.23 degrees and 1.1 cm. A scan laid out as the 1073 rays of the rb1 recording now comes to 0.012 degrees, where it came to 0.39 degrees. At an odd length the arithmetic no longer agrees with the ROS 1 package.
  • Lays the map out from the first ray of the scan. The matcher cast its window of a turn from the start of that window. Thus it matched a scan whose first ray was at a different angle up to half a ray out. In the test room, the heading of a whole turn symmetric about the heading was 0.5 degrees out. On a narrower scan where the turn less its rays is odd, as on the rb1 recording, the finer casts of the rotation step were half a ray out. Now each cast lies along the rays of the scan, at each count of rays. In the test room the error is less than 4e-15 radians, and on the rb1 layout less than 2e-7.
  • Corrector::correct takes a fifth argument, first_ray_angle. It is the angle of the first range from the heading of the sensor, and a caller must supply it. The node supplies the angle_min of the scan. FSM::Reference increases from 32 to 40 bytes.
  • Refuses a scan whose angle_min is not a number.
  • Refuses an estimate stamped before zero with a sentence and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such estimate.
  • Ignores a scan stamped before zero in odometry mode, with a warning, and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such scan.
  • Makes the node's start and stop flag safe to read and write from several executor threads at once. The flag was a plain bool, written by start and stop and read on other executor threads. A ThreadSanitizer run of the start, stop and correction tests reported that race seven times before and none after.
  • Lays the optional map scan over the scan the sensor reported, ray for ray, whatever the sensor covers. It spread the scan's ray count over a whole turn from half a turn behind the heading, but carried the scan's own angles. Thus for a sensor that covers less than a turn, it did not lie over the scan. Each ray is now cast along the matching ray of the scan. In the test room it now disagrees with a 270 degree scan by 0.026 m a ray, where it disagreed by 0.56 m.
  • No longer says that a non-zero rng_seed makes a run repeat. The README and both parameter files said so. Each executor thread seeds its own generator, and any of them may run a match. Thus which draw a recovery gets depends on the thread schedule. On a recording from a real robot, three odometry runs at rng_seed 1 over 2000 scans differed from step 79.
  • Reads a sensor mounted upside down from the transform tree, with nothing to set. The correction read the rotation of the sensor's placement on the robot as a heading and nothing more, so a lidar mounted half a turn about its forward axis was taken for an upright one and its scan was matched as the mirror image of the room. On a recording from a robot whose lidar is mounted that way, none of twenty estimates pushed 0.1 m and 5 degrees off the logged pose was put back within 0.1 m and 2 degrees of it. The whole rotation is now read. Where the sensor's z axis points down the ranges are taken in reverse order and laid out from the sensor's heading less the sum of the scan's first and last angles, which is exact for any scan the node accepts. Reversing the ranges alone would turn the answer by one ray on a scan beginning at minus pi. A setup that flipped the scan in its driver while its transform tree carries the half turn of roll is now read mirrored, and should drop one of the two. The optional map scan now runs in the order the sensor reports its rays, where for such a sensor it was drawn as the mirror image of the scan.
  • Corrects a defect that answered a narrower sensor confidently and wrongly. Corrector::correct was never told what the sensor covered, so it read the map over a whole turn and matched it against a measurement covering less of one. That converges rather than failing, so every signal a caller can read said the correction was fine. The map is now read over a whole turn at the sensor's own angular spacing and windowed to what the sensor could have seen. The aperture is a required argument with no default, since a default of

File truncated at 100 lines see the full file

Launch files

  • launch/fsm_localisation.launch.xml
      • namespace [default: /]
      • node_name [default: fsm_localisation]
      • params [default: $(find-pkg-share fsm_localisation)/config/params_odometry.yaml]

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged fsm_localisation at Robotics Stack Exchange

No version for distro noetic showing lyrical. Known supported distros are highlighted in the buttons above.
Package symbol

fsm_localisation package from fsm_localisation repo

fsm_localisation

ROS Distro
lyrical

Package Summary

Version 1.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/fourier-scan-matcher/fsm-localisation.git
VCS Type git
VCS Version lyrical-devel
Last Updated 2026-11-01
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Correspondenceless scan matching of panoramic 2D lidar scans in the frequency domain, in two modes: lidar odometry from consecutive scans, and correction of a pose estimate against an occupancy grid.

Additional Links

Maintainers

  • Alexandros Filotheou

Authors

  • Alexandros Filotheou
README
No README found. See repository README.
CHANGELOG

Changelog for package fsm_localisation

Forthcoming

  • Declares as test dependencies the packages that the Python tests import: launch, launch_ros, launch_testing, python3-pytest, rcl_interfaces, rclpy and tf2_msgs. Before, the tests got them only through other packages.

1.0.0 (2026-11-01)

  • Declares libfftw3-dev as a build dependency and libfftw3 as a run dependency. ros/rosdistro #54634 split the libfftw3 rule: that key now installs the run time libraries only, and the new key libfftw3-dev installs the headers. Thus rosdep installs each dependency, and the install steps and docker/Dockerfile no longer install libfftw3-dev by name or skip a key.
  • Switches the translation bound off in params_amelioration.yaml. On the rb1 recording, the estimate was up to 0.25 m and 10 degrees out on every third frame. There the bound refused 510 to 670 of 2223 frames. It also let through 17 to 57 answers more than 0.5 m or 10 degrees out. With the bound off, no frame was refused and 1 to 49 answers were that far out. With the estimate on the logged pose, the median heading gap fell from 0.587 to 0.503 degrees.
  • Unpacks the spectrum of an odd count of rays correctly. It unpacked each spectrum as if its length was even. Thus at an odd length it removed the imaginary part of the highest coefficient and gave one coefficient too few. This changed each rotation that the matcher found for such a scan. In the test room the start was 0.14 m and 4.6 degrees out. From there a scan of 269 rays now comes to 0.067 degrees and 0.35 cm from the truth. Before, it came to 0.23 degrees and 1.1 cm. A scan laid out as the 1073 rays of the rb1 recording now comes to 0.012 degrees, where it came to 0.39 degrees. At an odd length the arithmetic no longer agrees with the ROS 1 package.
  • Lays the map out from the first ray of the scan. The matcher cast its window of a turn from the start of that window. Thus it matched a scan whose first ray was at a different angle up to half a ray out. In the test room, the heading of a whole turn symmetric about the heading was 0.5 degrees out. On a narrower scan where the turn less its rays is odd, as on the rb1 recording, the finer casts of the rotation step were half a ray out. Now each cast lies along the rays of the scan, at each count of rays. In the test room the error is less than 4e-15 radians, and on the rb1 layout less than 2e-7.
  • Corrector::correct takes a fifth argument, first_ray_angle. It is the angle of the first range from the heading of the sensor, and a caller must supply it. The node supplies the angle_min of the scan. FSM::Reference increases from 32 to 40 bytes.
  • Refuses a scan whose angle_min is not a number.
  • Refuses an estimate stamped before zero with a sentence and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such estimate.
  • Ignores a scan stamped before zero in odometry mode, with a warning, and keeps running. The conversion of such a stamp to a time threw an exception that nothing caught, and the node aborted at the first such scan.
  • Makes the node's start and stop flag safe to read and write from several executor threads at once. The flag was a plain bool, written by start and stop and read on other executor threads. A ThreadSanitizer run of the start, stop and correction tests reported that race seven times before and none after.
  • Lays the optional map scan over the scan the sensor reported, ray for ray, whatever the sensor covers. It spread the scan's ray count over a whole turn from half a turn behind the heading, but carried the scan's own angles. Thus for a sensor that covers less than a turn, it did not lie over the scan. Each ray is now cast along the matching ray of the scan. In the test room it now disagrees with a 270 degree scan by 0.026 m a ray, where it disagreed by 0.56 m.
  • No longer says that a non-zero rng_seed makes a run repeat. The README and both parameter files said so. Each executor thread seeds its own generator, and any of them may run a match. Thus which draw a recovery gets depends on the thread schedule. On a recording from a real robot, three odometry runs at rng_seed 1 over 2000 scans differed from step 79.
  • Reads a sensor mounted upside down from the transform tree, with nothing to set. The correction read the rotation of the sensor's placement on the robot as a heading and nothing more, so a lidar mounted half a turn about its forward axis was taken for an upright one and its scan was matched as the mirror image of the room. On a recording from a robot whose lidar is mounted that way, none of twenty estimates pushed 0.1 m and 5 degrees off the logged pose was put back within 0.1 m and 2 degrees of it. The whole rotation is now read. Where the sensor's z axis points down the ranges are taken in reverse order and laid out from the sensor's heading less the sum of the scan's first and last angles, which is exact for any scan the node accepts. Reversing the ranges alone would turn the answer by one ray on a scan beginning at minus pi. A setup that flipped the scan in its driver while its transform tree carries the half turn of roll is now read mirrored, and should drop one of the two. The optional map scan now runs in the order the sensor reports its rays, where for such a sensor it was drawn as the mirror image of the scan.
  • Corrects a defect that answered a narrower sensor confidently and wrongly. Corrector::correct was never told what the sensor covered, so it read the map over a whole turn and matched it against a measurement covering less of one. That converges rather than failing, so every signal a caller can read said the correction was fine. The map is now read over a whole turn at the sensor's own angular spacing and windowed to what the sensor could have seen. The aperture is a required argument with no default, since a default of

File truncated at 100 lines see the full file

Launch files

  • launch/fsm_localisation.launch.xml
      • namespace [default: /]
      • node_name [default: fsm_localisation]
      • params [default: $(find-pkg-share fsm_localisation)/config/params_odometry.yaml]

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged fsm_localisation at Robotics Stack Exchange