Monitors motor current, detects overcurrent (soft 5A, hard 8A), models thermal
state using I^2R heating model, and applies speed derating for safe operation.
Overcurrent Protection:
- Soft limit: 5A (warning, trigger speed derating)
- Hard limit: 8A (fault, immediate shutdown)
- Monitors both left and right motor currents
- Triggers emergency stop on hard fault
Thermal Derating (I^2R Model):
Heat generation: P_loss = I^2 * R (both motors combined)
Heat dissipation: P_cool = cooling_constant * ΔT
Temperature dynamics: dT/dt = (P_loss - P_cool) / thermal_mass
Temperature-based speed derating:
- Full speed at ambient temperature
- Linear derating from 25°C to 80°C limit
- Aggressive derating near 80°C limit
- Zero speed at or above 80°C
Combined Protection:
- Speed derate = min(current_derate, thermal_derate)
- Hard fault → 0% speed (immediate stop)
- Soft fault → gradual derating based on current
- High temperature → gradual derating approaching zero
- Provides protective action before damage
Published Topics:
- /saltybot/motor_protection (std_msgs/String) - JSON status
* state (NORMAL/SOFT_FAULT/HARD_FAULT)
* current_left, current_right, current_max (A)
* motor_temp (°C)
* soft/hard limits
- /saltybot/speed_limit (std_msgs/Float32) - Thermal derate [0, 1]
Subscribed Topics:
- /saltybot/motor_current_left (std_msgs/Float32) - Left motor (A)
- /saltybot/motor_current_right (std_msgs/Float32) - Right motor (A)
Package: saltybot_motor_protection
Entry point: motor_protection_node
Frequency: 50Hz (20ms cycle)
Thermal Model Parameters:
- Motor resistance: 1.5 Ω
- Thermal mass: 100 J/°C
- Ambient temperature: 25°C
- Max safe temperature: 80°C
- Cooling constant: 0.05 1/s
Features:
✓ Multi-motor current monitoring (worst-case approach)
✓ I^2R Joule heating with passive cooling
✓ Exponential temperature dynamics
✓ Two-level overcurrent protection
✓ Combined current+thermal derating
✓ Soft fault duration tracking
✓ Automatic recovery on current drop
✓ JSON telemetry with state and metrics
Tests: 25+ unit tests covering:
- ThermalModel initialization and parameters
- Current subscription and clamping
- Overcurrent detection (soft, hard)
- Fault recovery and state transitions
- Joule heating calculation (I^2R)
- Temperature rise and cooling
- Speed derating (normal, soft fault, thermal, hard fault)
- Derate clipping and bounds
- JSON status format
- Realistic scenarios (thermal rise, overcurrent spike, asymmetric loading)
- Combined current+thermal derating
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Jetson Nano — AI/SLAM Platform Setup
Self-balancing robot: Jetson Nano dev environment for ROS2 Humble + SLAM stack.
Stack
| Component | Version / Part |
|---|---|
| Platform | Jetson Nano 4GB |
| JetPack | 4.6 (L4T R32.6.1, CUDA 10.2) |
| ROS2 | Humble Hawksbill |
| DDS | CycloneDDS |
| SLAM | slam_toolbox |
| Nav | Nav2 |
| Depth camera | Intel RealSense D435i |
| LiDAR | RPLIDAR A1M8 |
| MCU bridge | STM32F722 (USB CDC @ 921600) |
Quick Start
# 1. Host setup (once, on fresh JetPack 4.6)
sudo bash scripts/setup-jetson.sh
# 2. Build Docker image
bash scripts/build-and-run.sh build
# 3. Start full stack
bash scripts/build-and-run.sh up
# 4. Open ROS2 shell
bash scripts/build-and-run.sh shell
Docs
docs/pinout.md— GPIO/I2C/UART pinout for all peripheralsdocs/power-budget.md— 10W power envelope analysis
Files
jetson/
├── Dockerfile # L4T base + ROS2 Humble + SLAM packages
├── docker-compose.yml # Multi-service stack (ROS2, RPLIDAR, D435i, STM32)
├── README.md # This file
├── docs/
│ ├── pinout.md # GPIO/I2C/UART pinout reference
│ └── power-budget.md # Power budget analysis (10W envelope)
└── scripts/
├── entrypoint.sh # Docker container entrypoint
├── setup-jetson.sh # Host setup (udev, Docker, nvpmodel)
└── build-and-run.sh # Build/run helper
Power Budget (Summary)
| Scenario | Total |
|---|---|
| Idle | 2.9W |
| Nominal (SLAM active) | ~10.2W |
| Peak | 15.4W |
Target: 10W (MAXN nvpmodel). Use RPLIDAR standby + 640p D435i for compliance.
See docs/power-budget.md for full analysis.