openscvx 0.3.1.dev60__tar.gz → 0.3.2.dev127__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.
- openscvx-0.3.2.dev127/CONTRIBUTING.md +180 -0
- {openscvx-0.3.1.dev60/openscvx.egg-info → openscvx-0.3.2.dev127}/PKG-INFO +3 -7
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/README.md +0 -6
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/examples.md +0 -11
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/abstract/3DoF_pdg.py +28 -9
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/cinema_vp.py +23 -4
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/cinema_vp_realtime_base.py +0 -3
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/dr_double_integrator.py +20 -4
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/dr_vp.py +21 -4
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/dr_vp_nodal.py +20 -2
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/dr_vp_polytope.py +21 -2
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/drone_racing.py +20 -2
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/obstacle_avoidance.py +19 -3
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/obstacle_avoidance_nodal.py +18 -2
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/obstacle_avoidance_realtime_base.py +18 -2
- openscvx-0.3.2.dev127/examples/plotting.py +1343 -0
- openscvx-0.3.2.dev127/examples/plotting_viser.py +694 -0
- openscvx-0.3.2.dev127/examples/realtime/cinema_vp_realtime.py +461 -0
- openscvx-0.3.2.dev127/examples/realtime/drone_racing_realtime.py +387 -0
- openscvx-0.3.2.dev127/examples/realtime/obstacle_avoidance_realtime.py +376 -0
- openscvx-0.3.2.dev127/figures/openscvx_logo_square.png +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/_version.py +3 -3
- openscvx-0.3.2.dev127/openscvx/plotting/__init__.py +63 -0
- openscvx-0.3.2.dev127/openscvx/plotting/plotting.py +756 -0
- openscvx-0.3.2.dev127/openscvx/plotting/scp_iteration.py +299 -0
- openscvx-0.3.2.dev127/openscvx/plotting/viser/__init__.py +126 -0
- openscvx-0.3.2.dev127/openscvx/plotting/viser/animated.py +605 -0
- openscvx-0.3.2.dev127/openscvx/plotting/viser/plotly_integration.py +333 -0
- openscvx-0.3.2.dev127/openscvx/plotting/viser/primitives.py +355 -0
- openscvx-0.3.2.dev127/openscvx/plotting/viser/scp.py +459 -0
- openscvx-0.3.2.dev127/openscvx/plotting/viser/server.py +112 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/problem.py +1 -2
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127/openscvx.egg-info}/PKG-INFO +3 -7
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx.egg-info/SOURCES.txt +10 -2
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx.egg-info/requires.txt +2 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/pyproject.toml +2 -0
- openscvx-0.3.2.dev127/tests/test_plotting.py +492 -0
- openscvx-0.3.1.dev60/examples/plotting.py +0 -3738
- openscvx-0.3.1.dev60/examples/realtime/cinema_vp_realtime.py +0 -631
- openscvx-0.3.1.dev60/examples/realtime/drone_racing_realtime.py +0 -604
- openscvx-0.3.1.dev60/examples/realtime/obstacle_avoidance_realtime.py +0 -466
- openscvx-0.3.1.dev60/openscvx/plotting/__init__.py +0 -30
- openscvx-0.3.1.dev60/openscvx/plotting/plotting.py +0 -1155
- openscvx-0.3.1.dev60/tests/test_plotting.py +0 -624
- openscvx-0.3.1.dev60/tests/test_pyqtgraph_functions.py +0 -297
- openscvx-0.3.1.dev60/tests/test_pyqtgraph_helpers.py +0 -138
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/assets/logo.svg +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/release-drafter.yml +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/workflows/_docs.yml +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/workflows/docs.yml +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/workflows/lint.yml +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/workflows/nightly.yml +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/workflows/release-drafter.yml +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/workflows/release.yml +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/workflows/tests-integration.yml +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/workflows/tests-unit.yml +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.gitignore +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/LICENSE +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Overview/constraint_reformulation.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Overview/control_parameterization.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Overview/discretization.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Overview/ocp.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Overview/scvx.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Overview/time_dilation.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/UnderTheHood/lowering_architecture.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/advanced_problem_setup.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/api.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/api_constraints.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/api_control.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/api_integrators.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/api_state.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/api_trajoptproblem.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/api_variable.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/basic_problem_setup.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/tutorial_6dof_los_guidance.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/tutorial_6dof_obstacle_avoidance.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/tutorials.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/assets/favicon.png +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/assets/images/ct-scvx_dark.png +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/assets/images/ct-scvx_light.png +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/assets/images/ctcs_dark.png +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/assets/images/ctcs_light.png +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/assets/images/problem_class_dark.png +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/assets/images/problem_class_light.png +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/assets/logo.svg +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/citation.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/getting-started.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/index.md +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/javascripts/mathjax.js +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/abstract/brachistochrone.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/car/dubins_car.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/car/dubins_car_disjoint.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/car/dubins_car_stljax.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/realtime/dubins_car_realtime.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/figures/ctlos_cine.gif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/figures/ctlos_dr.gif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/figures/dtlos_cine.gif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/figures/dtlos_dr.gif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/figures/openscvx_logo.svg +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/figures/oscvx_structure_full_dark.svg +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/figures/video_preview.png +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/__init__.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/1-background.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/1-background@1x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/1-background@2x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/1-background@3x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/1-background@4x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/2-mars.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/2-mars@1x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/2-mars@2x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/2-mars@3x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/2-mars@4x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/3-moon.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/3-moon@1x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/3-moon@2x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/3-moon@3x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/3-moon@4x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/4-sat1.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/4-sat1@1x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/4-sat1@2x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/4-sat1@3x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/4-sat1@4x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/5-space.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/5-space@1x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/5-space@2x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/5-space@3x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/5-space@4x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/6-earth.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/6-earth@1x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/6-earth@2x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/6-earth@3x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/6-earth@4x.avif +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/javascripts/parallax.js +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/logo.svg +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/stylesheets/custom.css +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/stylesheets/parallax.css +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/home.html +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/main.html +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/partials/parallax/hero.html +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/partials/parallax.html +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/mkdocs.yml +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/__init__.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/algorithms/__init__.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/algorithms/autotuning.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/algorithms/optimization_results.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/algorithms/ptr.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/algorithms/solver_state.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/config.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/discretization/__init__.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/discretization/discretization.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/expert/__init__.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/expert/byof.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/expert/lowering.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/expert/validation.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/integrators/__init__.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/integrators/runge_kutta.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/lowered/__init__.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/lowered/cvxpy_constraints.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/lowered/cvxpy_variables.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/lowered/dynamics.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/lowered/jax_constraints.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/lowered/parameters.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/lowered/problem.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/lowered/unified.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/propagation/__init__.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/propagation/post_processing.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/propagation/propagation.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/solvers/__init__.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/solvers/cvxpy.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/__init__.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/augmentation.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/builder.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/constraint_set.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/__init__.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/arithmetic.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/array.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/constraint.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/control.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/expr.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/linalg.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/math.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/spatial.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/state.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/stl.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/variable.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/hashing.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/lower.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/lowerers/__init__.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/lowerers/cvxpy.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/lowerers/jax.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/preprocessing.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/problem.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/time.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/unified.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/utils/__init__.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/utils/cache.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/utils/caching.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/utils/printing.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/utils/profiling.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/utils/utils.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx.egg-info/dependency_links.txt +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx.egg-info/top_level.txt +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/scripts/gen_example_pages.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/scripts/gen_ref_pages.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/setup.cfg +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/__init__.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/brachistochrone_analytical.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/__init__.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/__init__.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_arithmetic.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_array.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_constraint.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_expr.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_linalg.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_math.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_node_reference.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_parameters.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_scaling.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_spatial.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_variable.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/test_augmentation.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/test_hashing.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/test_lower_cvxpy.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/test_lower_jax.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/test_preprocessing.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/test_unified.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/test_brachistochrone.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/test_cvxpygen_optional.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/test_discretization.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/test_examples.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/test_expert.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/test_integrators.py +0 -0
- {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/test_propagation.py +0 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
## Contributing to OpenSCvx
|
|
2
|
+
|
|
3
|
+
### Local Installation
|
|
4
|
+
|
|
5
|
+
To set up OpenSCvx for local development, first clone the repository and create a virtual environment:
|
|
6
|
+
|
|
7
|
+
> **Note:** These instructions use SSH URLs. If you haven't set up SSH keys with GitHub, see [Connecting to GitHub with SSH](https://docs.github.com/en/authentication/connecting-to-github-with-ssh).
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
git clone git@github.com:haynec/OpenSCvx.git
|
|
11
|
+
cd OpenSCvx
|
|
12
|
+
python -m venv venv
|
|
13
|
+
source venv/bin/activate # On Windows: venv\Scripts\activate
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Then install the package in editable mode with development dependencies:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
pip install -e ".[test]"
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
For additional features, you can install optional dependencies:
|
|
23
|
+
- `pip install -e ".[gui]"` - GUI visualization tools
|
|
24
|
+
- `pip install -e ".[cvxpygen]"` - Code generation support
|
|
25
|
+
- `pip install -e ".[stl]"` - STL (Signal Temporal Logic) constraints
|
|
26
|
+
|
|
27
|
+
#### Using uv (Alternative)
|
|
28
|
+
|
|
29
|
+
If you prefer using [uv](https://github.com/astral-sh/uv) for faster dependency resolution:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
git clone git@github.com:haynec/OpenSCvx.git
|
|
33
|
+
cd OpenSCvx
|
|
34
|
+
uv venv
|
|
35
|
+
source .venv/bin/activate # On Windows: .venv\Scripts\activate
|
|
36
|
+
uv pip install -e ".[test]"
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
To contribute changes, you'll need to create a branch or fork. See [Forking and Merging](#forking-and-merging) below for details on our workflow and [Branch Naming Conventions](#branch-naming-conventions) for required naming patterns.
|
|
40
|
+
|
|
41
|
+
### Forking and Merging
|
|
42
|
+
|
|
43
|
+
All contributions must be submitted via pull request and approved by a maintainer before merging. This ensures code quality, maintains consistency across the codebase, and gives contributors feedback on their changes.
|
|
44
|
+
|
|
45
|
+
We currently use standard merge commits for pull requests. We may transition to squash merges in the future to maintain a cleaner commit history on `main`.
|
|
46
|
+
|
|
47
|
+
Contributors can either:
|
|
48
|
+
1. **Create a branch directly** on the OpenSCvx repository (for those with write access)
|
|
49
|
+
2. **Fork the repository** to their own GitHub account and submit pull requests from there (recommended for external contributors)
|
|
50
|
+
|
|
51
|
+
#### Fork Setup
|
|
52
|
+
|
|
53
|
+
To set up a fork for development:
|
|
54
|
+
|
|
55
|
+
1. Fork the repository on GitHub by clicking the "Fork" button on the [OpenSCvx repository page](https://github.com/haynec/OpenSCvx)
|
|
56
|
+
|
|
57
|
+
2. Clone your fork locally:
|
|
58
|
+
```bash
|
|
59
|
+
git clone git@github.com:YOUR_USERNAME/OpenSCvx.git
|
|
60
|
+
cd OpenSCvx
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
3. Add the upstream repository as a remote:
|
|
64
|
+
```bash
|
|
65
|
+
git remote add upstream git@github.com:haynec/OpenSCvx.git
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
4. Verify your remotes:
|
|
69
|
+
```bash
|
|
70
|
+
git remote -v
|
|
71
|
+
# origin git@github.com:YOUR_USERNAME/OpenSCvx.git (fetch)
|
|
72
|
+
# origin git@github.com:YOUR_USERNAME/OpenSCvx.git (push)
|
|
73
|
+
# upstream git@github.com:haynec/OpenSCvx.git (fetch)
|
|
74
|
+
# upstream git@github.com:haynec/OpenSCvx.git (push)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
5. Keep your fork up to date by periodically pulling from upstream:
|
|
78
|
+
```bash
|
|
79
|
+
git fetch upstream
|
|
80
|
+
git checkout main
|
|
81
|
+
git merge upstream/main
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
#### Branch Naming Conventions
|
|
85
|
+
|
|
86
|
+
We use [release-drafter](https://github.com/release-drafter/release-drafter) to automatically generate release notes based on pull request labels. These labels are auto-assigned based on your branch name prefix.
|
|
87
|
+
|
|
88
|
+
**Required branch prefixes:**
|
|
89
|
+
|
|
90
|
+
| Prefix | Label Applied | Release Category |
|
|
91
|
+
|--------|---------------|------------------|
|
|
92
|
+
| `feature/` | enhancement | Features |
|
|
93
|
+
| `fix/` | bug | Bug Fixes |
|
|
94
|
+
| `refactor/` | refactor | Maintenance |
|
|
95
|
+
| `chore/` | chore | Maintenance |
|
|
96
|
+
| `docs/` or `doc/` | documentation | Maintenance |
|
|
97
|
+
|
|
98
|
+
**Examples:**
|
|
99
|
+
- `feature/add-new-solver` - Adding a new solver option
|
|
100
|
+
- `fix/convergence-issue` - Fixing a bug
|
|
101
|
+
- `refactor/simplify-dynamics` - Code refactoring
|
|
102
|
+
- `chore/update-dependencies` - Maintenance tasks
|
|
103
|
+
- `docs/api-examples` - Documentation updates
|
|
104
|
+
|
|
105
|
+
See the [workflow](.github/workflows/release-drafter.yml) and [configuration](.github/release-drafter.yml) for details.
|
|
106
|
+
|
|
107
|
+
### Development Guidelines
|
|
108
|
+
|
|
109
|
+
#### Use of LLM-Based Tools
|
|
110
|
+
|
|
111
|
+
While the development of OpenSCvx has been greatly assisted by LLM-based tools for coding tasks, it is up to the contributor to use them in a responsible manner. We welcome their use, _but with great power comes great responsibility_.
|
|
112
|
+
|
|
113
|
+
Our goal is to produce a high-quality codebase that is well organized, easy to modify, easy to understand, and, most importantly, easy to maintain. We will not accept so-called _AI-slop_. Contributors are expected to:
|
|
114
|
+
|
|
115
|
+
1. **Understand every line** of code they submit. You are responsible for it, not the LLM
|
|
116
|
+
2. **Review and refactor** generated code to match the project's style and patterns
|
|
117
|
+
3. **Write meaningful commit messages and keep commits small-ish** to break the changes into bite-sized chunks that can be understood based on the commit message.
|
|
118
|
+
4. **Test thoroughly** - LLMs can generate plausible-looking but subtly incorrect code. See point 1.
|
|
119
|
+
|
|
120
|
+
#### Keep It Simple
|
|
121
|
+
|
|
122
|
+
We value simplicity over cleverness. Before adding code, ask yourself:
|
|
123
|
+
|
|
124
|
+
- **[YAGNI](https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it)**: "You Aren't Gonna Need It" - don't add functionality until it's actually needed
|
|
125
|
+
- **[KISS](https://en.wikipedia.org/wiki/KISS_principle)**: "Keep It Simple, Stupid" - the simplest solution is usually the best one
|
|
126
|
+
- **[Feature creep](https://en.wikipedia.org/wiki/Feature_creep)**: the enemy of maintainable software. A 10-line function that's easy to understand beats a 50-line "flexible" abstraction that handles hypothetical future requirements. When in doubt, leave it out.
|
|
127
|
+
|
|
128
|
+
While we don't always follow these rules, we try.
|
|
129
|
+
|
|
130
|
+
#### Code Style
|
|
131
|
+
|
|
132
|
+
We use [Ruff](https://github.com/astral-sh/ruff) for linting and formatting. Before submitting a PR, ensure your code passes:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
ruff check .
|
|
136
|
+
ruff format --check .
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
To auto-fix issues:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
ruff check --fix .
|
|
143
|
+
ruff format .
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
See the `[tool.ruff]` section in `pyproject.toml` for our configuration.
|
|
147
|
+
|
|
148
|
+
#### Testing
|
|
149
|
+
|
|
150
|
+
OpenSCvx uses `pytest` for automated testing. Tests run automatically via GitHub Actions:
|
|
151
|
+
|
|
152
|
+
- **[tests-unit.yml](.github/workflows/tests-unit.yml)**: Runs on every PR - fast unit tests including the brachistochrone benchmark
|
|
153
|
+
- **[tests-integration.yml](.github/workflows/tests-integration.yml)**: Runs weekly - full example problems as a smoke test
|
|
154
|
+
|
|
155
|
+
##### Running Tests Locally
|
|
156
|
+
|
|
157
|
+
For faster feedback during development, run tests locally:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
pytest tests/ # All unit tests
|
|
161
|
+
pytest tests/test_brachistochrone.py -v # Just the brachistochrone benchmark
|
|
162
|
+
pytest -v -m "not integration" # Skip expensive integration tests
|
|
163
|
+
pytest -v -m integration # Only integration tests (runs test_examples.py)
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
##### Brachistochrone Problem
|
|
167
|
+
|
|
168
|
+
The [brachistochrone problem](https://en.wikipedia.org/wiki/Brachistochrone_curve) serves as our primary validation benchmark. This classic problem asks for the curve of fastest descent under gravity between two points, and has a known analytical solution: the cycloid. We use it as part of the unit-test suite because:
|
|
169
|
+
|
|
170
|
+
- **Analytical solution exists**: We can validate numerical results against the exact cycloid curve
|
|
171
|
+
- **Small and fast**: The problem converges quickly, making it ideal for CI/CD pipelines
|
|
172
|
+
- **Representative**: It exercises core features like free final time optimization and nonlinear dynamics
|
|
173
|
+
|
|
174
|
+
##### Test-Driven Development
|
|
175
|
+
|
|
176
|
+
While we do not strictly follow [test driven development (TDD)](https://en.wikipedia.org/wiki/Test-driven_development), we aim to keep a representative test-suite where it makes sense to do so and leverage TDD when possible.
|
|
177
|
+
|
|
178
|
+
For example, the [symbolic-expression layer](openscvx/symbolic/__init__.py) is well covered by [tests](tests/symbolic/) which were written simultaneously with the symbolic layer.
|
|
179
|
+
|
|
180
|
+
The extensive test suite helps ensure that new features and refactors don't break existing functionality.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openscvx
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.2.dev127
|
|
4
4
|
Summary: A general Python-based successive convexification implementation which uses a JAX backend.
|
|
5
5
|
Author-email: Chris Hayner and Griffin Norris <haynec@uw.edu>
|
|
6
6
|
License: Apache Software License
|
|
@@ -19,6 +19,8 @@ Requires-Dist: termcolor
|
|
|
19
19
|
Requires-Dist: diffrax
|
|
20
20
|
Requires-Dist: absl-py
|
|
21
21
|
Requires-Dist: flatbuffers
|
|
22
|
+
Requires-Dist: viser
|
|
23
|
+
Requires-Dist: matplotlib
|
|
22
24
|
Provides-Extra: gui
|
|
23
25
|
Requires-Dist: pyqtgraph; extra == "gui"
|
|
24
26
|
Requires-Dist: PyQt5; extra == "gui"
|
|
@@ -154,12 +156,6 @@ For local development:
|
|
|
154
156
|
pip install -e ".[gui]"
|
|
155
157
|
```
|
|
156
158
|
|
|
157
|
-
The GUI features include:
|
|
158
|
-
- Interactive 3D trajectory visualization with `plot_animation_pyqtgraph()`
|
|
159
|
-
- SCP iteration animation with `plot_scp_animation_pyqtgraph()`
|
|
160
|
-
- Camera view animation with `plot_camera_animation_pyqtgraph()`
|
|
161
|
-
- Real-time optimization visualization in examples like `drone_racing_realtime.py`
|
|
162
|
-
|
|
163
159
|
#### CVXPYGen Dependencies (Optional)
|
|
164
160
|
|
|
165
161
|
For code generation and faster solver performance, CVXPYGen can be installed:
|
|
@@ -117,12 +117,6 @@ For local development:
|
|
|
117
117
|
pip install -e ".[gui]"
|
|
118
118
|
```
|
|
119
119
|
|
|
120
|
-
The GUI features include:
|
|
121
|
-
- Interactive 3D trajectory visualization with `plot_animation_pyqtgraph()`
|
|
122
|
-
- SCP iteration animation with `plot_scp_animation_pyqtgraph()`
|
|
123
|
-
- Camera view animation with `plot_camera_animation_pyqtgraph()`
|
|
124
|
-
- Real-time optimization visualization in examples like `drone_racing_realtime.py`
|
|
125
|
-
|
|
126
120
|
#### CVXPYGen Dependencies (Optional)
|
|
127
121
|
|
|
128
122
|
For code generation and faster solver performance, CVXPYGen can be installed:
|
|
@@ -55,17 +55,6 @@ Most examples follow this structure:
|
|
|
55
55
|
6. **Solving**: Run the optimization
|
|
56
56
|
7. **Visualization**: Plot and analyze results
|
|
57
57
|
|
|
58
|
-
## Interactive Examples
|
|
59
|
-
|
|
60
|
-
For interactive 3D visualization, many examples include GUI plotting functions:
|
|
61
|
-
|
|
62
|
-
```python
|
|
63
|
-
from examples.plotting import plot_animation_pyqtgraph
|
|
64
|
-
|
|
65
|
-
# After solving the problem
|
|
66
|
-
plot_animation_pyqtgraph(results).show()
|
|
67
|
-
```
|
|
68
|
-
|
|
69
58
|
## Performance Tips
|
|
70
59
|
|
|
71
60
|
- Start with simpler examples to understand the workflow
|
|
@@ -21,8 +21,12 @@ grandparent_dir = os.path.dirname(os.path.dirname(current_dir))
|
|
|
21
21
|
sys.path.append(grandparent_dir)
|
|
22
22
|
|
|
23
23
|
import openscvx as ox
|
|
24
|
-
from examples.
|
|
24
|
+
from examples.plotting_viser import (
|
|
25
|
+
create_pdg_animated_plotting_server,
|
|
26
|
+
create_scp_animated_plotting_server,
|
|
27
|
+
)
|
|
25
28
|
from openscvx import Problem
|
|
29
|
+
from openscvx.plotting import plot_controls, plot_projections_2d, plot_states, plot_vector_norm
|
|
26
30
|
|
|
27
31
|
n = 10
|
|
28
32
|
total_time = 95.0 # Total simulation time
|
|
@@ -159,6 +163,7 @@ problem.settings.cvx.solver_args = {"enforce_dpp": True}
|
|
|
159
163
|
plotting_dict = {
|
|
160
164
|
"rho_min": rho_min,
|
|
161
165
|
"rho_max": rho_max,
|
|
166
|
+
"glideslope_angle_deg": 86.0,
|
|
162
167
|
}
|
|
163
168
|
|
|
164
169
|
if __name__ == "__main__":
|
|
@@ -167,12 +172,26 @@ if __name__ == "__main__":
|
|
|
167
172
|
results = problem.post_process()
|
|
168
173
|
results.update(plotting_dict)
|
|
169
174
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
175
|
+
plot_states(results, ["position", "velocity"]).show()
|
|
176
|
+
plot_controls(results, ["thrust"]).show()
|
|
177
|
+
plot_vector_norm(results, "thrust", bounds=(rho_min, rho_max)).show()
|
|
178
|
+
plot_projections_2d(results, velocity_var_name="velocity").show()
|
|
179
|
+
|
|
180
|
+
# Create PDG trajectory visualization
|
|
181
|
+
# scene_scale=100 brings 2000m scale down to ~20m for viser
|
|
182
|
+
traj_server = create_pdg_animated_plotting_server(
|
|
183
|
+
results,
|
|
184
|
+
thrust_key="thrust",
|
|
185
|
+
glideslope_angle_deg=86.0,
|
|
186
|
+
scene_scale=100.0,
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
# Create SCP iteration visualization
|
|
190
|
+
scp_server = create_scp_animated_plotting_server(
|
|
191
|
+
results,
|
|
192
|
+
frame_duration_ms=200,
|
|
193
|
+
scene_scale=100.0,
|
|
194
|
+
)
|
|
176
195
|
|
|
177
|
-
#
|
|
178
|
-
|
|
196
|
+
# Keep servers running
|
|
197
|
+
traj_server.sleep_forever()
|
|
@@ -23,7 +23,10 @@ grandparent_dir = os.path.dirname(os.path.dirname(current_dir))
|
|
|
23
23
|
sys.path.append(grandparent_dir)
|
|
24
24
|
|
|
25
25
|
import openscvx as ox
|
|
26
|
-
from examples.
|
|
26
|
+
from examples.plotting_viser import (
|
|
27
|
+
create_animated_plotting_server,
|
|
28
|
+
create_scp_animated_plotting_server,
|
|
29
|
+
)
|
|
27
30
|
from openscvx import Problem
|
|
28
31
|
from openscvx.utils import get_kp_pose
|
|
29
32
|
|
|
@@ -261,11 +264,9 @@ plotting_dict = {
|
|
|
261
264
|
"alpha_x": alpha_x,
|
|
262
265
|
"alpha_y": alpha_y,
|
|
263
266
|
"R_sb": R_sb,
|
|
264
|
-
"init_poses": init_pose,
|
|
265
267
|
"norm_type": norm_type,
|
|
266
268
|
"min_range": min_range,
|
|
267
269
|
"max_range": max_range,
|
|
268
|
-
"moving_subject": True,
|
|
269
270
|
}
|
|
270
271
|
|
|
271
272
|
if __name__ == "__main__":
|
|
@@ -273,6 +274,24 @@ if __name__ == "__main__":
|
|
|
273
274
|
results = problem.solve()
|
|
274
275
|
results = problem.post_process()
|
|
275
276
|
|
|
277
|
+
# Compute moving target trajectory using the post-processed time array
|
|
278
|
+
traj_time = results.trajectory["time"].flatten()
|
|
279
|
+
target_trajectory = np.asarray(get_kp_pose(traj_time, init_pose))
|
|
280
|
+
plotting_dict["init_poses"] = [target_trajectory] # List of target trajectories
|
|
281
|
+
|
|
276
282
|
results.update(plotting_dict)
|
|
277
283
|
|
|
278
|
-
|
|
284
|
+
# Create both visualization servers (viser auto-assigns ports)
|
|
285
|
+
traj_server = create_animated_plotting_server(
|
|
286
|
+
results,
|
|
287
|
+
thrust_key="thrust_force",
|
|
288
|
+
viewcone_scale=10.0,
|
|
289
|
+
)
|
|
290
|
+
scp_server = create_scp_animated_plotting_server(
|
|
291
|
+
results,
|
|
292
|
+
attitude_stride=3,
|
|
293
|
+
frame_duration_ms=200,
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
# Keep both servers running
|
|
297
|
+
traj_server.sleep_forever()
|
|
@@ -23,7 +23,6 @@ grandparent_dir = os.path.dirname(os.path.dirname(current_dir))
|
|
|
23
23
|
sys.path.append(grandparent_dir)
|
|
24
24
|
|
|
25
25
|
import openscvx as ox
|
|
26
|
-
from examples.plotting import plot_animation
|
|
27
26
|
from openscvx import Problem
|
|
28
27
|
|
|
29
28
|
n = 12 # Number of Nodes
|
|
@@ -229,5 +228,3 @@ if __name__ == "__main__":
|
|
|
229
228
|
results = problem.post_process()
|
|
230
229
|
|
|
231
230
|
results.update(plotting_dict)
|
|
232
|
-
|
|
233
|
-
plot_animation(results, problem.settings).show()
|
|
@@ -22,7 +22,10 @@ grandparent_dir = os.path.dirname(os.path.dirname(current_dir))
|
|
|
22
22
|
sys.path.append(grandparent_dir)
|
|
23
23
|
|
|
24
24
|
import openscvx as ox
|
|
25
|
-
from examples.
|
|
25
|
+
from examples.plotting_viser import (
|
|
26
|
+
create_animated_plotting_server,
|
|
27
|
+
create_scp_animated_plotting_server,
|
|
28
|
+
)
|
|
26
29
|
from openscvx import Problem
|
|
27
30
|
from openscvx.utils import gen_vertices, rot
|
|
28
31
|
|
|
@@ -134,7 +137,7 @@ for _ in range(n_gates + 1):
|
|
|
134
137
|
|
|
135
138
|
position.guess = position_bar
|
|
136
139
|
|
|
137
|
-
|
|
140
|
+
t = ox.Time(
|
|
138
141
|
initial=0.0,
|
|
139
142
|
final=("minimize", total_time),
|
|
140
143
|
min=0.0,
|
|
@@ -145,7 +148,7 @@ problem = Problem(
|
|
|
145
148
|
dynamics=dynamics,
|
|
146
149
|
states=states,
|
|
147
150
|
controls=controls,
|
|
148
|
-
time=
|
|
151
|
+
time=t,
|
|
149
152
|
constraints=constraint_exprs,
|
|
150
153
|
N=n,
|
|
151
154
|
)
|
|
@@ -175,4 +178,17 @@ if __name__ == "__main__":
|
|
|
175
178
|
|
|
176
179
|
results.update(plotting_dict)
|
|
177
180
|
|
|
178
|
-
|
|
181
|
+
# Create both visualization servers (viser auto-assigns ports)
|
|
182
|
+
traj_server = create_animated_plotting_server(
|
|
183
|
+
results,
|
|
184
|
+
thrust_key="force",
|
|
185
|
+
viewcone_scale=10.0,
|
|
186
|
+
)
|
|
187
|
+
scp_server = create_scp_animated_plotting_server(
|
|
188
|
+
results,
|
|
189
|
+
attitude_stride=3,
|
|
190
|
+
frame_duration_ms=200,
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
# Keep both servers running
|
|
194
|
+
traj_server.sleep_forever()
|
|
@@ -23,7 +23,10 @@ grandparent_dir = os.path.dirname(os.path.dirname(current_dir))
|
|
|
23
23
|
sys.path.append(grandparent_dir)
|
|
24
24
|
|
|
25
25
|
import openscvx as ox
|
|
26
|
-
from examples.
|
|
26
|
+
from examples.plotting_viser import (
|
|
27
|
+
create_animated_plotting_server,
|
|
28
|
+
create_scp_animated_plotting_server,
|
|
29
|
+
)
|
|
27
30
|
from openscvx import Problem
|
|
28
31
|
from openscvx.utils import gen_vertices, rot
|
|
29
32
|
|
|
@@ -240,7 +243,7 @@ problem = Problem(
|
|
|
240
243
|
N=n,
|
|
241
244
|
)
|
|
242
245
|
|
|
243
|
-
problem.settings.prp.dt = 0.
|
|
246
|
+
problem.settings.prp.dt = 0.01
|
|
244
247
|
|
|
245
248
|
|
|
246
249
|
problem.settings.scp.w_tr = 2e0 # Weight on the Trust Reigon
|
|
@@ -273,5 +276,19 @@ if __name__ == "__main__":
|
|
|
273
276
|
|
|
274
277
|
results.update(plotting_dict)
|
|
275
278
|
|
|
276
|
-
|
|
277
|
-
|
|
279
|
+
# Create both visualization servers (viser auto-assigns ports)
|
|
280
|
+
traj_server = create_animated_plotting_server(
|
|
281
|
+
results,
|
|
282
|
+
thrust_key="thrust_force",
|
|
283
|
+
viewcone_scale=10.0,
|
|
284
|
+
show_control_plot="thrust_force",
|
|
285
|
+
show_control_norm_plot="thrust_force",
|
|
286
|
+
)
|
|
287
|
+
scp_server = create_scp_animated_plotting_server(
|
|
288
|
+
results,
|
|
289
|
+
attitude_stride=3,
|
|
290
|
+
frame_duration_ms=200,
|
|
291
|
+
)
|
|
292
|
+
|
|
293
|
+
# Keep both servers running
|
|
294
|
+
traj_server.sleep_forever()
|
|
@@ -23,7 +23,10 @@ grandparent_dir = os.path.dirname(os.path.dirname(current_dir))
|
|
|
23
23
|
sys.path.append(grandparent_dir)
|
|
24
24
|
|
|
25
25
|
import openscvx as ox
|
|
26
|
-
from examples.
|
|
26
|
+
from examples.plotting_viser import (
|
|
27
|
+
create_animated_plotting_server,
|
|
28
|
+
create_scp_animated_plotting_server,
|
|
29
|
+
)
|
|
27
30
|
from openscvx import Problem
|
|
28
31
|
from openscvx.utils import gen_vertices, rot
|
|
29
32
|
|
|
@@ -275,4 +278,19 @@ if __name__ == "__main__":
|
|
|
275
278
|
|
|
276
279
|
results.update_plotting_data(**plotting_dict)
|
|
277
280
|
|
|
278
|
-
|
|
281
|
+
# Create both visualization servers (viser auto-assigns ports)
|
|
282
|
+
traj_server = create_animated_plotting_server(
|
|
283
|
+
results,
|
|
284
|
+
thrust_key="thrust_force",
|
|
285
|
+
show_control_plot="thrust_force",
|
|
286
|
+
show_control_norm_plot="thrust_force",
|
|
287
|
+
viewcone_scale=10.0,
|
|
288
|
+
)
|
|
289
|
+
scp_server = create_scp_animated_plotting_server(
|
|
290
|
+
results,
|
|
291
|
+
attitude_stride=3,
|
|
292
|
+
frame_duration_ms=200,
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
# Keep both servers running
|
|
296
|
+
traj_server.sleep_forever()
|
|
@@ -24,7 +24,10 @@ grandparent_dir = os.path.dirname(os.path.dirname(current_dir))
|
|
|
24
24
|
sys.path.append(grandparent_dir)
|
|
25
25
|
|
|
26
26
|
import openscvx as ox
|
|
27
|
-
from examples.
|
|
27
|
+
from examples.plotting_viser import (
|
|
28
|
+
create_animated_plotting_server,
|
|
29
|
+
create_scp_animated_plotting_server,
|
|
30
|
+
)
|
|
28
31
|
from openscvx import Problem
|
|
29
32
|
from openscvx.utils import gen_vertices, rot
|
|
30
33
|
|
|
@@ -288,4 +291,20 @@ if __name__ == "__main__":
|
|
|
288
291
|
results = problem.solve()
|
|
289
292
|
results = problem.post_process()
|
|
290
293
|
results.update(plotting_dict)
|
|
291
|
-
|
|
294
|
+
|
|
295
|
+
# Create both visualization servers (viser auto-assigns ports)
|
|
296
|
+
traj_server = create_animated_plotting_server(
|
|
297
|
+
results,
|
|
298
|
+
thrust_key="thrust_force",
|
|
299
|
+
viewcone_scale=10.0,
|
|
300
|
+
show_control_plot="thrust_force",
|
|
301
|
+
show_control_norm_plot="thrust_force",
|
|
302
|
+
)
|
|
303
|
+
scp_server = create_scp_animated_plotting_server(
|
|
304
|
+
results,
|
|
305
|
+
attitude_stride=3,
|
|
306
|
+
frame_duration_ms=200,
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
# Keep both servers running
|
|
310
|
+
traj_server.sleep_forever()
|
|
@@ -21,7 +21,10 @@ grandparent_dir = os.path.dirname(os.path.dirname(current_dir))
|
|
|
21
21
|
sys.path.append(grandparent_dir)
|
|
22
22
|
|
|
23
23
|
import openscvx as ox
|
|
24
|
-
from examples.
|
|
24
|
+
from examples.plotting_viser import (
|
|
25
|
+
create_animated_plotting_server,
|
|
26
|
+
create_scp_animated_plotting_server,
|
|
27
|
+
)
|
|
25
28
|
from openscvx import Problem
|
|
26
29
|
from openscvx.utils import gen_vertices, rot
|
|
27
30
|
|
|
@@ -309,4 +312,19 @@ if __name__ == "__main__":
|
|
|
309
312
|
|
|
310
313
|
results.update(plotting_dict)
|
|
311
314
|
|
|
312
|
-
|
|
315
|
+
# Create both visualization servers (viser auto-assigns ports)
|
|
316
|
+
traj_server = create_animated_plotting_server(
|
|
317
|
+
results,
|
|
318
|
+
thrust_key="thrust_force",
|
|
319
|
+
viewcone_scale=10.0,
|
|
320
|
+
show_control_plot="thrust_force",
|
|
321
|
+
show_control_norm_plot="thrust_force",
|
|
322
|
+
)
|
|
323
|
+
scp_server = create_scp_animated_plotting_server(
|
|
324
|
+
results,
|
|
325
|
+
attitude_stride=3,
|
|
326
|
+
frame_duration_ms=200,
|
|
327
|
+
)
|
|
328
|
+
|
|
329
|
+
# Keep both servers running
|
|
330
|
+
traj_server.sleep_forever()
|
|
@@ -22,7 +22,10 @@ grandparent_dir = os.path.dirname(os.path.dirname(current_dir))
|
|
|
22
22
|
sys.path.append(grandparent_dir)
|
|
23
23
|
|
|
24
24
|
import openscvx as ox
|
|
25
|
-
from examples.
|
|
25
|
+
from examples.plotting_viser import (
|
|
26
|
+
create_animated_plotting_server,
|
|
27
|
+
create_scp_animated_plotting_server,
|
|
28
|
+
)
|
|
26
29
|
from openscvx import Problem
|
|
27
30
|
from openscvx.utils import generate_orthogonal_unit_vectors
|
|
28
31
|
|
|
@@ -157,7 +160,7 @@ problem = Problem(
|
|
|
157
160
|
N=n,
|
|
158
161
|
)
|
|
159
162
|
|
|
160
|
-
problem.settings.prp.dt = 0.
|
|
163
|
+
problem.settings.prp.dt = 0.001
|
|
161
164
|
problem.settings.scp.lam_vb = 1e0
|
|
162
165
|
problem.settings.scp.w_tr_adapt = 1.8
|
|
163
166
|
problem.settings.scp.w_tr = 1e1
|
|
@@ -179,4 +182,17 @@ if __name__ == "__main__":
|
|
|
179
182
|
|
|
180
183
|
results.update(plotting_dict)
|
|
181
184
|
|
|
182
|
-
|
|
185
|
+
# Create both visualization servers (viser auto-assigns ports)
|
|
186
|
+
traj_server = create_animated_plotting_server(
|
|
187
|
+
results,
|
|
188
|
+
thrust_key="thrust_force",
|
|
189
|
+
viewcone_scale=10.0,
|
|
190
|
+
)
|
|
191
|
+
scp_server = create_scp_animated_plotting_server(
|
|
192
|
+
results,
|
|
193
|
+
attitude_stride=3,
|
|
194
|
+
frame_duration_ms=200,
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
# Keep both servers running
|
|
198
|
+
traj_server.sleep_forever()
|
|
@@ -21,7 +21,10 @@ grandparent_dir = os.path.dirname(os.path.dirname(current_dir))
|
|
|
21
21
|
sys.path.append(grandparent_dir)
|
|
22
22
|
|
|
23
23
|
import openscvx as ox
|
|
24
|
-
from examples.
|
|
24
|
+
from examples.plotting_viser import (
|
|
25
|
+
create_animated_plotting_server,
|
|
26
|
+
create_scp_animated_plotting_server,
|
|
27
|
+
)
|
|
25
28
|
from openscvx import Problem
|
|
26
29
|
from openscvx.utils import generate_orthogonal_unit_vectors
|
|
27
30
|
|
|
@@ -173,4 +176,17 @@ if __name__ == "__main__":
|
|
|
173
176
|
|
|
174
177
|
results.update(plotting_dict)
|
|
175
178
|
|
|
176
|
-
|
|
179
|
+
# Create both visualization servers (viser auto-assigns ports)
|
|
180
|
+
traj_server = create_animated_plotting_server(
|
|
181
|
+
results,
|
|
182
|
+
thrust_key="thrust_force",
|
|
183
|
+
viewcone_scale=10.0,
|
|
184
|
+
)
|
|
185
|
+
scp_server = create_scp_animated_plotting_server(
|
|
186
|
+
results,
|
|
187
|
+
attitude_stride=3,
|
|
188
|
+
frame_duration_ms=200,
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
# Keep both servers running
|
|
192
|
+
traj_server.sleep_forever()
|
{openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/obstacle_avoidance_realtime_base.py
RENAMED
|
@@ -22,7 +22,10 @@ grandparent_dir = os.path.dirname(os.path.dirname(current_dir))
|
|
|
22
22
|
sys.path.append(grandparent_dir)
|
|
23
23
|
|
|
24
24
|
import openscvx as ox
|
|
25
|
-
from examples.
|
|
25
|
+
from examples.plotting_viser import (
|
|
26
|
+
create_animated_plotting_server,
|
|
27
|
+
create_scp_animated_plotting_server,
|
|
28
|
+
)
|
|
26
29
|
from openscvx import Problem
|
|
27
30
|
from openscvx.utils import generate_orthogonal_unit_vectors
|
|
28
31
|
|
|
@@ -177,4 +180,17 @@ if __name__ == "__main__":
|
|
|
177
180
|
|
|
178
181
|
results.update(plotting_dict)
|
|
179
182
|
|
|
180
|
-
|
|
183
|
+
# Create both visualization servers (viser auto-assigns ports)
|
|
184
|
+
traj_server = create_animated_plotting_server(
|
|
185
|
+
results,
|
|
186
|
+
thrust_key="thrust_force",
|
|
187
|
+
viewcone_scale=10.0,
|
|
188
|
+
)
|
|
189
|
+
scp_server = create_scp_animated_plotting_server(
|
|
190
|
+
results,
|
|
191
|
+
attitude_stride=3,
|
|
192
|
+
frame_duration_ms=200,
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
# Keep both servers running
|
|
196
|
+
traj_server.sleep_forever()
|