Skip to content

v0.8.0

Compare
Choose a tag to compare
@aaron-skydio aaron-skydio released this 07 Feb 19:03
· 244 commits to main since this release

Full Changelog: v0.7.0...v0.8.0

This is probably our biggest release yet, with multiple major additions - we have built-in IMU Preintegration, new backends for CUDA and PyTorch, and a new symbolic type for unit vectors on S(2). Plus, we've made major improvements to memory usage in the C++ optimizer, made lots of additions to the symbolic API, and made plenty of improvements under the hood.

🚨 Breaking Changes

  • ae43476 Slices of 1D matrices are matrices, not lists - taking a 1D slice of a geo.Matrix now returns a geo.Matrix, previously it would return a list.
  • f60180e Add include_jacobians flag - by default, the Optimizer will now not allocate or populate the problem jacobian, since it is not needed for optimization. If you'd like it to be filled out, set include_jacobians to true.
  • There are some simplifications to the sym::Factor API, described in Code Cleanup / Refactoring below. Most users should be unaffected.
  • Generated Python functions return vectors as 1D ndarrays - see the description below

📈 IMU Factor

SymForce has IMU Preintegration! We have a C++ ImuFactor with preintegration and linearization functions generated from a symbolic implementation. See the PRs #279 and #280 for more information, and see imu_factor.h for an example.

🦾 CUDA Backend

The CUDA backend generates __host__ __device__ functions, i.e. functions that you can call from within a CUDA kernel. It's currently in an experimental state, and supports scalars, vectors/matrices, and sf.DataBuffer in the APIs of generated functions; other types like geo and cam objects can be passed via their storage vectors. See the commit for more examples.

🔥 PyTorch Backend

The PyTorch backend generates python functions that operate on PyTorch tensors, with each symbolic op becoming one PyTorch op. It supports broadcasting these operations across multiple optional batch dimensions. Like the CUDA backend, this is currently experimental - it supports scalars and vectors/matrices in generated functions APIs, and is not particularly optimized for performance.

⚪ geo.Unit3

The Unit3 symbolic type lets you represent unit vectors in 3D, including optimizing unit vector variables and performing manifold operations on them.

➡️ Generated Python functions return vectors as 1D ndarrays

By default, generated python functions will now return 1d ndarrays for outputs that are row or column vectors (including 1x1 matrices). This includes member functions of generated python types, such as sym.Pose3.position(). See the commit for more information.

💨 Optimizer Performance/API Improvements

Major improvements to memory usage in the C++ optimizer, especially for large problems like bundle adjustment that have lots of small factors. Also, converting a sym::Values to LCM is significantly faster.

🔣 Symbolic API additions

🧹 Code Cleanup / Refactoring

⚙️ Infra / Buildsystem changes

👮 SkyMarshal