feat: UWB accuracy analyzer (Issue #634) #641
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "sl-uwb/issue-634-uwb-logger"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Jetson-side ROS2 package for continuous UWB position logging and on-demand accuracy testing at known ground-truth positions.
saltybot_uwb_logger_msgs(new package)AccuracyReport.msg:n_samples,mean_x/y,bias_x/y,std_x/y/2d,cep50_m,cep95_m,rmse_m,max_error_m, per-anchoranchor_range_mean/std_m[],test_id,duration_sStartAccuracyTest.srv:truth_x/y_m,n_samples,timeout_s,test_id→success,message,test_idsaltybot_uwb_logger(new package)accuracy_stats.py— pure numpy, no ROS2:compute_stats(xs, ys, truth_x, truth_y)→AccuracyStatsRangeAccum— streaming mean/std for per-anchor range datalogger_node.py—/uwb_loggerROS2 node:/saltybot/pose/fusedfused_pose_<DATE>.csv(ts, x, y, heading)/saltybot/uwb/poseuwb_pose_<DATE>.csv(ts, x, y)/uwb/rangesuwb_ranges_<DATE>.csv(ts, anchor_id, range_m, raw_mm, rssi, tag_id)/saltybot/uwb/accuracy_reportService
/saltybot/uwb/start_accuracy_test:AccuracyReport+ writesaccuracy_<test_id>.jsonenable_csv=falseTests
16/16 unit tests passing (
test/test_accuracy_stats.py) — no ROS2 or hardware:RangeAccumempty/single/multiTest plan
ros2 launch saltybot_uwb_logger uwb_logger.launch.py~/uwb_logs/ros2 topic echo /saltybot/uwb/accuracy_report— verify CEP50 < 0.15 m~/uwb_logs/accuracy_<test_id>.jsonwritten correctly🤖 Generated with Claude Code
saltybot_uwb_logger_msgs (new package): - AccuracyReport.msg: n_samples, mean/bias/std (x,y,2D), CEP50, CEP95, RMSE, max_error, per-anchor range stats, test_id, duration_s - StartAccuracyTest.srv: request (truth_x/y_m, n_samples, timeout_s, test_id) → response (success, message, test_id) saltybot_uwb_logger (new package): - accuracy_stats.py: compute_stats() + RangeAccum — pure numpy, no ROS2 CEP50/CEP95 = 50th/95th percentile of 2-D error; bias, std, RMSE, max - logger_node.py: /uwb_logger ROS2 node Subscribes: /saltybot/pose/fused → fused_pose_<DATE>.csv (ts, x, y, heading) /saltybot/uwb/pose → uwb_pose_<DATE>.csv (ts, x, y) /uwb/ranges → uwb_ranges_<DATE>.csv (ts, anchor_id, range_m, raw_mm, rssi, tag_id) Service /saltybot/uwb/start_accuracy_test: Collects N fused-pose samples at known (truth_x, truth_y) in background thread. On completion or timeout: publishes AccuracyReport on /saltybot/uwb/accuracy_report + writes accuracy_<test_id>.json. Per-anchor range stats included. CSV flushed every 5 s. Tests: 16/16 passing (test/test_accuracy_stats.py, no ROS2/hardware) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>