Repository navigation
1.2.1
Security
- Viewer no longer leaks exception detail in HTTP 500 responses (the
upload_gpxandcreate_wormholehandlers now return a generic message and log the real error server-side) - SocketIO CORS now defaults to same-origin instead of a hardcoded
*;MAP_DATA_CORS_ORIGINSopts into a specific origin list - Optional access-token gate via
MAP_DATA_ACCESS_TOKEN(off by default) for network deployments; documented the--host 0.0.0.0attack surface in the viewer docs
Fixed
- Guarded three latent
None-dereference paths surfaced by mypy:buffer_lineraises a clear error for a way with no geometry;osm_cloudraises a clear error if the UTM-to-local transform is still unresolved at startup (rclpy shutdown race) instead of crashing later;upload_gpxrejects a file part with no filename (HTTP 400) instead of raisingTypeError - Fixed
TrackerNode.num_waypointsnever being updated in the ROS node - Fixed polygon rasterization re-blocking holes when drawing obstacles
- Fixed inconsistent UTM zone forcing during map parsing
- Fixed
combine_wayscrash when OSM relation merging yields disconnected MultiLineString geometries - Fixed
Way.to_pcd_pointsignoring thedensityparameter for linestring geometries - Fixed
Way.to_pcd_pointscache returning stale results when called with different arguments - Fixed
parse_gpx_file/parse_yaml_filereturning inconsistent shapes on empty input - Fixed
parse_gpx_fileonly reading waypoints — now falls back to tracks and routes - Fixed RRT*
__main__demo crashing due to tuple start/goal (requiresnp.array) - Synced hardcoded fallback
sandsurface cost (0.7→0.4) withplanner_defaults.yaml - Wired up the dead
mapdata_pathlaunch argument inosm_cloud.launch.py(baremapdata_file/gpx_filenames now resolve against the data directory)
Changed
- Overpass
run_queriesnow filters server-side by the tag families the parser inspects instead of downloading every way/node in the bounding box; matching multipolygon relations and their member ways are recursed in so those obstacles are still classified - Removed the no-op
joblibthreading parallelism fromReplanPath.replan(the A*/RRT* segment work is GIL-bound); segments run sequentially and the grid cache is warmed once up front, removing a redundant per-segment cache-build race - Removed the now-unused
joblibruntime dependency frompyproject.toml - Deduplicated the triplicated way-resolution pipeline in
viewer/routes.pyinto a shared_resolve_wayhelper, and documented theMapDatashallow-vs-deep copy invariant - Removed the unused multi-robot
robot_idscaffolding from the tracker (parameter, telemetry field, andhelhest.yamlentry) — the viewer targets a single robot
Added
- Static type checking with
mypy([tool.mypy]inpyproject.toml), enforced in CI (typecheckjob) and as a pre-commit hook, to catch bugs like keyword-only-argument mismatches and inconsistent Flask route return types - Interactive viewer:
GET /api/export/geojsonendpoint and toolbar button to download the merged (annotation-resolved) map as a.geojsonfile, for use in QGIS/geojson.io - Unit tests for
osm_cloudpure helper functions (create_grid,points_near_ref,transform_points,split_ways_to_points) pytest-covcoverage reporting in CI.pre-commit-config.yamlfor local ruff lint/format checks- Documented the
map_data_infoCLI (including--validate), the viewer's--data-dir/--host/--portflags, and theTHUNDERFOREST_API_KEY/SEZNAM_API_KEYenvironment variables in the README and viewer docs - Unit test for the
osm_cloudROS node initialization (parameter wiring, publishers, timer) - Tests for
parse_osm_relsmultipolygon member-way tagging,combine_waysdisconnected members,Way.to_pcd_pointscache invalidation, empty-GPX return shape, the off-path zero-cost regression, and launch-argument consumption - NumPy-style docstrings for
pathsolver/grid_constructor.py,viewer/helpers.py, and theviewer/routes.pyhandlers
Pull requests
Full Changelog: v1.2.0...v1.2.1 · changelog