openscvx 0.3.2.dev173__tar.gz → 0.3.2.dev184__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.dev173/openscvx.egg-info → openscvx-0.3.2.dev184}/PKG-INFO +1 -1
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/plotting_viser.py +6 -2
- openscvx-0.3.2.dev184/examples/spacecraft/proxops_cw.py +188 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/_version.py +3 -3
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/plotting/viser/primitives.py +37 -17
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/plotting/viser/server.py +10 -7
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184/openscvx.egg-info}/PKG-INFO +1 -1
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx.egg-info/SOURCES.txt +1 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/.github/assets/logo.svg +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/.github/release-drafter.yml +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/.github/workflows/_docs.yml +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/.github/workflows/docs.yml +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/.github/workflows/lint.yml +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/.github/workflows/nightly.yml +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/.github/workflows/release-drafter.yml +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/.github/workflows/release.yml +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/.github/workflows/tests-integration.yml +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/.github/workflows/tests-unit.yml +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/.gitignore +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/CONTRIBUTING.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/LICENSE +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/README.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/Overview/constraint_reformulation.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/Overview/control_parameterization.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/Overview/discretization.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/Overview/ocp.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/Overview/scvx.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/Overview/time_dilation.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/UnderTheHood/lowering_architecture.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/Usage/advanced_problem_setup.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/Usage/api.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/Usage/api_constraints.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/Usage/api_control.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/Usage/api_integrators.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/Usage/api_state.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/Usage/api_trajoptproblem.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/Usage/api_variable.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/Usage/basic_problem_setup.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/Usage/tutorial_6dof_los_guidance.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/Usage/tutorial_6dof_obstacle_avoidance.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/Usage/tutorials.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/assets/favicon.png +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/assets/images/ct-scvx_dark.png +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/assets/images/ct-scvx_light.png +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/assets/images/ctcs_dark.png +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/assets/images/ctcs_light.png +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/assets/images/problem_class_dark.png +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/assets/images/problem_class_light.png +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/assets/logo.svg +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/citation.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/examples.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/getting-started.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/index.md +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/javascripts/mathjax.js +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/abstract/3DoF_pdg.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/abstract/brachistochrone.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/arm/three_link_arm.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/car/dubins_car.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/car/dubins_car_disjoint.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/car/dubins_car_stljax.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/drone/cinema_vp.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/drone/cinema_vp_realtime_base.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/drone/dr_double_integrator.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/drone/dr_vp.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/drone/dr_vp_nodal.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/drone/dr_vp_polytope.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/drone/drone_racing.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/drone/obstacle_avoidance.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/drone/obstacle_avoidance_nodal.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/drone/obstacle_avoidance_realtime_base.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/plotting.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/realtime/cinema_vp_realtime.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/realtime/drone_racing_realtime.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/realtime/dubins_car_realtime.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/figures/ctlos_cine.gif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/figures/ctlos_dr.gif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/figures/dtlos_cine.gif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/figures/dtlos_dr.gif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/figures/openscvx_logo.svg +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/figures/openscvx_logo_square.png +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/figures/oscvx_structure_full_dark.svg +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/figures/video_preview.png +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/__init__.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/1-background.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/1-background@1x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/1-background@2x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/1-background@3x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/1-background@4x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/2-mars.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/2-mars@1x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/2-mars@2x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/2-mars@3x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/2-mars@4x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/3-moon.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/3-moon@1x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/3-moon@2x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/3-moon@3x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/3-moon@4x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/4-sat1.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/4-sat1@1x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/4-sat1@2x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/4-sat1@3x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/4-sat1@4x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/5-space.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/5-space@1x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/5-space@2x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/5-space@3x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/5-space@4x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/6-earth.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/6-earth@1x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/6-earth@2x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/6-earth@3x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/6-earth@4x.avif +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/javascripts/parallax.js +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/logo.svg +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/stylesheets/custom.css +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/stylesheets/parallax.css +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/home.html +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/main.html +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/partials/parallax/hero.html +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/partials/parallax.html +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/mkdocs.yml +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/__init__.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/algorithms/__init__.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/algorithms/autotuning.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/algorithms/base.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/algorithms/optimization_results.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/algorithms/penalized_trust_region.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/config.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/discretization/__init__.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/discretization/discretization.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/expert/__init__.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/expert/byof.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/expert/lowering.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/expert/validation.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/integrators/__init__.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/integrators/runge_kutta.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/lowered/__init__.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/lowered/cvxpy_constraints.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/lowered/cvxpy_variables.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/lowered/dynamics.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/lowered/jax_constraints.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/lowered/parameters.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/lowered/problem.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/lowered/unified.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/plotting/__init__.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/plotting/plotting.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/plotting/scp_iteration.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/plotting/viser/__init__.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/plotting/viser/animated.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/plotting/viser/plotly_integration.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/plotting/viser/scp.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/problem.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/propagation/__init__.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/propagation/post_processing.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/propagation/propagation.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/solvers/__init__.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/solvers/cvxpy.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/__init__.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/augmentation.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/builder.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/constraint_set.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/expr/__init__.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/expr/arithmetic.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/expr/array.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/expr/constraint.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/expr/control.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/expr/expr.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/expr/lie/__init__.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/expr/lie/se3.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/expr/lie/so3.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/expr/linalg.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/expr/math.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/expr/spatial.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/expr/state.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/expr/stl.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/expr/variable.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/hashing.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/lower.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/lowerers/__init__.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/lowerers/cvxpy.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/lowerers/jax.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/preprocessing.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/problem.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/time.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/symbolic/unified.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/utils/__init__.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/utils/cache.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/utils/caching.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/utils/printing.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/utils/profiling.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx/utils/utils.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx.egg-info/dependency_links.txt +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx.egg-info/requires.txt +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/openscvx.egg-info/top_level.txt +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/pyproject.toml +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/scripts/gen_example_pages.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/scripts/gen_ref_pages.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/setup.cfg +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/__init__.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/brachistochrone_analytical.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/__init__.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/expr/__init__.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/expr/test_arithmetic.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/expr/test_array.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/expr/test_constraint.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/expr/test_expr.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/expr/test_lie.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/expr/test_linalg.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/expr/test_math.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/expr/test_node_reference.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/expr/test_parameters.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/expr/test_scaling.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/expr/test_spatial.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/expr/test_variable.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/test_augmentation.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/test_hashing.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/test_lower_cvxpy.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/test_lower_jax.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/test_preprocessing.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/symbolic/test_unified.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/test_brachistochrone.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/test_cvxpygen_optional.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/test_discretization.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/test_examples.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/test_expert.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/test_integrators.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/tests/test_plotting.py +0 -0
- {openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/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.dev184
|
|
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
|
|
@@ -58,6 +58,7 @@ def create_animated_plotting_server(
|
|
|
58
58
|
target_radius: float = 1.0,
|
|
59
59
|
show_control_plot: str | None = None,
|
|
60
60
|
show_control_norm_plot: str | None = None,
|
|
61
|
+
show_grid: bool = True,
|
|
61
62
|
) -> viser.ViserServer:
|
|
62
63
|
"""Create an animated trajectory visualization server.
|
|
63
64
|
|
|
@@ -101,6 +102,7 @@ def create_animated_plotting_server(
|
|
|
101
102
|
showing each control component vs time with animated markers
|
|
102
103
|
show_control_norm_plot: If provided with a control name, displays norm plot
|
|
103
104
|
showing ‖control‖₂ vs time with animated marker
|
|
105
|
+
show_grid: Whether to show the grid (default True)
|
|
104
106
|
|
|
105
107
|
Returns:
|
|
106
108
|
ViserServer instance (animation runs in background thread)
|
|
@@ -135,7 +137,7 @@ def create_animated_plotting_server(
|
|
|
135
137
|
colors = compute_velocity_colors(vel)
|
|
136
138
|
|
|
137
139
|
# Create server
|
|
138
|
-
server = create_server(pos)
|
|
140
|
+
server = create_server(pos, show_grid=show_grid)
|
|
139
141
|
|
|
140
142
|
# Add static elements
|
|
141
143
|
if "vertices" in results:
|
|
@@ -257,6 +259,7 @@ def create_scp_animated_plotting_server(
|
|
|
257
259
|
frame_duration_ms: int = 500,
|
|
258
260
|
scene_scale: float = 1.0,
|
|
259
261
|
cmap_name: str = "viridis",
|
|
262
|
+
show_grid: bool = True,
|
|
260
263
|
) -> viser.ViserServer:
|
|
261
264
|
"""Create an animated visualization of SCP iteration convergence.
|
|
262
265
|
|
|
@@ -289,6 +292,7 @@ def create_scp_animated_plotting_server(
|
|
|
289
292
|
scene_scale: Divide all positions by this factor. Use >1 for large-scale
|
|
290
293
|
trajectories (e.g., 100.0 for km-scale problems).
|
|
291
294
|
cmap_name: Matplotlib colormap name for iteration coloring (default: "viridis")
|
|
295
|
+
show_grid: Whether to show the grid (default True)
|
|
292
296
|
|
|
293
297
|
Returns:
|
|
294
298
|
ViserServer instance (animation runs in background thread)
|
|
@@ -322,7 +326,7 @@ def create_scp_animated_plotting_server(
|
|
|
322
326
|
attitudes = [X[:, attitude_slice] for X in X_history]
|
|
323
327
|
|
|
324
328
|
# Create server using final iteration's positions for grid sizing
|
|
325
|
-
server = create_server(positions[-1])
|
|
329
|
+
server = create_server(positions[-1], show_grid=show_grid)
|
|
326
330
|
|
|
327
331
|
# Add static elements (gates, obstacles) if present
|
|
328
332
|
if "vertices" in results:
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"""Proximity Operations (ProxOps) using Clohessy-Wiltshire dynamics.
|
|
2
|
+
|
|
3
|
+
This example demonstrates optimal trajectory generation for spacecraft
|
|
4
|
+
proximity operations and docking using the Clohessy-Wiltshire (CW) equations
|
|
5
|
+
for relative motion in a circular orbit.
|
|
6
|
+
See [Clohessy-Wiltshire equations](https://en.wikipedia.org/wiki/Clohessy%E2%80%93Wiltshire_equations)
|
|
7
|
+
for further details.
|
|
8
|
+
The problem includes:
|
|
9
|
+
|
|
10
|
+
- 3D relative position and velocity dynamics (CW equations)
|
|
11
|
+
- Fuel-optimal control (minimize delta-v)
|
|
12
|
+
- Thrust magnitude constraints
|
|
13
|
+
- Approach cone constraint for safe docking corridor
|
|
14
|
+
- Final docking at target (origin)
|
|
15
|
+
|
|
16
|
+
!!! tip "The CW frame convention:"
|
|
17
|
+
- x: radial direction (outward from Earth)
|
|
18
|
+
- y: along-track direction (velocity direction)
|
|
19
|
+
- z: cross-track direction (normal to orbit plane)
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
import os
|
|
23
|
+
import sys
|
|
24
|
+
|
|
25
|
+
import numpy as np
|
|
26
|
+
|
|
27
|
+
# Add grandparent directory to path to import examples.plotting
|
|
28
|
+
current_dir = os.path.dirname(os.path.abspath(__file__))
|
|
29
|
+
grandparent_dir = os.path.dirname(os.path.dirname(current_dir))
|
|
30
|
+
sys.path.append(grandparent_dir)
|
|
31
|
+
|
|
32
|
+
import openscvx as ox
|
|
33
|
+
from examples.plotting_viser import (
|
|
34
|
+
create_animated_plotting_server,
|
|
35
|
+
create_scp_animated_plotting_server,
|
|
36
|
+
)
|
|
37
|
+
from openscvx import Problem
|
|
38
|
+
from openscvx.plotting import plot_scp_iterations
|
|
39
|
+
from openscvx.plotting.viser import add_glideslope_cone
|
|
40
|
+
|
|
41
|
+
# Problem parameters
|
|
42
|
+
n_nodes = 5 # Number of discretization nodes
|
|
43
|
+
total_time = 180.0 # Total maneuver time in seconds
|
|
44
|
+
|
|
45
|
+
# Orbital parameters (ISS-like orbit at ~400 km altitude)
|
|
46
|
+
mu = 3.986004418e14 # Earth gravitational parameter [m^3/s^2]
|
|
47
|
+
a = 6.778e6 # Semi-major axis [m] (Earth radius + 400 km)
|
|
48
|
+
n = np.sqrt(mu / a**3) # Mean motion [rad/s] (~0.00113 rad/s)
|
|
49
|
+
|
|
50
|
+
# Define state components
|
|
51
|
+
# Position in CW frame [x, y, z] in meters
|
|
52
|
+
position = ox.State("position", shape=(3,))
|
|
53
|
+
position.max = np.array([100.0, 100.0, 100.0])
|
|
54
|
+
position.min = np.array([-100.0, -100.0, -100.0])
|
|
55
|
+
position.initial = np.array([0.0, -100.0, 0.0]) # Start 100m behind target (V-bar position)
|
|
56
|
+
position.final = np.array([0.0, 0.0, 0.0]) # Dock at origin
|
|
57
|
+
position.guess = np.linspace(position.initial, position.final, n_nodes)
|
|
58
|
+
|
|
59
|
+
# Velocity in CW frame [vx, vy, vz] in m/s
|
|
60
|
+
velocity = ox.State("velocity", shape=(3,))
|
|
61
|
+
v_max = 2.0 # Maximum relative velocity [m/s]
|
|
62
|
+
velocity.max = np.array([v_max, v_max, v_max])
|
|
63
|
+
velocity.min = np.array([-v_max, -v_max, -v_max])
|
|
64
|
+
velocity.initial = [0.0, 2.0, 0.0]
|
|
65
|
+
velocity.final = np.array([0.0, 0.0, 0.0]) # Zero relative velocity at docking
|
|
66
|
+
velocity.guess = np.zeros((n_nodes, 3))
|
|
67
|
+
|
|
68
|
+
# Define control: acceleration from thrusters [ax, ay, az] in m/s^2
|
|
69
|
+
accel = ox.Control("accel", shape=(3,))
|
|
70
|
+
a_max = 0.1 # Maximum acceleration [m/s^2] (typical for reaction control thrusters)
|
|
71
|
+
accel.max = np.array([a_max, a_max, a_max])
|
|
72
|
+
accel.min = np.array([-a_max, -a_max, -a_max])
|
|
73
|
+
accel.guess = np.zeros((n_nodes, 3))
|
|
74
|
+
|
|
75
|
+
# Define list of all states and controls
|
|
76
|
+
states = [position, velocity]
|
|
77
|
+
controls = [accel]
|
|
78
|
+
|
|
79
|
+
# Generate constraints
|
|
80
|
+
constraints = []
|
|
81
|
+
|
|
82
|
+
# Box constraints for states
|
|
83
|
+
for state in states:
|
|
84
|
+
constraints.extend(
|
|
85
|
+
[
|
|
86
|
+
ox.ctcs(state <= state.max),
|
|
87
|
+
ox.ctcs(state.min <= state),
|
|
88
|
+
]
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# R-bar approach cone constraint (from below, -x direction)
|
|
92
|
+
# Enforces sqrt(y^2 + z^2) <= tan(theta) * (-x)
|
|
93
|
+
# This requires the spacecraft to approach from negative x (below target)
|
|
94
|
+
# and stay within a cone centered on the -x axis
|
|
95
|
+
cone_half_angle = 20 * np.pi / 180 # 20 degree half-angle
|
|
96
|
+
constraints.append(
|
|
97
|
+
ox.ctcs(ox.linalg.Norm(position[1:]) <= np.tan(cone_half_angle) * (-position[0])).over(
|
|
98
|
+
(n_nodes - 3, n_nodes - 1)
|
|
99
|
+
)
|
|
100
|
+
)
|
|
101
|
+
# Enforce entrance to the cone at safe distance
|
|
102
|
+
constraints.append((-position[0] >= 20.0).at([n_nodes - 3]))
|
|
103
|
+
|
|
104
|
+
# Clohessy-Wiltshire dynamics
|
|
105
|
+
dynamics = {
|
|
106
|
+
"position": velocity,
|
|
107
|
+
"velocity": ox.Concat(
|
|
108
|
+
3 * n**2 * position[0] + 2 * n * velocity[1] + accel[0],
|
|
109
|
+
-2 * n * velocity[0] + accel[1],
|
|
110
|
+
-(n**2) * position[2] + accel[2],
|
|
111
|
+
),
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
# Time configuration (free final time to minimize fuel)
|
|
115
|
+
time = ox.Time(
|
|
116
|
+
initial=0.0,
|
|
117
|
+
final=("free", total_time),
|
|
118
|
+
min=0.0,
|
|
119
|
+
max=total_time,
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
# Build the problem
|
|
123
|
+
problem = Problem(
|
|
124
|
+
dynamics=dynamics,
|
|
125
|
+
states=states,
|
|
126
|
+
controls=controls,
|
|
127
|
+
time=time,
|
|
128
|
+
constraints=constraints,
|
|
129
|
+
N=n_nodes,
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
# Solver settings (FOH is default, no need to set explicitly)
|
|
133
|
+
problem.settings.dis.dis_type = "ZOH"
|
|
134
|
+
problem.settings.scp.k_max = 100
|
|
135
|
+
problem.settings.scp.w_tr = 1e0
|
|
136
|
+
problem.settings.scp.w_tr_adapt = 1.2
|
|
137
|
+
problem.settings.scp.lam_cost = 1e-1
|
|
138
|
+
problem.settings.scp.lam_vc = 1e1
|
|
139
|
+
problem.settings.scp.lam_vb = 1e0
|
|
140
|
+
|
|
141
|
+
# Plotting metadata
|
|
142
|
+
plotting_dict = {
|
|
143
|
+
"mean_motion": n,
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if __name__ == "__main__":
|
|
147
|
+
problem.initialize()
|
|
148
|
+
results = problem.solve()
|
|
149
|
+
results = problem.post_process()
|
|
150
|
+
results.update(plotting_dict)
|
|
151
|
+
|
|
152
|
+
# Plot results
|
|
153
|
+
plot_scp_iterations(results).show()
|
|
154
|
+
|
|
155
|
+
# Create animation
|
|
156
|
+
traj_server = create_animated_plotting_server(results, thrust_key="accel", show_grid=False)
|
|
157
|
+
|
|
158
|
+
# Add R-bar approach cone (opens in -x direction)
|
|
159
|
+
add_glideslope_cone(
|
|
160
|
+
traj_server,
|
|
161
|
+
apex=(0, 0, 0),
|
|
162
|
+
height=20.0, # Cone extends 100m in -x direction
|
|
163
|
+
glideslope_angle_deg=cone_half_angle * 180 / np.pi,
|
|
164
|
+
axis=(-1, 0, 0), # R-bar: negative radial direction
|
|
165
|
+
color=(200, 80, 80),
|
|
166
|
+
opacity=0.5,
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
# Create SCP iteration visualization
|
|
170
|
+
scp_server = create_scp_animated_plotting_server(
|
|
171
|
+
results,
|
|
172
|
+
frame_duration_ms=200,
|
|
173
|
+
scene_scale=1.0,
|
|
174
|
+
show_grid=False,
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
# Add R-bar approach cone to SCP visualization
|
|
178
|
+
add_glideslope_cone(
|
|
179
|
+
scp_server,
|
|
180
|
+
apex=(0, 0, 0),
|
|
181
|
+
height=20.0,
|
|
182
|
+
glideslope_angle_deg=cone_half_angle * 180 / np.pi,
|
|
183
|
+
axis=(-1, 0, 0),
|
|
184
|
+
color=(200, 80, 80),
|
|
185
|
+
opacity=0.5,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
scp_server.sleep_forever()
|
|
@@ -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.dev184'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 3, 2, 'dev184')
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'gb43481d6f'
|
|
@@ -228,14 +228,16 @@ def _generate_cone_mesh(
|
|
|
228
228
|
height: float,
|
|
229
229
|
half_angle_deg: float,
|
|
230
230
|
n_segments: int = 32,
|
|
231
|
+
axis: np.ndarray | tuple = (0.0, 0.0, 1.0),
|
|
231
232
|
) -> tuple[np.ndarray, np.ndarray]:
|
|
232
|
-
"""Generate a cone mesh with apex at given position, opening
|
|
233
|
+
"""Generate a cone mesh with apex at given position, opening along specified axis.
|
|
233
234
|
|
|
234
235
|
Args:
|
|
235
236
|
apex: Apex position (3,) - the tip of the cone
|
|
236
|
-
height: Height of the cone (extends
|
|
237
|
-
half_angle_deg: Half-angle of the cone from the
|
|
237
|
+
height: Height of the cone (extends along axis direction from apex)
|
|
238
|
+
half_angle_deg: Half-angle of the cone from the axis in degrees
|
|
238
239
|
n_segments: Number of segments around the circumference
|
|
240
|
+
axis: Unit vector direction the cone opens toward (default +Z)
|
|
239
241
|
|
|
240
242
|
Returns:
|
|
241
243
|
Tuple of (vertices, faces) where vertices is (V, 3) and faces is (F, 3)
|
|
@@ -243,21 +245,36 @@ def _generate_cone_mesh(
|
|
|
243
245
|
half_angle_rad = np.radians(half_angle_deg)
|
|
244
246
|
base_radius = height * np.tan(half_angle_rad)
|
|
245
247
|
|
|
248
|
+
# Normalize axis
|
|
249
|
+
axis = np.asarray(axis, dtype=np.float32)
|
|
250
|
+
axis = axis / np.linalg.norm(axis)
|
|
251
|
+
|
|
252
|
+
# Build orthonormal basis: find two vectors perpendicular to axis
|
|
253
|
+
# Pick a reference vector not parallel to axis
|
|
254
|
+
if abs(axis[0]) < 0.9:
|
|
255
|
+
ref = np.array([1.0, 0.0, 0.0], dtype=np.float32)
|
|
256
|
+
else:
|
|
257
|
+
ref = np.array([0.0, 1.0, 0.0], dtype=np.float32)
|
|
258
|
+
|
|
259
|
+
# Gram-Schmidt to get perpendicular vectors
|
|
260
|
+
u = ref - np.dot(ref, axis) * axis
|
|
261
|
+
u = u / np.linalg.norm(u)
|
|
262
|
+
v = np.cross(axis, u)
|
|
263
|
+
|
|
246
264
|
# Vertices: apex + base circle points
|
|
247
265
|
vertices = [apex.copy()] # Apex at index 0
|
|
248
266
|
|
|
267
|
+
# Base center position
|
|
268
|
+
base_center = apex + height * axis
|
|
269
|
+
|
|
249
270
|
# Base circle vertices
|
|
250
271
|
for i in range(n_segments):
|
|
251
272
|
angle = 2 * np.pi * i / n_segments
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
z = apex[2] + height
|
|
255
|
-
vertices.append([x, y, z])
|
|
273
|
+
offset = base_radius * (np.cos(angle) * u + np.sin(angle) * v)
|
|
274
|
+
vertices.append(base_center + offset)
|
|
256
275
|
|
|
257
276
|
# Center of base for closing the bottom
|
|
258
|
-
base_center
|
|
259
|
-
base_center[2] += height
|
|
260
|
-
vertices.append(base_center) # Index n_segments + 1
|
|
277
|
+
vertices.append(base_center.copy()) # Index n_segments + 1
|
|
261
278
|
|
|
262
279
|
vertices = np.array(vertices, dtype=np.float32)
|
|
263
280
|
|
|
@@ -287,25 +304,28 @@ def add_glideslope_cone(
|
|
|
287
304
|
apex: np.ndarray | tuple = (0.0, 0.0, 0.0),
|
|
288
305
|
height: float = 2000.0,
|
|
289
306
|
glideslope_angle_deg: float = 86.0,
|
|
307
|
+
axis: np.ndarray | tuple = (0.0, 0.0, 1.0),
|
|
290
308
|
color: tuple[int, int, int] = (100, 200, 100),
|
|
291
309
|
opacity: float = 0.2,
|
|
292
310
|
wireframe: bool = False,
|
|
293
311
|
n_segments: int = 32,
|
|
294
312
|
) -> viser.MeshHandle:
|
|
295
|
-
"""Add a glideslope constraint cone to the scene.
|
|
313
|
+
"""Add a glideslope/approach constraint cone to the scene.
|
|
296
314
|
|
|
297
315
|
The glideslope constraint typically has the form:
|
|
298
|
-
||
|
|
316
|
+
||position_perp|| <= tan(angle) * position_along_axis
|
|
299
317
|
|
|
300
|
-
This creates a cone with apex at the
|
|
318
|
+
This creates a cone with apex at the target, opening along the specified axis.
|
|
301
319
|
|
|
302
320
|
Args:
|
|
303
321
|
server: ViserServer instance
|
|
304
|
-
apex: Apex position (landing site), default is origin
|
|
322
|
+
apex: Apex position (docking/landing site), default is origin
|
|
305
323
|
height: Height of the cone visualization
|
|
306
|
-
glideslope_angle_deg: Glideslope angle in degrees (measured from
|
|
307
|
-
For constraint ||
|
|
324
|
+
glideslope_angle_deg: Glideslope angle in degrees (measured from axis).
|
|
325
|
+
For constraint ||r_perp|| <= tan(theta) * r_axis, pass theta here.
|
|
308
326
|
Common values: 86 deg (very wide), 70 deg (moderate), 45 deg (steep)
|
|
327
|
+
axis: Unit vector direction the cone opens toward. Default (0,0,1) for +Z.
|
|
328
|
+
Use (-1,0,0) for R-bar approach (from below in radial direction).
|
|
309
329
|
color: RGB color tuple
|
|
310
330
|
opacity: Opacity (0-1)
|
|
311
331
|
wireframe: If True, render as wireframe
|
|
@@ -316,7 +336,7 @@ def add_glideslope_cone(
|
|
|
316
336
|
"""
|
|
317
337
|
apex = np.asarray(apex, dtype=np.float32)
|
|
318
338
|
|
|
319
|
-
vertices, faces = _generate_cone_mesh(apex, height, glideslope_angle_deg, n_segments)
|
|
339
|
+
vertices, faces = _generate_cone_mesh(apex, height, glideslope_angle_deg, n_segments, axis=axis)
|
|
320
340
|
|
|
321
341
|
handle = server.scene.add_mesh_simple(
|
|
322
342
|
"/constraints/glideslope_cone",
|
|
@@ -46,12 +46,14 @@ def compute_grid_size(pos: np.ndarray, padding: float = 1.2) -> float:
|
|
|
46
46
|
def create_server(
|
|
47
47
|
pos: np.ndarray,
|
|
48
48
|
dark_mode: bool = True,
|
|
49
|
+
show_grid: bool = True,
|
|
49
50
|
) -> viser.ViserServer:
|
|
50
51
|
"""Create a viser server with basic scene setup.
|
|
51
52
|
|
|
52
53
|
Args:
|
|
53
54
|
pos: Position array for computing grid size
|
|
54
55
|
dark_mode: Whether to use dark theme
|
|
56
|
+
show_grid: Whether to show the grid (default True)
|
|
55
57
|
|
|
56
58
|
Returns:
|
|
57
59
|
ViserServer instance with grid and origin frame
|
|
@@ -96,13 +98,14 @@ def create_server(
|
|
|
96
98
|
dark_mode=dark_mode,
|
|
97
99
|
)
|
|
98
100
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
101
|
+
if show_grid:
|
|
102
|
+
grid_size = compute_grid_size(pos)
|
|
103
|
+
server.scene.add_grid(
|
|
104
|
+
"/grid",
|
|
105
|
+
width=grid_size,
|
|
106
|
+
height=grid_size,
|
|
107
|
+
position=np.array([0.0, 0.0, 0.0]),
|
|
108
|
+
)
|
|
106
109
|
server.scene.add_frame(
|
|
107
110
|
"/origin",
|
|
108
111
|
wxyz=(1.0, 0.0, 0.0, 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.dev184
|
|
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
|
|
@@ -69,6 +69,7 @@ examples/realtime/cinema_vp_realtime.py
|
|
|
69
69
|
examples/realtime/drone_racing_realtime.py
|
|
70
70
|
examples/realtime/dubins_car_realtime.py
|
|
71
71
|
examples/realtime/obstacle_avoidance_realtime.py
|
|
72
|
+
examples/spacecraft/proxops_cw.py
|
|
72
73
|
figures/ctlos_cine.gif
|
|
73
74
|
figures/ctlos_dr.gif
|
|
74
75
|
figures/dtlos_cine.gif
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/UnderTheHood/vectorization_and_vmapping.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/docs/Usage/tutorial_6dof_obstacle_avoidance.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/drone/obstacle_avoidance_realtime_base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/examples/realtime/obstacle_avoidance_realtime.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.3.2.dev173 → openscvx-0.3.2.dev184}/material/overrides/assets/images/layers/2-mars.avif
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|