Anchor firmware (esp32/uwb_anchor/src/main.cpp): - Add peer_range_once(peer_id) — DS-TWR initiator role toward a peer anchor - Add AT+PEER_RANGE=<id> command: triggers inter-anchor ranging and returns +PEER_RANGE:<my_id>,<peer_id>,<range_mm>,<rssi_dbm> (or ERR,TIMEOUT) ROS2 package saltybot_uwb_calibration_msgs: - CalibrateAnchors.srv: request (anchor_ids[], n_samples) → response (positions_x/y/z[], residual_rms_m, anchor_positions_json) ROS2 package saltybot_uwb_calibration: - mds_math.py: classical MDS (double-centred D², eigendecomposition), anchor_frame_align() to fix anchor-0 at origin / anchor-1 on +X - calibration_node.py: /saltybot/uwb/calibrate_anchors service — opens anchor serial ports, rounds-robin AT+PEER_RANGE= for all pairs, builds N×N distance matrix, runs MDS, returns JSON anchor positions - 12/12 unit tests passing (test/test_mds_math.py) - Supports ≥ 4 anchors; 5× averaged ranging per pair by default Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Merge pull request 'feat: Battery holder bracket (Issue #588)' (#589) from sl-mechanical/issue-588-battery-holder into main
Description
SaltyLab self-balancing bot firmware (STM32F722)
Languages
Python
67.1%
C
11.4%
JavaScript
9.2%
OpenSCAD
7.8%
HTML
1.5%
Other
2.9%