---
title: Drake v1.24.0
date: 2023-12-18
released: 2023-12-18
---

# Announcements

* Drake now supports [Clarabel](https://github.com/oxfordcontrol/Clarabel.rs), an open-source convex conic solver. This solver can solve convex optimization problems with linear, second-order, positive semidefinite or exponential cone constraints and linear/quadratic objective functions ([#20604][_#20604]).

* Drake now supports macOS Sonoma ([#20678][_#20678]).

* We introduce two new convex approximations of contact, Similar  (`multibody::DiscreteContactApproximation::kSimilar`) and Lagged (`multibody::DiscreteContactApproximation::kLagged`), in the SAP solver. Users can now use the model previously implemented in TAMSI (compliant contact with Hunt and Crossley dissipation and regularized friction) in the SAP solver. These new models are preferred given that the Hunt and Crossley model is based on physics and experimental observations. Moreover, unlike the TAMSI solver, the SAP solver provides theoretical and practical convergence guarantees. Practically this means:
  * Exactly the same physical parameters that apply to TAMSI (multibody::DiscreteContactApproximation::kTamsi) now apply to the Similar and the Lagged model. Users simply need to flip a single switch in `multibody::DiscreteContactApproximation` to take advantage of the new convex approximations.
  * The `relaxation_time` parameter for dissipation only applies to the `multibody::DiscreteContactApproximation::kSap` approximation, as before.
  * `MultibodyPlant::set_discrete_contact_approximation()` or `MultibodyPlantConfig::discrete_contact_approximation` should be used to configure the model of discrete contact approximation. The solver type is inferred from the type of contact approximation.  `MultibodyPlant::set_discrete_contact_solver()` and `MultibodyPlantConfig::discrete_contact_solver` are deprecated.
  * We encourage you to start using the `multibody::DiscreteContactApproximation::kLagged` and `multibody::DiscreteContactApproximation::kSimilar` models in your own simulations. Refer to the documentation for the differences between the two approximations. One of them will become the default contact model, and your feedback in advance is appreciated.
  * Refer to our paper, available at [https://arxiv.org/abs/2312.03908](https://arxiv.org/abs/2312.03908), if you want to learn more about this new feature and its underlying theory.

# Breaking changes since v1.23.0

* Drake no longer supports the `$SDF_PATH` environment variable for resolving SDFormat `<include>` statements ([#20642][_#20642]).
  * SDFormat include statements should use `package://` URIs, instead.

Refer to our [Drake Stability Guidelines](/stable.html) for our policy
on API changes.

# Changes since v1.23.0

## Dynamical Systems

<!-- <relnotes for systems go here> -->

New features

* Configure label image publishing in CameraConfig ([#20554][_#20554])
* ConcatenateImages allows for variable size inputs ([#20599][_#20599])
* Add ImageIo ([#20447][_#20447])

Fixes

* None

## Mathematical Program

<!-- <relnotes for solvers go here> -->

New features

* Add ClarabelSolver to ChooseBestSolver ([#20587][_#20587])
* Enable Clarabel by default ([#20604][_#20604])
* Get dual solution from Clarabel ([#20597][_#20597])
* ClarabelSolver obeys SolverOptions ([#20602][_#20602])
* Add Clarabel to preferred_solvers in MinimumUniformScalingToTouch ([#20677][_#20677])
* Add constraints for enforcing that a principal submatrix of a symmetric matrix be positive semidefinite ([#20586][_#20586])
* Add an environment variable to disable SnoptSolver ([#20636][_#20636])

Fixes

* Reset IRIS consecutive_failures after falsifying lower bound ([#20627][_#20627])
* Check ConvexSet::IsBounded first in MaybeCalcAxisAlignedBoundingBox ([#20680][_#20680])

## Multibody Dynamics and Geometry

<!-- <relnotes for geometry,multibody go here> -->

New features

* Support downloading meshcat html files via URLs ([#20504][_#20504])
* Meshcat can report "current" meshcat camera pose ([#20484][_#20484])
* Compute gradient of signed distance when boxes touch ([#20033][_#20033])
* MultibodyPlant supports Hunt and Crossley constraint ([#20654][_#20654])

Fixes

* Correct phong-to-pbr promotion in presence of diffuse texture ([#20607][_#20607])

## Planning

<!-- <relnotes for planning go here> -->

New features

* Add wraparound edges to GcsTrajectoryOptimization, for unbounded revolute joints ([#20509][_#20509])
* Add GetContinuousRevoluteJointIndices as a helper function for GCS ([#20652][_#20652])

Fixes

* None

## Tutorials and examples

<!-- <relnotes for examples,tutorials go here> -->

* Clean up PR2 model ([#20588][_#20588])

## Miscellaneous features and fixes

<!-- <relnotes for common,math,lcm,lcmtypes,manipulation,perception,visualization go here> -->

* `model_visualizer` enables camera tracking and makes use of the pose ([#20484][_#20484])
* Use PYTHON_VERSION (not UBUNTU_RELEASE) to toggle DrakeGym example on/off ([#20574][_#20574])
* Add ExtractPrincipalSubmatrix and ToLowerTriangularColumnsFromMatrix utility functions ([#20646][_#20646])([#20670][_#20670])

## pydrake bindings

<!-- <relnotes for bindings go here> -->

New features

* Add python bindings for FlattenModelDirectives ([#20608][_#20608])
* Add python bindings for ClarabelSolver ([#20569][_#20569])

Fixes

* None

## Build system

<!-- <relnotes for cmake,doc,setup,third_party,tools go here> -->

* Prune unnecessary dependencies ([#20563][_#20563])
* Avoid installing vestigial drake_visualizer scripts ([#20564][_#20564])
* Cull SDFormat use of environment and subprocess. In particular, Drake no longer supports the `$SDF_PATH` environment variable for resolving SDFormat `<include>` statements. SDFormat include statements should use `package://` URIs, instead. ([#20642][_#20642])
* Fix some errors with Bazel 7 ([#20658][_#20658])
  * This might not yet achieve full Bazel 7 compatibility, but it does fix some acute problems for users that are merely installing Drake.
* Offically support macOS Sonoma ([#20678][_#20678])

## Build dependencies

<!-- <relnotes for workspace go here> -->

* Add rules_license 0.0.7 ([#20560][_#20560])
* Upgrade abseil_cpp_internal to latest commit ([#20630][_#20630])
* Upgrade bazelisk to latest release v1.19.0 ([#20631][_#20631])
* Upgrade bazel_skylib to latest release 1.5.0 ([#20630][_#20630])
* Upgrade fcl_internal to latest commit ([#20630][_#20630])
* Upgrade gz_utils_internal to latest release gz-utils2_2.2.0 ([#20637][_#20637])
* Upgrade meshcat to latest commit ([#20484][_#20484])
* Upgrade MOSEK to latest release 10.1.21 ([#20634][_#20634])
* Upgrade mypy_internal to latest release v1.7.1 ([#20630][_#20630])
* Upgrade nanoflann_internal to latest release v1.5.2 ([#20630][_#20630])
* Upgrade nlohmann_internal to latest release v3.11.3 ([#20630][_#20630])
* Upgrade rules_python to latest release 0.27.1 ([#20630][_#20630])
* Upgrade rules_rust to latest release 0.32.0 ([#20630][_#20630])
* Upgrade stable_baselines3_internal to latest release v2.2.1 ([#20632][_#20632])
* Upgrade suitesparse_internal to latest release v7.3.1 ([#20630][_#20630])

## Newly-deprecated APIs

* `drake::multibody::Body::node_index` ([#20603][_#20603])
* The `@drake_detected_os` external ([#20600][_#20600])
* `drake::multibody::MultibodyPlant::set_discrete_contact_solver` and  `drake::multibody::MultibodyPlantConfig::discrete_contact_solver` ([#20672][_#20672])  
  * Instead of choosing a solver, users now must choose a discrete contact approximation. The solver is inferred from the approximation. Users can select an approximation with `drake::multibody::MultibodyPlant::set_discrete_contact_approximation` or via `drake::multibody::MultibodyPlantConfig::discrete_contact_approximation`.

## Removal of deprecated items

* `drake::geometry::RenderEngineGlParams::default_label` ([#20589][_#20589])
* `drake::geometry::RenderEngineGltfClientParams::default_label` ([#20589][_#20589])
* `drake::geometry::RenderEngineVtkParams::default_label` ([#20589][_#20589])
* `drake::systems::sensors::Image<drake::systems::sensors::PixelType::kExpr>` ([#20590][_#20590])
* `drake::systems::sensors::PixelFormat::kExpr` ([#20590][_#20590])
* `drake::systems::sensors::PixelType::kExpr` ([#20590][_#20590])
* `drake::systems::DiscreteUpdateEvent::DiscreteUpdateCallback` ([#20591][_#20591])
* `drake::systems::DiscreteUpdateEvent::DiscreteUpdateEvent` overloads taking legacy callback type signatures ([#20591][_#20591])
* `drake::systems::DiscreteUpdateEvent::SystemCallback` ([#20591][_#20591])
* `drake::systems::PublishEvent::PublishCallback` ([#20591][_#20591])
* `drake::systems::PublishEvent::PublishEvent` overloads taking legacy callback type signatures ([#20591][_#20591])
* `drake::systems::PublishEvent::SystemCallback` ([#20591][_#20591])
* `drake::systems::UnrestrictedUpdateEvent::SystemCallback` ([#20591][_#20591])
* `drake::systems::UnrestrictedUpdateEvent::UnrestrictedUpdateCallback` ([#20591][_#20591])
* `drake::systems::UnrestrictedUpdateEvent::UnrestrictedUpdateEvent` overloads taking legacy callback type signatures ([#20591][_#20591])
* The `@clp` external ([#20592][_#20592])
* The `@gym_py` external ([#20592][_#20592])
* `drake::multibody::UnitInertia::SolidCylinder` two-argument form ([#20593][_#20593])
* `drake::multibody::UnitInertia::SolidCylinderAboutEnd` two-argument overload ([#20593][_#20593])
* The following functions' semantics have changed even though their signature have not:
  * `drake::multibody::UnitInertia::AxiallySymmetric` now requires a normalized unit vector ([#20593][_#20593])
  * `drake::multibody::UnitInertia::SolidCapsule` three-argument form now requires a normalized unit vector ([#20593][_#20593])
  * `drake::multibody::UnitInertia::SolidCylinder` three-argument form now requires a normalized unit vector ([#20593][_#20593])
  * `drake::multibody::UnitInertia::SolidCylinderAboutEnd` three-argument form now requires a normalized unit vector ([#20593][_#20593])
  * `drake::multibody::UnitInertia::StraightLine` now requires a normalized unit vector ([#20593][_#20593])
  * `drake::multibody::UnitInertia::ThinRod` now requires a normalized unit vector ([#20593][_#20593])


# Notes


This release provides [pre-compiled binaries](https://github.com/RobotLocomotion/drake/releases/tag/v1.24.0) named
``drake-1.24.0-{focal|jammy|mac|mac-arm64}.tar.gz``. See [Stable Releases](/from_binary.html#stable-releases) for instructions on how to use them.

Drake binary releases incorporate a pre-compiled version of [SNOPT](https://ccom.ucsd.edu/~optimizers/solvers/snopt/) as part of the
[Mathematical Program toolbox](https://drake.mit.edu/doxygen_cxx/group__solvers.html). Thanks to
Philip E. Gill and Elizabeth Wong for their kind support.

<!-- <begin issue links> -->
[_#20033]: https://github.com/RobotLocomotion/drake/pull/20033
[_#20447]: https://github.com/RobotLocomotion/drake/pull/20447
[_#20484]: https://github.com/RobotLocomotion/drake/pull/20484
[_#20504]: https://github.com/RobotLocomotion/drake/pull/20504
[_#20509]: https://github.com/RobotLocomotion/drake/pull/20509
[_#20554]: https://github.com/RobotLocomotion/drake/pull/20554
[_#20560]: https://github.com/RobotLocomotion/drake/pull/20560
[_#20563]: https://github.com/RobotLocomotion/drake/pull/20563
[_#20564]: https://github.com/RobotLocomotion/drake/pull/20564
[_#20569]: https://github.com/RobotLocomotion/drake/pull/20569
[_#20574]: https://github.com/RobotLocomotion/drake/pull/20574
[_#20586]: https://github.com/RobotLocomotion/drake/pull/20586
[_#20587]: https://github.com/RobotLocomotion/drake/pull/20587
[_#20588]: https://github.com/RobotLocomotion/drake/pull/20588
[_#20589]: https://github.com/RobotLocomotion/drake/pull/20589
[_#20590]: https://github.com/RobotLocomotion/drake/pull/20590
[_#20591]: https://github.com/RobotLocomotion/drake/pull/20591
[_#20592]: https://github.com/RobotLocomotion/drake/pull/20592
[_#20593]: https://github.com/RobotLocomotion/drake/pull/20593
[_#20597]: https://github.com/RobotLocomotion/drake/pull/20597
[_#20599]: https://github.com/RobotLocomotion/drake/pull/20599
[_#20600]: https://github.com/RobotLocomotion/drake/pull/20600
[_#20602]: https://github.com/RobotLocomotion/drake/pull/20602
[_#20603]: https://github.com/RobotLocomotion/drake/pull/20603
[_#20604]: https://github.com/RobotLocomotion/drake/pull/20604
[_#20607]: https://github.com/RobotLocomotion/drake/pull/20607
[_#20608]: https://github.com/RobotLocomotion/drake/pull/20608
[_#20627]: https://github.com/RobotLocomotion/drake/pull/20627
[_#20630]: https://github.com/RobotLocomotion/drake/pull/20630
[_#20631]: https://github.com/RobotLocomotion/drake/pull/20631
[_#20632]: https://github.com/RobotLocomotion/drake/pull/20632
[_#20634]: https://github.com/RobotLocomotion/drake/pull/20634
[_#20636]: https://github.com/RobotLocomotion/drake/pull/20636
[_#20637]: https://github.com/RobotLocomotion/drake/pull/20637
[_#20642]: https://github.com/RobotLocomotion/drake/pull/20642
[_#20646]: https://github.com/RobotLocomotion/drake/pull/20646
[_#20652]: https://github.com/RobotLocomotion/drake/pull/20652
[_#20654]: https://github.com/RobotLocomotion/drake/pull/20654
[_#20658]: https://github.com/RobotLocomotion/drake/pull/20658
[_#20670]: https://github.com/RobotLocomotion/drake/pull/20670
[_#20672]: https://github.com/RobotLocomotion/drake/pull/20672
[_#20677]: https://github.com/RobotLocomotion/drake/pull/20677
[_#20678]: https://github.com/RobotLocomotion/drake/pull/20678
[_#20680]: https://github.com/RobotLocomotion/drake/pull/20680
<!-- <end issue links> -->

<!--
  Current oldest_commit 6955a4668b84b133e1c827560083685cd6d39849 (exclusive).
  Current newest_commit 9ba8f5d8d4ee6919ec41542d47509549cfa8d919 (inclusive).
-->
