Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Write user-facing notes under the section that best describes the change. Keep entries concise, link to relevant pull requests or documentation when useful, and include benchmark baseline and measurement context for performance claims.
[Unreleased]¶
Added¶
- Python 3.15 support, with numerical tests and patched Open3D source-build and rendering checks in Ubuntu CI.
Changed¶
- Refreshed the numerical and rendering dependency lock for Python 3.15,
including compatible Viser and
rpds-pyreleases.
Performance¶
Deprecated¶
Breaking changes¶
Fixed¶
- Restored the Section IVa PyElastica benchmarks using COOMM, with PyElastica 1.0 support and short rollout tests in CI; see PR #220.
- Recognized the current patched Open3D 0.20
.soromox3build in the macOS rendering guard, allowing image/video export and modern windows.
Documentation¶
- Updated the sequential CPU rollout results to match the latest paper version, reporting up to 27.0× speedup over SoRoSim for three-second rollouts on an Intel Core Ultra 7 165H CPU, with solver context and tip-position agreement.
Contributors¶
[0.5.0] - 2026-09-18¶
This release introduces shared renderer configuration and studio scenes, upgrades Open3D support, and adds UMArm operational-space tracking. Renderer API and default changes are listed below; see the full changes since v0.4.1.
Added¶
- Shared lighting, materials, shadows and curved backdrops, with technical,
neutral/bright/dark studio, flat and clay presets for Open3D and Viser.
Preset lights and backdrops follow the ground orientation for upright, hanging
and tilted scenes. Mount options now include beveled disks, truncated cones
and flared collars;
GroundPlaneConfig(height_reference="base_mounting_face")aligns scenery with the mounting face. See PR #210 and PR #212. - A UMArm operational-space circle-tracking example using
OperationalSpaceImpedanceControlTrackerand balanced antagonistic pressures, extending the joint-space tracking examples available in v0.4.1; see PR #211. - A reproducible Figure 13 assembler for the safety-control and reinforcement learning studies, exporting PDF, SVG and PNG with a source-hash manifest; see the paper reproduction instructions.
Changed¶
- Source checkouts using
uvnow build pinned, patched Open3D 0.20.0 on macOS, Linux x86-64/ARM64 and Windows x86-64. The build supports Metal rendering on macOS and Vulkan image/video exports on Linux and Windows, with neutral color grading, selectable linear/ACES tone mapping and a fix for uninitialized mesh texture coordinates. Plainpip install soromox[rendering]uses PyPI packages; see the installation guide, PR #213 and PR #214. - Open3D static
show()now uses the modern renderer, matching image exports. Interactive animation retains the legacy renderer with matching camera projection and warnings about appearance differences. Simulation and control examples export videos by default. Viser adapts the shared scene settings; Matplotlib and OpenCV use white backgrounds and ignore scene appearance. - Refreshed Section V videos, snapshots and website media with studio styling. Figures 11 and 13 improve trajectory visibility, reference-surface contrast, legend labels and transparent backgrounds; see PR #212.
- Section Vf policy rollouts now default to 20 seconds instead of 7; the step
count derives from duration and control FPS unless
--n-stepsis supplied.
Breaking changes¶
- Renderer constructor settings move into
config=RendererConfig(...), withscene,camera,colors,geometryandoutputsections. For example, replaceOpen3DRenderer(robot, width=1920, height=1080)with:
from soromox.rendering import Open3DRenderer, RendererConfig, RenderOutputConfig
renderer = Open3DRenderer(
robot,
config=RendererConfig(output=RenderOutputConfig(width=1920, height=1080)),
)
Camera and color modules move from rendering.camera_config and
rendering.color_config to rendering.config.camera and
rendering.config.colors. Import public configuration types, including
VideoEncodingConfig, from soromox.rendering or soromox.rendering.config.
Per-call camera, color and video overrides replace entire configuration
sections; see the configuration guide.
- Output defaults are now shared: 800 × 600 pixels, 80 backbone samples and
48 cross-section samples. Compared with v0.4.1, Open3D and Viser output shrinks
from 1920 × 1200, OpenCV output changes from 700 × 700, Matplotlib and OpenCV
backbone sampling increases from 50 to 80, and Open3D cross-section sampling
increases from 20 to 48. Set config.output and config.geometry explicitly
to retain previous dimensions and sampling.
- The automatic camera distance factor changes from 10.0 to 1.5. Ground planes
default to world alignment (+Z spatial, +Y planar); select
GroundPlaneConfig(alignment="base") for base alignment. Open3D and Viser
default to flared collar mounts; use config.geometry.base_plate_style="disk"
for the previous cylindrical shape.
- Open3D render_sequence(..., record_path=...) now exports synchronously through
the modern renderer and returns without interactive playback. record_every_n
reduces both frame count and FPS; playback controls do not affect exports.
OpenCV sequence options become keyword-only and require record_path.
- Extras that include Open3D now require open3d>=0.20, up from >=0.18.
Checkout-based uv installs additionally need native build tools and graphics
dependencies for the patched source build; see the
installation guide.
- Renamed the joint-space example track_mckibben_umarm.py to
track_umarm_with_feedforward_compensation.py in
examples/control/configuration_space/.
Fixed¶
- Removed artificial seams and dark rings at matching swept-link boundaries in Open3D and Viser by smoothing normals and removing buried end caps, while preserving actual cross-section steps.
- Open3D static viewing probes Linux window creation in a separate process and reports native display failures with logs before initializing the viewer.
- Matplotlib video exports honor configured pixel dimensions independently of global DPI. Static ground surfaces no longer hide robot lines above the floor, and rounded joins remove gaps between backbone segments.
Documentation¶
- Added a preset gallery with upright and hanging Open3D/Viser comparisons, and expanded the configuration guide with shared settings and backend differences.
Contributors¶
- Thanks to @Johannap1 for identifying unused ground-plane code, native window-creation failures and Open3D segment seams in PR #210.
- Thanks to @zuorunze for reviewing the UMArm pressure-coordinate formulation and validating the tracking example in PR #211.
- Thanks to @vdperfetta01 for suggestions that improved trajectory visibility, reference surfaces and figure legends in PR #212.
[0.4.1] - 2026-09-06¶
Added¶
- Added
soromox.simulation.SemiImplicitEuler, a Diffrax-compatible kick–drift integrator forSoftRobotrollouts that supports unequal floating-base configuration and velocity dimensions, manifold retraction, and trailing auxiliary state; see the Simulation Integrators guide and PR #201. - Added reproducible six-start Section Vd control-gain optimization results, with a shared dimensionless objective, tuned settings, schema-v3 archives, and regression coverage; see PR #204 and issue #154.
- Added a dynamic UMArm joint-space tracking example with
FeedforwardCompensationTracker, balanced antagonistic pressure offsets, tracking plots, and pressure-colored Viser recording; see PR #207. - Added the generic signed direct
AffineGeneralizedCoordinateActuator, with affine generalized-coordinate routing and metadata-only input bounds; see PR #187. - Added affine-curvature GVS examples for the R-SIP, force-actuated Soft Cart-Pole, Soft Pendubot, and Soft Furuta Pendulum, including semantic upright/hanging configurations, open-loop simulations, summary plots, and Viser rendering; see PR #187.
- Added renderer-neutral cross-section contours and loft construction, with a registration hook for extending both swept 3D renderers with new geometries; see PR #200.
Changed¶
- Extended the parallel-rollout benchmark tooling with explicit solver
selection, including
semi-implicit-euler, per-case checkpointing, and expected out-of-memory reporting. - Updated the Section Vd workflow with one generator and tuning study, retuned controller and optimizer settings, strict device selection, regenerated figures, and distinct optimized-best and initial-median animations with a shared gravity-down camera.
- Unified fixed- and floating-base gravity with shared analytical point-mass quadrature, avoiding runtime autodiff and full spatial gravity contractions; see PR #209.
- Standardized example mounting declarations with named poses and conventional world-down gravity, and aligned Section Vf rendering with zero gravity; see PR #208.
- Open3D and Viser swept backbones now preserve circular, elliptical, and rectangular cross-sections, including dimensions that vary with abscissa; see PR #200.
Performance¶
- Refreshed the committed FP64 parallel-rollout measurements on an NVIDIA RTX 5090 through batch size 1,024. Automatic backend selection resolves to Warp for GVS; relative to batch size 1, GVS throughput reaches 679.7× for one segment and 133.6× for 32 segments at batch size 1,024. The 32-segment case peaks at batch size 512 and is 1.2% lower at 1,024; see the benchmark protocol and PR #205.
Breaking changes¶
- Corrected the
PlanarPCSthreadlike routing convention so a positive material-yoffset shortens under positivekappa_z. Existing planar threadlike models that compensated for the previous sign must update their routing offsets or actuator directions. - Renamed the Viser
cylinder_sectionsand Open3Dtube_resolutionoptions to the geometry-neutralcross_section_resolution; see PR #200. - Renamed
AffineJointTransmissionandAffineJointTransmissionParamstoAffineGeneralizedCoordinateTransmissionandAffineGeneralizedCoordinateTransmissionParamsto reflect support for rigid-joint, continuum, and hybrid generalized coordinates; see PR #187.
Fixed¶
- Fixed analytical gravitational forces for rotated mounts in
ArticulatedSoftRobotandPlanarHSA; see PR #209. - Set Viser scenes to +Z-up while preserving explicit camera-up selections; see PR #208.
- Corrected the Section Ve camera and render artifacts so +Z gravity appears downward; see PR #208.
- Fixed
DynamicalSystemAPI documentation to avoid assuming second-order[q, qd]states or configuration-only projection; see PR #206. - Fixed Viser discrete cross-section markers to match Open3D: circular, rectangular, and elliptical sections now use spheres, boxes, and ellipsoids, respectively; see PR #200.
- Fixed Open3D and Viser lofting across link boundaries, which produced a short shape-morphing funnel when adjacent links used different cross-sections.
- Fixed Open3D swept meshes reusing the first endpoint cross-section at both ends, which previously rendered tapered profiles as piecewise-constant.
Documentation¶
- Added the Simulation Integrators API guide, including solver compatibility and floating-base integration caveats.
- Documented the low-dimensional soft-pendulum coordinate, actuation, material, and rigid-body-assumption conventions; see PR #187.
[0.4.0] - 2026-09-01¶
Added¶
- Added explicit JAX and Warp execution backends for
PlanarPCS,PCS, andGVS, with automatic backend selection, typed launch parameters, reusable APIs undersoromox.execution, and arbitrary positive PCS quadrature counts. The Warp implementation provides fused forward-kinematics, full inertial Jacobian, dynamics-term, and forward-dynamics paths; allocation-free, CUDA-graph-capturable launchers; and direct-effort fusion for built-in linear threadlike actuation. - Added native matrix-free Warp products for
J(q, s) @ qdandsum_s J(q, s).T @ wrench_s. These paths reuse caller-owned workspace and floating-frame state instead of materializing a Jacobian at every spatial sample. - Added fixed and floating-base configurations across all system families, including planar and quaternion base poses, distinct configuration and velocity dimensions, world-frame base velocities and wrenches, vectorized JAX composition, and specialized Warp execution; see Floating-base systems.
Changed¶
- Reworked the execution layer around shared quaternion,
SO(2),SO(3),SE(2), andSE(3)primitives and explicit operand/output contracts, so the same public model methods can dispatch to optimized JAX or Warp paths without changing the model definition. - Reduced GVS dynamics assembly to compact strain bases and bounded active-DOF prefixes, and reused intermediate velocity and floating-root rotation terms.
- Made effort laws declare which transmission states they need.
DirectEffortnow skips unused actuator-coordinate and velocity evaluation, and each actuator moment matrix is assembled only once. - Made the system-method and parallel-rollout benchmarks device-selectable and reproducible. Results now record source revision, software versions, precision, accelerator, CPU affinity, warmup, and synchronized sample data; GPU requests no longer fall back silently to CPU.
Performance¶
- Fresh FP64 comparisons against v0.3.0 used Python 3.12.13, JAX 0.11.0, and
Warp 1.16.0. CPU runs were restricted to an otherwise-idle performance core
of an Intel Core Ultra 9 285K with all library thread counts set to one; GPU
runs used an otherwise-idle NVIDIA RTX 5090. The main grid covered
PlanarPCS,PCS, and order-1GVS; 1, 2, 8, 16, and 32 segments; batches 1, 16, 64, 256, and 1024; five-point quadrature; and forward kinematics, full inertial Jacobians, fused pose-plus-Jacobian evaluation, JVP, VJP, dynamics terms, and forward dynamics. Kinematics cases evaluated 60 spatial samples per system, whereas each dynamics case evaluated one batched state, so their absolute times are not directly comparable. Results are medians of seven synchronized samples after five warmups. - Relative to v0.3.0 across the 25 segment/batch combinations, JAX GVS
dynamics terms and forward dynamics improved by geometric means of 1.17× and
1.14× on CPU and 1.10× and 1.08× on GPU. At 32 segments and batch 1024,
terms/forward time fell 15.5%/14.1% on CPU and 21.2%/17.7% on GPU. GVS
kinematics, JVP, and VJP remained near parity, as did the corresponding
release-over-release
PlanarPCSandPCSpaths. - An eight-segment discretization sweep used batches 1, 256, and 1024; three-
and nine-point quadrature for
PlanarPCSandPCS; and GVS strain-order/ quadrature pairs 0/5, 3/7, and 5/9. At batch 1024, order-5 GVS JAX dynamics terms/forward dynamics improved 15.0%/14.1% on CPU and 29.8%/22.8% on GPU relative to v0.3.0.PlanarPCSandPCSquadrature sweeps showed no consistent release-over-release shift beyond run-to-run variation. - For the main grid, current Warp versus current JAX improved full inertial
GVS Jacobians by a 3.38× geometric mean on CPU and 10.88× across the 24
matched GPU cases; fused GVS pose-plus-Jacobian evaluation improved 3.37×
and 11.17×. GPU Warp also
improved full Jacobians by 1.35× for
PlanarPCSand 2.53× forPCS. Across all 25 matched GPU segment/batch cases, Warp/JAX geometric-mean speedups for dynamics terms/forward dynamics were 1.00×/1.62× forPlanarPCS, 0.94×/1.16× forPCS, and 2.00×/1.77× forGVS; the value below one means that PCS dynamics terms alone were about 7% slower under Warp even though PCS forward dynamics was 16% faster. Individual terms/forward cases ranged from 0.22–3.29×/0.89–2.80× forPlanarPCS, 0.33–2.47×/0.33–2.24× forPCS, and 0.35–5.53×/0.41–4.44× forGVS. At batch 256 across the five segment counts, the corresponding geometric means were 1.11×/1.93×, 1.25×/1.43×, and 2.70×/2.22×. The minima principally expose fixed launch cost for one-segment terms and under-occupied persistent chain kernels at 32 segments and batch 1; the maxima occurred at batch 1024. At 32 segments and batch 1024, the dense JAX GVS Jacobian case exhausted the RTX 5090's 32-GB memory while Warp completed it; Warp also improved terms/forward time by 1.27×/1.20×. In the quadrature sweep, GPU Warp terms/forward geometric-mean speedups were 1.93×/2.66× at three points and 1.87×/1.80× at nine points forPlanarPCS, and 1.46×/2.05× and 1.42×/1.78× forPCS. Small GPU workloads can still favor JAX. - CPU Warp is primarily a dense-kinematics optimization: its full Jacobian
geometric means improved 1.46× for
PlanarPCS, 1.50× forPCS, and 3.38× forGVS, but JAX was 1.82×/1.78× faster overall for GVS dynamics terms / forward dynamics. In the high-order sweep at batch 1024, Warp improved order-0 terms/forward dynamics by 1.38×/1.34×, but was 1.46×/1.41× slower at order 3 and 1.79×/1.70× slower at order 5. The CPUautopolicy therefore continues to select JAX. On GPU at the same batch, Warp's terms/forward speedups tapered from 4.25×/3.68× at order 0 to 2.02×/1.64× at order 3 and 1.21×/1.14× at order 5; the smallest order-5 cases still favored JAX. - Native matrix-free Warp JVP/VJP was compared with dense Warp Jacobian
materialization at eight segments, 60 samples, and batches 1, 16, 64, 256,
and 1024. CPU JVP/VJP speedups ranged from 1.60–4.22×/1.31–5.47× for
PlanarPCS, 4.05–6.90×/3.02–5.18× forPCS, and 3.27–5.58×/1.59–1.98× forGVS; GPU ranges were 3.43–4.62×/3.22–4.67×, 1.77–7.22×/1.91–5.15×, and 2.08–7.89×/2.00–5.29×, respectively. Directional workspace was 21.5×, 43.0×, and 83.6× smaller than dense materialization. These measurements used five warmups and the median of seven runs with 20 synchronized iterations.
Breaking changes¶
- Changed all SoRoMoX quaternion coordinates to the scalar-last Hamilton
convention
[qx, qy, qz, qw], including spatial base poses, operational-space poses, floating-base state, and JAX and Warp execution. Code that constructs or indexes quaternions directly must use the new coordinate order. - Replaced the ambiguous
SoftRobot.num_dofsattribute with explicitnum_internal_dofs,num_coordinates, andnum_velocitiesdimensions. Code that allocates configurations, velocities, or internal controller state must now select the corresponding dimension explicitly. - Removed mounting poses from physical parameter PyTrees. Constructors retain
the
base_poseargument for fixed mounting, models expose the resolved value asfixed_base_pose, andwith_fixed_base_pose(...)updates a fixed mounting independently ofwith_params(...)andupdate_params(...). - Renamed abscissa-only batch APIs to identify their mapped argument:
forward_kinematics_batched(...)is nowforward_kinematics_abscissa_batched(...),jacobian_batched(...)is nowjacobian_abscissa_batched(...), and the body-frame, inertial-frame, and Jacobian-time-derivative variants follow the same*_abscissa_batchedconvention. The old names have been removed. - Moved generic actuator-visualization adaptation out of
SoftRobot.actuator_visual_layers(...)and intosoromox.rendering.actuator_visual_layers(...). Renderers continue to adapt standardSoftRobotsystems automatically, while robot-defined hooks remain available for specialized visualization behavior.
Fixed¶
- Fixed forward-kinematics, Jacobian, and energy custom JVPs to preserve derivatives with respect to dynamic model leaves, including fixed mounting poses and gravity updated inside compiled functions, across JAX and accelerated execution paths.
- Fixed GVS abscissa-batched partial-cell poses and inertial Jacobians so
rotational strain-basis values consistently honor
scale_rotational_basis_by_lengthfor every supported basis family.
Documentation¶
- Added an Execution Devices and Backends guide, a backend-selection example in the Quick Start, and API reference pages for execution configuration and the reusable GVS and PCS Warp interfaces.
- Documented the low-dimensional soft-pendulum coordinate, actuation, material, and rigid-body-assumption conventions.
Contributors¶
- Thanks to @vdperfetta01 for sustained review of the GVS optimization, execution-backend, floating-base, and API changes in PR #174, #177, #181, #183, #184, #185, and #186, including identifying a test failure before merge.
- Thanks to @mohammedtarnini and @Johannap1 for reviewing the GVS assembly optimization in PR #174.
[0.3.0] - 2026-08-25¶
Added¶
- Shared continuum-component APIs under
soromox.systems.componentsfor link, joint, cross-section, and isotropic-material parameters and specifications. - Common
from_links,params_from_links,update_link_params,link_matrices_from_material, andwith_isotropic_materialworkflows for PCS and PlanarPCS, with the same material/update APIs on GVS. - GVS joint stiffness and damping parameters that participate in global matrix
assembly, plus
update_joint_paramsfor immutable joint-local updates. - Differentiable unit-response mappings from Young's modulus with either shear modulus or Poisson's ratio, plus optional material damping, to canonical generalized link matrices.
-
Continuum-component, parameter-update, and material-optimization documentation with complete PCS and GVS examples.
-
Compiled parameter-update examples and regression coverage for every public system family, routed actuators, passive elements, gradients, eager cache refreshes, static-structure rejection, and no-retrace same-layout updates.
Changed¶
- Accelerated PlanarPCS, PCS, and GVS forward dynamics through fused dynamics assembly, causal Jacobian propagation, and matrix-free Lie-algebra actions. Compared with v0.2.3 across one-environment CPU and 256-environment GPU benchmarks with 1, 4, 8, and 16 segments, warm runtime improved in every measured case: 1.06–2.21x for PlanarPCS, 1.32–8.28x for PCS, and 1.30–5.36x for GVS. At 16 segments on GPU, temporary memory decreased from 459 MB to 95 MB, 1.73 GB to 270 MB, and 3.02 GB to 128 MB, respectively.
- Routed exact inverse-dynamics controllers through the contracted
dynamics_termsinterface and fused actuation- and operational-space term transformations to avoid repeated inertia, Coriolis, gravity, Jacobian, and matrix-factorization work. Across affected PCS and GVS controller paths with one and four segments, this reduced runtime by 38.3% on a geometric-mean basis (up to 55.9%).
Fixed¶
- Made the Open3D viewer's Q/Esc shortcuts close windows cleanly so execution continues after the viewer exits.
- Made bound-aware finite-difference Jacobians compatible with JAX immutable
arrays and documented the
numerical_jacobianutility.
Contributors¶
- Thanks to @matteodv99tn for his contributions to PR #156.
- Thanks to @ivrolan for his contributions to PR #162.
- Thanks to @mohammedtarnini for his suggesting the improvement implemented in PR #166.
[0.2.3] - 2026-08-19¶
Added¶
- Reverse-mode-safe numerical primitives, strict singularity diagnostics, and pytree finiteness reporting for locating and handling degenerate model configurations.
- Public, dtype-aware
jacobian_coefficientsfor forward and inverse Lie-group Jacobians, together with a reproducible Lie-algebra benchmark covering primal, Jacobian, Hessian, and analytic constant-strain derivative paths. - Public
constant_strain.se2.operatorsandconstant_strain.se3.operatorsbundles with a fixed named result for callers that need adjoints, tangents, and an optional analytic tangent derivative at the same strain and arclength. - Public
se2andse3left Jacobians and analytic directional derivatives for accumulated Lie-algebra coordinates, independent of any constant-strain rod interpretation. - Public
constant_strain.se3.tangent_and_derivativefor callers that need the selective tangent pair without constructing unused adjoint operators. - An offline Section Vd post-processing renderer for saved optimization trajectories, with reproducible tracking plots, MP4 animations, optional GIF conversion, and intermediate metrics.
Changed¶
- Harmonized PCS, PlanarPCS, and GVS around nested
params.linkownership, descriptive public construction names, shared link/joint specifications, and canonical per-link generalized stiffness and damping matrices. - Moved shared
LinkSpecandJointSpecfunctionality out of the GVS package; GVS now retains only segment, strain-basis, quadrature, and runtime concepts specific to variable-strain mechanics. - Simplified cross-section parameters to coefficient arrays populated by link
factories; constant values and
LinearProfilecover constant and linearly varying geometry without a profile-parameter class hierarchy. - Made isotropic material parameters caller-owned construction/optimization PyTrees instead of duplicating material and generalized-matrix representations inside system parameters.
- Made geometry updates refresh material unit-response operators without silently replacing explicitly supplied canonical matrices.
- Reworked
SO(3),SE(2), andSE(3)exponential/logarithmic maps, constant-strain adjoint and tangent operators, and PlanarPCS pose integration around stable closed forms and high-order near-zero series. Constant-strain tangent derivatives remain explicit analytic production paths; runtime autodiff is used only as a test oracle. - Organized constant-strain operators into dedicated
se2andse3modules with unsuffixed names. General left-Jacobian machinery now belongs to the rigid-body Lie-algebra modules; the constant-strain package retains arclength scaling, prepared powers, rod-specific adjoints, and the sharedConstantStrainOperatorsresult. - Fused repeated constant-strain operator evaluation in PlanarPCS, PCS, and
GVS. The planar path uses direct SE(2) blocks; the spatial operators share
exact fourth-order matrix powers and tangent coefficients. PCS additionally
prepares arclength-independent powers once per segment, assembles transported
tangents directly, and propagates the contracted
Jd @ qdneeded by forward dynamics instead of materializing unused matrices. PlanarPCS and GVS now use the same contracted-derivative strategy in their dynamics-only recurrences while preserving full Jacobian derivatives in public kinematics. - Replaced generated symbolic PlanarHSA expressions with a JAX-native
PlanarPCS implementation, reusing shared planar kinematics, Jacobians,
quadrature, and dynamics; migrated parameter files to the descriptive
reference_strainschema and removed the obsolete symbolic and legacy-parameter modules. -
Compared with
mainon CPU/JAX 0.11.0 across five fresh processes, the 40-case Lie benchmark reduced geometric-mean steady-state and compile time by 24.3% and 5.3%. A fresh raw before/after table is reported in this PR for PlanarPCS, PCS, and GVS. -
Updated the dependency metadata and lockfile for a CUDA 13-enabled JAX and PyTorch stack, and declared
ipywidgetswith the optional Open3D extras. - Simplified rendering, example, paper-result, and complete installations by
removing an unused video-encoding package; video output continues to use the
system
ffmpegexecutable. - Consolidated the Section Vd control-gain optimization scripts around a shared,
testable optimization loop and independently configured collocated and
synergistic cases, with shared CLI/output helpers, explicit output locations,
overwrite protection, paper-result iteration defaults,
gammaderived from a configurable tendon-length error scale for collocated integral saturation (default 10 mm), finite saturation-parameter validation, stale-artifact documentation, and consistent NumPy archive, pickle, and diagnostic-figure handling. Diagnostic figures are always saved, the obsolete--save-figuresswitch is no longer needed, and the primary optimization data is persisted before plotting or interactive rendering begins; saved trajectory diagnostics can be rendered without rerunning optimization. - Normalized explicit continuous-rollout
save_tssequences to JAX arrays and preserved traced initial times for JIT-compiled and vectorized open- and closed-loop rollouts.
Fixed¶
- Made same-PyTree, same-shape, same-dtype system, environment, actuator, passive-element, and isotropic-material replacements usable inside JIT-compiled code. Concrete eager calls retain value validation, while traced calls enforce the statically observable type and shape contract.
- Split parameter validation into explicit
validate_structure()andvalidate_values()subclass hooks, with framework-owned eager and traced dispatch for intrinsic and model-structure-dependent validation. Closed-over concrete values are checked at JAX trace time, while dynamic leaves retain structure-only validation. Component-to-robot checks use the same structural and concrete-value phases. - Reused I-SUPPORT routing spans and McKibben joint-pair topology during compiled numeric updates, and kept GVS cross-section index dtypes stable when refreshing parameter-dependent caches.
- Included stored GVS joint stiffness and damping in global stiffness and damping assembly.
- Resolved omitted GVS padding values in the advanced
GVS(params, structure)constructor and aligned rectangular geometry output with the shared[height, width]cross-section convention. - Normalized caller-provided isotropic material sequences to JAX arrays and rejected non-finite or nonphysical link geometry, density, and material values during concrete construction and replacement.
- Migrated examples, benchmarks, and paper case studies to the harmonized PCS and GVS parameter APIs.
- Kept values and reverse-mode gradients finite at degenerate normalization, division, square-root, inverse-kinematics, and thread-routing sites across PCS, GVS, Planar HSA, articulated, McKibben, rotation, and reference-trajectory code paths.
- Sanitized inactive square-root and quotient inputs in SO(3)/SE(3) magnitude and quaternion-conversion branches, preventing batched selection from exposing NaNs under nested JVP/reverse-mode transforms; the SoftRobot forward-kinematics and spatial-Jacobian regressions from PR #148 now pass.
- Kept Lie exponential/logarithmic values, first derivatives, and Hessians finite and accurate at zero and small rotations, including batched SE(2) and arbitrary-axis SE(3) inputs, without adding autodiff to production paths.
- Made simulation benchmark timing treat Python solver/save parameters as static JAX arguments so the existing rollout benchmark can compile and run.
- Prevented automatically generated continuous-rollout save grids from overshooting the requested final time, while always including that endpoint exactly for both divisible and non-divisible save intervals.
- Set the Section Vd collocated and synergistic optimization defaults to the 100 iterations used by the paper-result histories, and document that setting in the reproduction commands.
- Corrected Section Vd loss/parameter history pairing, rejected non-finite optimization candidates, and selected the best collocated and synergistic plotting batches independently.
- Guarded the collocated optimization reference against transient setpoints and collapsed tendon paths by using stable asymmetric tensions and failing fast when the generated steady state is unsuitable for reverse-mode optimization.
- Reported Open3D window-creation failures explicitly, with a clear error for environments that lack a usable display or OpenGL context.
Breaking changes¶
- Removed flat PCS and PlanarPCS link/material fields. Access link data through
params.link, and construct systems withfrom_linksorparams_from_links. - Removed the global PCS damping matrix and cross-link damping coupling. Supply one generalized damping block per link.
- Removed
GVSLinkParamsand GVS-local exports of shared link, joint, and cross-section specifications. Import shared types fromsoromox.systemsorsoromox.systems.components. - Replaced abbreviated GVS construction fields such as
E,nu,rho,eta,L,r_i, andr_fwith descriptive material, geometry, and profile arguments. - Moved
reference_strainfromStrainBasisSpectoLinkSpec; basis specs now describe only the selected strains and basis order. - No compatibility aliases are provided.
[0.2.2] - 2026-08-11¶
Added¶
- Configurable, base-aligned ground planes for the Matplotlib, Open3D, and Viser renderers, including inherited support in the I-SUPPORT and UMArm renderers.
- A top-level Paper & Results documentation page with CPU and GPU benchmarks, all six application case studies, reproduction pointers, and curated web-optimized figures, animations, and videos from the SoRoMoX paper.
- A responsive core-renderer gallery, system-specific rendering samples, and a concise top-level contributor guide.
Changed¶
- Improved Open3D and Viser efficiency for multi-robot animations with renderer-owned vectorized actuator geometry, batched actuator and sphere scene objects, automatically merged multi-robot Open3D backbones, and instanced or merged Viser geometry with one atomic transaction per frame. Viser ground planes now follow the complete batched layout. This substantially reduces backend registrations and browser scene handles without adding trajectory-rendering concerns to soft-robot mechanics. In a 16-robot, 80-point, eight-frame benchmark, merged Open3D improved initial/frame rendering by 21.0x/2.7x (6.51 s to 0.31 s and 41.2 ms to 15.1 ms), while batched Viser improved full swept-video/browser-capture time by 2.3x/3.6x (27.9 s to 12.0 s and 2.98 s to 0.83 s) with 38.5x fewer live handles.
- Separated Section Vf reinforcement-learning rollout generation from rendering:
trained and uniform-random baseline trajectories now retain the full parallel
batch under
data/traj, while the shared offline renderer derives single-arm or automatically framed grid MP4/GIF names from its input data underoutputsand uses the paper's visual style. Renamed the canonical artifacts around policy state and environment count, versioned the current trajectory and render artifacts, and moved Section Vf MP4/GIF storage to Git LFS. - Applied the shared camera field of view and tighter scene framing to Matplotlib's 3D renderer, bringing its gallery view closer to Open3D and Viser while retaining metric axes.
- Standardized the renderer gallery around consistent robot geometry, colors, ground planes, and framing, with tighter I-SUPPORT and UMArm close-ups.
- Refocused the README and documentation home on the JAX-native model implementations for articulated and continuum soft robots, their control-oriented interface, installation, performance, and first use.
- Reorganized the rendering documentation into an overview and gallery, backend API guide, and shared configuration reference; normalized Python examples throughout the generated package documentation as fenced code.
- Made the SoRoMoX arXiv preprint the primary academic citation, centralized citation guidance, and retained an exact-release software citation for reproducibility-sensitive work.
- Kept Citation at the top level of the documentation navigation immediately after Paper & Results, and grouped the supported systems following the paper.
- Placed Actuation before Control in the API navigation and removed the outdated symbolic-derivation documentation page.
- Moved detailed contributor and documentation tooling into the development
guide and made
VERSION_BUMP_README.mdthe authoritative maintainer release workflow, including the branch, pull-request, tag, and recovery procedures. - Added Twine to the development dependency set so the documented distribution validation command is available in the project environment.
- Separated backend-specific renderer coverage into dedicated Matplotlib, Open3D, and Viser test modules, leaving the shared base-renderer tests focused on backend-independent behavior.
- Removed the obsolete duplicate actuation overview page in favor of the structured actuation documentation section.
Fixed¶
- Renamed the operational-space Viser renderer test module and made Section Vf tests skip cleanly when optional paper dependencies are unavailable, preventing full-suite collection failures.
- Corrected the I-SUPPORT dynamic-model DOI and added platform references to the I-SUPPORT and McKibben UMArm system pages.
[0.2.1] - 2026-08-03¶
Added¶
- Section-scoped
paper_results/workflows that colocate generation and plotting code, source or generated data, canonical figures and videos, and reproduction instructions for the results reported in the paper. - Reproducible PCS configuration- and operational-space control case studies with shared simulation, plotting, serialization, Viser, phase-separated RMSE, and canonical paper-figure workflows.
- A shared Matplotlib publication style and case-specific figure composers for consistent typography, sizing, colors, labels, grids, and legends.
- Focused Section Vc tests for case-relative paths, NPZ schemas, overwrite protection, plotting, controller setup, trajectory primitives, and rendering.
- Complete Section IVa, IVb, Va, Vd, Ve, and Vf generation workflows alongside their paper data and outputs, including released RL checkpoints.
- Reproducible Section Vc evaluation metrics for all six configuration coordinates and geometric operational-space pose tracking, with canonical NPZ and JSON artifacts and a human- or machine-readable reporting CLI.
- A publication-sized Section Vc composite figure combining configuration-space comparisons, operational-space tracking and errors, and chronological experiment snapshots in committed PDF and SVG outputs.
Changed¶
- Separated lightweight demonstrations under
examples/from complete publication reproduction workflows and datasets underpaper_results/. - Made generated example figures and videos topic-local instead of writing them
to the repository root, and organized paper sections into independent
code/,data/, andoutputs/ownership. - Made affected example and paper entry points independent of the current working directory, added configurable artifact paths and overwrite guards, and migrated visualization workflows to the current renderer APIs.
- Standardized the Section Vc paper figures around full-width configuration-space tracking and partial-feedback-linearization operational-space tracking, with explicit strain labels and prominent reference trajectories.
- Store trained model checkpoints through Git LFS while leaving generated example artifacts and noncanonical paper diagnostics ignored.
- Made the built-in
tanhPID integral-error saturation unit preserving asGamma^-1 tanh(Gamma e), retained unit slope at the origin, and validated scalar, vector, and matrix saturation parameters against their required positivity and shape constraints. - Applied separate physical integral-error saturation scales to rotational and linear Section Vc strains, regenerated the canonical data and figures, and added steady-state regulation MAE over the final 10% of each evaluated setpoint interval.
- Refactored Viser sequence rendering around deterministic scene and frame hooks, synchronized video and lossless snapshot capture, explicit snapshot validation, and a render-only workflow for the operational-space paper scene.
Fixed¶
- Rejected paused or looping playback modes for finite Viser video exports.
- Included
cbfpyin the test dependency set so the Section Ve rendering tests collect across every supported Python version. - Corrected the documented Section Vc steady-state evaluation window from the final quarter to the final 10% (0.3 s) of each 3 s setpoint interval.
[0.2.0] - 2026-07-29¶
Added¶
- First SoRoMoX package release published to PyPI.
ArticulatedSoftRobotspatial serial-chain system with optional joint stiffness and damping, dense matrix dynamics, ABA forward dynamics, examples, documentation, and benchmark coverage.- Geometric Variable-Strain (GVS), tendon-actuated GVS, I-SUPPORT, and McKibben-actuated UMArm models.
- Model-based control, system-identification, residual-learning, reinforcement learning, rendering, and CPU/GPU benchmarking examples.
- Open3D and Viser renderers with trajectory, actuator, and video support.
Changed¶
- Generalized continuum actuation around composable threadlike actuation models.
- Standardized system, geometry, Lie algebra, operational-space, actuation-space, parameter, and base-pose APIs.
- Declared support for Python 3.11 through 3.14 and migrated the documentation build to Zensical.
- Set JAX 0.10.0 and Diffrax 0.7.2 as the minimum numerical dependency versions validated by CI.
- Expanded the software authorship and citation metadata.
Fixed¶
- Corrected dynamics, Jacobian, rendering, control, rollout, and multi-segment I-SUPPORT behavior across the supported systems.
[0.1.0] - 2025-09-01¶
Added¶
- Initial SoRoMoX development milestone.
Features¶
- Fast, parallelizable, and differentiable soft robot models implemented in JAX
- Implemented systems:
- N-link pendulum
- Planar Piecewise Constant Strain (PCS) continuum soft robot
- Spatial Piecewise Constant Strain (PCS) continuum soft robot
- Planar Handed Shearing Auxetics (HSA) robot
Version History¶
- v0.1.0: Initial release with core functionality