Two new ROS2 packages implementing Issue #142: saltybot_terrain_msgs (ament_cmake) - Terrain.msg: stamp, surface_type, roughness, incline_rad, grip, slip_ratio, speed_scale saltybot_terrain_adaptation (ament_python, 50 Hz) - terrain_analyzer.py: IMU vibration RMS → roughness [0,1] + surface classification (smooth/tile/carpet/grass/gravel) with hysteresis-protected switching - incline_detector.py: quaternion pitch → first-order LPF → incline_rad; motor_bias() - slip_detector.py: cmd_vel vs odom → slip_ratio with EMA smoothing + speed gate - terrain_adapter.py: TerrainState, TerrainAdapter (speed_scale, pid_scales, motor_bias), TerrainHistory (rolling deque, JSON type-change log) - terrain_adaptation_node.py: 50 Hz node; IMU watchdog; publishes terrain JSON + typed msg, speed_scale, pid_scales (JSON), motor_bias, terrain_history (on type change) - config/terrain_params.yaml, launch/terrain_adaptation.launch.py Tests: 60/60 passing (TerrainAnalyzer, SlipDetector, InclineDetector, TerrainAdapter, TerrainHistory all covered) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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%