This release introduces a new (experimental!) high-performance and customizable viewer backend based on [Panda3D](https://github.com/ikalevatykh/panda3d_viewer#using-with-pinocchio), which supports both offscreen and onscreen rendering. Yet, some features of Viewer may not be working properly, and offscreen rendering requires X11 server on Linux for now. Notably, it is now possible to add flexibilities at fixed joint frames, and to add coupling forces between frames of the same robot.
Many important new features, breaking changes and critical bug fixes have been introduced since release 1.4.0, so it is time to bump up the minor version tag!
New features:
* [core] Log robot input args, robot urdf content, and all options as constants.
* [core] Enable to add flexible joints at any FIXED_JOINT frame.
* [core] Add composite centroidal rigid-body inertia computation to 'computeForwardKinematics'.
* [core] Enable to add coupling forces between frames of the same robot.
* [python/viewer] Add partial support of Panda3d visualizer.
Improvements:
* [core] Store constants in hdf5 datasets instead of attributes to get around 64K size limit.
* [core] TMLC telemetry format now supports both attributes and dataset field.
* [core] Do not enforce position/velocity limits at init if disable.
* [core] Fallback to not loading/using collision model if meshes are missing.
* [core|core/python] Expose 'computeForwardKinematics'.
* [core/python] Enable to get system from 'Engine'.
* [python/log] Fix print logged variables.
* [python/robot] Fixes some edge cases when automatically generating HDF file.
* [python/robot] Enable explicit robot initialization without hardware description file.
* [python/robot] Skip collision bounding box handling if meshes are not available.
* [python/simulator] Simulator's Viewer instance is no longer private attribute.
* [gym] Make viewer instance directly accessible in pipeline environments.
* [gym] Get access to simulator's attributes directly.
* [gym/common] Add new random sampling utility.
* [gym/common/env] Make sure robot shared memory is reset after calling '_setup'.
* [gym/common/env] Do not log error is observation is out-of-bounds, and only warning in debug.
* [gym/common/env] Make sure the low-level engine memory address does not change.
* [core/python] Avoid memory allocation by 'compute_systems_dynamics' for efficiency.
Bug fixes:
* [core] Fix body forces wrongly computed by 'aba'.
* [core] Fix 'getRigidConfigurationFromFlexible' method of Model class.
* [core] Fix computeSystemDynamics edge case and Python binding signature.
* [core/python] Fix bindings of some system_state object fields.
* [python/robot] Fix support of multiple collision boxes.
* [python/simulator] Fix callback not working since scalar references are now ndarray in Python.
* [python/simulator] Fix 'state' property for 'use_theoretical_state'=True.
* [python/viewer] Fix viewer exception when closing backend during replay.
* [gym/common/env] Fix 'replay' not working.
Miscellaneous:
* [core] Double space before inline comments.
* [core] Add constant for telemetry constant delimiter.
* [core] Clarity telemetry namespace.
* [core|core/python] Rename 'computeSystemDynamics' in 'computeSystemsDynamics' for consistency.
* [core/python] Simplify C++ to Python log converter.
* [python/viewer] Split viewer and replay tools in separated submodules to reduce file complexity.
* [python/viewer] Rename 'replay_speed' in 'speed_ratio' for clarity.