frenet-planner 1.0.0__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.
Files changed (167) hide show
  1. frenet_planner-1.0.0/.clang-format +5 -0
  2. frenet_planner-1.0.0/.github/ISSUE_TEMPLATE/bug_report.md +13 -0
  3. frenet_planner-1.0.0/.github/ISSUE_TEMPLATE/feature_request.md +11 -0
  4. frenet_planner-1.0.0/.github/release.yml +19 -0
  5. frenet_planner-1.0.0/.github/workflows/core.yml +49 -0
  6. frenet_planner-1.0.0/.github/workflows/docs.yml +20 -0
  7. frenet_planner-1.0.0/.github/workflows/python.yml +97 -0
  8. frenet_planner-1.0.0/.github/workflows/ros.yml +54 -0
  9. frenet_planner-1.0.0/.gitignore +34 -0
  10. frenet_planner-1.0.0/.pre-commit-config.yaml +20 -0
  11. frenet_planner-1.0.0/CHANGELOG.md +59 -0
  12. frenet_planner-1.0.0/CITATION.cff +50 -0
  13. frenet_planner-1.0.0/CMakeLists.txt +13 -0
  14. frenet_planner-1.0.0/CODE_OF_CONDUCT.md +16 -0
  15. frenet_planner-1.0.0/CONTRIBUTING.md +29 -0
  16. frenet_planner-1.0.0/LICENSE +201 -0
  17. frenet_planner-1.0.0/PKG-INFO +264 -0
  18. frenet_planner-1.0.0/README.md +230 -0
  19. frenet_planner-1.0.0/SECURITY.md +19 -0
  20. frenet_planner-1.0.0/benchmarks/commonroad/bench_set.txt +280 -0
  21. frenet_planner-1.0.0/benchmarks/commonroad/fetch_scenarios.py +65 -0
  22. frenet_planner-1.0.0/benchmarks/make_tables.py +165 -0
  23. frenet_planner-1.0.0/configs/highway.yaml +26 -0
  24. frenet_planner-1.0.0/configs/paper_fiss.yaml +19 -0
  25. frenet_planner-1.0.0/configs/urban.yaml +23 -0
  26. frenet_planner-1.0.0/core/CMakeLists.txt +169 -0
  27. frenet_planner-1.0.0/core/bench/CMakeLists.txt +3 -0
  28. frenet_planner-1.0.0/core/bench/bench_planners.cpp +87 -0
  29. frenet_planner-1.0.0/core/cmake/frenet_plannerConfig.cmake.in +11 -0
  30. frenet_planner-1.0.0/core/include/frenet_planner/collision/box2d.hpp +31 -0
  31. frenet_planner-1.0.0/core/include/frenet_planner/common/math.hpp +54 -0
  32. frenet_planner-1.0.0/core/include/frenet_planner/common/types.hpp +55 -0
  33. frenet_planner-1.0.0/core/include/frenet_planner/control/controller.hpp +107 -0
  34. frenet_planner-1.0.0/core/include/frenet_planner/geometry/polynomial.hpp +43 -0
  35. frenet_planner-1.0.0/core/include/frenet_planner/geometry/reference_line.hpp +63 -0
  36. frenet_planner-1.0.0/core/include/frenet_planner/geometry/spline.hpp +63 -0
  37. frenet_planner-1.0.0/core/include/frenet_planner/map/road_map.hpp +79 -0
  38. frenet_planner-1.0.0/core/include/frenet_planner/map/route_corridor.hpp +46 -0
  39. frenet_planner-1.0.0/core/include/frenet_planner/planning/components.hpp +127 -0
  40. frenet_planner-1.0.0/core/include/frenet_planner/planning/config.hpp +128 -0
  41. frenet_planner-1.0.0/core/include/frenet_planner/planning/corridor.hpp +62 -0
  42. frenet_planner-1.0.0/core/include/frenet_planner/planning/frenet_obstacles.hpp +108 -0
  43. frenet_planner-1.0.0/core/include/frenet_planner/planning/local_planner.hpp +125 -0
  44. frenet_planner-1.0.0/core/include/frenet_planner/planning/planner.hpp +124 -0
  45. frenet_planner-1.0.0/core/include/frenet_planner/planning/trajectory.hpp +65 -0
  46. frenet_planner-1.0.0/core/include/frenet_planner/prediction/lane_following.hpp +44 -0
  47. frenet_planner-1.0.0/core/include/frenet_planner/prediction/obstacle.hpp +41 -0
  48. frenet_planner-1.0.0/core/include/frenet_planner/smoothing/piecewise_jerk.hpp +46 -0
  49. frenet_planner-1.0.0/core/include/frenet_planner/smoothing/smoother.hpp +49 -0
  50. frenet_planner-1.0.0/core/package.xml +22 -0
  51. frenet_planner-1.0.0/core/src/box2d.cpp +40 -0
  52. frenet_planner-1.0.0/core/src/components.cpp +245 -0
  53. frenet_planner-1.0.0/core/src/config.cpp +210 -0
  54. frenet_planner-1.0.0/core/src/controller.cpp +136 -0
  55. frenet_planner-1.0.0/core/src/corridor.cpp +87 -0
  56. frenet_planner-1.0.0/core/src/frenet_obstacles.cpp +247 -0
  57. frenet_planner-1.0.0/core/src/lane_following.cpp +128 -0
  58. frenet_planner-1.0.0/core/src/local_planner.cpp +355 -0
  59. frenet_planner-1.0.0/core/src/mpc.cpp +119 -0
  60. frenet_planner-1.0.0/core/src/obstacle.cpp +49 -0
  61. frenet_planner-1.0.0/core/src/piecewise_jerk.cpp +91 -0
  62. frenet_planner-1.0.0/core/src/planner.cpp +234 -0
  63. frenet_planner-1.0.0/core/src/planners.cpp +311 -0
  64. frenet_planner-1.0.0/core/src/planners.hpp +94 -0
  65. frenet_planner-1.0.0/core/src/polynomial.cpp +66 -0
  66. frenet_planner-1.0.0/core/src/qp.hpp +118 -0
  67. frenet_planner-1.0.0/core/src/reference_line.cpp +175 -0
  68. frenet_planner-1.0.0/core/src/road_map.cpp +146 -0
  69. frenet_planner-1.0.0/core/src/route_corridor.cpp +294 -0
  70. frenet_planner-1.0.0/core/src/smoother.cpp +208 -0
  71. frenet_planner-1.0.0/core/src/spline.cpp +145 -0
  72. frenet_planner-1.0.0/core/test/CMakeLists.txt +32 -0
  73. frenet_planner-1.0.0/core/test/test_collision.cpp +91 -0
  74. frenet_planner-1.0.0/core/test/test_components.cpp +167 -0
  75. frenet_planner-1.0.0/core/test/test_config.cpp +54 -0
  76. frenet_planner-1.0.0/core/test/test_control.cpp +213 -0
  77. frenet_planner-1.0.0/core/test/test_map.cpp +276 -0
  78. frenet_planner-1.0.0/core/test/test_planners.cpp +221 -0
  79. frenet_planner-1.0.0/core/test/test_polynomial.cpp +60 -0
  80. frenet_planner-1.0.0/core/test/test_prediction.cpp +144 -0
  81. frenet_planner-1.0.0/core/test/test_reference_line.cpp +116 -0
  82. frenet_planner-1.0.0/core/test/test_safety.cpp +311 -0
  83. frenet_planner-1.0.0/core/test/test_spline.cpp +93 -0
  84. frenet_planner-1.0.0/core/test/test_utils.hpp +63 -0
  85. frenet_planner-1.0.0/docs/benchmarks.md +167 -0
  86. frenet_planner-1.0.0/docs/concepts.md +134 -0
  87. frenet_planner-1.0.0/docs/demo/data/DEU_A99-1_1_T-1.json +1 -0
  88. frenet_planner-1.0.0/docs/demo/data/USA_Lanker-2_16_T-1.json +1 -0
  89. frenet_planner-1.0.0/docs/demo/data/USA_US101-22_3_T-1.json +1 -0
  90. frenet_planner-1.0.0/docs/demo/data/ZAM_Tjunction-1_101_T-1.json +1 -0
  91. frenet_planner-1.0.0/docs/demo/data/ZAM_Zip-1_50_T-1.json +1 -0
  92. frenet_planner-1.0.0/docs/demo/data/index.json +47 -0
  93. frenet_planner-1.0.0/docs/demo/index.html +341 -0
  94. frenet_planner-1.0.0/docs/foxglove/frenet_planner_layout.json +202 -0
  95. frenet_planner-1.0.0/docs/foxglove.md +49 -0
  96. frenet_planner-1.0.0/docs/index.md +21 -0
  97. frenet_planner-1.0.0/docs/media/autobahn_fiss_plus.gif +0 -0
  98. frenet_planner-1.0.0/docs/media/carla_birdseye_cut_in.gif +0 -0
  99. frenet_planner-1.0.0/docs/media/carla_cut_in.webp +0 -0
  100. frenet_planner-1.0.0/docs/media/carla_overtake.webp +0 -0
  101. frenet_planner-1.0.0/docs/media/carla_traffic_hero.webp +0 -0
  102. frenet_planner-1.0.0/docs/media/compare_fop_fiss_fissplus.gif +0 -0
  103. frenet_planner-1.0.0/docs/media/logo.svg +18 -0
  104. frenet_planner-1.0.0/docs/media/merge_fiss_plus.gif +0 -0
  105. frenet_planner-1.0.0/docs/media/social_preview.png +0 -0
  106. frenet_planner-1.0.0/docs/media/tjunction_fiss_plus.gif +0 -0
  107. frenet_planner-1.0.0/docs/media/urban_fiss_plus.gif +0 -0
  108. frenet_planner-1.0.0/docs/media/us101_fiss_plus.gif +0 -0
  109. frenet_planner-1.0.0/docs/python.md +74 -0
  110. frenet_planner-1.0.0/docs/ros.md +70 -0
  111. frenet_planner-1.0.0/examples/make_social_preview.py +48 -0
  112. frenet_planner-1.0.0/examples/quickstart.ipynb +258 -0
  113. frenet_planner-1.0.0/mkdocs.yml +27 -0
  114. frenet_planner-1.0.0/msgs/frenet_planner_msgs/CMakeLists.txt +22 -0
  115. frenet_planner-1.0.0/msgs/frenet_planner_msgs/msg/Obstacle.msg +7 -0
  116. frenet_planner-1.0.0/msgs/frenet_planner_msgs/msg/ObstacleArray.msg +2 -0
  117. frenet_planner-1.0.0/msgs/frenet_planner_msgs/msg/ObstacleState.msg +6 -0
  118. frenet_planner-1.0.0/msgs/frenet_planner_msgs/msg/PlannerStats.msg +20 -0
  119. frenet_planner-1.0.0/msgs/frenet_planner_msgs/msg/StopLineState.msg +3 -0
  120. frenet_planner-1.0.0/msgs/frenet_planner_msgs/msg/StopLineStateArray.msg +2 -0
  121. frenet_planner-1.0.0/msgs/frenet_planner_msgs/msg/Trajectory.msg +5 -0
  122. frenet_planner-1.0.0/msgs/frenet_planner_msgs/msg/TrajectoryPoint.msg +10 -0
  123. frenet_planner-1.0.0/msgs/frenet_planner_msgs/package.xml +26 -0
  124. frenet_planner-1.0.0/pixi.lock +17014 -0
  125. frenet_planner-1.0.0/pixi.toml +157 -0
  126. frenet_planner-1.0.0/pyproject.toml +58 -0
  127. frenet_planner-1.0.0/python/CMakeLists.txt +15 -0
  128. frenet_planner-1.0.0/python/frenet_planner/__init__.py +29 -0
  129. frenet_planner-1.0.0/python/frenet_planner/bags/__init__.py +1 -0
  130. frenet_planner-1.0.0/python/frenet_planner/bags/from_commonroad.py +234 -0
  131. frenet_planner-1.0.0/python/frenet_planner/bags/msg_definitions.py +13 -0
  132. frenet_planner-1.0.0/python/frenet_planner/carla/__init__.py +1 -0
  133. frenet_planner-1.0.0/python/frenet_planner/carla/adapter.py +187 -0
  134. frenet_planner-1.0.0/python/frenet_planner/carla/closed_loop.py +601 -0
  135. frenet_planner-1.0.0/python/frenet_planner/carla/record.py +320 -0
  136. frenet_planner-1.0.0/python/frenet_planner/carla/render.py +86 -0
  137. frenet_planner-1.0.0/python/frenet_planner/commonroad/__init__.py +20 -0
  138. frenet_planner-1.0.0/python/frenet_planner/commonroad/adapter.py +230 -0
  139. frenet_planner-1.0.0/python/frenet_planner/commonroad/benchmark.py +488 -0
  140. frenet_planner-1.0.0/python/frenet_planner/commonroad/demo.py +209 -0
  141. frenet_planner-1.0.0/python/frenet_planner/commonroad/export_web.py +95 -0
  142. frenet_planner-1.0.0/python/frenet_planner/viz/__init__.py +5 -0
  143. frenet_planner-1.0.0/python/frenet_planner/viz/foxglove_scene.py +250 -0
  144. frenet_planner-1.0.0/python/src/bindings.cpp +736 -0
  145. frenet_planner-1.0.0/python/tests/test_bindings.py +178 -0
  146. frenet_planner-1.0.0/ros/common/include/frenet_planner_ros/lanelet2_adapter.hpp +42 -0
  147. frenet_planner-1.0.0/ros/common/src/lanelet2_adapter.cpp +128 -0
  148. frenet_planner-1.0.0/ros/ros1/frenet_planner_ros1/CMakeLists.txt +39 -0
  149. frenet_planner-1.0.0/ros/ros1/frenet_planner_ros1/cfg/FrenetPlanner.cfg +68 -0
  150. frenet_planner-1.0.0/ros/ros1/frenet_planner_ros1/launch/planner.launch +31 -0
  151. frenet_planner-1.0.0/ros/ros1/frenet_planner_ros1/package.xml +32 -0
  152. frenet_planner-1.0.0/ros/ros1/frenet_planner_ros1/src/controller_node.cpp +77 -0
  153. frenet_planner-1.0.0/ros/ros1/frenet_planner_ros1/src/planner_node.cpp +375 -0
  154. frenet_planner-1.0.0/ros/ros1/frenet_planner_ros1/test/planner_node.test +8 -0
  155. frenet_planner-1.0.0/ros/ros1/frenet_planner_ros1/test/test_planner_node.cpp +94 -0
  156. frenet_planner-1.0.0/ros/ros2/frenet_planner_ros2/CMakeLists.txt +63 -0
  157. frenet_planner-1.0.0/ros/ros2/frenet_planner_ros2/config/planner.yaml +38 -0
  158. frenet_planner-1.0.0/ros/ros2/frenet_planner_ros2/include/frenet_planner_ros2/planner_node.hpp +120 -0
  159. frenet_planner-1.0.0/ros/ros2/frenet_planner_ros2/launch/planner.launch.py +71 -0
  160. frenet_planner-1.0.0/ros/ros2/frenet_planner_ros2/package.xml +39 -0
  161. frenet_planner-1.0.0/ros/ros2/frenet_planner_ros2/rviz/frenet_planner.rviz +55 -0
  162. frenet_planner-1.0.0/ros/ros2/frenet_planner_ros2/scripts/bag_replay_eval.py +240 -0
  163. frenet_planner-1.0.0/ros/ros2/frenet_planner_ros2/src/controller_main.cpp +12 -0
  164. frenet_planner-1.0.0/ros/ros2/frenet_planner_ros2/src/controller_node.cpp +82 -0
  165. frenet_planner-1.0.0/ros/ros2/frenet_planner_ros2/src/main.cpp +12 -0
  166. frenet_planner-1.0.0/ros/ros2/frenet_planner_ros2/src/planner_node.cpp +661 -0
  167. frenet_planner-1.0.0/ros/ros2/frenet_planner_ros2/test/test_planner_node.cpp +180 -0
@@ -0,0 +1,5 @@
1
+ BasedOnStyle: Google
2
+ ColumnLimit: 110
3
+ DerivePointerAlignment: false
4
+ PointerAlignment: Left
5
+ IncludeBlocks: Regroup
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: Bug report
3
+ about: Something does not work as documented
4
+ labels: bug
5
+ ---
6
+
7
+ **What happened**
8
+
9
+ **How to reproduce** (scenario / bag / minimal Python snippet, planner type, config)
10
+
11
+ **Expected behaviour**
12
+
13
+ **Environment** (OS, install method: pip / ROS 2 distro / ROS 1, version)
@@ -0,0 +1,11 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest an improvement
4
+ labels: enhancement
5
+ ---
6
+
7
+ **Use case**
8
+
9
+ **Proposed solution**
10
+
11
+ **Alternatives considered**
@@ -0,0 +1,19 @@
1
+ changelog:
2
+ exclude:
3
+ labels: [ignore-for-release]
4
+ authors: [dependabot, pre-commit-ci]
5
+ categories:
6
+ - title: Planning
7
+ labels: [planner, behaviour, prediction]
8
+ - title: Maps and routing
9
+ labels: [map, lanelet2]
10
+ - title: Optimization and control
11
+ labels: [smoother, mpc, control]
12
+ - title: Integrations
13
+ labels: [ros1, ros2, python, carla, commonroad]
14
+ - title: Bug fixes
15
+ labels: [bug]
16
+ - title: Documentation
17
+ labels: [documentation]
18
+ - title: Other changes
19
+ labels: ["*"]
@@ -0,0 +1,49 @@
1
+ name: core
2
+
3
+ on:
4
+ push:
5
+ branches: [main, v1-modernize]
6
+ pull_request:
7
+
8
+ concurrency:
9
+ group: ${{ github.workflow }}-${{ github.ref }}
10
+ cancel-in-progress: true
11
+
12
+ jobs:
13
+ test:
14
+ name: ${{ matrix.compiler }} / ${{ matrix.build }}
15
+ runs-on: ubuntu-24.04
16
+ strategy:
17
+ fail-fast: false
18
+ matrix:
19
+ compiler: [gcc, clang]
20
+ build: [RelWithDebInfo, Sanitize]
21
+ env:
22
+ CC: ${{ matrix.compiler == 'gcc' && 'gcc' || 'clang' }}
23
+ CXX: ${{ matrix.compiler == 'gcc' && 'g++' || 'clang++' }}
24
+ steps:
25
+ - uses: actions/checkout@v4
26
+ - name: Install dependencies
27
+ run: sudo apt-get update && sudo apt-get install -y ninja-build libeigen3-dev libyaml-cpp-dev libgtest-dev libbenchmark-dev
28
+ - name: Configure
29
+ run: >
30
+ cmake -S . -B build -G Ninja
31
+ -DCMAKE_BUILD_TYPE=${{ matrix.build == 'Sanitize' && 'Debug' || matrix.build }}
32
+ -DFRENET_PLANNER_BUILD_TESTS=ON -DFRENET_PLANNER_BUILD_BENCHMARKS=ON
33
+ -DFRENET_PLANNER_SANITIZE=${{ matrix.build == 'Sanitize' && 'ON' || 'OFF' }}
34
+ - name: Build
35
+ run: cmake --build build
36
+ - name: Test
37
+ run: ctest --test-dir build --output-on-failure
38
+ - name: Benchmark smoke run
39
+ if: matrix.build != 'Sanitize'
40
+ run: ./build/core/bench/frenet_planner_bench --benchmark_min_time=0.05s
41
+
42
+ pixi:
43
+ runs-on: ubuntu-24.04
44
+ steps:
45
+ - uses: actions/checkout@v4
46
+ - uses: prefix-dev/setup-pixi@v0.8.1
47
+ with:
48
+ cache: true
49
+ - run: pixi run test
@@ -0,0 +1,20 @@
1
+ name: docs
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths: ["docs/**", "mkdocs.yml", "README.md"]
7
+
8
+ permissions:
9
+ contents: write
10
+
11
+ jobs:
12
+ deploy:
13
+ runs-on: ubuntu-24.04
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ - uses: actions/setup-python@v5
17
+ with:
18
+ python-version: "3.12"
19
+ - run: pip install "mkdocs<2" "mkdocs-material<10"
20
+ - run: mkdocs gh-deploy --force
@@ -0,0 +1,97 @@
1
+ name: python
2
+
3
+ on:
4
+ push:
5
+ branches: [main, v1-modernize]
6
+ tags: ["v*"]
7
+ pull_request:
8
+
9
+ concurrency:
10
+ group: ${{ github.workflow }}-${{ github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ jobs:
14
+ test:
15
+ runs-on: ubuntu-24.04
16
+ strategy:
17
+ fail-fast: false
18
+ matrix:
19
+ python: ["3.10", "3.11", "3.12", "3.13"]
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+ - uses: actions/setup-python@v5
23
+ with:
24
+ python-version: ${{ matrix.python }}
25
+ - name: Build and install
26
+ run: pip install ".[test]" -v
27
+ - name: Test
28
+ run: |
29
+ cd /tmp && python -c "import frenet_planner as fp; assert fp.has_optimizers()"
30
+ pytest -q ${{ github.workspace }}/python/tests
31
+
32
+ commonroad-demo:
33
+ runs-on: ubuntu-24.04
34
+ steps:
35
+ - uses: actions/checkout@v4
36
+ - uses: actions/setup-python@v5
37
+ with:
38
+ python-version: "3.11"
39
+ - run: pip install ".[commonroad]"
40
+ - name: Fetch pinned scenarios
41
+ run: python benchmarks/commonroad/fetch_scenarios.py --subset hand-crafted --out data/cache/scenarios
42
+ - name: Closed-loop benchmark (smoke)
43
+ run: |
44
+ python -m frenet_planner.commonroad.benchmark --scenarios data/cache/scenarios/hand-crafted \
45
+ --limit 20 --seed 1 --jobs 4 --out results/ci.csv
46
+ python - <<'PY'
47
+ import pandas as pd
48
+ df = pd.read_csv("results/ci.csv")
49
+ assert (df.status != "error").all(), df[df.status == "error"]
50
+ print(df.groupby("planner").success.mean())
51
+ PY
52
+
53
+ wheels:
54
+ if: startsWith(github.ref, 'refs/tags/v') || github.event_name == 'push'
55
+ strategy:
56
+ matrix:
57
+ os: [ubuntu-24.04, ubuntu-24.04-arm, macos-14]
58
+ runs-on: ${{ matrix.os }}
59
+ steps:
60
+ - uses: actions/checkout@v4
61
+ - uses: pypa/cibuildwheel@v2.23.3
62
+ env:
63
+ CIBW_BUILD: "cp310-* cp311-* cp312-* cp313-*"
64
+ CIBW_SKIP: "*-musllinux_* *-win32 *_i686"
65
+ # Current NumPy ships Linux wheels for manylinux_2_28 only (glibc >= 2.28).
66
+ CIBW_MANYLINUX_X86_64_IMAGE: manylinux_2_28
67
+ CIBW_MANYLINUX_AARCH64_IMAGE: manylinux_2_28
68
+ CIBW_TEST_REQUIRES: pytest
69
+ CIBW_TEST_COMMAND: "pytest -q {project}/python/tests -k 'not embedded_msg'"
70
+ - uses: actions/upload-artifact@v4
71
+ with:
72
+ name: wheels-${{ matrix.os }}
73
+ path: wheelhouse/*.whl
74
+
75
+ sdist:
76
+ runs-on: ubuntu-24.04
77
+ steps:
78
+ - uses: actions/checkout@v4
79
+ - run: pipx run build --sdist
80
+ - uses: actions/upload-artifact@v4
81
+ with:
82
+ name: sdist
83
+ path: dist/*.tar.gz
84
+
85
+ publish:
86
+ if: startsWith(github.ref, 'refs/tags/v')
87
+ needs: [test, wheels, sdist]
88
+ runs-on: ubuntu-24.04
89
+ environment: pypi
90
+ permissions:
91
+ id-token: write # PyPI trusted publishing
92
+ steps:
93
+ - uses: actions/download-artifact@v4
94
+ with:
95
+ path: dist
96
+ merge-multiple: true
97
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,54 @@
1
+ name: ros
2
+
3
+ on:
4
+ push:
5
+ branches: [main, v1-modernize]
6
+ pull_request:
7
+
8
+ concurrency:
9
+ group: ${{ github.workflow }}-${{ github.ref }}
10
+ cancel-in-progress: true
11
+
12
+ jobs:
13
+ ros2:
14
+ name: ROS 2 ${{ matrix.distro }}
15
+ runs-on: ubuntu-${{ matrix.ubuntu }}
16
+ timeout-minutes: 60
17
+ strategy:
18
+ fail-fast: false
19
+ matrix:
20
+ include:
21
+ - {distro: jazzy, ubuntu: "24.04"}
22
+ - {distro: humble, ubuntu: "22.04"}
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+ - uses: ros-tooling/setup-ros@v0.7
26
+ with:
27
+ required-ros-distributions: ${{ matrix.distro }}
28
+ - name: Install dependencies
29
+ run: |
30
+ source /opt/ros/${{ matrix.distro }}/setup.bash
31
+ rosdep update --rosdistro ${{ matrix.distro }}
32
+ rosdep install --from-paths core msgs ros/ros2 --ignore-src -y -r --rosdistro ${{ matrix.distro }}
33
+ - name: Build
34
+ run: |
35
+ source /opt/ros/${{ matrix.distro }}/setup.bash
36
+ colcon build --base-paths core msgs ros/ros2 --event-handlers console_cohesion+ \
37
+ --cmake-args -DCMAKE_BUILD_TYPE=Release
38
+ - name: Test
39
+ run: |
40
+ source /opt/ros/${{ matrix.distro }}/setup.bash
41
+ colcon test --base-paths core msgs ros/ros2 --packages-select frenet_planner_ros2 \
42
+ --event-handlers console_direct+
43
+ colcon test-result --verbose
44
+
45
+ ros1:
46
+ name: ROS 1 noetic (RoboStack)
47
+ runs-on: ubuntu-24.04
48
+ steps:
49
+ - uses: actions/checkout@v4
50
+ - uses: prefix-dev/setup-pixi@v0.8.1
51
+ with:
52
+ environments: noetic
53
+ cache: true
54
+ - run: pixi run -e noetic ros1-test
@@ -0,0 +1,34 @@
1
+ # Build trees
2
+ build/
3
+ build-*/
4
+ install/
5
+ log/
6
+ devel/
7
+ logs/
8
+ _skbuild/
9
+ dist/
10
+ *.egg-info/
11
+ wheelhouse/
12
+
13
+ # Pixi / Python
14
+ .pixi/
15
+ __pycache__/
16
+ *.pyc
17
+ .pytest_cache/
18
+ .ruff_cache/
19
+
20
+ # Benchmark outputs (results tables are committed under docs/ instead)
21
+ /results/
22
+ data/cache/
23
+ *.mcap
24
+ *.db3
25
+
26
+ # Editors / OS
27
+ .vscode/
28
+ .idea/
29
+ *.user
30
+ *~
31
+ .DS_Store
32
+ python/frenet_planner/*.so
33
+ build-ros2-ws/
34
+ build-ros1-ws/
@@ -0,0 +1,20 @@
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v5.0.0
4
+ hooks:
5
+ - id: trailing-whitespace
6
+ - id: end-of-file-fixer
7
+ - id: check-yaml
8
+ - id: check-added-large-files
9
+ args: [--maxkb=2000]
10
+ - repo: https://github.com/pre-commit/mirrors-clang-format
11
+ rev: v19.1.7
12
+ hooks:
13
+ - id: clang-format
14
+ types_or: [c++]
15
+ - repo: https://github.com/astral-sh/ruff-pre-commit
16
+ rev: v0.9.6
17
+ hooks:
18
+ - id: ruff
19
+ args: [--fix]
20
+ - id: ruff-format
@@ -0,0 +1,59 @@
1
+ # Changelog
2
+
3
+ ## 1.0.0 — unreleased
4
+
5
+ The first release of the unified planner family: FOP, FOP+, FISS (RA-L 2022) and FISS+ (IROS 2023)
6
+ in one code base.
7
+
8
+ ### Planning
9
+ - ROS-agnostic C++17 core with four interchangeable planners behind one interface (`makePlanner`)
10
+ and a full pipeline (`LocalPlanner`):
11
+ - route corridor;
12
+ - stitching;
13
+ - target-speed policy;
14
+ - fail-safe fallbacks (previous plan, emergency braking).
15
+ - Exact time-domain Frenet ↔ Cartesian conversion; arc-length reference lines of any length.
16
+ - Werling-style cost with an admissible end-state estimate (used by FISS/FISS+).
17
+ - Kinematic, road-boundary and oriented-box collision validation against time-stamped predictions;
18
+ parallel validation for FOP/FOP+.
19
+ - Keeping distance:
20
+ - per-lane car following (the speed that closes the gap to the desired headway);
21
+ - proximity cost: headway, time to collision and lateral clearance;
22
+ - a hard safety envelope ("virtual bumper": minimum gap, headway and TTC) with a reaction-time
23
+ grace for cut-ins.
24
+ - Map-aware lane-following prediction, and predictions for obstacles that arrive with only their
25
+ current state.
26
+ - Fallback ladder: previous plan, a re-plan over a shorter collision horizon, then emergency braking.
27
+ - Explainability: per-reason rejection counts, the obstacle that blocked the cheapest candidate, and
28
+ gap / headway / TTC to the vehicle ahead in every cycle's statistics.
29
+
30
+ ### Maps
31
+ - Lane-level `RoadMap` with adapters for Lanelet2 (C++), CommonRoad and CARLA (Python), providing:
32
+ - per-lane sampling on real lane geometry;
33
+ - lane-change legality;
34
+ - speed and curvature limits;
35
+ - route urgency;
36
+ - traffic-light stop lines.
37
+
38
+ ### Optimization and control (optional, OSQP)
39
+ - Piecewise-jerk QP smoother inside a space–time driving corridor.
40
+ - LTV-MPC tracking controller with steering-rate limits; Stanley+PID baseline; kinematic bicycle
41
+ simulator.
42
+
43
+ ### Integrations
44
+ - Python package `frenet-planner` (nanobind) with a CommonRoad benchmark, ROS 2 bag tools and a CARLA
45
+ closed-loop runner.
46
+ - ROS 2 (`frenet_planner_ros2`, component nodes) and ROS 1 (`frenet_planner_ros1`) wrappers;
47
+ `frenet_planner_msgs` builds for both.
48
+ - Runtime planner switching through ROS 2 parameters, `dynamic_reconfigure` or Python.
49
+ - Scene markers and an RViz 2 configuration (ROS 2).
50
+ - Foxglove: MCAP recording (or live streaming) of CARLA and CommonRoad runs with a ready-made layout.
51
+
52
+ ### Quality
53
+ - Test suites:
54
+ - GoogleTest, including sanitizer builds;
55
+ - pytest;
56
+ - ROS 2 gtest;
57
+ - ROS 1 rostest.
58
+ - CI for all of the above and for wheels.
59
+ - Reproducible benchmarks with pinned scenario sets.
@@ -0,0 +1,50 @@
1
+ cff-version: 1.2.0
2
+ message: "If you use this software, please cite it and the FISS / FISS+ papers."
3
+ title: "frenet_planner: fast sampling-based Frenet trajectory planners (FOP, FISS, FISS+)"
4
+ type: software
5
+ version: 1.0.0
6
+ license: Apache-2.0
7
+ repository-code: "https://github.com/SS47816/frenet_planner"
8
+ authors:
9
+ - family-names: Sun
10
+ given-names: Shuo
11
+ references:
12
+ - type: article
13
+ title: "FISS: A Trajectory Planning Framework Using Fast Iterative Search and Sampling Strategy for Autonomous Driving"
14
+ authors:
15
+ - {family-names: Sun, given-names: Shuo}
16
+ - {family-names: Liu, given-names: Zhiyang}
17
+ - {family-names: Yin, given-names: Huan}
18
+ - {family-names: Ang, given-names: Marcelo H.}
19
+ journal: IEEE Robotics and Automation Letters
20
+ volume: 7
21
+ issue: 4
22
+ start: 9985
23
+ end: 9992
24
+ year: 2022
25
+ doi: 10.1109/LRA.2022.3191940
26
+ - type: conference-paper
27
+ title: "FISS+: Efficient and Focused Trajectory Generation and Refinement Using Fast Iterative Search and Sampling Strategy"
28
+ authors:
29
+ - {family-names: Sun, given-names: Shuo}
30
+ - {family-names: Chen, given-names: Jie}
31
+ - {family-names: Sun, given-names: Jiawei}
32
+ - {family-names: Yuan, given-names: Chengran}
33
+ - {family-names: Li, given-names: Yuanchen}
34
+ - {family-names: Zhang, given-names: Tangyike}
35
+ - {family-names: Ang, given-names: Marcelo H.}
36
+ collection-title: IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)
37
+ start: 10527
38
+ end: 10534
39
+ year: 2023
40
+ doi: 10.1109/IROS55552.2023.10341498
41
+ - type: conference-paper
42
+ title: "Optimal trajectory generation for dynamic street scenarios in a Frenét Frame"
43
+ authors:
44
+ - {family-names: Werling, given-names: Moritz}
45
+ - {family-names: Ziegler, given-names: Julius}
46
+ - {family-names: Kammel, given-names: Sören}
47
+ - {family-names: Thrun, given-names: Sebastian}
48
+ collection-title: IEEE International Conference on Robotics and Automation (ICRA)
49
+ year: 2010
50
+ doi: 10.1109/ROBOT.2010.5509799
@@ -0,0 +1,13 @@
1
+ cmake_minimum_required(VERSION 3.16)
2
+ project(frenet_planner_superbuild LANGUAGES CXX)
3
+
4
+ # Top-level entry point for standalone (non-ROS) builds and for the Python
5
+ # package. ROS builds use core/, msgs/ and ros/* directly as packages.
6
+ option(FRENET_PLANNER_BUILD_PYTHON "Build the Python bindings" OFF)
7
+
8
+ enable_testing()
9
+ add_subdirectory(core)
10
+
11
+ if(FRENET_PLANNER_BUILD_PYTHON)
12
+ add_subdirectory(python)
13
+ endif()
@@ -0,0 +1,16 @@
1
+ # Code of Conduct
2
+
3
+ This project follows the [Contributor Covenant, version 2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct/).
4
+
5
+ In short: be welcoming, be respectful of differing viewpoints and experience levels, give and accept
6
+ constructive feedback gracefully, and focus on what is best for the community. Harassment, personal
7
+ attacks, trolling and publishing others' private information are not acceptable in issues, pull
8
+ requests, discussions or any other project space.
9
+
10
+ ## Reporting
11
+
12
+ If you experience or witness unacceptable behaviour, contact the maintainers privately through the
13
+ contact options on the [maintainer's GitHub profile](https://github.com/SS47816). Reports are
14
+ handled confidentially. Maintainers may remove, edit or reject comments, commits, code and issues
15
+ that do not follow this code of conduct, and may temporarily or permanently ban contributors who do
16
+ so repeatedly.
@@ -0,0 +1,29 @@
1
+ # Contributing
2
+
3
+ Thanks for helping! Bug reports with a minimal reproduction (a CommonRoad scenario, a bag, or a
4
+ few lines of Python) are the most useful thing you can send.
5
+
6
+ ## Development setup
7
+
8
+ [pixi](https://pixi.sh) provides every toolchain without root:
9
+
10
+ | Task | Command |
11
+ |---|---|
12
+ | C++ core + tests | `pixi run test` |
13
+ | with ASan/UBSan | `pixi run test-asan` |
14
+ | micro-benchmarks | `pixi run bench-micro` |
15
+ | Python bindings + tests | `pixi run -e bench py-test` |
16
+ | CommonRoad benchmark | `pixi run -e bench cr-bench --scenarios <dir>` |
17
+ | ROS 2 build + tests | `pixi run -e jazzy ros2-test` |
18
+ | ROS 1 build + tests | `pixi run -e noetic ros1-test` |
19
+
20
+ ## Guidelines
21
+
22
+ - The core (`core/`) must stay ROS-free and dependency-light (C++17 standard library,
23
+ yaml-cpp, optional OSQP).
24
+ - Every bug fix comes with a regression test; every new planner feature with a test in
25
+ `core/test/` and, if user-visible, a benchmark run (`benchmarks/`).
26
+ - Format with `pre-commit run --all-files` (clang-format, ruff).
27
+ - Commit messages follow [Conventional Commits](https://www.conventionalcommits.org).
28
+ - New planners: subclass `Planner` (see `core/src/planners.hpp`), register in `makePlanner`,
29
+ add the type to `PlannerType`, and they are available in Python and both ROS wrappers.