This commit is contained in:
CaiXiang
2025-11-14 16:09:58 +08:00
commit af65c2425d
74 changed files with 14650 additions and 0 deletions

View File

@@ -0,0 +1,74 @@
# AGV Path Tracking GUI - Bug Fixes Summary
## Issues Found and Fixed
### 1. **CSV Parsing Bug (path_curve_custom.cpp)**
**Issue**: Incorrect error handling in CSV token parsing
- **Location**: `src/path_curve_custom.cpp`, lines 35-42 (original)
- **Problem**: When `std::stod()` throws an exception for a token, the code uses `continue` inside the token-reading loop. This causes the offending token to be skipped while remaining tokens are still processed, resulting in misaligned column data.
- **Example**: CSV line "1.5, invalid, 3.0, 4.0" would be parsed as [1.5, 3.0, 4.0] instead of being rejected entirely.
- **Fix**:
- Added `parse_error` flag to track errors
- When any token fails to parse, skip the entire line
- Added token trimming to handle whitespace properly
- Improved error handling with explicit break instead of continue
### 2. **Stanley Algorithm Index Bounds Check (control_generator.cpp)**
**Issue**: Missing validation of `findNearestPoint()` return value
- **Location**: `src/control_generator.cpp`, line 87 (original)
- **Problem**: `findNearestPoint()` returns -1 when path is empty, but the code directly accesses `path_points[-1]` without checking, causing a crash/undefined behavior
- **Crash Trace**:
```cpp
int nearest_idx = path.findNearestPoint(...);
PathPoint nearest_point = path_points[nearest_idx]; // CRASH if nearest_idx == -1
```
- **Fix**: Added validation to check if `nearest_idx < 0` and default to index 0
### 3. **Pure Pursuit Lookahead Point Type Conversion Bug (control_generator.cpp)**
**Issue**: Implicit unsafe conversion of signed to unsigned integer
- **Location**: `src/control_generator.cpp`, line 188 (original)
- **Problem**: Converting `int nearest_idx` to `size_t i` in for loop. If `nearest_idx` is -1, it converts to a very large positive number (e.g., 18446744073709551615 on 64-bit systems)
- **Fix**:
- Added validation to check `nearest_idx < 0`
- Use explicit `static_cast<size_t>()` for safe conversion
- Return safe default (first path point) if index is invalid
### 4. **Visualization Division by Zero (qt_gui_demo.cpp)**
**Issue**: Missing bounds check for scale calculation
- **Location**: `examples/qt_gui_demo.cpp`, line 100 (original)
- **Problem**: If all path points have identical coordinates, `range` becomes 0, causing division by zero:
```cpp
double scale = std::min(width() - 2 * padding, height() - 2 * padding) / range;
```
- **Fix**: Added check for `range < 1e-6` and default to 1.0 to prevent division by zero
## Testing Recommendations
1. **Test CSV Loading with smooth_path_arc.csv**:
- Verify that the GUI no longer crashes when loading the file
- Check that all 150 path points are loaded correctly
- Verify visualization displays the arc path properly
2. **Test Edge Cases**:
- CSV files with malformed data (missing columns, invalid numbers)
- Paths with degenerate cases (all points at same location)
- Empty path files
- CSV files with extra whitespace around values
3. **Verify Control Generation**:
- Run Pure Pursuit algorithm with loaded path
- Run Stanley algorithm with loaded path
- Check that control sequences are generated without crashes
## Files Modified
1. `src/path_curve_custom.cpp` - CSV parsing improvements
2. `src/control_generator.cpp` - Index validation in Stanley and Pure Pursuit algorithms
3. `examples/qt_gui_demo.cpp` - Division by zero prevention in visualization
## Related Issues Prevented
- **Stack overflow**: From invalid array access with large negative indices cast to unsigned
- **Data corruption**: From misaligned CSV column parsing
- **Graphics rendering failures**: From NaN/infinity scale values
- **Segmentation faults**: From accessing out-of-bounds array indices