simple-autonomous-car 0.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- simple_autonomous_car-0.1.2/.github/workflows/ci.yml +74 -0
- simple_autonomous_car-0.1.2/.github/workflows/publish.yml +103 -0
- simple_autonomous_car-0.1.2/.gitignore +60 -0
- simple_autonomous_car-0.1.2/.pre-commit-config.yaml +31 -0
- simple_autonomous_car-0.1.2/CHANGELOG.md +95 -0
- simple_autonomous_car-0.1.2/CONTRIBUTING.md +60 -0
- simple_autonomous_car-0.1.2/PKG-INFO +324 -0
- simple_autonomous_car-0.1.2/README.md +289 -0
- simple_autonomous_car-0.1.2/docs/api/modules.md +259 -0
- simple_autonomous_car-0.1.2/docs/api/overview.md +179 -0
- simple_autonomous_car-0.1.2/docs/getting-started/installation.md +138 -0
- simple_autonomous_car-0.1.2/docs/getting-started/quickstart.md +131 -0
- simple_autonomous_car-0.1.2/docs/guides/building-alert-systems.md +342 -0
- simple_autonomous_car-0.1.2/docs/guides/component_visualization.md +181 -0
- simple_autonomous_car-0.1.2/docs/guides/costmap.md +252 -0
- simple_autonomous_car-0.1.2/docs/guides/footprint_guide.md +241 -0
- simple_autonomous_car-0.1.2/docs/guides/frame-conversions.md +214 -0
- simple_autonomous_car-0.1.2/docs/guides/grid_map_navigation.md +123 -0
- simple_autonomous_car-0.1.2/docs/guides/track-bounds-alert.md +266 -0
- simple_autonomous_car-0.1.2/docs/guides/visualization.md +399 -0
- simple_autonomous_car-0.1.2/docs/index.md +76 -0
- simple_autonomous_car-0.1.2/examples/costmap_example.py +210 -0
- simple_autonomous_car-0.1.2/examples/grid_map_example.py +210 -0
- simple_autonomous_car-0.1.2/examples/visualization_example.py +179 -0
- simple_autonomous_car-0.1.2/notebooks/README.md +31 -0
- simple_autonomous_car-0.1.2/notebooks/building/README.md +20 -0
- simple_autonomous_car-0.1.2/notebooks/building/building_controller.ipynb +526 -0
- simple_autonomous_car-0.1.2/notebooks/building/building_custom_planners.ipynb +316 -0
- simple_autonomous_car-0.1.2/notebooks/building/building_custom_sensors.ipynb +507 -0
- simple_autonomous_car-0.1.2/notebooks/building/building_simulation.ipynb +438 -0
- simple_autonomous_car-0.1.2/notebooks/examples/README.md +16 -0
- simple_autonomous_car-0.1.2/notebooks/learning/README.md +79 -0
- simple_autonomous_car-0.1.2/notebooks/learning/algorithms/advanced_planning_algorithms.ipynb +560 -0
- simple_autonomous_car-0.1.2/notebooks/learning/algorithms/control_algorithms.ipynb +485 -0
- simple_autonomous_car-0.1.2/notebooks/learning/algorithms/dynamic_obstacles.ipynb +831 -0
- simple_autonomous_car-0.1.2/notebooks/learning/algorithms/sensor_algorithms.ipynb +371 -0
- simple_autonomous_car-0.1.2/notebooks/learning/control/learning_build_controller.ipynb +420 -0
- simple_autonomous_car-0.1.2/notebooks/learning/costmaps/footprint_integration.ipynb +636 -0
- simple_autonomous_car-0.1.2/notebooks/learning/costmaps/learning_build_costmap.ipynb +510 -0
- simple_autonomous_car-0.1.2/notebooks/learning/oop_fundamentals/understanding_classes_and_oop.ipynb +715 -0
- simple_autonomous_car-0.1.2/notebooks/learning/planning/learning_build_planner.ipynb +453 -0
- simple_autonomous_car-0.1.2/notebooks/learning/sensors/learning_build_sensor.ipynb +289 -0
- simple_autonomous_car-0.1.2/notebooks/tutorials/README.md +21 -0
- simple_autonomous_car-0.1.2/notebooks/tutorials/costmap_tutorial.ipynb +654 -0
- simple_autonomous_car-0.1.2/notebooks/tutorials/performance_optimization.ipynb +307 -0
- simple_autonomous_car-0.1.2/notebooks/tutorials/planner_tutorial.ipynb +643 -0
- simple_autonomous_car-0.1.2/notebooks/tutorials/sensor_fusion_tutorial.ipynb +298 -0
- simple_autonomous_car-0.1.2/notebooks/tutorials/track_bounds_alert.ipynb +1235 -0
- simple_autonomous_car-0.1.2/pyproject.toml +99 -0
- simple_autonomous_car-0.1.2/requirements.txt +14 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/__init__.py +96 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/alerts/__init__.py +5 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/alerts/track_bounds_alert.py +276 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/car/__init__.py +5 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/car/car.py +234 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/constants.py +112 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/control/__init__.py +7 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/control/base_controller.py +152 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/control/controller_viz.py +282 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/control/pid_controller.py +153 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/control/pure_pursuit_controller.py +578 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/costmap/__init__.py +12 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/costmap/base_costmap.py +187 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/costmap/grid_costmap.py +507 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/costmap/inflation.py +126 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/detection/__init__.py +5 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/detection/error_detector.py +165 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/filters/__init__.py +7 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/filters/base_filter.py +119 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/filters/kalman_filter.py +131 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/filters/particle_filter.py +162 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/footprint/__init__.py +7 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/footprint/base_footprint.py +128 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/footprint/circular_footprint.py +73 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/footprint/rectangular_footprint.py +123 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/frames/__init__.py +21 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/frames/frenet.py +267 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/maps/__init__.py +9 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/maps/frenet_map.py +97 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/maps/grid_ground_truth_map.py +83 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/maps/grid_map.py +361 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/maps/ground_truth_map.py +64 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/maps/perceived_map.py +169 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/perception/__init__.py +5 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/perception/perception.py +107 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/planning/__init__.py +7 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/planning/base_planner.py +184 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/planning/goal_planner.py +261 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/planning/track_planner.py +199 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/sensors/__init__.py +6 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/sensors/base_sensor.py +105 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/sensors/lidar_sensor.py +145 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/track/__init__.py +5 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/track/track.py +463 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/visualization/__init__.py +25 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/visualization/alert_viz.py +316 -0
- simple_autonomous_car-0.1.2/src/simple_autonomous_car/visualization/utils.py +169 -0
- simple_autonomous_car-0.1.2/src/simulations/README.md +71 -0
- simple_autonomous_car-0.1.2/src/simulations/__init__.py +1 -0
- simple_autonomous_car-0.1.2/src/simulations/configs/__init__.py +7 -0
- simple_autonomous_car-0.1.2/src/simulations/configs/grid_map.py +65 -0
- simple_autonomous_car-0.1.2/src/simulations/configs/race_track.py +36 -0
- simple_autonomous_car-0.1.2/src/simulations/configs/simple_track.py +42 -0
- simple_autonomous_car-0.1.2/src/simulations/enhanced_visualization.py +393 -0
- simple_autonomous_car-0.1.2/src/simulations/simulation.py +521 -0
- simple_autonomous_car-0.1.2/tests/__init__.py +1 -0
- simple_autonomous_car-0.1.2/tests/test_car.py +64 -0
- simple_autonomous_car-0.1.2/tests/test_detection.py +61 -0
- simple_autonomous_car-0.1.2/tests/test_filters.py +134 -0
- simple_autonomous_car-0.1.2/tests/test_grid_map.py +117 -0
- simple_autonomous_car-0.1.2/tests/test_maps.py +76 -0
- simple_autonomous_car-0.1.2/tests/test_track.py +46 -0
- simple_autonomous_car-0.1.2/uv.lock +3506 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, develop]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main, develop]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
lint:
|
|
11
|
+
name: Lint
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
- name: Set up Python
|
|
16
|
+
uses: actions/setup-python@v5
|
|
17
|
+
with:
|
|
18
|
+
python-version: "3.11"
|
|
19
|
+
- name: Install dependencies
|
|
20
|
+
run: |
|
|
21
|
+
python -m pip install --upgrade pip
|
|
22
|
+
pip install -e ".[dev]"
|
|
23
|
+
- name: Run black
|
|
24
|
+
run: black --check .
|
|
25
|
+
- name: Run ruff
|
|
26
|
+
run: ruff check .
|
|
27
|
+
- name: Run mypy
|
|
28
|
+
run: mypy .
|
|
29
|
+
|
|
30
|
+
test:
|
|
31
|
+
name: Test Python ${{ matrix.python-version }}
|
|
32
|
+
runs-on: ubuntu-latest
|
|
33
|
+
strategy:
|
|
34
|
+
matrix:
|
|
35
|
+
python-version: ["3.10", "3.11", "3.12"]
|
|
36
|
+
steps:
|
|
37
|
+
- uses: actions/checkout@v4
|
|
38
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
39
|
+
uses: actions/setup-python@v5
|
|
40
|
+
with:
|
|
41
|
+
python-version: ${{ matrix.python-version }}
|
|
42
|
+
- name: Install dependencies
|
|
43
|
+
run: |
|
|
44
|
+
python -m pip install --upgrade pip
|
|
45
|
+
pip install -e ".[dev]"
|
|
46
|
+
- name: Run tests
|
|
47
|
+
run: pytest --cov=src --cov-report=xml --cov-report=term-missing
|
|
48
|
+
- name: Upload coverage reports to Codecov
|
|
49
|
+
uses: codecov/codecov-action@v5
|
|
50
|
+
with:
|
|
51
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
52
|
+
file: ./coverage.xml
|
|
53
|
+
flags: unittests
|
|
54
|
+
name: codecov-umbrella
|
|
55
|
+
fail_ci_if_error: false
|
|
56
|
+
|
|
57
|
+
build:
|
|
58
|
+
name: Build package
|
|
59
|
+
runs-on: ubuntu-latest
|
|
60
|
+
needs: [lint, test]
|
|
61
|
+
steps:
|
|
62
|
+
- uses: actions/checkout@v4
|
|
63
|
+
- name: Set up Python
|
|
64
|
+
uses: actions/setup-python@v5
|
|
65
|
+
with:
|
|
66
|
+
python-version: ${{ matrix.python-version }}
|
|
67
|
+
- name: Install build dependencies
|
|
68
|
+
run: |
|
|
69
|
+
python -m pip install --upgrade pip
|
|
70
|
+
pip install build
|
|
71
|
+
- name: Build package
|
|
72
|
+
run: python -m build
|
|
73
|
+
- name: Check package
|
|
74
|
+
run: pip install twine && twine check dist/*
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published, edited]
|
|
6
|
+
# Note: We use GitHub Releases instead of direct tag pushes for:
|
|
7
|
+
# - Better visibility and release notes
|
|
8
|
+
# - More intentional publishing (less accidental)
|
|
9
|
+
# - Better control with environment protection rules
|
|
10
|
+
# 'edited' type allows re-running by editing the release
|
|
11
|
+
# If you need tag-only publishing, uncomment below:
|
|
12
|
+
# push:
|
|
13
|
+
# tags:
|
|
14
|
+
# - "v*"
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
publish:
|
|
18
|
+
name: Publish to PyPI
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
environment:
|
|
21
|
+
name: pypi
|
|
22
|
+
url: https://pypi.org/project/simple_autonomous_car/
|
|
23
|
+
permissions:
|
|
24
|
+
contents: read
|
|
25
|
+
id-token: write # Required for PyPI trusted publishing
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v4
|
|
28
|
+
with:
|
|
29
|
+
fetch-depth: 0 # Fetch all history for version detection
|
|
30
|
+
|
|
31
|
+
- name: Set up Python
|
|
32
|
+
uses: actions/setup-python@v5
|
|
33
|
+
with:
|
|
34
|
+
python-version: "3.11"
|
|
35
|
+
|
|
36
|
+
- name: Extract version from release tag
|
|
37
|
+
id: tag_version
|
|
38
|
+
env:
|
|
39
|
+
TAG_NAME: ${{ github.event.release.tag_name }}
|
|
40
|
+
run: |
|
|
41
|
+
# GitHub releases provide the tag in github.event.release.tag_name
|
|
42
|
+
# Remove 'v' prefix if present
|
|
43
|
+
if [[ "$TAG_NAME" == v* ]]; then
|
|
44
|
+
VERSION=${TAG_NAME#v}
|
|
45
|
+
else
|
|
46
|
+
VERSION="$TAG_NAME"
|
|
47
|
+
fi
|
|
48
|
+
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
|
49
|
+
echo "Release tag: $TAG_NAME"
|
|
50
|
+
echo "Release version: $VERSION"
|
|
51
|
+
|
|
52
|
+
- name: Verify version matches pyproject.toml
|
|
53
|
+
run: |
|
|
54
|
+
pip install tomli
|
|
55
|
+
PYPROJECT_VERSION=$(python -c "import tomli; print(tomli.load(open('pyproject.toml', 'rb'))['project']['version'])")
|
|
56
|
+
TAG_VERSION="${{ steps.tag_version.outputs.version }}"
|
|
57
|
+
if [ "$PYPROJECT_VERSION" != "$TAG_VERSION" ]; then
|
|
58
|
+
echo "Error: Version mismatch!"
|
|
59
|
+
echo "pyproject.toml version: $PYPROJECT_VERSION"
|
|
60
|
+
echo "Tag version: $TAG_VERSION"
|
|
61
|
+
exit 1
|
|
62
|
+
fi
|
|
63
|
+
echo "✓ Version matches: $PYPROJECT_VERSION"
|
|
64
|
+
|
|
65
|
+
- name: Install build dependencies
|
|
66
|
+
run: |
|
|
67
|
+
python -m pip install --upgrade pip
|
|
68
|
+
pip install build twine
|
|
69
|
+
|
|
70
|
+
- name: Build package
|
|
71
|
+
run: python -m build
|
|
72
|
+
|
|
73
|
+
- name: Check package
|
|
74
|
+
run: twine check dist/*
|
|
75
|
+
|
|
76
|
+
- name: Check if pre-release
|
|
77
|
+
id: check_prerelease
|
|
78
|
+
run: |
|
|
79
|
+
if [ "${{ github.event.release.prerelease }}" == "true" ]; then
|
|
80
|
+
echo "skip=true" >> $GITHUB_OUTPUT
|
|
81
|
+
echo "⚠️ Pre-release detected - skipping PyPI publish"
|
|
82
|
+
else
|
|
83
|
+
echo "skip=false" >> $GITHUB_OUTPUT
|
|
84
|
+
echo "✓ Final release - will publish to PyPI"
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
- name: Publish to PyPI
|
|
88
|
+
if: steps.check_prerelease.outputs.skip == 'false'
|
|
89
|
+
# Option 1: PyPI Trusted Publishing (Recommended)
|
|
90
|
+
# Configure at: https://pypi.org/manage/account/publishing/
|
|
91
|
+
# Add your repository URL and workflow name
|
|
92
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
93
|
+
with:
|
|
94
|
+
packages-dir: dist/
|
|
95
|
+
print-hash: true
|
|
96
|
+
|
|
97
|
+
# Option 2: Using API Token (Alternative)
|
|
98
|
+
# Uncomment below and comment out the above step if using API token
|
|
99
|
+
# - name: Publish to PyPI
|
|
100
|
+
# env:
|
|
101
|
+
# TWINE_USERNAME: __token__
|
|
102
|
+
# TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
|
|
103
|
+
# run: twine upload dist/* --verbose
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
build/
|
|
8
|
+
develop-eggs/
|
|
9
|
+
dist/
|
|
10
|
+
downloads/
|
|
11
|
+
eggs/
|
|
12
|
+
.eggs/
|
|
13
|
+
lib/
|
|
14
|
+
lib64/
|
|
15
|
+
parts/
|
|
16
|
+
sdist/
|
|
17
|
+
var/
|
|
18
|
+
wheels/
|
|
19
|
+
*.egg-info/
|
|
20
|
+
.installed.cfg
|
|
21
|
+
*.egg
|
|
22
|
+
|
|
23
|
+
# Virtual environments
|
|
24
|
+
venv/
|
|
25
|
+
env/
|
|
26
|
+
ENV/
|
|
27
|
+
.venv
|
|
28
|
+
|
|
29
|
+
# IDE
|
|
30
|
+
.vscode/
|
|
31
|
+
.idea/
|
|
32
|
+
*.swp
|
|
33
|
+
*.swo
|
|
34
|
+
*~
|
|
35
|
+
|
|
36
|
+
# Testing
|
|
37
|
+
.pytest_cache/
|
|
38
|
+
.coverage
|
|
39
|
+
htmlcov/
|
|
40
|
+
.tox/
|
|
41
|
+
.hypothesis/
|
|
42
|
+
|
|
43
|
+
# Type checking
|
|
44
|
+
.mypy_cache/
|
|
45
|
+
.dmypy.json
|
|
46
|
+
dmypy.json
|
|
47
|
+
|
|
48
|
+
# Pre-commit
|
|
49
|
+
.pre-commit-cache/
|
|
50
|
+
|
|
51
|
+
# Project specific
|
|
52
|
+
*.png
|
|
53
|
+
*.jpg
|
|
54
|
+
*.gif
|
|
55
|
+
outputs/
|
|
56
|
+
logs/
|
|
57
|
+
|
|
58
|
+
# OS
|
|
59
|
+
.DS_Store
|
|
60
|
+
Thumbs.db
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
3
|
+
rev: v4.5.0
|
|
4
|
+
hooks:
|
|
5
|
+
- id: trailing-whitespace
|
|
6
|
+
- id: end-of-file-fixer
|
|
7
|
+
- id: check-yaml
|
|
8
|
+
- id: check-added-large-files
|
|
9
|
+
- id: check-json
|
|
10
|
+
- id: check-toml
|
|
11
|
+
- id: check-merge-conflict
|
|
12
|
+
- id: debug-statements
|
|
13
|
+
|
|
14
|
+
- repo: https://github.com/psf/black
|
|
15
|
+
rev: 23.12.1
|
|
16
|
+
hooks:
|
|
17
|
+
- id: black
|
|
18
|
+
language_version: python3
|
|
19
|
+
|
|
20
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
21
|
+
rev: v0.1.9
|
|
22
|
+
hooks:
|
|
23
|
+
- id: ruff
|
|
24
|
+
args: [--fix, --exit-non-zero-on-fix]
|
|
25
|
+
|
|
26
|
+
- repo: https://github.com/pre-commit/mirrors-mypy
|
|
27
|
+
rev: v1.8.0
|
|
28
|
+
hooks:
|
|
29
|
+
- id: mypy
|
|
30
|
+
additional_dependencies: [types-all]
|
|
31
|
+
args: [--ignore-missing-imports]
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## [0.1.0] - 2026-XX-XX
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- **Modular Sensor System**: Complete sensor architecture
|
|
9
|
+
- `BaseSensor` abstract class for all sensors
|
|
10
|
+
- `LiDARSensor` implementation
|
|
11
|
+
- Car can have multiple sensors via `car.add_sensor()`
|
|
12
|
+
- Sensors can be enabled/disabled individually
|
|
13
|
+
|
|
14
|
+
- **Control System**: Complete control architecture
|
|
15
|
+
- `BaseController` abstract class
|
|
16
|
+
- `PurePursuitController` for path following
|
|
17
|
+
- `PIDController` for PID control
|
|
18
|
+
- Controllers work with plans from planners
|
|
19
|
+
|
|
20
|
+
- **Planning System**: Path planning framework
|
|
21
|
+
- `BasePlanner` abstract class
|
|
22
|
+
- `TrackPlanner` for track following
|
|
23
|
+
- Planners generate waypoints for controllers
|
|
24
|
+
|
|
25
|
+
- **Enhanced Car Class**:
|
|
26
|
+
- Support for multiple sensors
|
|
27
|
+
- `car.add_sensor()`, `car.remove_sensor()`, `car.get_sensor()`
|
|
28
|
+
- `car.sense_all()` to get data from all sensors
|
|
29
|
+
|
|
30
|
+
- **Controller Notebook**: Interactive tutorial for building controllers
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
- **Project Renamed**: From `car-loc-viz` to `simple-autonomous-car`
|
|
34
|
+
- **Package Renamed**: From `car_loc_viz` to `simple_autonomous_car`
|
|
35
|
+
- **Architecture**: Modular OOP design with pluggable components
|
|
36
|
+
- **Sensor System**: Replaced single `Sensor` class with modular `BaseSensor` system
|
|
37
|
+
|
|
38
|
+
### Removed
|
|
39
|
+
- Old `Sensor` class (replaced by modular sensor system)
|
|
40
|
+
|
|
41
|
+
## [0.0.2] - 2026-XX-XX
|
|
42
|
+
|
|
43
|
+
### Added
|
|
44
|
+
- **Frenet Frame Support**: Complete Frenet coordinate system implementation
|
|
45
|
+
- `FrenetFrame` class for path-aligned coordinates
|
|
46
|
+
- Conversion utilities: `global_to_frenet`, `frenet_to_global`, `ego_to_frenet`, `frenet_to_ego`, `sensor_to_ego`, `ego_to_sensor`
|
|
47
|
+
- `FrenetMap` for map representation in Frenet coordinates
|
|
48
|
+
|
|
49
|
+
- **PerceptionPoints**: New data structure for perception data
|
|
50
|
+
- Vector of points in local (ego) frame
|
|
51
|
+
- Frame conversion utilities
|
|
52
|
+
- Distance filtering
|
|
53
|
+
|
|
54
|
+
- **Alert System**: Track Bounds Alert System
|
|
55
|
+
- `TrackBoundsAlert` class for detecting boundary deviations
|
|
56
|
+
- Comprehensive documentation
|
|
57
|
+
- Jupyter notebook with examples
|
|
58
|
+
|
|
59
|
+
- **Documentation**:
|
|
60
|
+
- Building on Top guide
|
|
61
|
+
- Track Bounds Alert System documentation
|
|
62
|
+
- Jupyter notebook tutorials
|
|
63
|
+
|
|
64
|
+
- **CI/CD**:
|
|
65
|
+
- GitHub Actions workflows for lint, test, and build
|
|
66
|
+
- PyPI publishing workflow
|
|
67
|
+
- Multi-platform testing (Linux, Windows, macOS)
|
|
68
|
+
- Multiple Python version support (3.10, 3.11, 3.12)
|
|
69
|
+
|
|
70
|
+
- **SDK Structure**:
|
|
71
|
+
- Clean module organization
|
|
72
|
+
- Comprehensive `__init__.py` exports
|
|
73
|
+
- Type hints throughout
|
|
74
|
+
- Error handling
|
|
75
|
+
|
|
76
|
+
### Changed
|
|
77
|
+
- Refactored code structure for better modularity
|
|
78
|
+
- Updated sensor to return `PerceptionPoints` instead of raw arrays
|
|
79
|
+
- Improved project metadata for PyPI publishing
|
|
80
|
+
- Enhanced documentation structure
|
|
81
|
+
|
|
82
|
+
### Fixed
|
|
83
|
+
- Frame conversion utilities
|
|
84
|
+
- Error handling in alert system
|
|
85
|
+
- Import structure
|
|
86
|
+
|
|
87
|
+
## [0.0.1] - 2026-XX-XX
|
|
88
|
+
|
|
89
|
+
### Added
|
|
90
|
+
- Initial release
|
|
91
|
+
- Basic track generation
|
|
92
|
+
- Car model and dynamics
|
|
93
|
+
- Ground truth and perceived maps
|
|
94
|
+
- Basic visualization
|
|
95
|
+
- Error detection
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Contributing to Car Loc Viz SDK
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing! This document provides guidelines for contributing to the project.
|
|
4
|
+
|
|
5
|
+
## Development Setup
|
|
6
|
+
|
|
7
|
+
1. Fork the repository
|
|
8
|
+
2. Clone your fork:
|
|
9
|
+
```bash
|
|
10
|
+
git clone https://github.com/yourusername/car-loc-viz.git
|
|
11
|
+
cd car-loc-viz
|
|
12
|
+
```
|
|
13
|
+
3. Install development dependencies:
|
|
14
|
+
```bash
|
|
15
|
+
uv sync --dev
|
|
16
|
+
```
|
|
17
|
+
4. Install pre-commit hooks:
|
|
18
|
+
```bash
|
|
19
|
+
uv run pre-commit install
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Code Style
|
|
23
|
+
|
|
24
|
+
- Follow PEP 8 style guidelines
|
|
25
|
+
- Use `black` for formatting (line length: 100)
|
|
26
|
+
- Use `ruff` for linting
|
|
27
|
+
- Use `mypy` for type checking
|
|
28
|
+
- Maximum line length: 100 characters
|
|
29
|
+
|
|
30
|
+
## Testing
|
|
31
|
+
|
|
32
|
+
- Write tests for all new features
|
|
33
|
+
- Ensure all tests pass: `uv run pytest`
|
|
34
|
+
- Aim for high test coverage
|
|
35
|
+
- Add tests to appropriate files in `tests/`
|
|
36
|
+
|
|
37
|
+
## Documentation
|
|
38
|
+
|
|
39
|
+
- Update docstrings for all new functions/classes
|
|
40
|
+
- Follow NumPy docstring format
|
|
41
|
+
- Update relevant documentation files
|
|
42
|
+
- Add examples if applicable
|
|
43
|
+
|
|
44
|
+
## Pull Request Process
|
|
45
|
+
|
|
46
|
+
1. Create a feature branch from `main`
|
|
47
|
+
2. Make your changes
|
|
48
|
+
3. Ensure tests pass and code is linted
|
|
49
|
+
4. Update documentation
|
|
50
|
+
5. Submit a pull request with a clear description
|
|
51
|
+
|
|
52
|
+
## Commit Messages
|
|
53
|
+
|
|
54
|
+
- Use clear, descriptive commit messages
|
|
55
|
+
- Reference issues when applicable
|
|
56
|
+
- Follow conventional commit format when possible
|
|
57
|
+
|
|
58
|
+
## Questions?
|
|
59
|
+
|
|
60
|
+
Open an issue for questions or discussions about contributions.
|