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.
Files changed (234) hide show
  1. openscvx-0.3.2.dev127/CONTRIBUTING.md +180 -0
  2. {openscvx-0.3.1.dev60/openscvx.egg-info → openscvx-0.3.2.dev127}/PKG-INFO +3 -7
  3. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/README.md +0 -6
  4. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/examples.md +0 -11
  5. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/abstract/3DoF_pdg.py +28 -9
  6. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/cinema_vp.py +23 -4
  7. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/cinema_vp_realtime_base.py +0 -3
  8. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/dr_double_integrator.py +20 -4
  9. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/dr_vp.py +21 -4
  10. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/dr_vp_nodal.py +20 -2
  11. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/dr_vp_polytope.py +21 -2
  12. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/drone_racing.py +20 -2
  13. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/obstacle_avoidance.py +19 -3
  14. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/obstacle_avoidance_nodal.py +18 -2
  15. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/drone/obstacle_avoidance_realtime_base.py +18 -2
  16. openscvx-0.3.2.dev127/examples/plotting.py +1343 -0
  17. openscvx-0.3.2.dev127/examples/plotting_viser.py +694 -0
  18. openscvx-0.3.2.dev127/examples/realtime/cinema_vp_realtime.py +461 -0
  19. openscvx-0.3.2.dev127/examples/realtime/drone_racing_realtime.py +387 -0
  20. openscvx-0.3.2.dev127/examples/realtime/obstacle_avoidance_realtime.py +376 -0
  21. openscvx-0.3.2.dev127/figures/openscvx_logo_square.png +0 -0
  22. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/_version.py +3 -3
  23. openscvx-0.3.2.dev127/openscvx/plotting/__init__.py +63 -0
  24. openscvx-0.3.2.dev127/openscvx/plotting/plotting.py +756 -0
  25. openscvx-0.3.2.dev127/openscvx/plotting/scp_iteration.py +299 -0
  26. openscvx-0.3.2.dev127/openscvx/plotting/viser/__init__.py +126 -0
  27. openscvx-0.3.2.dev127/openscvx/plotting/viser/animated.py +605 -0
  28. openscvx-0.3.2.dev127/openscvx/plotting/viser/plotly_integration.py +333 -0
  29. openscvx-0.3.2.dev127/openscvx/plotting/viser/primitives.py +355 -0
  30. openscvx-0.3.2.dev127/openscvx/plotting/viser/scp.py +459 -0
  31. openscvx-0.3.2.dev127/openscvx/plotting/viser/server.py +112 -0
  32. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/problem.py +1 -2
  33. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127/openscvx.egg-info}/PKG-INFO +3 -7
  34. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx.egg-info/SOURCES.txt +10 -2
  35. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx.egg-info/requires.txt +2 -0
  36. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/pyproject.toml +2 -0
  37. openscvx-0.3.2.dev127/tests/test_plotting.py +492 -0
  38. openscvx-0.3.1.dev60/examples/plotting.py +0 -3738
  39. openscvx-0.3.1.dev60/examples/realtime/cinema_vp_realtime.py +0 -631
  40. openscvx-0.3.1.dev60/examples/realtime/drone_racing_realtime.py +0 -604
  41. openscvx-0.3.1.dev60/examples/realtime/obstacle_avoidance_realtime.py +0 -466
  42. openscvx-0.3.1.dev60/openscvx/plotting/__init__.py +0 -30
  43. openscvx-0.3.1.dev60/openscvx/plotting/plotting.py +0 -1155
  44. openscvx-0.3.1.dev60/tests/test_plotting.py +0 -624
  45. openscvx-0.3.1.dev60/tests/test_pyqtgraph_functions.py +0 -297
  46. openscvx-0.3.1.dev60/tests/test_pyqtgraph_helpers.py +0 -138
  47. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/assets/logo.svg +0 -0
  48. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/release-drafter.yml +0 -0
  49. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/workflows/_docs.yml +0 -0
  50. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/workflows/docs.yml +0 -0
  51. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/workflows/lint.yml +0 -0
  52. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/workflows/nightly.yml +0 -0
  53. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/workflows/release-drafter.yml +0 -0
  54. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/workflows/release.yml +0 -0
  55. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/workflows/tests-integration.yml +0 -0
  56. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.github/workflows/tests-unit.yml +0 -0
  57. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/.gitignore +0 -0
  58. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/LICENSE +0 -0
  59. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Overview/constraint_reformulation.md +0 -0
  60. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Overview/control_parameterization.md +0 -0
  61. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Overview/discretization.md +0 -0
  62. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Overview/ocp.md +0 -0
  63. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Overview/scvx.md +0 -0
  64. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Overview/time_dilation.md +0 -0
  65. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/UnderTheHood/lowering_architecture.md +0 -0
  66. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
  67. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/advanced_problem_setup.md +0 -0
  68. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/api.md +0 -0
  69. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/api_constraints.md +0 -0
  70. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/api_control.md +0 -0
  71. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/api_integrators.md +0 -0
  72. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/api_state.md +0 -0
  73. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/api_trajoptproblem.md +0 -0
  74. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/api_variable.md +0 -0
  75. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/basic_problem_setup.md +0 -0
  76. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/tutorial_6dof_los_guidance.md +0 -0
  77. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/tutorial_6dof_obstacle_avoidance.md +0 -0
  78. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/Usage/tutorials.md +0 -0
  79. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/assets/favicon.png +0 -0
  80. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/assets/images/ct-scvx_dark.png +0 -0
  81. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/assets/images/ct-scvx_light.png +0 -0
  82. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/assets/images/ctcs_dark.png +0 -0
  83. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/assets/images/ctcs_light.png +0 -0
  84. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/assets/images/problem_class_dark.png +0 -0
  85. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/assets/images/problem_class_light.png +0 -0
  86. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/assets/logo.svg +0 -0
  87. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/citation.md +0 -0
  88. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/getting-started.md +0 -0
  89. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/index.md +0 -0
  90. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/docs/javascripts/mathjax.js +0 -0
  91. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/abstract/brachistochrone.py +0 -0
  92. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/car/dubins_car.py +0 -0
  93. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/car/dubins_car_disjoint.py +0 -0
  94. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/car/dubins_car_stljax.py +0 -0
  95. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/examples/realtime/dubins_car_realtime.py +0 -0
  96. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/figures/ctlos_cine.gif +0 -0
  97. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/figures/ctlos_dr.gif +0 -0
  98. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/figures/dtlos_cine.gif +0 -0
  99. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/figures/dtlos_dr.gif +0 -0
  100. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/figures/openscvx_logo.svg +0 -0
  101. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/figures/oscvx_structure_full_dark.svg +0 -0
  102. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/figures/video_preview.png +0 -0
  103. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/__init__.py +0 -0
  104. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/1-background.avif +0 -0
  105. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/1-background@1x.avif +0 -0
  106. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/1-background@2x.avif +0 -0
  107. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/1-background@3x.avif +0 -0
  108. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/1-background@4x.avif +0 -0
  109. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/2-mars.avif +0 -0
  110. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/2-mars@1x.avif +0 -0
  111. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/2-mars@2x.avif +0 -0
  112. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/2-mars@3x.avif +0 -0
  113. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/2-mars@4x.avif +0 -0
  114. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/3-moon.avif +0 -0
  115. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/3-moon@1x.avif +0 -0
  116. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/3-moon@2x.avif +0 -0
  117. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/3-moon@3x.avif +0 -0
  118. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/3-moon@4x.avif +0 -0
  119. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/4-sat1.avif +0 -0
  120. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/4-sat1@1x.avif +0 -0
  121. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/4-sat1@2x.avif +0 -0
  122. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/4-sat1@3x.avif +0 -0
  123. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/4-sat1@4x.avif +0 -0
  124. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/5-space.avif +0 -0
  125. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/5-space@1x.avif +0 -0
  126. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/5-space@2x.avif +0 -0
  127. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/5-space@3x.avif +0 -0
  128. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/5-space@4x.avif +0 -0
  129. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/6-earth.avif +0 -0
  130. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/6-earth@1x.avif +0 -0
  131. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/6-earth@2x.avif +0 -0
  132. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/6-earth@3x.avif +0 -0
  133. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/images/layers/6-earth@4x.avif +0 -0
  134. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/javascripts/parallax.js +0 -0
  135. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/logo.svg +0 -0
  136. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/stylesheets/custom.css +0 -0
  137. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/assets/stylesheets/parallax.css +0 -0
  138. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/home.html +0 -0
  139. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/main.html +0 -0
  140. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/partials/parallax/hero.html +0 -0
  141. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/material/overrides/partials/parallax.html +0 -0
  142. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/mkdocs.yml +0 -0
  143. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/__init__.py +0 -0
  144. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/algorithms/__init__.py +0 -0
  145. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/algorithms/autotuning.py +0 -0
  146. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/algorithms/optimization_results.py +0 -0
  147. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/algorithms/ptr.py +0 -0
  148. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/algorithms/solver_state.py +0 -0
  149. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/config.py +0 -0
  150. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/discretization/__init__.py +0 -0
  151. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/discretization/discretization.py +0 -0
  152. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/expert/__init__.py +0 -0
  153. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/expert/byof.py +0 -0
  154. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/expert/lowering.py +0 -0
  155. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/expert/validation.py +0 -0
  156. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/integrators/__init__.py +0 -0
  157. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/integrators/runge_kutta.py +0 -0
  158. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/lowered/__init__.py +0 -0
  159. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/lowered/cvxpy_constraints.py +0 -0
  160. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/lowered/cvxpy_variables.py +0 -0
  161. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/lowered/dynamics.py +0 -0
  162. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/lowered/jax_constraints.py +0 -0
  163. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/lowered/parameters.py +0 -0
  164. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/lowered/problem.py +0 -0
  165. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/lowered/unified.py +0 -0
  166. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/propagation/__init__.py +0 -0
  167. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/propagation/post_processing.py +0 -0
  168. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/propagation/propagation.py +0 -0
  169. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/solvers/__init__.py +0 -0
  170. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/solvers/cvxpy.py +0 -0
  171. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/__init__.py +0 -0
  172. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/augmentation.py +0 -0
  173. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/builder.py +0 -0
  174. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/constraint_set.py +0 -0
  175. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/__init__.py +0 -0
  176. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/arithmetic.py +0 -0
  177. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/array.py +0 -0
  178. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/constraint.py +0 -0
  179. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/control.py +0 -0
  180. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/expr.py +0 -0
  181. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/linalg.py +0 -0
  182. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/math.py +0 -0
  183. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/spatial.py +0 -0
  184. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/state.py +0 -0
  185. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/stl.py +0 -0
  186. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/expr/variable.py +0 -0
  187. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/hashing.py +0 -0
  188. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/lower.py +0 -0
  189. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/lowerers/__init__.py +0 -0
  190. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/lowerers/cvxpy.py +0 -0
  191. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/lowerers/jax.py +0 -0
  192. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/preprocessing.py +0 -0
  193. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/problem.py +0 -0
  194. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/time.py +0 -0
  195. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/symbolic/unified.py +0 -0
  196. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/utils/__init__.py +0 -0
  197. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/utils/cache.py +0 -0
  198. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/utils/caching.py +0 -0
  199. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/utils/printing.py +0 -0
  200. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/utils/profiling.py +0 -0
  201. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx/utils/utils.py +0 -0
  202. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx.egg-info/dependency_links.txt +0 -0
  203. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/openscvx.egg-info/top_level.txt +0 -0
  204. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/scripts/gen_example_pages.py +0 -0
  205. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/scripts/gen_ref_pages.py +0 -0
  206. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/setup.cfg +0 -0
  207. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/__init__.py +0 -0
  208. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/brachistochrone_analytical.py +0 -0
  209. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/__init__.py +0 -0
  210. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/__init__.py +0 -0
  211. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_arithmetic.py +0 -0
  212. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_array.py +0 -0
  213. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_constraint.py +0 -0
  214. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_expr.py +0 -0
  215. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_linalg.py +0 -0
  216. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_math.py +0 -0
  217. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_node_reference.py +0 -0
  218. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_parameters.py +0 -0
  219. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_scaling.py +0 -0
  220. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_spatial.py +0 -0
  221. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/expr/test_variable.py +0 -0
  222. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/test_augmentation.py +0 -0
  223. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/test_hashing.py +0 -0
  224. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/test_lower_cvxpy.py +0 -0
  225. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/test_lower_jax.py +0 -0
  226. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/test_preprocessing.py +0 -0
  227. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/symbolic/test_unified.py +0 -0
  228. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/test_brachistochrone.py +0 -0
  229. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/test_cvxpygen_optional.py +0 -0
  230. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/test_discretization.py +0 -0
  231. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/test_examples.py +0 -0
  232. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/test_expert.py +0 -0
  233. {openscvx-0.3.1.dev60 → openscvx-0.3.2.dev127}/tests/test_integrators.py +0 -0
  234. {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.1.dev60
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.plotting import plot_control_norm, plot_xy_xz_yz
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
- # plot_animation_3DoF_rocket(results, problem.settings).show()
171
- # plot_scp_animation(results, problem.settings).show()
172
- # plot_state(results, problem.settings).show()
173
- # plot_control(results, problem.settings).show()
174
- plot_control_norm(results, problem.settings).show()
175
- plot_xy_xz_yz(results, problem.settings).show()
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
- # If installed with extras, you can use the following to plot with pyqtgraph
178
- # plot_animation_pyqtgraph(results, problem.settings)
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.plotting import plot_animation
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
- plot_animation(results, problem.settings).show()
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.plotting import plot_animation_double_integrator
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
- time = ox.Time(
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=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
- plot_animation_double_integrator(results, problem.settings).show()
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.plotting import plot_animation
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.1
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
- plot_animation(results, problem.settings).show()
277
- # plot_animation_pyqtgraph(results, problem.settings)
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.plotting import plot_animation
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
- plot_animation(results, problem.settings).show()
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.plotting import plot_animation
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
- plot_animation(results, problem.settings).show()
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.plotting import plot_animation
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
- plot_animation(results, problem.settings).show()
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.plotting import plot_animation
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.01
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
- plot_animation(results, problem.settings).show()
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.plotting import plot_animation
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
- plot_animation(results, problem.settings).show()
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()
@@ -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.plotting import plot_animation
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
- plot_animation(results, problem.settings).show()
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()