openscvx 0.3.2.dev184__tar.gz → 0.3.2.dev204__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.dev184/openscvx.egg-info → openscvx-0.3.2.dev204}/PKG-INFO +1 -1
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/drone/dr_vp.py +18 -15
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/drone/dr_vp_nodal.py +18 -15
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/drone/dr_vp_polytope.py +13 -12
- openscvx-0.3.2.dev204/examples/drone/obstacle_avoidance_vmap.py +238 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/__init__.py +7 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/_version.py +3 -3
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/__init__.py +9 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/math.py +202 -0
- openscvx-0.3.2.dev204/openscvx/symbolic/expr/vmap.py +321 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/lowerers/cvxpy.py +33 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/lowerers/jax.py +147 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204/openscvx.egg-info}/PKG-INFO +1 -1
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx.egg-info/SOURCES.txt +4 -1
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_math.py +676 -0
- openscvx-0.3.2.dev204/tests/symbolic/expr/test_vmap.py +414 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/.github/assets/logo.svg +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/.github/release-drafter.yml +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/.github/workflows/_docs.yml +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/.github/workflows/docs.yml +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/.github/workflows/lint.yml +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/.github/workflows/nightly.yml +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/.github/workflows/release-drafter.yml +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/.github/workflows/release.yml +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/.github/workflows/tests-integration.yml +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/.github/workflows/tests-unit.yml +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/.gitignore +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/CONTRIBUTING.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/LICENSE +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/README.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/Overview/constraint_reformulation.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/Overview/control_parameterization.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/Overview/discretization.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/Overview/ocp.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/Overview/scvx.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/Overview/time_dilation.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/UnderTheHood/lowering_architecture.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/Usage/advanced_problem_setup.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/Usage/api.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/Usage/api_constraints.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/Usage/api_control.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/Usage/api_integrators.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/Usage/api_state.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/Usage/api_trajoptproblem.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/Usage/api_variable.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/Usage/basic_problem_setup.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/Usage/tutorial_6dof_los_guidance.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/Usage/tutorial_6dof_obstacle_avoidance.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/Usage/tutorials.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/assets/favicon.png +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/assets/images/ct-scvx_dark.png +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/assets/images/ct-scvx_light.png +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/assets/images/ctcs_dark.png +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/assets/images/ctcs_light.png +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/assets/images/problem_class_dark.png +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/assets/images/problem_class_light.png +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/assets/logo.svg +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/citation.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/examples.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/getting-started.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/index.md +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/docs/javascripts/mathjax.js +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/abstract/3DoF_pdg.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/abstract/brachistochrone.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/arm/three_link_arm.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/car/dubins_car.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/car/dubins_car_disjoint.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/car/dubins_car_stljax.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/drone/cinema_vp.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/drone/cinema_vp_realtime_base.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/drone/dr_double_integrator.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/drone/drone_racing.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/drone/obstacle_avoidance.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/drone/obstacle_avoidance_nodal.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/drone/obstacle_avoidance_realtime_base.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/plotting.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/plotting_viser.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/realtime/cinema_vp_realtime.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/realtime/drone_racing_realtime.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/realtime/dubins_car_realtime.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/examples/spacecraft/proxops_cw.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/figures/ctlos_cine.gif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/figures/ctlos_dr.gif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/figures/dtlos_cine.gif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/figures/dtlos_dr.gif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/figures/openscvx_logo.svg +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/figures/openscvx_logo_square.png +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/figures/oscvx_structure_full_dark.svg +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/figures/video_preview.png +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/__init__.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/1-background.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/1-background@1x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/1-background@2x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/1-background@3x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/1-background@4x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/2-mars.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/2-mars@1x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/2-mars@2x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/2-mars@3x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/2-mars@4x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/3-moon.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/3-moon@1x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/3-moon@2x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/3-moon@3x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/3-moon@4x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/4-sat1.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/4-sat1@1x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/4-sat1@2x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/4-sat1@3x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/4-sat1@4x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/5-space.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/5-space@1x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/5-space@2x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/5-space@3x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/5-space@4x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/6-earth.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/6-earth@1x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/6-earth@2x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/6-earth@3x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/6-earth@4x.avif +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/javascripts/parallax.js +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/logo.svg +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/stylesheets/custom.css +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/assets/stylesheets/parallax.css +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/home.html +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/main.html +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/partials/parallax/hero.html +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/material/overrides/partials/parallax.html +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/mkdocs.yml +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/algorithms/__init__.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/algorithms/autotuning.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/algorithms/base.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/algorithms/optimization_results.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/algorithms/penalized_trust_region.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/config.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/discretization/__init__.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/discretization/discretization.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/expert/__init__.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/expert/byof.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/expert/lowering.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/expert/validation.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/integrators/__init__.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/integrators/runge_kutta.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/lowered/__init__.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/lowered/cvxpy_constraints.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/lowered/cvxpy_variables.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/lowered/dynamics.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/lowered/jax_constraints.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/lowered/parameters.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/lowered/problem.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/lowered/unified.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/plotting/__init__.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/plotting/plotting.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/plotting/scp_iteration.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/plotting/viser/__init__.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/plotting/viser/animated.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/plotting/viser/plotly_integration.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/plotting/viser/primitives.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/plotting/viser/scp.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/plotting/viser/server.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/problem.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/propagation/__init__.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/propagation/post_processing.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/propagation/propagation.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/solvers/__init__.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/solvers/cvxpy.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/__init__.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/augmentation.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/builder.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/constraint_set.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/arithmetic.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/array.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/constraint.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/control.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/expr.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/lie/__init__.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/lie/se3.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/lie/so3.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/linalg.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/spatial.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/state.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/stl.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/variable.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/hashing.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/lower.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/lowerers/__init__.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/preprocessing.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/problem.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/time.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/symbolic/unified.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/utils/__init__.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/utils/cache.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/utils/caching.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/utils/printing.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/utils/profiling.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx/utils/utils.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx.egg-info/dependency_links.txt +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx.egg-info/requires.txt +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/openscvx.egg-info/top_level.txt +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/pyproject.toml +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/scripts/gen_example_pages.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/scripts/gen_ref_pages.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/setup.cfg +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/__init__.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/brachistochrone_analytical.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/__init__.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/expr/__init__.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_arithmetic.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_array.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_constraint.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_expr.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_lie.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_linalg.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_node_reference.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_parameters.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_scaling.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_spatial.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_variable.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/test_augmentation.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/test_hashing.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/test_lower_cvxpy.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/test_lower_jax.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/test_preprocessing.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/symbolic/test_unified.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/test_brachistochrone.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/test_cvxpygen_optional.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/test_discretization.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/test_examples.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/test_expert.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/test_integrators.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/test_plotting.py +0 -0
- {openscvx-0.3.2.dev184 → openscvx-0.3.2.dev204}/tests/test_propagation.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openscvx
|
|
3
|
-
Version: 0.3.2.
|
|
3
|
+
Version: 0.3.2.dev204
|
|
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
|
|
@@ -116,14 +116,13 @@ for center in gate_centers:
|
|
|
116
116
|
### End Gate Parameters ###
|
|
117
117
|
|
|
118
118
|
n_subs = 10
|
|
119
|
-
init_poses = []
|
|
120
119
|
np.random.seed(0)
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
120
|
+
init_poses = np.array(
|
|
121
|
+
[
|
|
122
|
+
[100.0 + np.random.random() * 20.0, -60.0 + np.random.random() * 20.0, 20.0]
|
|
123
|
+
for _ in range(n_subs)
|
|
124
|
+
]
|
|
125
|
+
) # Shape: (n_subs, 3)
|
|
127
126
|
|
|
128
127
|
|
|
129
128
|
# Define list of all states (needed for Problem and constraints)
|
|
@@ -142,9 +141,16 @@ constraints = []
|
|
|
142
141
|
for state in states:
|
|
143
142
|
constraints.extend([ox.ctcs(state <= state.max), ox.ctcs(state.min <= state)])
|
|
144
143
|
|
|
145
|
-
# Add visibility constraints using
|
|
146
|
-
|
|
147
|
-
|
|
144
|
+
# Add visibility constraints using Vmap for parallel evaluation
|
|
145
|
+
# Single CTCS constraint with vectorized evaluation over all target poses
|
|
146
|
+
visibility_constraint = ox.ctcs(
|
|
147
|
+
ox.Vmap(
|
|
148
|
+
lambda pose: g_vp(pose, position, attitude),
|
|
149
|
+
batch=init_poses,
|
|
150
|
+
)
|
|
151
|
+
<= 0.0
|
|
152
|
+
)
|
|
153
|
+
constraints.append(visibility_constraint)
|
|
148
154
|
|
|
149
155
|
# Add gate constraints using symbolic expressions
|
|
150
156
|
for node, cen in zip(gate_nodes, A_gate_cen):
|
|
@@ -207,12 +213,9 @@ for _ in range(n_gates + 1):
|
|
|
207
213
|
# Modify attitude to point sensor at targets
|
|
208
214
|
R_sb = R_sb # Sensor to body frame
|
|
209
215
|
b = R_sb @ np.array([0, 1, 0])
|
|
216
|
+
mean_target = np.mean(init_poses, axis=0) # Average target position
|
|
210
217
|
for k in range(n):
|
|
211
|
-
|
|
212
|
-
for pose in init_poses:
|
|
213
|
-
kp.append(pose)
|
|
214
|
-
kp = np.mean(kp, axis=0)
|
|
215
|
-
a = kp - position_bar[k]
|
|
218
|
+
a = mean_target - position_bar[k]
|
|
216
219
|
# Determine the direction cosine matrix that aligns the z-axis of the sensor frame with the
|
|
217
220
|
# relative position vector
|
|
218
221
|
q_xyz = np.cross(b, a)
|
|
@@ -116,14 +116,13 @@ for center in gate_centers:
|
|
|
116
116
|
### End Gate Parameters ###
|
|
117
117
|
|
|
118
118
|
n_subs = 10
|
|
119
|
-
init_poses = []
|
|
120
119
|
np.random.seed(5)
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
120
|
+
init_poses = np.array(
|
|
121
|
+
[
|
|
122
|
+
[100.0 + np.random.random() * 20.0, -70.0 + np.random.random() * 20.0, 20.0]
|
|
123
|
+
for _ in range(n_subs)
|
|
124
|
+
]
|
|
125
|
+
) # Shape: (n_subs, 3)
|
|
127
126
|
|
|
128
127
|
|
|
129
128
|
# Define list of all states (needed for Problem and constraints)
|
|
@@ -142,9 +141,16 @@ constraints = []
|
|
|
142
141
|
for state in states:
|
|
143
142
|
constraints.extend([ox.ctcs(state <= state.max), ox.ctcs(state.min <= state)])
|
|
144
143
|
|
|
145
|
-
# Add visibility constraints using
|
|
146
|
-
|
|
147
|
-
|
|
144
|
+
# Add visibility constraints using Vmap for parallel evaluation
|
|
145
|
+
# Single nodal constraint with vectorized evaluation over all target poses
|
|
146
|
+
visibility_constraint = (
|
|
147
|
+
ox.Vmap(
|
|
148
|
+
lambda pose: g_vp(pose, position, attitude),
|
|
149
|
+
batch=init_poses,
|
|
150
|
+
)
|
|
151
|
+
<= 0.0
|
|
152
|
+
)
|
|
153
|
+
constraints.append(visibility_constraint)
|
|
148
154
|
|
|
149
155
|
# Add gate constraints using symbolic expressions
|
|
150
156
|
for node, cen in zip(gate_nodes, A_gate_cen):
|
|
@@ -207,12 +213,9 @@ for _ in range(n_gates + 1):
|
|
|
207
213
|
# Modify attitude to point sensor at targets
|
|
208
214
|
R_sb = R_sb # Sensor to body frame
|
|
209
215
|
b = R_sb @ np.array([0, 1, 0])
|
|
216
|
+
mean_target = np.mean(init_poses, axis=0) # Average target position
|
|
210
217
|
for k in range(n):
|
|
211
|
-
|
|
212
|
-
for pose in init_poses:
|
|
213
|
-
kp.append(pose)
|
|
214
|
-
kp = np.mean(kp, axis=0)
|
|
215
|
-
a = kp - position_bar[k]
|
|
218
|
+
a = mean_target - position_bar[k]
|
|
216
219
|
# Determine the direction cosine matrix that aligns the z-axis of the sensor frame with the
|
|
217
220
|
# relative position vector
|
|
218
221
|
q_xyz = np.cross(b, a)
|
|
@@ -111,10 +111,7 @@ polytope_point = np.array(
|
|
|
111
111
|
[107.47, -50.00, 22.85],
|
|
112
112
|
]
|
|
113
113
|
)
|
|
114
|
-
init_poses =
|
|
115
|
-
for point in polytope_point:
|
|
116
|
-
init_poses.append(point)
|
|
117
|
-
init_poses = init_poses
|
|
114
|
+
init_poses = polytope_point # Shape: (20, 3)
|
|
118
115
|
### Gate Parameters ###
|
|
119
116
|
n_gates = 10
|
|
120
117
|
gate_centers = [
|
|
@@ -162,9 +159,16 @@ constraints = []
|
|
|
162
159
|
for state in states:
|
|
163
160
|
constraints.extend([ox.ctcs(state <= state.max), ox.ctcs(state.min <= state)])
|
|
164
161
|
|
|
165
|
-
# Add visibility constraints
|
|
166
|
-
|
|
167
|
-
|
|
162
|
+
# Add visibility constraints using Vmap for parallel evaluation
|
|
163
|
+
# Single CTCS constraint with vectorized evaluation over all polytope points
|
|
164
|
+
visibility_constraint = ox.ctcs(
|
|
165
|
+
ox.Vmap(
|
|
166
|
+
lambda pose: g_vp(pose, position, attitude),
|
|
167
|
+
batch=init_poses,
|
|
168
|
+
)
|
|
169
|
+
<= 0.0
|
|
170
|
+
)
|
|
171
|
+
constraints.append(visibility_constraint)
|
|
168
172
|
|
|
169
173
|
# Add gate constraints using symbolic expressions
|
|
170
174
|
for node, cen in zip(gate_nodes, A_gate_cen):
|
|
@@ -227,12 +231,9 @@ for _ in range(n_gates + 1):
|
|
|
227
231
|
# Modify attitude to point sensor at targets
|
|
228
232
|
R_sb = R_sb # Sensor to body frame
|
|
229
233
|
b = R_sb @ np.array([0, 1, 0])
|
|
234
|
+
mean_target = np.mean(init_poses, axis=0) # Average target position
|
|
230
235
|
for k in range(n):
|
|
231
|
-
|
|
232
|
-
for pose in init_poses:
|
|
233
|
-
kp.append(pose)
|
|
234
|
-
kp = np.mean(kp, axis=0)
|
|
235
|
-
a = kp - position_bar[k]
|
|
236
|
+
a = mean_target - position_bar[k]
|
|
236
237
|
# Determine the direction cosine matrix that aligns the z-axis of the sensor frame with the
|
|
237
238
|
# relative position vector
|
|
238
239
|
q_xyz = np.cross(b, a)
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"""Double integrator obstacle avoidance with Vmap for parallel constraint evaluation.
|
|
2
|
+
|
|
3
|
+
This example demonstrates using ox.Vmap directly in constraints for data-parallel
|
|
4
|
+
obstacle avoidance with numerous spherical obstacles.
|
|
5
|
+
|
|
6
|
+
The approach:
|
|
7
|
+
|
|
8
|
+
1. Stack all obstacle centers into a single array
|
|
9
|
+
2. Use Vmap directly in the constraint to compute distances in parallel
|
|
10
|
+
3. The vector-valued constraint is enforced element-wise
|
|
11
|
+
|
|
12
|
+
Compare with:
|
|
13
|
+
- obstacle_avoidance.py (manual loop over 3 obstacles)
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import os
|
|
17
|
+
import sys
|
|
18
|
+
|
|
19
|
+
import numpy as np
|
|
20
|
+
|
|
21
|
+
# Add grandparent directory to path to import examples.plotting
|
|
22
|
+
current_dir = os.path.dirname(os.path.abspath(__file__))
|
|
23
|
+
grandparent_dir = os.path.dirname(os.path.dirname(current_dir))
|
|
24
|
+
sys.path.append(grandparent_dir)
|
|
25
|
+
|
|
26
|
+
import openscvx as ox
|
|
27
|
+
from examples.plotting_viser import (
|
|
28
|
+
create_animated_plotting_server,
|
|
29
|
+
create_scp_animated_plotting_server,
|
|
30
|
+
)
|
|
31
|
+
from openscvx import Problem
|
|
32
|
+
|
|
33
|
+
n = 6 # Number of nodes
|
|
34
|
+
total_time = 10.0 # Total time for the simulation
|
|
35
|
+
|
|
36
|
+
# =============================================================================
|
|
37
|
+
# State and Control Definitions
|
|
38
|
+
# =============================================================================
|
|
39
|
+
|
|
40
|
+
# 3D position
|
|
41
|
+
position = ox.State("position", shape=(3,))
|
|
42
|
+
position.max = np.array([15.0, 15.0, 15.0])
|
|
43
|
+
position.min = np.array([-15.0, -15.0, 0.0])
|
|
44
|
+
position.initial = np.array([-10.0, -10.0, 2.0])
|
|
45
|
+
position.final = np.array([10.0, 10.0, 2.0])
|
|
46
|
+
|
|
47
|
+
# 3D velocity
|
|
48
|
+
velocity = ox.State("velocity", shape=(3,))
|
|
49
|
+
velocity.max = np.array([10.0, 10.0, 10.0])
|
|
50
|
+
velocity.min = np.array([-10.0, -10.0, -10.0])
|
|
51
|
+
velocity.initial = np.array([0.0, 0.0, 0.0])
|
|
52
|
+
velocity.final = [("free", 0.0), ("free", 0.0), ("free", 0.0)]
|
|
53
|
+
|
|
54
|
+
# Control force
|
|
55
|
+
force = ox.Control("force", shape=(3,))
|
|
56
|
+
f_max = 20.0
|
|
57
|
+
force.max = np.array([f_max, f_max, f_max])
|
|
58
|
+
force.min = np.array([-f_max, -f_max, -f_max])
|
|
59
|
+
|
|
60
|
+
# Physical parameters
|
|
61
|
+
m = 1.0 # Mass
|
|
62
|
+
g = -9.81 # Gravity
|
|
63
|
+
|
|
64
|
+
# =============================================================================
|
|
65
|
+
# Obstacle Configuration (3D grid)
|
|
66
|
+
# =============================================================================
|
|
67
|
+
|
|
68
|
+
obstacle_radius_min, obstacle_radius_max = 1.0, 2.5
|
|
69
|
+
|
|
70
|
+
# Generate obstacle positions in a 3D grid pattern between start and goal
|
|
71
|
+
np.random.seed(42)
|
|
72
|
+
obstacle_centers = []
|
|
73
|
+
|
|
74
|
+
# Tweak number of obstacles by changing the grid sizes
|
|
75
|
+
n_rows = 4
|
|
76
|
+
n_cols = 4
|
|
77
|
+
n_lays = 4
|
|
78
|
+
|
|
79
|
+
# Create a 3D field of obstacles: rows (x) x columns (y) x layers (z)
|
|
80
|
+
for i in range(n_rows):
|
|
81
|
+
for j in range(n_cols):
|
|
82
|
+
for k in range(n_lays):
|
|
83
|
+
# Base grid position
|
|
84
|
+
x = -6.0 + i * 6.0
|
|
85
|
+
y = -7.5 + j * 5.0
|
|
86
|
+
z = 1.0 + k * 2.5 # Layers at z = 1.0, 3.5, 6.0
|
|
87
|
+
# Add some randomness
|
|
88
|
+
x += np.random.uniform(-1.0, 1.0)
|
|
89
|
+
y += np.random.uniform(-1.0, 1.0)
|
|
90
|
+
z += np.random.uniform(-0.5, 0.5)
|
|
91
|
+
obstacle_centers.append([x, y, z])
|
|
92
|
+
|
|
93
|
+
n_obstacles = len(obstacle_centers) # 36 obstacles
|
|
94
|
+
|
|
95
|
+
obstacle_centers = np.array(obstacle_centers) # Shape: (n_obstacles, 3)
|
|
96
|
+
obstacle_radii = np.random.uniform(obstacle_radius_min, obstacle_radius_max, size=n_obstacles)
|
|
97
|
+
|
|
98
|
+
print(f"Created {n_obstacles} obstacles")
|
|
99
|
+
print(f"Obstacle centers shape: {obstacle_centers.shape}")
|
|
100
|
+
|
|
101
|
+
# =============================================================================
|
|
102
|
+
# Dynamics (simple double integrator)
|
|
103
|
+
# =============================================================================
|
|
104
|
+
|
|
105
|
+
dynamics = {
|
|
106
|
+
"position": velocity,
|
|
107
|
+
"velocity": (1.0 / m) * force + np.array([0.0, 0.0, g]),
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
# =============================================================================
|
|
111
|
+
# Constraints
|
|
112
|
+
# =============================================================================
|
|
113
|
+
|
|
114
|
+
states = [position, velocity]
|
|
115
|
+
controls = [force]
|
|
116
|
+
|
|
117
|
+
constraints = []
|
|
118
|
+
|
|
119
|
+
# Box constraints on states
|
|
120
|
+
for state in states:
|
|
121
|
+
constraints.extend(
|
|
122
|
+
[
|
|
123
|
+
ox.ctcs(state <= state.max),
|
|
124
|
+
ox.ctcs(state.min <= state),
|
|
125
|
+
]
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
# Box constraints on controls
|
|
129
|
+
constraints.extend(
|
|
130
|
+
[
|
|
131
|
+
force <= force.max,
|
|
132
|
+
force.min <= force,
|
|
133
|
+
]
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
# =============================================================================
|
|
137
|
+
# Obstacle Avoidance
|
|
138
|
+
# =============================================================================
|
|
139
|
+
# Two approaches are shown below for benchmarking. Comment/uncomment to toggle.
|
|
140
|
+
|
|
141
|
+
# --- APPROACH 1: Vmap (single constraint, vectorized) ---
|
|
142
|
+
# - Single CTCS constraint with vectorized evaluation
|
|
143
|
+
# - Vmap computes distance to all obstacles in parallel
|
|
144
|
+
|
|
145
|
+
obstacle_avoidance = ox.ctcs(
|
|
146
|
+
obstacle_radii
|
|
147
|
+
<= ox.Vmap(
|
|
148
|
+
lambda obs_center: ox.linalg.Norm(position - obs_center),
|
|
149
|
+
batch=obstacle_centers,
|
|
150
|
+
)
|
|
151
|
+
)
|
|
152
|
+
constraints.append(obstacle_avoidance)
|
|
153
|
+
|
|
154
|
+
# --- APPROACH 2: Individual constraints (loop, no vmap) ---
|
|
155
|
+
# - Creates n_obstacles separate CTCS constraints
|
|
156
|
+
# - Each constraint is lowered and traced independently
|
|
157
|
+
|
|
158
|
+
# for i in range(n_obstacles):
|
|
159
|
+
# obs_center = obstacle_centers[i]
|
|
160
|
+
# radius = obstacle_radii[i]
|
|
161
|
+
# obstacle_constraint = ox.ctcs(
|
|
162
|
+
# radius <= ox.linalg.Norm(position - obs_center)
|
|
163
|
+
# )
|
|
164
|
+
# constraints.append(obstacle_constraint)
|
|
165
|
+
|
|
166
|
+
# =============================================================================
|
|
167
|
+
# Initial Guesses
|
|
168
|
+
# =============================================================================
|
|
169
|
+
|
|
170
|
+
straight_line = np.linspace(position.initial, position.final, n)
|
|
171
|
+
position.guess = straight_line
|
|
172
|
+
velocity.guess = np.zeros((n, 3))
|
|
173
|
+
force.guess = np.tile([0.0, 0.0, -m * g], (n, 1)) # Hover thrust
|
|
174
|
+
|
|
175
|
+
# =============================================================================
|
|
176
|
+
# Problem Setup
|
|
177
|
+
# =============================================================================
|
|
178
|
+
|
|
179
|
+
time = ox.Time(
|
|
180
|
+
initial=0.0,
|
|
181
|
+
final=("minimize", total_time),
|
|
182
|
+
min=0.0,
|
|
183
|
+
max=total_time,
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
problem = Problem(
|
|
187
|
+
dynamics=dynamics,
|
|
188
|
+
states=states,
|
|
189
|
+
controls=controls,
|
|
190
|
+
time=time,
|
|
191
|
+
constraints=constraints,
|
|
192
|
+
N=n,
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
# SCP settings
|
|
196
|
+
problem.settings.prp.dt = 0.01
|
|
197
|
+
problem.settings.scp.w_tr = 5e0
|
|
198
|
+
problem.settings.scp.lam_cost = 1e0
|
|
199
|
+
problem.settings.scp.lam_vc = 1e2
|
|
200
|
+
problem.settings.scp.ep_tr = 1e-3
|
|
201
|
+
problem.settings.scp.ep_vb = 1e-4
|
|
202
|
+
problem.settings.scp.ep_vc = 1e-8
|
|
203
|
+
problem.settings.scp.cost_drop = 5
|
|
204
|
+
problem.settings.scp.cost_relax = 0.7
|
|
205
|
+
problem.settings.scp.w_tr_adapt = 1.5
|
|
206
|
+
|
|
207
|
+
# =============================================================================
|
|
208
|
+
# Solve and Visualize
|
|
209
|
+
# =============================================================================
|
|
210
|
+
|
|
211
|
+
if __name__ == "__main__":
|
|
212
|
+
problem.initialize()
|
|
213
|
+
results = problem.solve()
|
|
214
|
+
results = problem.post_process()
|
|
215
|
+
|
|
216
|
+
# Store obstacle info for visualization
|
|
217
|
+
results.update(
|
|
218
|
+
{
|
|
219
|
+
"obstacles_centers": [c for c in obstacle_centers],
|
|
220
|
+
"obstacles_radii": [[1 / r, 1 / r, 1 / r] for r in obstacle_radii],
|
|
221
|
+
"obstacles_axes": [np.eye(3) for _ in range(n_obstacles)],
|
|
222
|
+
}
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
# Create viser visualization servers
|
|
226
|
+
traj_server = create_animated_plotting_server(
|
|
227
|
+
results,
|
|
228
|
+
thrust_key="force",
|
|
229
|
+
viewcone_scale=5.0,
|
|
230
|
+
)
|
|
231
|
+
scp_server = create_scp_animated_plotting_server(
|
|
232
|
+
results,
|
|
233
|
+
attitude_stride=3,
|
|
234
|
+
frame_duration_ms=200,
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
# Keep servers running
|
|
238
|
+
traj_server.sleep_forever()
|
|
@@ -15,6 +15,7 @@ from openscvx.symbolic.expr import (
|
|
|
15
15
|
CTCS,
|
|
16
16
|
Abs,
|
|
17
17
|
Add,
|
|
18
|
+
Bilerp,
|
|
18
19
|
Block,
|
|
19
20
|
Concat,
|
|
20
21
|
Constant,
|
|
@@ -32,6 +33,7 @@ from openscvx.symbolic.expr import (
|
|
|
32
33
|
Index,
|
|
33
34
|
Inequality,
|
|
34
35
|
Leaf,
|
|
36
|
+
Linterp,
|
|
35
37
|
Log,
|
|
36
38
|
LogSumExp,
|
|
37
39
|
MatMul,
|
|
@@ -51,6 +53,7 @@ from openscvx.symbolic.expr import (
|
|
|
51
53
|
Sum,
|
|
52
54
|
Tan,
|
|
53
55
|
Variable,
|
|
56
|
+
Vmap,
|
|
54
57
|
Vstack,
|
|
55
58
|
ctcs,
|
|
56
59
|
)
|
|
@@ -106,6 +109,8 @@ __all__ = [
|
|
|
106
109
|
"Log",
|
|
107
110
|
"LogSumExp",
|
|
108
111
|
"Max",
|
|
112
|
+
"Linterp",
|
|
113
|
+
"Bilerp",
|
|
109
114
|
# Constraints
|
|
110
115
|
"Constraint",
|
|
111
116
|
"Equality",
|
|
@@ -113,6 +118,8 @@ __all__ = [
|
|
|
113
118
|
"NodalConstraint",
|
|
114
119
|
"CTCS",
|
|
115
120
|
"ctcs",
|
|
121
|
+
# Data parallelism
|
|
122
|
+
"Vmap",
|
|
116
123
|
# Submodules
|
|
117
124
|
"stl",
|
|
118
125
|
"spatial",
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '0.3.2.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 3, 2, '
|
|
31
|
+
__version__ = version = '0.3.2.dev204'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 3, 2, 'dev204')
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'g3b21ffc13'
|
|
@@ -118,9 +118,11 @@ from .linalg import Diag, Norm, Sum, Transpose
|
|
|
118
118
|
# Mathematical functions
|
|
119
119
|
from .math import (
|
|
120
120
|
Abs,
|
|
121
|
+
Bilerp,
|
|
121
122
|
Cos,
|
|
122
123
|
Exp,
|
|
123
124
|
Huber,
|
|
125
|
+
Linterp,
|
|
124
126
|
Log,
|
|
125
127
|
LogSumExp,
|
|
126
128
|
Max,
|
|
@@ -144,6 +146,9 @@ from .stl import Or
|
|
|
144
146
|
# Variable
|
|
145
147
|
from .variable import Variable
|
|
146
148
|
|
|
149
|
+
# Vmap
|
|
150
|
+
from .vmap import Vmap, _Placeholder # noqa: F401
|
|
151
|
+
|
|
147
152
|
__all__ = [
|
|
148
153
|
# Core base classes and fundamental operations
|
|
149
154
|
"Expr",
|
|
@@ -191,6 +196,8 @@ __all__ = [
|
|
|
191
196
|
"Log",
|
|
192
197
|
"LogSumExp",
|
|
193
198
|
"Max",
|
|
199
|
+
"Linterp",
|
|
200
|
+
"Bilerp",
|
|
194
201
|
# Linear algebra operations
|
|
195
202
|
"Transpose",
|
|
196
203
|
"Stack",
|
|
@@ -219,4 +226,6 @@ __all__ = [
|
|
|
219
226
|
"ctcs",
|
|
220
227
|
# STL operations
|
|
221
228
|
"Or",
|
|
229
|
+
# Vmap
|
|
230
|
+
"Vmap",
|
|
222
231
|
]
|