fuse_models package from fuse repofuse fuse_constraints fuse_core fuse_doc fuse_graphs fuse_loss fuse_models fuse_msgs fuse_optimizers fuse_publishers fuse_tutorials fuse_variables fuse_viz |
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | BSD |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/locusrobotics/fuse.git |
VCS Type | git |
VCS Version | iron |
Last Updated | 2024-10-31 |
Dev Status | MAINTAINED |
CI status | No Continuous Integration |
Released | RELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (0)
Good First Issues (0) Pull Requests to Review (0) |
Package Description
Additional Links
Maintainers
- Tom Moore
Authors
- Tom Moore
The fuse_models
package contains plugins that can be used to produce state estimates for a wide variety of robots. The package is intended to support transitioning from the robot_localization
package to fuse
.
Changelog for package fuse_models
1.0.1 (2023-03-03)
1.0.0 (2023-03-03)
- Use upstream rclcpp::node_interfaces::NodeInterfaces
(#313)
- Use upstream rclcpp::node_interfaces::NodeInterfaces
* Dereference node arguments to NodeInterfaces ---------Co-authored-by: methylDragon <<methylDragon@gmail.com>>
- fuse -> ROS 2 fuse_models: Linting (#315)
- Use getParameterName and namespace parameters for publishers (#314)
- Use rclcpp::Clock::wait_until_started (#303)
- fuse -> ROS 2 : Doc Generation
(#278)
- Port doc generation and fix package.xml for linting
- Fix small bugs in package.xml
- Use default rosdoc2 settings
- Use default rosdoc2 settings
* Update fuse_doc for rosdoc2 ---------Co-authored-by: Shane Loretz <<sloretz@google.com>>
- fuse -> ROS 2 fuse_optimizers: Port fuse_optimizers (#307) Co-authored-by: Shane Loretz <<sloretz@osrfoundation.org>> Co-authored-by: Shane Loretz <<shane.loretz@gmail.com>>
- fuse -> ROS 2 fuse_models: Port fuse_models
(#304)
- Port messages
- Port fuse_models
- Fix alloc error and some bugs
- Wait on result
- fuse -> ROS 2 fuse_publishers : Linting (#305)
- fuse -> ROS 2 fuse_publishers: Port fuse_publishers (#299) Co-authored-by: Shane Loretz <<shane.loretz@gmail.com>>
- fuse -> ROS 2 fuse_constraints : Linting (#298)
- fuse -> ROS 2 fuse_graphs: Linting (#297)
- fuse -> ROS 2 fuse_variables: Linting
(#296)
- Migrate to .hpp files
- Create redirection headers
- Make xmllint and uncrustify happy
- Wrap most comment lines
- Satisfy cpplint
- fuse -> ROS 2 fuse_loss: Port fuse_loss (#287)
- fuse -> ROS 2 fuse_core: Linting (#292)
- fuse -> ROS 2 fuse_core : Parameters and Tests (#286) Co-authored-by: Shane Loretz <<sloretz@osrfoundation.org>> Co-authored-by: Ivor Wanders <<ivor@iwanders.net>>
- fuse -> ROS 2 : Port Time (#283)
- fuse -> ROS 2 : Port Logging (#279) Co-authored-by: Tom Moore <<tmoore@locusrobotics.com>>
- Fuse -> ROS 2 fuse_core: Partial port of fuse_core (#281) Co-authored-by: Brett Downing
- fuse -> ROS 2: Clean up macro usage warnings (#280)
- fuse -> ROS 2 fuse_msgs : Port package and ignore unported packages for now (#277) Co-authored-by: Tom Moore <<tmoore@locusrobotics.com>>
- [RST-4186] Fix fuse macro names
(#263)
- Namespace all macros with the FUSE_ prefix. Mark original macros as deprecated.
- Update all fuse objects to use the new macro names
- Adding doxygen to all packages (#241)
- [RST-3451] Delay some transform warnings so startup is less chatty
- Contributors: Shane Loretz, Stephen Williams, Tom Moore, methylDragon
0.4.2 (2021-07-20)
- Adding roslint dependency to fuse_viz
(#231)
- Adding roslint dependency to fuse_viz
- Silence CMP0048 warnings
- Contributors: Tom Moore
0.4.1 (2021-07-13)
- Getting versions in sync
-
Substract minimum twist covariance from twist covariance (#222) * Substract min twist cov from twist cov If the twist covariance already had a minimum twist covariance added to it to prevent ill-conditioned covariance matrices, we need a way to substract that minimum twist covariance from it before we compute the pose relative covariance. Otherwise, we cannot get the original pose relative covariance because the minimum twist covariance term is multiplies by the time delta, which could actually make the resulting pose relative covariance ill-conditioned or very small, i.e. overconfident.
- [Issue #223] Add an optional tf_timeout parameter to the sensor models (#224)
- Factorize differential mode processing
(#219)
- Factorize differential mode processing
- Throttle log message when transform message fails
- Target frame optional
(#217)
- Make target_frame optional
- Remove optional target_frame parameters in tests
- Transform message in differential mode
(#216)
* Transform message in differential mode This is important because
the relative transformation is not the same if the sensor and target
frame are different. Consider for example the case of an IMU sensor
upside down:
- The robot base frame is base_link
- The IMU sensor frame is imu_link
* The imu_link transformation wrt base_link is 180 degrees wrt the y or x axis * The angular velocity around the z axis has opposite sign in the sensor frame wrt the target frame
- Require pose_target_frame in differential mode
- Roslint
- Add pose_target_frame to optimizer test config
- Use fuse_core::getPositiveParam for all ros::Duration parameters
(#212)
- Use fuse_core::getPositiveParam for ros::Duration
- Use fuse_core::getPositiveParam for TF durations
- Add tcp_no_delay parameter to sensor models (#211)
- Add ability to throttle covariance computation (#209)
- Add invert_tf to Odometry2DPublisher (#206) This allows to publish the inverse TF transform. This can be useful to skip the odom->base_link lookupTransform() when braodcasting map->base_link, which must be broadcasted as map->odom because TF tree doesn't support more than a single parent per frame, base_link in this case. This is particular relevant when predict_to_current_time is enabled, because the lookupTransform() could take a while, causing delays.
- Support throttling serialized graph publisher
(#204)
- Change sensor proc from gtest to gmock target
- Move ThrottledCallback to fuse_core
- Support generic callbacks in ThrottledCallback
- Throttle graph publishing
- Overload getPositiveParam for ros::Duration
- Use getPositiveParam for ros::Duration parameters
- Add linear acceleration to synchronizer (#205)
- Use local latest_stamp in notifyCallback (#203)
- Use dedicated spinner for publish timer callback
(#201)
- Use dedicated spinner for publishTimerCallback
* This reduces the jitter in the output topics and TF transform stamp because it allows the notifyCallback and publishTimerCallback to run concurrently. The notifyCallback might take longer than the timer period sometimes, mostly because the covariance computation is an expensive operation. * There is a subtle change of behaviour with this implementation! Before, the publishTimerCallback overwrote the odom_output_ and acceleration_output_ with the predicted state. Now it does not, and if it gets called twice or more times consecutively, it predicts since the last time the state was computed and updated in the notifyCallback. With the notifyCallback and publishTimerCallback running concurrently it is not trivial to keep the previous behaviour efficiently, because we would have to lock the entire callbacks to avoid the publishTimerCallback to overwrite a new state being computed concurrently in the notifyCallback. That being said, the predicted state is likely the same in both implementation. That is, the result is likely the same if we use multiple steps or a single one to predict the last state forward to the current time.
- Add fuse_models::GraphIgnition sensor model (#196)
- Add fuse_models::Transaction sensor model (#195)
- Fix Unicycle2D constructor doxygen (#198)
- Remove deprecated ::Model models leftovers
(#194)
- Remove fuse_models::twist_2d::Model plugin declaration
- Remove empty space in fuse_plugins.xml
- Update ::Model names to new names in doxygen comments
- Conditionally test_depend on benchmark (#189)
- Fix typo in jacobian comments (#191)
- Fix throttle
(#190)
* Update last called time adding throttle period Instead of setting
to now, which could be larger than the expected call time.
- Init last called time to now the first time
* Fix check for init/zero last called time We cannot use isValid because that does not check the last called time is zero, but a completely different thing. We must use isZero.
- Check canTransform output and show error if false
(#188)
- Check canTransform output and show error if false
- Fix pose -> twist typo
- Lookup transform directly
- Use std::enable_if_t (#187)
- Fix roslint 0.12.0
(#186)
* Fix roslint 0.12.0 include_what_you_use warnings Mostly for:
- std::move -> #include <utility>
- std::make_shared and similar -> #include <memory>
- Remove static string variable not permitted by roslint 0.12.0, using a test fixture where needed.
- Only call generator if motion model history empty
(#181)
- Only call generator if motion model history empty
- Handle dt == 0 special case in motion model
- Revert test_timestamp_manager.cpp #154
- Add EmptySingleStamp test
- Add use_twist_covariance ROS param and logic to Imu2D differential
orientation measurements
(#178)
* Move pose into previous_pose_ This makes the Odometry2D do the
same as the Imu2D.
* Allow Imu2D to use twist covariance For differential orientation
measurements.
- Move pose relative covariance closer to use
- Validate unicycle 2d
(#180)
- Remove unused EPSILON constexpr
- Validate Unicyle2D state and process noise
- Add disable_checks param (defaults to false)
- Validate state1 and state2 are finite
* Validate process noise covariance (after it's been scaled and multiplied by dt)
- Fix doxygen comment (#177)
- Delay throttle no valid state message (#175) This requires rosconsole >=1.13.8.
- Throttle (#162)
- Support throttling sensor model inputs
- Add ThrottledCallback rostest
- Fix motion model history
(#168)
- Fix the motion model history to maintain at least the requested time interval
- Apply a similar fix to the MessageBuffer class
-
Get positive param API change (#169) * Change getPositiveParam API In order to match the getParam and getRequiredParam, so the value is not returned, but set in an in/out argument. * Move getPositiveParam and other param related functions to parameter.h from util.h, and updated the ros/unit tests accordingly. * Fix wrapAngle2D expected range to [-Pi, +Pi) Instead of (-Pi, +Pi], and update unit test to reflect that.
- Don't require frame if empty indices (#166)
- Fix Unicycle2DIgnition set_pose
(#154)
- Initialize StateHistoryElement::velocity_yaw
- Process ignition transactions individually
- Call motion model generator with last stamp
- Skip optimization cycle if transaction is empty
- C++14 for test_unicycle_2d_state_cost_function (#157)
- Print state history
(#156)
- Add print method to StateHistoryElement
* Add print method to Unicycle2D It only prints the history state for now though.
- Minor typo fixes (#155)
- Get minimum_pose_relative_covariance_diagonal (#150) Regardless of the value of [independent]{.title-ref}, because the [fuse_models::Odometry2D]{.title-ref} sensor model checks for [use_twist_covariance]{.title-ref} before [independent]{.title-ref}, and we could end up with an uninitialized [minimum_pose_relative_covariance_diagonal]{.title-ref}.
- Support ScaledLoss (#141)
- Remove duplicated roslint build_depend (#146)
- Remove old acceleration_2d folder (#145)
- Cleanup validation checks
(#139)
* Add getCovarianceDiagonalParam helper This allows to load a
covariance matrix from the parameter server, provided in a list with
the diagonal values.
- Add isSymmetric and isPositiveDefinite helper functions
- Use twist covariance for differential dependent (#138) In the [fuse_models::Odometry2D]{.title-ref} sensor model, when [differential: true]{.title-ref} and [independent: false]{.title-ref}, the relative pose covariance should NOT be computed from the consecutive absolute pose covariance matrices because they grow unbounded, so the resulting relative pose covariance suffers from numerical issues. Instead, we can use the twist covariance of the last pose to compute the relative pose covariance, using the time difference between the consecutive absolute poses. The only limitation is that we cannot throttle the input topics, because otherwise the twist covariance from the intermediate/throttled messages is missed. We'll have to throttle inside the sensor model, by integrating the intermediate messages.
- Support dependent relative pose measurements
(#137)
- Added a "dependent" covariance calculation option to the "differential" mode
- Added an [independent]{.title-ref} param that defaults to [true]{.title-ref} to keep the current behaviour
* Added a [minimum_pose_relative_covariance_diagonal]{.title-ref} param that is added to the resulting pose relative covariance in order to guarantee that it's not zero or ill-conditioned.
-
Scale process noise covariance (#130) * Scale process noise covariance This scales the process noise covariance pose by the norm of the current state velocity. A new parameter [velocity_norm_min]{.title-ref} is added, that prevents the process noise scaling from setting the pose components to zero or a very small value that could lead to NaN or a rank deficient Jacobian in the problem solved, due to an ill-condition covariance for the process noise.
- Better validation of partial measurement output
(#131)
* Relax the default precision when validating the covariance matrix
is symmetric.
* Print the covariance matrix with
[Eigen::FullPrecision]{.title-ref} when the symmetry test fails with
[isApprox]{.title-ref}, so we can see the magnitude of the error.
- Show source if validation fails
- Changes from throwing/crashing to ROS_ERROR.
- Add eigenvalues to non-PSD error check
- Add disable_checks param to sensor models
- Publish linear acceleration
(#129)
- Publish linear acceleration
* Also use linear acceleration if predicting to the current time if the new param [predict_with_acceleration]{.title-ref} is [true]{.title-ref} (default value).
- Explicitly call boost::range::join (#128) Otherwise we could get a compilation error due to an ambiguous overloaded [join]{.title-ref} function when some additional [boost/algorithm]{.title-ref} headers are included.
- Add fuse_loss pkg with plugin-based loss functions (#118)
- Validate partial measurements (#125)
- Don't read pose_target_frame if differential (#126) If differential is true, the pose_target_frame is not used.
- Only allow exact timestamp transformations (#123)
- Benchmark unicycle_2d state cost function (#121) The benchmark targets are now only build if CATKIN_ENABLE_TESTING is ON, which means that benchmark is now a test_depend and not a depend. However, the benchmarks are NOT gtests, so they are built directly on catkin build, i.e. there is no need to run make run_tests after. For this reason, the find_package on benchmark is no longer REQUIRED, but QUIET instead. The benchmark is built only if the benchmark package is FOUND.
- Removed the explicit '-std=c++14' compile flag
(#119)
- Removed the explicit '-std=c++14' compile flag
- Changed the CXX_STANDARD setting to be per-target instead of global
- Added the CXX_STANDARD_REQUIRED setting to all targets
- Predict jacobians per parameter block (#115)
- fix compilation in Kinetic (#112)
- Wait for reset service existence (#116)
- Publish odometry with timer and allow to predict it (#109)
- Use measurement stamps for transformed variables (#113)
- [RST-2149] Added the configured device_id to the log message (#110)
- [RST-2438] Make ceres params loaders reusable
(#104)
- Moved the Ceres loadFromROS functions into reusable functions in fuse_core
- Load solver parameters for the batch optimizer
- Expose Ceres Solver, Problem and Covariance Options as ROS parameters (#78)
- [RST-2427] Added a 'source' field to the constraints. This is an API-breaking change. (#101)
- [RST-2340] Add serialization support to fuse (#98)
- RST-2390 Renaming unicycle_2d
(#90)
- Renaming unicycle_2d
- Renaming twist_2d (#89)
- Renaming pose_2d (#88)
- Renaming odometry_2d (#87)
- Renaming imu_2d (#86)
- RST-2390 Renaming acceleration_2d
(#85)
- Renaming acceleration_2d
- Renaming package to fuse_models
- Preparing for move
- Contributors: Davide Faconti, Enrique Fernandez Perdomo, Stephen Williams, Tom Moore, sjphilli
0.4.0 (2019-08-14)
0.3.0 (2019-08-14)
0.2.0 (2019-07-12)
- Get predict_to_current_time ROS param (#17)
- [RST-2202] Catch potential errors when computing the covariances
(#18)
- Clear the covariance on error
- Remove angles header not used (#16)
- Default to private ~reset and ~set_pose names (#14)
- Depend on sensor_msgs and nav_msgs (#15)
- Depend on libceres-dev instead of ceres-solver
(#11)
- Depend on libceres-dev instead of ceres-solver
- Add missed depend on angles
- Resolve names before subscribing (#10)
- Linter/style changes
- Use std::bind instead of std::bind2nd std::bind2nd is marked as deprecated in C++11 Co-Authored-By: Stephen Williams <<stephen.vincent.williams@gmail.com>>
- Add sensor_proc test Only for:
- mergeIndices
- appendPartialMeasurement
- Fix appendPartialMeasurement by merging indices Position and orientation indices are merged together into a single std::vector<size_t> of indices, applying the appropriate offset to the orientation indices. This is passed to appendPartialMeasurement, which should be called only once. It doesn't need the base_index and offset args anymore.
- [RST-2128] fuse rl ignition sensor (#6)
- [RST-2144] Updated macro calls on all objects to support proper Eigen memory alignment (#8)
- Bug in motion model history (#7)
- Use linear indices for linear velocity (#5) Not angular indices, which is wrong and produces a crash at runtime because an assert fails.
- Fix appendPartialMeasurement assignments (#4)
- Store ros::Subscriber in sensor model attribute (#3) Store ros::Subscriber in sensor model attribute
- Tailor: Creating Jenkinsfile
- Adding base_link_output_frame_id to the 2D odom publisher (#1)
- Contributors: Enrique Fernandez, Enrique Fernandez Perdomo, Enrique Fernández Perdomo, Stephen Williams, Tom Moore, locus-services
0.1.0 (2019-03-18)
- [RST-1625] Use the stamped variable synchronizer (#13)
- Tailor: Updating Jenkinsfile
- Tailor: Updating Jenkinsfile
- Tailor: Updating Jenkinsfile
- Updated package for changes to fuse_core::Transaction (#11)
- Tailor: Creating Jenkinsfile
- Simplifying
- Just using rotation
- Adding tf2 overloads for twist and acceleration
- Updated derived sensors for recent change to the sensor API
- Adding 2D odometry publisher
- Adding 2D IMU sensor model
- Feature/pedantic style change
(#7)
- White spaaaaaaaaaaaaaaaaaaaaaaace
- Moar whitespace
- PR feedback
- Adding support for partial measurements
- Adding 2D odometry sensor
- Enabling partial measurements for fuse_rl
- PR feedback
- PR feedback
- Adding 2d pose sensor
- Adding 2D odometry sensor
- Adding 2D acceleration sensor
- Adding 2D twist sensor
- More comments
- Removing comment
- Using Jacobians to rotate covariances
- PR feedback
- PR feedback
- Adding ability to transform poses
- Adding 2d pose sensor
- Update README.md
- Adding 2D kinematic constraint
- Adding README
- Contributors: David V. Lu!!, Stephen Williams, Tom Moore, locus-services
Wiki Tutorials
Package Dependencies
System Dependencies
Name |
---|
benchmark |
boost |
libceres-dev |
eigen |
Dependant Packages
Name | Deps |
---|---|
fuse | |
fuse_optimizers | |
fuse_tutorials |
Launch files
Messages
Services
Plugins
Recent questions tagged fuse_models at Robotics Stack Exchange
fuse_models package from fuse repofuse fuse_constraints fuse_core fuse_doc fuse_graphs fuse_loss fuse_models fuse_msgs fuse_optimizers fuse_publishers fuse_tutorials fuse_variables fuse_viz |
|
Package Summary
Tags | No category tags. |
Version | 1.1.1 |
License | BSD |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/locusrobotics/fuse.git |
VCS Type | git |
VCS Version | jazzy |
Last Updated | 2024-10-31 |
Dev Status | MAINTAINED |
CI status | No Continuous Integration |
Released | RELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (0)
Good First Issues (0) Pull Requests to Review (0) |
Package Description
Additional Links
Maintainers
- Tom Moore
Authors
- Tom Moore
The fuse_models
package contains plugins that can be used to produce state estimates for a wide variety of robots. The package is intended to support transitioning from the robot_localization
package to fuse
.
Changelog for package fuse_models
1.1.1 (2024-05-02)
- Required formatting changes for the lastest version of ROS 2 Rolling (#368)
- Contributors: Stephen Williams
1.1.0 (2024-04-20)
- Port support for Ceres 2.1.0 Manifold class into ROS 2 Rolling
(#366)
- Support gcc12 and ceres 2.1.0
- Add support for the Manifold class when using Ceres Solver version 2.1.0 and above
- General clean up for Ceres 2.2.0 support
- Updated serialization support to be backwards compatible with previously serialized files
- Formatting changes required for ROS 2 Rolling / Ubuntu Noble
- Contributors: Stephen Williams
1.0.1 (2023-03-03)
1.0.0 (2023-03-03)
- Use upstream rclcpp::node_interfaces::NodeInterfaces
(#313)
- Use upstream rclcpp::node_interfaces::NodeInterfaces
* Dereference node arguments to NodeInterfaces ---------Co-authored-by: methylDragon <<methylDragon@gmail.com>>
- fuse -> ROS 2 fuse_models: Linting (#315)
- Use getParameterName and namespace parameters for publishers (#314)
- Use rclcpp::Clock::wait_until_started (#303)
- fuse -> ROS 2 : Doc Generation
(#278)
- Port doc generation and fix package.xml for linting
- Fix small bugs in package.xml
- Use default rosdoc2 settings
- Use default rosdoc2 settings
* Update fuse_doc for rosdoc2 ---------Co-authored-by: Shane Loretz <<sloretz@google.com>>
- fuse -> ROS 2 fuse_optimizers: Port fuse_optimizers (#307) Co-authored-by: Shane Loretz <<sloretz@osrfoundation.org>> Co-authored-by: Shane Loretz <<shane.loretz@gmail.com>>
- fuse -> ROS 2 fuse_models: Port fuse_models
(#304)
- Port messages
- Port fuse_models
- Fix alloc error and some bugs
- Wait on result
- fuse -> ROS 2 fuse_publishers : Linting (#305)
- fuse -> ROS 2 fuse_publishers: Port fuse_publishers (#299) Co-authored-by: Shane Loretz <<shane.loretz@gmail.com>>
- fuse -> ROS 2 fuse_constraints : Linting (#298)
- fuse -> ROS 2 fuse_graphs: Linting (#297)
- fuse -> ROS 2 fuse_variables: Linting
(#296)
- Migrate to .hpp files
- Create redirection headers
- Make xmllint and uncrustify happy
- Wrap most comment lines
- Satisfy cpplint
- fuse -> ROS 2 fuse_loss: Port fuse_loss (#287)
- fuse -> ROS 2 fuse_core: Linting (#292)
- fuse -> ROS 2 fuse_core : Parameters and Tests (#286) Co-authored-by: Shane Loretz <<sloretz@osrfoundation.org>> Co-authored-by: Ivor Wanders <<ivor@iwanders.net>>
- fuse -> ROS 2 : Port Time (#283)
- fuse -> ROS 2 : Port Logging (#279) Co-authored-by: Tom Moore <<tmoore@locusrobotics.com>>
- Fuse -> ROS 2 fuse_core: Partial port of fuse_core (#281) Co-authored-by: Brett Downing
- fuse -> ROS 2: Clean up macro usage warnings (#280)
- fuse -> ROS 2 fuse_msgs : Port package and ignore unported packages for now (#277) Co-authored-by: Tom Moore <<tmoore@locusrobotics.com>>
- [RST-4186] Fix fuse macro names
(#263)
- Namespace all macros with the FUSE_ prefix. Mark original macros as deprecated.
- Update all fuse objects to use the new macro names
- Adding doxygen to all packages (#241)
- [RST-3451] Delay some transform warnings so startup is less chatty
- Contributors: Shane Loretz, Stephen Williams, Tom Moore, methylDragon
0.4.2 (2021-07-20)
- Adding roslint dependency to fuse_viz
(#231)
- Adding roslint dependency to fuse_viz
- Silence CMP0048 warnings
- Contributors: Tom Moore
0.4.1 (2021-07-13)
- Getting versions in sync
-
Substract minimum twist covariance from twist covariance (#222) * Substract min twist cov from twist cov If the twist covariance already had a minimum twist covariance added to it to prevent ill-conditioned covariance matrices, we need a way to substract that minimum twist covariance from it before we compute the pose relative covariance. Otherwise, we cannot get the original pose relative covariance because the minimum twist covariance term is multiplies by the time delta, which could actually make the resulting pose relative covariance ill-conditioned or very small, i.e. overconfident.
- [Issue #223] Add an optional tf_timeout parameter to the sensor models (#224)
- Factorize differential mode processing
(#219)
- Factorize differential mode processing
- Throttle log message when transform message fails
- Target frame optional
(#217)
- Make target_frame optional
- Remove optional target_frame parameters in tests
- Transform message in differential mode
(#216)
* Transform message in differential mode This is important because
the relative transformation is not the same if the sensor and target
frame are different. Consider for example the case of an IMU sensor
upside down:
- The robot base frame is base_link
- The IMU sensor frame is imu_link
* The imu_link transformation wrt base_link is 180 degrees wrt the y or x axis * The angular velocity around the z axis has opposite sign in the sensor frame wrt the target frame
- Require pose_target_frame in differential mode
- Roslint
- Add pose_target_frame to optimizer test config
- Use fuse_core::getPositiveParam for all ros::Duration parameters
(#212)
- Use fuse_core::getPositiveParam for ros::Duration
- Use fuse_core::getPositiveParam for TF durations
- Add tcp_no_delay parameter to sensor models (#211)
- Add ability to throttle covariance computation (#209)
- Add invert_tf to Odometry2DPublisher (#206) This allows to publish the inverse TF transform. This can be useful to skip the odom->base_link lookupTransform() when braodcasting map->base_link, which must be broadcasted as map->odom because TF tree doesn't support more than a single parent per frame, base_link in this case. This is particular relevant when predict_to_current_time is enabled, because the lookupTransform() could take a while, causing delays.
- Support throttling serialized graph publisher
(#204)
- Change sensor proc from gtest to gmock target
- Move ThrottledCallback to fuse_core
- Support generic callbacks in ThrottledCallback
- Throttle graph publishing
- Overload getPositiveParam for ros::Duration
- Use getPositiveParam for ros::Duration parameters
- Add linear acceleration to synchronizer (#205)
- Use local latest_stamp in notifyCallback (#203)
- Use dedicated spinner for publish timer callback
(#201)
- Use dedicated spinner for publishTimerCallback
* This reduces the jitter in the output topics and TF transform stamp because it allows the notifyCallback and publishTimerCallback to run concurrently. The notifyCallback might take longer than the timer period sometimes, mostly because the covariance computation is an expensive operation. * There is a subtle change of behaviour with this implementation! Before, the publishTimerCallback overwrote the odom_output_ and acceleration_output_ with the predicted state. Now it does not, and if it gets called twice or more times consecutively, it predicts since the last time the state was computed and updated in the notifyCallback. With the notifyCallback and publishTimerCallback running concurrently it is not trivial to keep the previous behaviour efficiently, because we would have to lock the entire callbacks to avoid the publishTimerCallback to overwrite a new state being computed concurrently in the notifyCallback. That being said, the predicted state is likely the same in both implementation. That is, the result is likely the same if we use multiple steps or a single one to predict the last state forward to the current time.
- Add fuse_models::GraphIgnition sensor model (#196)
- Add fuse_models::Transaction sensor model (#195)
- Fix Unicycle2D constructor doxygen (#198)
- Remove deprecated ::Model models leftovers
(#194)
- Remove fuse_models::twist_2d::Model plugin declaration
- Remove empty space in fuse_plugins.xml
- Update ::Model names to new names in doxygen comments
- Conditionally test_depend on benchmark (#189)
- Fix typo in jacobian comments (#191)
- Fix throttle
(#190)
* Update last called time adding throttle period Instead of setting
to now, which could be larger than the expected call time.
- Init last called time to now the first time
* Fix check for init/zero last called time We cannot use isValid because that does not check the last called time is zero, but a completely different thing. We must use isZero.
- Check canTransform output and show error if false
(#188)
- Check canTransform output and show error if false
- Fix pose -> twist typo
- Lookup transform directly
- Use std::enable_if_t (#187)
- Fix roslint 0.12.0
(#186)
* Fix roslint 0.12.0 include_what_you_use warnings Mostly for:
- std::move -> #include <utility>
- std::make_shared and similar -> #include <memory>
- Remove static string variable not permitted by roslint 0.12.0, using a test fixture where needed.
- Only call generator if motion model history empty
(#181)
- Only call generator if motion model history empty
- Handle dt == 0 special case in motion model
- Revert test_timestamp_manager.cpp #154
- Add EmptySingleStamp test
- Add use_twist_covariance ROS param and logic to Imu2D differential
orientation measurements
(#178)
* Move pose into previous_pose_ This makes the Odometry2D do the
same as the Imu2D.
* Allow Imu2D to use twist covariance For differential orientation
measurements.
- Move pose relative covariance closer to use
- Validate unicycle 2d
(#180)
- Remove unused EPSILON constexpr
- Validate Unicyle2D state and process noise
- Add disable_checks param (defaults to false)
- Validate state1 and state2 are finite
* Validate process noise covariance (after it's been scaled and multiplied by dt)
- Fix doxygen comment (#177)
- Delay throttle no valid state message (#175) This requires rosconsole >=1.13.8.
- Throttle (#162)
- Support throttling sensor model inputs
- Add ThrottledCallback rostest
- Fix motion model history
(#168)
- Fix the motion model history to maintain at least the requested time interval
- Apply a similar fix to the MessageBuffer class
-
Get positive param API change (#169) * Change getPositiveParam API In order to match the getParam and getRequiredParam, so the value is not returned, but set in an in/out argument. * Move getPositiveParam and other param related functions to parameter.h from util.h, and updated the ros/unit tests accordingly. * Fix wrapAngle2D expected range to [-Pi, +Pi) Instead of (-Pi, +Pi], and update unit test to reflect that.
- Don't require frame if empty indices (#166)
- Fix Unicycle2DIgnition set_pose
(#154)
- Initialize StateHistoryElement::velocity_yaw
- Process ignition transactions individually
- Call motion model generator with last stamp
- Skip optimization cycle if transaction is empty
- C++14 for test_unicycle_2d_state_cost_function (#157)
- Print state history
(#156)
- Add print method to StateHistoryElement
* Add print method to Unicycle2D It only prints the history state for now though.
- Minor typo fixes (#155)
- Get minimum_pose_relative_covariance_diagonal (#150) Regardless of the value of [independent]{.title-ref}, because the [fuse_models::Odometry2D]{.title-ref} sensor model checks for [use_twist_covariance]{.title-ref} before [independent]{.title-ref}, and we could end up with an uninitialized [minimum_pose_relative_covariance_diagonal]{.title-ref}.
- Support ScaledLoss (#141)
- Remove duplicated roslint build_depend (#146)
- Remove old acceleration_2d folder (#145)
- Cleanup validation checks
(#139)
* Add getCovarianceDiagonalParam helper This allows to load a
covariance matrix from the parameter server, provided in a list with
the diagonal values.
- Add isSymmetric and isPositiveDefinite helper functions
- Use twist covariance for differential dependent (#138) In the [fuse_models::Odometry2D]{.title-ref} sensor model, when [differential: true]{.title-ref} and [independent: false]{.title-ref}, the relative pose covariance should NOT be computed from the consecutive absolute pose covariance matrices because they grow unbounded, so the resulting relative pose covariance suffers from numerical issues. Instead, we can use the twist covariance of the last pose to compute the relative pose covariance, using the time difference between the consecutive absolute poses. The only limitation is that we cannot throttle the input topics, because otherwise the twist covariance from the intermediate/throttled messages is missed. We'll have to throttle inside the sensor model, by integrating the intermediate messages.
- Support dependent relative pose measurements
(#137)
- Added a "dependent" covariance calculation option to the "differential" mode
- Added an [independent]{.title-ref} param that defaults to [true]{.title-ref} to keep the current behaviour
* Added a [minimum_pose_relative_covariance_diagonal]{.title-ref} param that is added to the resulting pose relative covariance in order to guarantee that it's not zero or ill-conditioned.
-
Scale process noise covariance (#130) * Scale process noise covariance This scales the process noise covariance pose by the norm of the current state velocity. A new parameter [velocity_norm_min]{.title-ref} is added, that prevents the process noise scaling from setting the pose components to zero or a very small value that could lead to NaN or a rank deficient Jacobian in the problem solved, due to an ill-condition covariance for the process noise.
- Better validation of partial measurement output
(#131)
* Relax the default precision when validating the covariance matrix
is symmetric.
* Print the covariance matrix with
[Eigen::FullPrecision]{.title-ref} when the symmetry test fails with
[isApprox]{.title-ref}, so we can see the magnitude of the error.
- Show source if validation fails
- Changes from throwing/crashing to ROS_ERROR.
- Add eigenvalues to non-PSD error check
- Add disable_checks param to sensor models
- Publish linear acceleration
(#129)
- Publish linear acceleration
* Also use linear acceleration if predicting to the current time if the new param [predict_with_acceleration]{.title-ref} is [true]{.title-ref} (default value).
- Explicitly call boost::range::join (#128) Otherwise we could get a compilation error due to an ambiguous overloaded [join]{.title-ref} function when some additional [boost/algorithm]{.title-ref} headers are included.
- Add fuse_loss pkg with plugin-based loss functions (#118)
- Validate partial measurements (#125)
- Don't read pose_target_frame if differential (#126) If differential is true, the pose_target_frame is not used.
- Only allow exact timestamp transformations (#123)
- Benchmark unicycle_2d state cost function (#121) The benchmark targets are now only build if CATKIN_ENABLE_TESTING is ON, which means that benchmark is now a test_depend and not a depend. However, the benchmarks are NOT gtests, so they are built directly on catkin build, i.e. there is no need to run make run_tests after. For this reason, the find_package on benchmark is no longer REQUIRED, but QUIET instead. The benchmark is built only if the benchmark package is FOUND.
- Removed the explicit '-std=c++14' compile flag
(#119)
- Removed the explicit '-std=c++14' compile flag
- Changed the CXX_STANDARD setting to be per-target instead of global
- Added the CXX_STANDARD_REQUIRED setting to all targets
- Predict jacobians per parameter block (#115)
- fix compilation in Kinetic (#112)
- Wait for reset service existence (#116)
- Publish odometry with timer and allow to predict it (#109)
- Use measurement stamps for transformed variables (#113)
- [RST-2149] Added the configured device_id to the log message (#110)
- [RST-2438] Make ceres params loaders reusable
(#104)
- Moved the Ceres loadFromROS functions into reusable functions in fuse_core
- Load solver parameters for the batch optimizer
- Expose Ceres Solver, Problem and Covariance Options as ROS parameters (#78)
- [RST-2427] Added a 'source' field to the constraints. This is an API-breaking change. (#101)
- [RST-2340] Add serialization support to fuse (#98)
- RST-2390 Renaming unicycle_2d
(#90)
- Renaming unicycle_2d
- Renaming twist_2d (#89)
- Renaming pose_2d (#88)
- Renaming odometry_2d (#87)
- Renaming imu_2d (#86)
- RST-2390 Renaming acceleration_2d
(#85)
- Renaming acceleration_2d
- Renaming package to fuse_models
- Preparing for move
- Contributors: Davide Faconti, Enrique Fernandez Perdomo, Stephen Williams, Tom Moore, sjphilli
0.4.0 (2019-08-14)
0.3.0 (2019-08-14)
0.2.0 (2019-07-12)
- Get predict_to_current_time ROS param (#17)
- [RST-2202] Catch potential errors when computing the covariances
(#18)
- Clear the covariance on error
- Remove angles header not used (#16)
- Default to private ~reset and ~set_pose names (#14)
- Depend on sensor_msgs and nav_msgs (#15)
- Depend on libceres-dev instead of ceres-solver
(#11)
- Depend on libceres-dev instead of ceres-solver
- Add missed depend on angles
- Resolve names before subscribing (#10)
- Linter/style changes
- Use std::bind instead of std::bind2nd std::bind2nd is marked as deprecated in C++11 Co-Authored-By: Stephen Williams <<stephen.vincent.williams@gmail.com>>
- Add sensor_proc test Only for:
- mergeIndices
- appendPartialMeasurement
- Fix appendPartialMeasurement by merging indices Position and orientation indices are merged together into a single std::vector<size_t> of indices, applying the appropriate offset to the orientation indices. This is passed to appendPartialMeasurement, which should be called only once. It doesn't need the base_index and offset args anymore.
- [RST-2128] fuse rl ignition sensor (#6)
- [RST-2144] Updated macro calls on all objects to support proper Eigen memory alignment (#8)
- Bug in motion model history (#7)
- Use linear indices for linear velocity (#5) Not angular indices, which is wrong and produces a crash at runtime because an assert fails.
- Fix appendPartialMeasurement assignments (#4)
- Store ros::Subscriber in sensor model attribute (#3) Store ros::Subscriber in sensor model attribute
- Tailor: Creating Jenkinsfile
- Adding base_link_output_frame_id to the 2D odom publisher (#1)
- Contributors: Enrique Fernandez, Enrique Fernandez Perdomo, Enrique Fernández Perdomo, Stephen Williams, Tom Moore, locus-services
0.1.0 (2019-03-18)
- [RST-1625] Use the stamped variable synchronizer (#13)
- Tailor: Updating Jenkinsfile
- Tailor: Updating Jenkinsfile
- Tailor: Updating Jenkinsfile
- Updated package for changes to fuse_core::Transaction (#11)
- Tailor: Creating Jenkinsfile
- Simplifying
- Just using rotation
- Adding tf2 overloads for twist and acceleration
- Updated derived sensors for recent change to the sensor API
- Adding 2D odometry publisher
- Adding 2D IMU sensor model
- Feature/pedantic style change
(#7)
- White spaaaaaaaaaaaaaaaaaaaaaaace
- Moar whitespace
- PR feedback
- Adding support for partial measurements
- Adding 2D odometry sensor
- Enabling partial measurements for fuse_rl
- PR feedback
- PR feedback
- Adding 2d pose sensor
- Adding 2D odometry sensor
- Adding 2D acceleration sensor
- Adding 2D twist sensor
- More comments
- Removing comment
- Using Jacobians to rotate covariances
- PR feedback
- PR feedback
- Adding ability to transform poses
- Adding 2d pose sensor
- Update README.md
- Adding 2D kinematic constraint
- Adding README
- Contributors: David V. Lu!!, Stephen Williams, Tom Moore, locus-services
Wiki Tutorials
Package Dependencies
System Dependencies
Name |
---|
benchmark |
boost |
libceres-dev |
eigen |
Dependant Packages
Name | Deps |
---|---|
fuse | |
fuse_optimizers | |
fuse_tutorials |
Launch files
Messages
Services
Plugins
Recent questions tagged fuse_models at Robotics Stack Exchange
fuse_models package from fuse repofuse fuse_constraints fuse_core fuse_doc fuse_graphs fuse_loss fuse_models fuse_msgs fuse_optimizers fuse_publishers fuse_tutorials fuse_variables fuse_viz |
|
Package Summary
Tags | No category tags. |
Version | 1.2.1 |
License | BSD |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/locusrobotics/fuse.git |
VCS Type | git |
VCS Version | rolling |
Last Updated | 2024-10-31 |
Dev Status | MAINTAINED |
CI status | No Continuous Integration |
Released | RELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (0)
Good First Issues (0) Pull Requests to Review (0) |
Package Description
Additional Links
Maintainers
- Tom Moore
Authors
- Tom Moore
The fuse_models
package contains plugins that can be used to produce state estimates for a wide variety of robots. The package is intended to support transitioning from the robot_localization
package to fuse
.
Changelog for package fuse_models
1.2.1 (2024-09-21)
- Fix stringop-overread compile issues (#381)
- Contributors: Stephen Williams
1.2.0 (2024-05-02)
1.1.1 (2024-05-02)
- Required formatting changes for the lastest version of ROS 2 Rolling (#368)
- Contributors: Stephen Williams
1.1.0 (2024-04-20)
- Port support for Ceres 2.1.0 Manifold class into ROS 2 Rolling
(#366)
- Support gcc12 and ceres 2.1.0
- Add support for the Manifold class when using Ceres Solver version 2.1.0 and above
- General clean up for Ceres 2.2.0 support
- Updated serialization support to be backwards compatible with previously serialized files
- Formatting changes required for ROS 2 Rolling / Ubuntu Noble
- Contributors: Stephen Williams
1.0.1 (2023-03-03)
1.0.0 (2023-03-03)
- Use upstream rclcpp::node_interfaces::NodeInterfaces
(#313)
- Use upstream rclcpp::node_interfaces::NodeInterfaces
* Dereference node arguments to NodeInterfaces ---------Co-authored-by: methylDragon <<methylDragon@gmail.com>>
- fuse -> ROS 2 fuse_models: Linting (#315)
- Use getParameterName and namespace parameters for publishers (#314)
- Use rclcpp::Clock::wait_until_started (#303)
- fuse -> ROS 2 : Doc Generation
(#278)
- Port doc generation and fix package.xml for linting
- Fix small bugs in package.xml
- Use default rosdoc2 settings
- Use default rosdoc2 settings
* Update fuse_doc for rosdoc2 ---------Co-authored-by: Shane Loretz <<sloretz@google.com>>
- fuse -> ROS 2 fuse_optimizers: Port fuse_optimizers (#307) Co-authored-by: Shane Loretz <<sloretz@osrfoundation.org>> Co-authored-by: Shane Loretz <<shane.loretz@gmail.com>>
- fuse -> ROS 2 fuse_models: Port fuse_models
(#304)
- Port messages
- Port fuse_models
- Fix alloc error and some bugs
- Wait on result
- fuse -> ROS 2 fuse_publishers : Linting (#305)
- fuse -> ROS 2 fuse_publishers: Port fuse_publishers (#299) Co-authored-by: Shane Loretz <<shane.loretz@gmail.com>>
- fuse -> ROS 2 fuse_constraints : Linting (#298)
- fuse -> ROS 2 fuse_graphs: Linting (#297)
- fuse -> ROS 2 fuse_variables: Linting
(#296)
- Migrate to .hpp files
- Create redirection headers
- Make xmllint and uncrustify happy
- Wrap most comment lines
- Satisfy cpplint
- fuse -> ROS 2 fuse_loss: Port fuse_loss (#287)
- fuse -> ROS 2 fuse_core: Linting (#292)
- fuse -> ROS 2 fuse_core : Parameters and Tests (#286) Co-authored-by: Shane Loretz <<sloretz@osrfoundation.org>> Co-authored-by: Ivor Wanders <<ivor@iwanders.net>>
- fuse -> ROS 2 : Port Time (#283)
- fuse -> ROS 2 : Port Logging (#279) Co-authored-by: Tom Moore <<tmoore@locusrobotics.com>>
- Fuse -> ROS 2 fuse_core: Partial port of fuse_core (#281) Co-authored-by: Brett Downing
- fuse -> ROS 2: Clean up macro usage warnings (#280)
- fuse -> ROS 2 fuse_msgs : Port package and ignore unported packages for now (#277) Co-authored-by: Tom Moore <<tmoore@locusrobotics.com>>
- [RST-4186] Fix fuse macro names
(#263)
- Namespace all macros with the FUSE_ prefix. Mark original macros as deprecated.
- Update all fuse objects to use the new macro names
- Adding doxygen to all packages (#241)
- [RST-3451] Delay some transform warnings so startup is less chatty
- Contributors: Shane Loretz, Stephen Williams, Tom Moore, methylDragon
0.4.2 (2021-07-20)
- Adding roslint dependency to fuse_viz
(#231)
- Adding roslint dependency to fuse_viz
- Silence CMP0048 warnings
- Contributors: Tom Moore
0.4.1 (2021-07-13)
- Getting versions in sync
-
Substract minimum twist covariance from twist covariance (#222) * Substract min twist cov from twist cov If the twist covariance already had a minimum twist covariance added to it to prevent ill-conditioned covariance matrices, we need a way to substract that minimum twist covariance from it before we compute the pose relative covariance. Otherwise, we cannot get the original pose relative covariance because the minimum twist covariance term is multiplies by the time delta, which could actually make the resulting pose relative covariance ill-conditioned or very small, i.e. overconfident.
- [Issue #223] Add an optional tf_timeout parameter to the sensor models (#224)
- Factorize differential mode processing
(#219)
- Factorize differential mode processing
- Throttle log message when transform message fails
- Target frame optional
(#217)
- Make target_frame optional
- Remove optional target_frame parameters in tests
- Transform message in differential mode
(#216)
* Transform message in differential mode This is important because
the relative transformation is not the same if the sensor and target
frame are different. Consider for example the case of an IMU sensor
upside down:
- The robot base frame is base_link
- The IMU sensor frame is imu_link
* The imu_link transformation wrt base_link is 180 degrees wrt the y or x axis * The angular velocity around the z axis has opposite sign in the sensor frame wrt the target frame
- Require pose_target_frame in differential mode
- Roslint
- Add pose_target_frame to optimizer test config
- Use fuse_core::getPositiveParam for all ros::Duration parameters
(#212)
- Use fuse_core::getPositiveParam for ros::Duration
- Use fuse_core::getPositiveParam for TF durations
- Add tcp_no_delay parameter to sensor models (#211)
- Add ability to throttle covariance computation (#209)
- Add invert_tf to Odometry2DPublisher (#206) This allows to publish the inverse TF transform. This can be useful to skip the odom->base_link lookupTransform() when braodcasting map->base_link, which must be broadcasted as map->odom because TF tree doesn't support more than a single parent per frame, base_link in this case. This is particular relevant when predict_to_current_time is enabled, because the lookupTransform() could take a while, causing delays.
- Support throttling serialized graph publisher
(#204)
- Change sensor proc from gtest to gmock target
- Move ThrottledCallback to fuse_core
- Support generic callbacks in ThrottledCallback
- Throttle graph publishing
- Overload getPositiveParam for ros::Duration
- Use getPositiveParam for ros::Duration parameters
- Add linear acceleration to synchronizer (#205)
- Use local latest_stamp in notifyCallback (#203)
- Use dedicated spinner for publish timer callback
(#201)
- Use dedicated spinner for publishTimerCallback
* This reduces the jitter in the output topics and TF transform stamp because it allows the notifyCallback and publishTimerCallback to run concurrently. The notifyCallback might take longer than the timer period sometimes, mostly because the covariance computation is an expensive operation. * There is a subtle change of behaviour with this implementation! Before, the publishTimerCallback overwrote the odom_output_ and acceleration_output_ with the predicted state. Now it does not, and if it gets called twice or more times consecutively, it predicts since the last time the state was computed and updated in the notifyCallback. With the notifyCallback and publishTimerCallback running concurrently it is not trivial to keep the previous behaviour efficiently, because we would have to lock the entire callbacks to avoid the publishTimerCallback to overwrite a new state being computed concurrently in the notifyCallback. That being said, the predicted state is likely the same in both implementation. That is, the result is likely the same if we use multiple steps or a single one to predict the last state forward to the current time.
- Add fuse_models::GraphIgnition sensor model (#196)
- Add fuse_models::Transaction sensor model (#195)
- Fix Unicycle2D constructor doxygen (#198)
- Remove deprecated ::Model models leftovers
(#194)
- Remove fuse_models::twist_2d::Model plugin declaration
- Remove empty space in fuse_plugins.xml
- Update ::Model names to new names in doxygen comments
- Conditionally test_depend on benchmark (#189)
- Fix typo in jacobian comments (#191)
- Fix throttle
(#190)
* Update last called time adding throttle period Instead of setting
to now, which could be larger than the expected call time.
- Init last called time to now the first time
* Fix check for init/zero last called time We cannot use isValid because that does not check the last called time is zero, but a completely different thing. We must use isZero.
- Check canTransform output and show error if false
(#188)
- Check canTransform output and show error if false
- Fix pose -> twist typo
- Lookup transform directly
- Use std::enable_if_t (#187)
- Fix roslint 0.12.0
(#186)
* Fix roslint 0.12.0 include_what_you_use warnings Mostly for:
- std::move -> #include <utility>
- std::make_shared and similar -> #include <memory>
- Remove static string variable not permitted by roslint 0.12.0, using a test fixture where needed.
- Only call generator if motion model history empty
(#181)
- Only call generator if motion model history empty
- Handle dt == 0 special case in motion model
- Revert test_timestamp_manager.cpp #154
- Add EmptySingleStamp test
- Add use_twist_covariance ROS param and logic to Imu2D differential
orientation measurements
(#178)
* Move pose into previous_pose_ This makes the Odometry2D do the
same as the Imu2D.
* Allow Imu2D to use twist covariance For differential orientation
measurements.
- Move pose relative covariance closer to use
- Validate unicycle 2d
(#180)
- Remove unused EPSILON constexpr
- Validate Unicyle2D state and process noise
- Add disable_checks param (defaults to false)
- Validate state1 and state2 are finite
* Validate process noise covariance (after it's been scaled and multiplied by dt)
- Fix doxygen comment (#177)
- Delay throttle no valid state message (#175) This requires rosconsole >=1.13.8.
- Throttle (#162)
- Support throttling sensor model inputs
- Add ThrottledCallback rostest
- Fix motion model history
(#168)
- Fix the motion model history to maintain at least the requested time interval
- Apply a similar fix to the MessageBuffer class
-
Get positive param API change (#169) * Change getPositiveParam API In order to match the getParam and getRequiredParam, so the value is not returned, but set in an in/out argument. * Move getPositiveParam and other param related functions to parameter.h from util.h, and updated the ros/unit tests accordingly. * Fix wrapAngle2D expected range to [-Pi, +Pi) Instead of (-Pi, +Pi], and update unit test to reflect that.
- Don't require frame if empty indices (#166)
- Fix Unicycle2DIgnition set_pose
(#154)
- Initialize StateHistoryElement::velocity_yaw
- Process ignition transactions individually
- Call motion model generator with last stamp
- Skip optimization cycle if transaction is empty
- C++14 for test_unicycle_2d_state_cost_function (#157)
- Print state history
(#156)
- Add print method to StateHistoryElement
* Add print method to Unicycle2D It only prints the history state for now though.
- Minor typo fixes (#155)
- Get minimum_pose_relative_covariance_diagonal (#150) Regardless of the value of [independent]{.title-ref}, because the [fuse_models::Odometry2D]{.title-ref} sensor model checks for [use_twist_covariance]{.title-ref} before [independent]{.title-ref}, and we could end up with an uninitialized [minimum_pose_relative_covariance_diagonal]{.title-ref}.
- Support ScaledLoss (#141)
- Remove duplicated roslint build_depend (#146)
- Remove old acceleration_2d folder (#145)
- Cleanup validation checks
(#139)
* Add getCovarianceDiagonalParam helper This allows to load a
covariance matrix from the parameter server, provided in a list with
the diagonal values.
- Add isSymmetric and isPositiveDefinite helper functions
- Use twist covariance for differential dependent (#138) In the [fuse_models::Odometry2D]{.title-ref} sensor model, when [differential: true]{.title-ref} and [independent: false]{.title-ref}, the relative pose covariance should NOT be computed from the consecutive absolute pose covariance matrices because they grow unbounded, so the resulting relative pose covariance suffers from numerical issues. Instead, we can use the twist covariance of the last pose to compute the relative pose covariance, using the time difference between the consecutive absolute poses. The only limitation is that we cannot throttle the input topics, because otherwise the twist covariance from the intermediate/throttled messages is missed. We'll have to throttle inside the sensor model, by integrating the intermediate messages.
- Support dependent relative pose measurements
(#137)
- Added a "dependent" covariance calculation option to the "differential" mode
- Added an [independent]{.title-ref} param that defaults to [true]{.title-ref} to keep the current behaviour
* Added a [minimum_pose_relative_covariance_diagonal]{.title-ref} param that is added to the resulting pose relative covariance in order to guarantee that it's not zero or ill-conditioned.
-
Scale process noise covariance (#130) * Scale process noise covariance This scales the process noise covariance pose by the norm of the current state velocity. A new parameter [velocity_norm_min]{.title-ref} is added, that prevents the process noise scaling from setting the pose components to zero or a very small value that could lead to NaN or a rank deficient Jacobian in the problem solved, due to an ill-condition covariance for the process noise.
- Better validation of partial measurement output
(#131)
* Relax the default precision when validating the covariance matrix
is symmetric.
* Print the covariance matrix with
[Eigen::FullPrecision]{.title-ref} when the symmetry test fails with
[isApprox]{.title-ref}, so we can see the magnitude of the error.
- Show source if validation fails
- Changes from throwing/crashing to ROS_ERROR.
- Add eigenvalues to non-PSD error check
- Add disable_checks param to sensor models
- Publish linear acceleration
(#129)
- Publish linear acceleration
* Also use linear acceleration if predicting to the current time if the new param [predict_with_acceleration]{.title-ref} is [true]{.title-ref} (default value).
- Explicitly call boost::range::join (#128) Otherwise we could get a compilation error due to an ambiguous overloaded [join]{.title-ref} function when some additional [boost/algorithm]{.title-ref} headers are included.
- Add fuse_loss pkg with plugin-based loss functions (#118)
- Validate partial measurements (#125)
- Don't read pose_target_frame if differential (#126) If differential is true, the pose_target_frame is not used.
- Only allow exact timestamp transformations (#123)
- Benchmark unicycle_2d state cost function (#121) The benchmark targets are now only build if CATKIN_ENABLE_TESTING is ON, which means that benchmark is now a test_depend and not a depend. However, the benchmarks are NOT gtests, so they are built directly on catkin build, i.e. there is no need to run make run_tests after. For this reason, the find_package on benchmark is no longer REQUIRED, but QUIET instead. The benchmark is built only if the benchmark package is FOUND.
- Removed the explicit '-std=c++14' compile flag
(#119)
- Removed the explicit '-std=c++14' compile flag
- Changed the CXX_STANDARD setting to be per-target instead of global
- Added the CXX_STANDARD_REQUIRED setting to all targets
- Predict jacobians per parameter block (#115)
- fix compilation in Kinetic (#112)
- Wait for reset service existence (#116)
- Publish odometry with timer and allow to predict it (#109)
- Use measurement stamps for transformed variables (#113)
- [RST-2149] Added the configured device_id to the log message (#110)
- [RST-2438] Make ceres params loaders reusable
(#104)
- Moved the Ceres loadFromROS functions into reusable functions in fuse_core
- Load solver parameters for the batch optimizer
- Expose Ceres Solver, Problem and Covariance Options as ROS parameters (#78)
- [RST-2427] Added a 'source' field to the constraints. This is an API-breaking change. (#101)
- [RST-2340] Add serialization support to fuse (#98)
- RST-2390 Renaming unicycle_2d
(#90)
- Renaming unicycle_2d
- Renaming twist_2d (#89)
- Renaming pose_2d (#88)
- Renaming odometry_2d (#87)
- Renaming imu_2d (#86)
- RST-2390 Renaming acceleration_2d
(#85)
- Renaming acceleration_2d
- Renaming package to fuse_models
- Preparing for move
- Contributors: Davide Faconti, Enrique Fernandez Perdomo, Stephen Williams, Tom Moore, sjphilli
0.4.0 (2019-08-14)
0.3.0 (2019-08-14)
0.2.0 (2019-07-12)
- Get predict_to_current_time ROS param (#17)
- [RST-2202] Catch potential errors when computing the covariances
(#18)
- Clear the covariance on error
- Remove angles header not used (#16)
- Default to private ~reset and ~set_pose names (#14)
- Depend on sensor_msgs and nav_msgs (#15)
- Depend on libceres-dev instead of ceres-solver
(#11)
- Depend on libceres-dev instead of ceres-solver
- Add missed depend on angles
- Resolve names before subscribing (#10)
- Linter/style changes
- Use std::bind instead of std::bind2nd std::bind2nd is marked as deprecated in C++11 Co-Authored-By: Stephen Williams <<stephen.vincent.williams@gmail.com>>
- Add sensor_proc test Only for:
- mergeIndices
- appendPartialMeasurement
- Fix appendPartialMeasurement by merging indices Position and orientation indices are merged together into a single std::vector<size_t> of indices, applying the appropriate offset to the orientation indices. This is passed to appendPartialMeasurement, which should be called only once. It doesn't need the base_index and offset args anymore.
- [RST-2128] fuse rl ignition sensor (#6)
- [RST-2144] Updated macro calls on all objects to support proper Eigen memory alignment (#8)
- Bug in motion model history (#7)
- Use linear indices for linear velocity (#5) Not angular indices, which is wrong and produces a crash at runtime because an assert fails.
- Fix appendPartialMeasurement assignments (#4)
- Store ros::Subscriber in sensor model attribute (#3) Store ros::Subscriber in sensor model attribute
- Tailor: Creating Jenkinsfile
- Adding base_link_output_frame_id to the 2D odom publisher (#1)
- Contributors: Enrique Fernandez, Enrique Fernandez Perdomo, Enrique Fernández Perdomo, Stephen Williams, Tom Moore, locus-services
0.1.0 (2019-03-18)
- [RST-1625] Use the stamped variable synchronizer (#13)
- Tailor: Updating Jenkinsfile
- Tailor: Updating Jenkinsfile
- Tailor: Updating Jenkinsfile
- Updated package for changes to fuse_core::Transaction (#11)
- Tailor: Creating Jenkinsfile
- Simplifying
- Just using rotation
- Adding tf2 overloads for twist and acceleration
- Updated derived sensors for recent change to the sensor API
- Adding 2D odometry publisher
- Adding 2D IMU sensor model
- Feature/pedantic style change
(#7)
- White spaaaaaaaaaaaaaaaaaaaaaaace
- Moar whitespace
- PR feedback
- Adding support for partial measurements
- Adding 2D odometry sensor
- Enabling partial measurements for fuse_rl
- PR feedback
- PR feedback
- Adding 2d pose sensor
- Adding 2D odometry sensor
- Adding 2D acceleration sensor
- Adding 2D twist sensor
- More comments
- Removing comment
- Using Jacobians to rotate covariances
- PR feedback
- PR feedback
- Adding ability to transform poses
- Adding 2d pose sensor
- Update README.md
- Adding 2D kinematic constraint
- Adding README
- Contributors: David V. Lu!!, Stephen Williams, Tom Moore, locus-services
Wiki Tutorials
Package Dependencies
System Dependencies
Name |
---|
benchmark |
boost |
libceres-dev |
eigen |
Dependant Packages
Name | Deps |
---|---|
fuse | |
fuse_optimizers | |
fuse_tutorials |
Launch files
Messages
Services
Plugins
Recent questions tagged fuse_models at Robotics Stack Exchange
fuse_models package from fuse repofuse fuse_constraints fuse_core fuse_doc fuse_graphs fuse_loss fuse_models fuse_msgs fuse_optimizers fuse_publishers fuse_tutorials fuse_variables fuse_viz |
|
Package Summary
Tags | No category tags. |
Version | 0.10.0 |
License | BSD |
Build type | CATKIN |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/locusrobotics/fuse.git |
VCS Type | git |
VCS Version | devel |
Last Updated | 2024-09-19 |
Dev Status | MAINTAINED |
CI status |
|
Released | RELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (0)
Good First Issues (0) Pull Requests to Review (0) |
Package Description
Additional Links
Maintainers
- Tom Moore
Authors
- Tom Moore
The fuse_models
package contains plugins that can be used to produce state estimates for a wide variety of robots. The package is intended to support transitioning from the robot_localization
package to fuse
.
Changelog for package fuse_models
0.5.0 (2022-02-23)
- [RST-4186] Fix fuse macro names (#263)
- Namespace all macros with the FUSE_ prefix. Mark original macros as deprecated.
- Update all fuse objects to use the new macro names
- Adding doxygen to all packages (#241)
- [RST-3451] Delay some transform warnings so startup is less chatty
- Contributors: Stephen Williams, Tom Moore
0.6.0 (2023-02-22)
- 0.5.0
- Update changelogs
- [RST-4186] Fix fuse macro names (#263)
- Namespace all macros with the FUSE_ prefix. Mark original macros as deprecated.
- Update all fuse objects to use the new macro names
- Adding doxygen to all packages (#241)
- [RST-3451] Delay some transform warnings so startup is less chatty
- Contributors: Gary Servin, Stephen Williams, Tom Moore
0.7.0 (2023-09-25)
- [RST-7809] Fix optimization errors when the orientation is
initialized at +PI (#334)
- Add some unit tests for the 2D orientation constraints; Create getters/setters for the 2D orientation variable is preparation for a fix.
- Force the 2D orientation value to be is minimum phase
- add missing tf timeout at differential mode of IMU, odometry, and pose sensor model (#322)
- Minor header fixes (#266)
- Use fuse_macros.h instead of deprecated macros.h
- Add missed header
- Sort headers
- Update devel to build on Ubuntu Jammy (22.04) (#326)
- Update to C++17 for use with Ubuntu Jammy
- Include Rviz and Eigen as system includes, which supresses warnings within the included libraries
- use pluginlib and class_list_macros .hpp include instead of deprecated .h From: Lucas Walter <<wsacul@gmail.com>>
- 0.6.0
- Update changelogs
- 0.5.0
- Update changelogs
- [RST-4186] Fix fuse macro names (#263)
- Namespace all macros with the FUSE_ prefix. Mark original macros as deprecated.
- Update all fuse objects to use the new macro names
- Adding doxygen to all packages (#241)
- [RST-3451] Delay some transform warnings so startup is less chatty
- Contributors: Enrique Fernandez Perdomo, Gary Servin, Stephen Williams, Tom Moore, fabianhirmann
0.10.0 (2024-09-16)
0.9.0 (2024-06-17)
- Gcc12 ceres 2.1.0 manifold locus (#363)
- General clean up for Ceres 2.2.0 support
* Updated serialization support to be backwards compatible with previously serialized files ---------Co-authored-by: Enrique Fernandez Perdomo <<efernandez@clearpath.ai>>
- Support gcc12 and ceres 2.1.0 (#341) Add support for the Manifold class when using Ceres Solver version 2.1.0 and above ---------Co-authored-by: Jake McLaughlin <<jake.mclaughlin98@gmail.com>>
- Contributors: Enrique Fernandez Perdomo, Stephen Williams
0.8.0 (2024-02-02)
- 0.7.0
- Update changelogs
- [RST-7809] Fix optimization errors when the orientation is
initialized at +PI (#334)
- Add some unit tests for the 2D orientation constraints; Create getters/setters for the 2D orientation variable is preparation for a fix.
- Force the 2D orientation value to be is minimum phase
- add missing tf timeout at differential mode of IMU, odometry, and pose sensor model (#322)
- Minor header fixes (#266)
- Use fuse_macros.h instead of deprecated macros.h
- Add missed header
- Sort headers
- Update devel to build on Ubuntu Jammy (22.04) (#326)
- Update to C++17 for use with Ubuntu Jammy
- Include Rviz and Eigen as system includes, which supresses warnings within the included libraries
- use pluginlib and class_list_macros .hpp include instead of deprecated .h From: Lucas Walter <<wsacul@gmail.com>>
- 0.6.0
- Update changelogs
- 0.5.0
- Update changelogs
- [RST-4186] Fix fuse macro names (#263)
- Namespace all macros with the FUSE_ prefix. Mark original macros as deprecated.
- Update all fuse objects to use the new macro names
- Adding doxygen to all packages (#241)
- [RST-3451] Delay some transform warnings so startup is less chatty
- Contributors: Enrique Fernandez Perdomo, Gary Servin, Stephen Williams, Tom Moore, fabianhirmann
0.4.2 (2021-07-20)
- Adding roslint dependency to fuse_viz
(#231)
- Adding roslint dependency to fuse_viz
- Silence CMP0048 warnings
- Contributors: Tom Moore
0.4.1 (2021-07-13)
- Getting versions in sync
-
Substract minimum twist covariance from twist covariance (#222) * Substract min twist cov from twist cov If the twist covariance already had a minimum twist covariance added to it to prevent ill-conditioned covariance matrices, we need a way to substract that minimum twist covariance from it before we compute the pose relative covariance. Otherwise, we cannot get the original pose relative covariance because the minimum twist covariance term is multiplies by the time delta, which could actually make the resulting pose relative covariance ill-conditioned or very small, i.e. overconfident.
- [Issue #223] Add an optional tf_timeout parameter to the sensor models (#224)
- Factorize differential mode processing
(#219)
- Factorize differential mode processing
- Throttle log message when transform message fails
- Target frame optional
(#217)
- Make target_frame optional
- Remove optional target_frame parameters in tests
- Transform message in differential mode
(#216)
* Transform message in differential mode This is important because
the relative transformation is not the same if the sensor and target
frame are different. Consider for example the case of an IMU sensor
upside down:
- The robot base frame is base_link
- The IMU sensor frame is imu_link
* The imu_link transformation wrt base_link is 180 degrees wrt the y or x axis * The angular velocity around the z axis has opposite sign in the sensor frame wrt the target frame
- Require pose_target_frame in differential mode
- Roslint
- Add pose_target_frame to optimizer test config
- Use fuse_core::getPositiveParam for all ros::Duration parameters
(#212)
- Use fuse_core::getPositiveParam for ros::Duration
- Use fuse_core::getPositiveParam for TF durations
- Add tcp_no_delay parameter to sensor models (#211)
- Add ability to throttle covariance computation (#209)
- Add invert_tf to Odometry2DPublisher (#206) This allows to publish the inverse TF transform. This can be useful to skip the odom->base_link lookupTransform() when braodcasting map->base_link, which must be broadcasted as map->odom because TF tree doesn't support more than a single parent per frame, base_link in this case. This is particular relevant when predict_to_current_time is enabled, because the lookupTransform() could take a while, causing delays.
- Support throttling serialized graph publisher
(#204)
- Change sensor proc from gtest to gmock target
- Move ThrottledCallback to fuse_core
- Support generic callbacks in ThrottledCallback
- Throttle graph publishing
- Overload getPositiveParam for ros::Duration
- Use getPositiveParam for ros::Duration parameters
- Add linear acceleration to synchronizer (#205)
- Use local latest_stamp in notifyCallback (#203)
- Use dedicated spinner for publish timer callback
(#201)
- Use dedicated spinner for publishTimerCallback
* This reduces the jitter in the output topics and TF transform stamp because it allows the notifyCallback and publishTimerCallback to run concurrently. The notifyCallback might take longer than the timer period sometimes, mostly because the covariance computation is an expensive operation. * There is a subtle change of behaviour with this implementation! Before, the publishTimerCallback overwrote the odom_output_ and acceleration_output_ with the predicted state. Now it does not, and if it gets called twice or more times consecutively, it predicts since the last time the state was computed and updated in the notifyCallback. With the notifyCallback and publishTimerCallback running concurrently it is not trivial to keep the previous behaviour efficiently, because we would have to lock the entire callbacks to avoid the publishTimerCallback to overwrite a new state being computed concurrently in the notifyCallback. That being said, the predicted state is likely the same in both implementation. That is, the result is likely the same if we use multiple steps or a single one to predict the last state forward to the current time.
- Add fuse_models::GraphIgnition sensor model (#196)
- Add fuse_models::Transaction sensor model (#195)
- Fix Unicycle2D constructor doxygen (#198)
- Remove deprecated ::Model models leftovers
(#194)
- Remove fuse_models::twist_2d::Model plugin declaration
- Remove empty space in fuse_plugins.xml
- Update ::Model names to new names in doxygen comments
- Conditionally test_depend on benchmark (#189)
- Fix typo in jacobian comments (#191)
- Fix throttle
(#190)
* Update last called time adding throttle period Instead of setting
to now, which could be larger than the expected call time.
- Init last called time to now the first time
* Fix check for init/zero last called time We cannot use isValid because that does not check the last called time is zero, but a completely different thing. We must use isZero.
- Check canTransform output and show error if false
(#188)
- Check canTransform output and show error if false
- Fix pose -> twist typo
- Lookup transform directly
- Use std::enable_if_t (#187)
- Fix roslint 0.12.0
(#186)
* Fix roslint 0.12.0 include_what_you_use warnings Mostly for:
- std::move -> #include <utility>
- std::make_shared and similar -> #include <memory>
- Remove static string variable not permitted by roslint 0.12.0, using a test fixture where needed.
- Only call generator if motion model history empty
(#181)
- Only call generator if motion model history empty
- Handle dt == 0 special case in motion model
- Revert test_timestamp_manager.cpp #154
- Add EmptySingleStamp test
- Add use_twist_covariance ROS param and logic to Imu2D differential
orientation measurements
(#178)
* Move pose into previous_pose_ This makes the Odometry2D do the
same as the Imu2D.
* Allow Imu2D to use twist covariance For differential orientation
measurements.
- Move pose relative covariance closer to use
- Validate unicycle 2d
(#180)
- Remove unused EPSILON constexpr
- Validate Unicyle2D state and process noise
- Add disable_checks param (defaults to false)
- Validate state1 and state2 are finite
* Validate process noise covariance (after it's been scaled and multiplied by dt)
- Fix doxygen comment (#177)
- Delay throttle no valid state message (#175) This requires rosconsole >=1.13.8.
- Throttle (#162)
- Support throttling sensor model inputs
- Add ThrottledCallback rostest
- Fix motion model history
(#168)
- Fix the motion model history to maintain at least the requested time interval
- Apply a similar fix to the MessageBuffer class
-
Get positive param API change (#169) * Change getPositiveParam API In order to match the getParam and getRequiredParam, so the value is not returned, but set in an in/out argument. * Move getPositiveParam and other param related functions to parameter.h from util.h, and updated the ros/unit tests accordingly. * Fix wrapAngle2D expected range to [-Pi, +Pi) Instead of (-Pi, +Pi], and update unit test to reflect that.
- Don't require frame if empty indices (#166)
- Fix Unicycle2DIgnition set_pose
(#154)
- Initialize StateHistoryElement::velocity_yaw
- Process ignition transactions individually
- Call motion model generator with last stamp
- Skip optimization cycle if transaction is empty
- C++14 for test_unicycle_2d_state_cost_function (#157)
- Print state history
(#156)
- Add print method to StateHistoryElement
* Add print method to Unicycle2D It only prints the history state for now though.
- Minor typo fixes (#155)
- Get minimum_pose_relative_covariance_diagonal (#150) Regardless of the value of [independent]{.title-ref}, because the [fuse_models::Odometry2D]{.title-ref} sensor model checks for [use_twist_covariance]{.title-ref} before [independent]{.title-ref}, and we could end up with an uninitialized [minimum_pose_relative_covariance_diagonal]{.title-ref}.
- Support ScaledLoss (#141)
- Remove duplicated roslint build_depend (#146)
- Remove old acceleration_2d folder (#145)
- Cleanup validation checks
(#139)
* Add getCovarianceDiagonalParam helper This allows to load a
covariance matrix from the parameter server, provided in a list with
the diagonal values.
- Add isSymmetric and isPositiveDefinite helper functions
- Use twist covariance for differential dependent (#138) In the [fuse_models::Odometry2D]{.title-ref} sensor model, when [differential: true]{.title-ref} and [independent: false]{.title-ref}, the relative pose covariance should NOT be computed from the consecutive absolute pose covariance matrices because they grow unbounded, so the resulting relative pose covariance suffers from numerical issues. Instead, we can use the twist covariance of the last pose to compute the relative pose covariance, using the time difference between the consecutive absolute poses. The only limitation is that we cannot throttle the input topics, because otherwise the twist covariance from the intermediate/throttled messages is missed. We'll have to throttle inside the sensor model, by integrating the intermediate messages.
- Support dependent relative pose measurements
(#137)
- Added a "dependent" covariance calculation option to the "differential" mode
- Added an [independent]{.title-ref} param that defaults to [true]{.title-ref} to keep the current behaviour
* Added a [minimum_pose_relative_covariance_diagonal]{.title-ref} param that is added to the resulting pose relative covariance in order to guarantee that it's not zero or ill-conditioned.
-
Scale process noise covariance (#130) * Scale process noise covariance This scales the process noise covariance pose by the norm of the current state velocity. A new parameter [velocity_norm_min]{.title-ref} is added, that prevents the process noise scaling from setting the pose components to zero or a very small value that could lead to NaN or a rank deficient Jacobian in the problem solved, due to an ill-condition covariance for the process noise.
- Better validation of partial measurement output
(#131)
* Relax the default precision when validating the covariance matrix
is symmetric.
* Print the covariance matrix with
[Eigen::FullPrecision]{.title-ref} when the symmetry test fails with
[isApprox]{.title-ref}, so we can see the magnitude of the error.
- Show source if validation fails
- Changes from throwing/crashing to ROS_ERROR.
- Add eigenvalues to non-PSD error check
- Add disable_checks param to sensor models
- Publish linear acceleration
(#129)
- Publish linear acceleration
* Also use linear acceleration if predicting to the current time if the new param [predict_with_acceleration]{.title-ref} is [true]{.title-ref} (default value).
- Explicitly call boost::range::join (#128) Otherwise we could get a compilation error due to an ambiguous overloaded [join]{.title-ref} function when some additional [boost/algorithm]{.title-ref} headers are included.
- Add fuse_loss pkg with plugin-based loss functions (#118)
- Validate partial measurements (#125)
- Don't read pose_target_frame if differential (#126) If differential is true, the pose_target_frame is not used.
- Only allow exact timestamp transformations (#123)
- Benchmark unicycle_2d state cost function (#121) The benchmark targets are now only build if CATKIN_ENABLE_TESTING is ON, which means that benchmark is now a test_depend and not a depend. However, the benchmarks are NOT gtests, so they are built directly on catkin build, i.e. there is no need to run make run_tests after. For this reason, the find_package on benchmark is no longer REQUIRED, but QUIET instead. The benchmark is built only if the benchmark package is FOUND.
- Removed the explicit '-std=c++14' compile flag
(#119)
- Removed the explicit '-std=c++14' compile flag
- Changed the CXX_STANDARD setting to be per-target instead of global
- Added the CXX_STANDARD_REQUIRED setting to all targets
- Predict jacobians per parameter block (#115)
- fix compilation in Kinetic (#112)
- Wait for reset service existence (#116)
- Publish odometry with timer and allow to predict it (#109)
- Use measurement stamps for transformed variables (#113)
- [RST-2149] Added the configured device_id to the log message (#110)
- [RST-2438] Make ceres params loaders reusable
(#104)
- Moved the Ceres loadFromROS functions into reusable functions in fuse_core
- Load solver parameters for the batch optimizer
- Expose Ceres Solver, Problem and Covariance Options as ROS parameters (#78)
- [RST-2427] Added a 'source' field to the constraints. This is an API-breaking change. (#101)
- [RST-2340] Add serialization support to fuse (#98)
- RST-2390 Renaming unicycle_2d
(#90)
- Renaming unicycle_2d
- Renaming twist_2d (#89)
- Renaming pose_2d (#88)
- Renaming odometry_2d (#87)
- Renaming imu_2d (#86)
- RST-2390 Renaming acceleration_2d
(#85)
- Renaming acceleration_2d
- Renaming package to fuse_models
- Preparing for move
- Contributors: Davide Faconti, Enrique Fernandez Perdomo, Stephen Williams, Tom Moore, sjphilli
0.4.0 (2019-08-14)
0.3.0 (2019-08-14)
0.2.0 (2019-07-12)
- Get predict_to_current_time ROS param (#17)
- [RST-2202] Catch potential errors when computing the covariances
(#18)
- Clear the covariance on error
- Remove angles header not used (#16)
- Default to private ~reset and ~set_pose names (#14)
- Depend on sensor_msgs and nav_msgs (#15)
- Depend on libceres-dev instead of ceres-solver
(#11)
- Depend on libceres-dev instead of ceres-solver
- Add missed depend on angles
- Resolve names before subscribing (#10)
- Linter/style changes
- Use std::bind instead of std::bind2nd std::bind2nd is marked as deprecated in C++11 Co-Authored-By: Stephen Williams <<stephen.vincent.williams@gmail.com>>
- Add sensor_proc test Only for:
- mergeIndices
- appendPartialMeasurement
- Fix appendPartialMeasurement by merging indices Position and orientation indices are merged together into a single std::vector<size_t> of indices, applying the appropriate offset to the orientation indices. This is passed to appendPartialMeasurement, which should be called only once. It doesn't need the base_index and offset args anymore.
- [RST-2128] fuse rl ignition sensor (#6)
- [RST-2144] Updated macro calls on all objects to support proper Eigen memory alignment (#8)
- Bug in motion model history (#7)
- Use linear indices for linear velocity (#5) Not angular indices, which is wrong and produces a crash at runtime because an assert fails.
- Fix appendPartialMeasurement assignments (#4)
- Store ros::Subscriber in sensor model attribute (#3) Store ros::Subscriber in sensor model attribute
- Tailor: Creating Jenkinsfile
- Adding base_link_output_frame_id to the 2D odom publisher (#1)
- Contributors: Enrique Fernandez, Enrique Fernandez Perdomo, Enrique Fernández Perdomo, Stephen Williams, Tom Moore, locus-services
0.1.0 (2019-03-18)
- [RST-1625] Use the stamped variable synchronizer (#13)
- Tailor: Updating Jenkinsfile
- Tailor: Updating Jenkinsfile
- Tailor: Updating Jenkinsfile
- Updated package for changes to fuse_core::Transaction (#11)
- Tailor: Creating Jenkinsfile
- Simplifying
- Just using rotation
- Adding tf2 overloads for twist and acceleration
- Updated derived sensors for recent change to the sensor API
- Adding 2D odometry publisher
- Adding 2D IMU sensor model
- Feature/pedantic style change
(#7)
- White spaaaaaaaaaaaaaaaaaaaaaaace
- Moar whitespace
- PR feedback
- Adding support for partial measurements
- Adding 2D odometry sensor
- Enabling partial measurements for fuse_rl
- PR feedback
- PR feedback
- Adding 2d pose sensor
- Adding 2D odometry sensor
- Adding 2D acceleration sensor
- Adding 2D twist sensor
- More comments
- Removing comment
- Using Jacobians to rotate covariances
- PR feedback
- PR feedback
- Adding ability to transform poses
- Adding 2d pose sensor
- Update README.md
- Adding 2D kinematic constraint
- Adding README
- Contributors: David V. Lu!!, Stephen Williams, Tom Moore, locus-services
Wiki Tutorials
Package Dependencies
System Dependencies
Name |
---|
benchmark |
boost |
libceres-dev |
eigen |
Dependant Packages
Name | Deps |
---|---|
fuse | |
fuse_optimizers | |
fuse_tutorials |
Launch files
Messages
Plugins
Recent questions tagged fuse_models at Robotics Stack Exchange
fuse_models package from fuse repofuse fuse_constraints fuse_core fuse_doc fuse_graphs fuse_loss fuse_models fuse_msgs fuse_optimizers fuse_publishers fuse_tutorials fuse_variables fuse_viz |
|
Package Summary
Tags | No category tags. |
Version | 0.10.0 |
License | BSD |
Build type | CATKIN |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/locusrobotics/fuse.git |
VCS Type | git |
VCS Version | devel |
Last Updated | 2024-09-19 |
Dev Status | MAINTAINED |
CI status |
|
Released | RELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (0)
Good First Issues (0) Pull Requests to Review (0) |
Package Description
Additional Links
Maintainers
- Tom Moore
Authors
- Tom Moore
The fuse_models
package contains plugins that can be used to produce state estimates for a wide variety of robots. The package is intended to support transitioning from the robot_localization
package to fuse
.
Changelog for package fuse_models
0.5.0 (2022-02-23)
- [RST-4186] Fix fuse macro names (#263)
- Namespace all macros with the FUSE_ prefix. Mark original macros as deprecated.
- Update all fuse objects to use the new macro names
- Adding doxygen to all packages (#241)
- [RST-3451] Delay some transform warnings so startup is less chatty
- Contributors: Stephen Williams, Tom Moore
0.6.0 (2023-02-22)
- 0.5.0
- Update changelogs
- [RST-4186] Fix fuse macro names (#263)
- Namespace all macros with the FUSE_ prefix. Mark original macros as deprecated.
- Update all fuse objects to use the new macro names
- Adding doxygen to all packages (#241)
- [RST-3451] Delay some transform warnings so startup is less chatty
- Contributors: Gary Servin, Stephen Williams, Tom Moore
0.7.0 (2023-09-25)
- [RST-7809] Fix optimization errors when the orientation is
initialized at +PI (#334)
- Add some unit tests for the 2D orientation constraints; Create getters/setters for the 2D orientation variable is preparation for a fix.
- Force the 2D orientation value to be is minimum phase
- add missing tf timeout at differential mode of IMU, odometry, and pose sensor model (#322)
- Minor header fixes (#266)
- Use fuse_macros.h instead of deprecated macros.h
- Add missed header
- Sort headers
- Update devel to build on Ubuntu Jammy (22.04) (#326)
- Update to C++17 for use with Ubuntu Jammy
- Include Rviz and Eigen as system includes, which supresses warnings within the included libraries
- use pluginlib and class_list_macros .hpp include instead of deprecated .h From: Lucas Walter <<wsacul@gmail.com>>
- 0.6.0
- Update changelogs
- 0.5.0
- Update changelogs
- [RST-4186] Fix fuse macro names (#263)
- Namespace all macros with the FUSE_ prefix. Mark original macros as deprecated.
- Update all fuse objects to use the new macro names
- Adding doxygen to all packages (#241)
- [RST-3451] Delay some transform warnings so startup is less chatty
- Contributors: Enrique Fernandez Perdomo, Gary Servin, Stephen Williams, Tom Moore, fabianhirmann
0.10.0 (2024-09-16)
0.9.0 (2024-06-17)
- Gcc12 ceres 2.1.0 manifold locus (#363)
- General clean up for Ceres 2.2.0 support
* Updated serialization support to be backwards compatible with previously serialized files ---------Co-authored-by: Enrique Fernandez Perdomo <<efernandez@clearpath.ai>>
- Support gcc12 and ceres 2.1.0 (#341) Add support for the Manifold class when using Ceres Solver version 2.1.0 and above ---------Co-authored-by: Jake McLaughlin <<jake.mclaughlin98@gmail.com>>
- Contributors: Enrique Fernandez Perdomo, Stephen Williams
0.8.0 (2024-02-02)
- 0.7.0
- Update changelogs
- [RST-7809] Fix optimization errors when the orientation is
initialized at +PI (#334)
- Add some unit tests for the 2D orientation constraints; Create getters/setters for the 2D orientation variable is preparation for a fix.
- Force the 2D orientation value to be is minimum phase
- add missing tf timeout at differential mode of IMU, odometry, and pose sensor model (#322)
- Minor header fixes (#266)
- Use fuse_macros.h instead of deprecated macros.h
- Add missed header
- Sort headers
- Update devel to build on Ubuntu Jammy (22.04) (#326)
- Update to C++17 for use with Ubuntu Jammy
- Include Rviz and Eigen as system includes, which supresses warnings within the included libraries
- use pluginlib and class_list_macros .hpp include instead of deprecated .h From: Lucas Walter <<wsacul@gmail.com>>
- 0.6.0
- Update changelogs
- 0.5.0
- Update changelogs
- [RST-4186] Fix fuse macro names (#263)
- Namespace all macros with the FUSE_ prefix. Mark original macros as deprecated.
- Update all fuse objects to use the new macro names
- Adding doxygen to all packages (#241)
- [RST-3451] Delay some transform warnings so startup is less chatty
- Contributors: Enrique Fernandez Perdomo, Gary Servin, Stephen Williams, Tom Moore, fabianhirmann
0.4.2 (2021-07-20)
- Adding roslint dependency to fuse_viz
(#231)
- Adding roslint dependency to fuse_viz
- Silence CMP0048 warnings
- Contributors: Tom Moore
0.4.1 (2021-07-13)
- Getting versions in sync
-
Substract minimum twist covariance from twist covariance (#222) * Substract min twist cov from twist cov If the twist covariance already had a minimum twist covariance added to it to prevent ill-conditioned covariance matrices, we need a way to substract that minimum twist covariance from it before we compute the pose relative covariance. Otherwise, we cannot get the original pose relative covariance because the minimum twist covariance term is multiplies by the time delta, which could actually make the resulting pose relative covariance ill-conditioned or very small, i.e. overconfident.
- [Issue #223] Add an optional tf_timeout parameter to the sensor models (#224)
- Factorize differential mode processing
(#219)
- Factorize differential mode processing
- Throttle log message when transform message fails
- Target frame optional
(#217)
- Make target_frame optional
- Remove optional target_frame parameters in tests
- Transform message in differential mode
(#216)
* Transform message in differential mode This is important because
the relative transformation is not the same if the sensor and target
frame are different. Consider for example the case of an IMU sensor
upside down:
- The robot base frame is base_link
- The IMU sensor frame is imu_link
* The imu_link transformation wrt base_link is 180 degrees wrt the y or x axis * The angular velocity around the z axis has opposite sign in the sensor frame wrt the target frame
- Require pose_target_frame in differential mode
- Roslint
- Add pose_target_frame to optimizer test config
- Use fuse_core::getPositiveParam for all ros::Duration parameters
(#212)
- Use fuse_core::getPositiveParam for ros::Duration
- Use fuse_core::getPositiveParam for TF durations
- Add tcp_no_delay parameter to sensor models (#211)
- Add ability to throttle covariance computation (#209)
- Add invert_tf to Odometry2DPublisher (#206) This allows to publish the inverse TF transform. This can be useful to skip the odom->base_link lookupTransform() when braodcasting map->base_link, which must be broadcasted as map->odom because TF tree doesn't support more than a single parent per frame, base_link in this case. This is particular relevant when predict_to_current_time is enabled, because the lookupTransform() could take a while, causing delays.
- Support throttling serialized graph publisher
(#204)
- Change sensor proc from gtest to gmock target
- Move ThrottledCallback to fuse_core
- Support generic callbacks in ThrottledCallback
- Throttle graph publishing
- Overload getPositiveParam for ros::Duration
- Use getPositiveParam for ros::Duration parameters
- Add linear acceleration to synchronizer (#205)
- Use local latest_stamp in notifyCallback (#203)
- Use dedicated spinner for publish timer callback
(#201)
- Use dedicated spinner for publishTimerCallback
* This reduces the jitter in the output topics and TF transform stamp because it allows the notifyCallback and publishTimerCallback to run concurrently. The notifyCallback might take longer than the timer period sometimes, mostly because the covariance computation is an expensive operation. * There is a subtle change of behaviour with this implementation! Before, the publishTimerCallback overwrote the odom_output_ and acceleration_output_ with the predicted state. Now it does not, and if it gets called twice or more times consecutively, it predicts since the last time the state was computed and updated in the notifyCallback. With the notifyCallback and publishTimerCallback running concurrently it is not trivial to keep the previous behaviour efficiently, because we would have to lock the entire callbacks to avoid the publishTimerCallback to overwrite a new state being computed concurrently in the notifyCallback. That being said, the predicted state is likely the same in both implementation. That is, the result is likely the same if we use multiple steps or a single one to predict the last state forward to the current time.
- Add fuse_models::GraphIgnition sensor model (#196)
- Add fuse_models::Transaction sensor model (#195)
- Fix Unicycle2D constructor doxygen (#198)
- Remove deprecated ::Model models leftovers
(#194)
- Remove fuse_models::twist_2d::Model plugin declaration
- Remove empty space in fuse_plugins.xml
- Update ::Model names to new names in doxygen comments
- Conditionally test_depend on benchmark (#189)
- Fix typo in jacobian comments (#191)
- Fix throttle
(#190)
* Update last called time adding throttle period Instead of setting
to now, which could be larger than the expected call time.
- Init last called time to now the first time
* Fix check for init/zero last called time We cannot use isValid because that does not check the last called time is zero, but a completely different thing. We must use isZero.
- Check canTransform output and show error if false
(#188)
- Check canTransform output and show error if false
- Fix pose -> twist typo
- Lookup transform directly
- Use std::enable_if_t (#187)
- Fix roslint 0.12.0
(#186)
* Fix roslint 0.12.0 include_what_you_use warnings Mostly for:
- std::move -> #include <utility>
- std::make_shared and similar -> #include <memory>
- Remove static string variable not permitted by roslint 0.12.0, using a test fixture where needed.
- Only call generator if motion model history empty
(#181)
- Only call generator if motion model history empty
- Handle dt == 0 special case in motion model
- Revert test_timestamp_manager.cpp #154
- Add EmptySingleStamp test
- Add use_twist_covariance ROS param and logic to Imu2D differential
orientation measurements
(#178)
* Move pose into previous_pose_ This makes the Odometry2D do the
same as the Imu2D.
* Allow Imu2D to use twist covariance For differential orientation
measurements.
- Move pose relative covariance closer to use
- Validate unicycle 2d
(#180)
- Remove unused EPSILON constexpr
- Validate Unicyle2D state and process noise
- Add disable_checks param (defaults to false)
- Validate state1 and state2 are finite
* Validate process noise covariance (after it's been scaled and multiplied by dt)
- Fix doxygen comment (#177)
- Delay throttle no valid state message (#175) This requires rosconsole >=1.13.8.
- Throttle (#162)
- Support throttling sensor model inputs
- Add ThrottledCallback rostest
- Fix motion model history
(#168)
- Fix the motion model history to maintain at least the requested time interval
- Apply a similar fix to the MessageBuffer class
-
Get positive param API change (#169) * Change getPositiveParam API In order to match the getParam and getRequiredParam, so the value is not returned, but set in an in/out argument. * Move getPositiveParam and other param related functions to parameter.h from util.h, and updated the ros/unit tests accordingly. * Fix wrapAngle2D expected range to [-Pi, +Pi) Instead of (-Pi, +Pi], and update unit test to reflect that.
- Don't require frame if empty indices (#166)
- Fix Unicycle2DIgnition set_pose
(#154)
- Initialize StateHistoryElement::velocity_yaw
- Process ignition transactions individually
- Call motion model generator with last stamp
- Skip optimization cycle if transaction is empty
- C++14 for test_unicycle_2d_state_cost_function (#157)
- Print state history
(#156)
- Add print method to StateHistoryElement
* Add print method to Unicycle2D It only prints the history state for now though.
- Minor typo fixes (#155)
- Get minimum_pose_relative_covariance_diagonal (#150) Regardless of the value of [independent]{.title-ref}, because the [fuse_models::Odometry2D]{.title-ref} sensor model checks for [use_twist_covariance]{.title-ref} before [independent]{.title-ref}, and we could end up with an uninitialized [minimum_pose_relative_covariance_diagonal]{.title-ref}.
- Support ScaledLoss (#141)
- Remove duplicated roslint build_depend (#146)
- Remove old acceleration_2d folder (#145)
- Cleanup validation checks
(#139)
* Add getCovarianceDiagonalParam helper This allows to load a
covariance matrix from the parameter server, provided in a list with
the diagonal values.
- Add isSymmetric and isPositiveDefinite helper functions
- Use twist covariance for differential dependent (#138) In the [fuse_models::Odometry2D]{.title-ref} sensor model, when [differential: true]{.title-ref} and [independent: false]{.title-ref}, the relative pose covariance should NOT be computed from the consecutive absolute pose covariance matrices because they grow unbounded, so the resulting relative pose covariance suffers from numerical issues. Instead, we can use the twist covariance of the last pose to compute the relative pose covariance, using the time difference between the consecutive absolute poses. The only limitation is that we cannot throttle the input topics, because otherwise the twist covariance from the intermediate/throttled messages is missed. We'll have to throttle inside the sensor model, by integrating the intermediate messages.
- Support dependent relative pose measurements
(#137)
- Added a "dependent" covariance calculation option to the "differential" mode
- Added an [independent]{.title-ref} param that defaults to [true]{.title-ref} to keep the current behaviour
* Added a [minimum_pose_relative_covariance_diagonal]{.title-ref} param that is added to the resulting pose relative covariance in order to guarantee that it's not zero or ill-conditioned.
-
Scale process noise covariance (#130) * Scale process noise covariance This scales the process noise covariance pose by the norm of the current state velocity. A new parameter [velocity_norm_min]{.title-ref} is added, that prevents the process noise scaling from setting the pose components to zero or a very small value that could lead to NaN or a rank deficient Jacobian in the problem solved, due to an ill-condition covariance for the process noise.
- Better validation of partial measurement output
(#131)
* Relax the default precision when validating the covariance matrix
is symmetric.
* Print the covariance matrix with
[Eigen::FullPrecision]{.title-ref} when the symmetry test fails with
[isApprox]{.title-ref}, so we can see the magnitude of the error.
- Show source if validation fails
- Changes from throwing/crashing to ROS_ERROR.
- Add eigenvalues to non-PSD error check
- Add disable_checks param to sensor models
- Publish linear acceleration
(#129)
- Publish linear acceleration
* Also use linear acceleration if predicting to the current time if the new param [predict_with_acceleration]{.title-ref} is [true]{.title-ref} (default value).
- Explicitly call boost::range::join (#128) Otherwise we could get a compilation error due to an ambiguous overloaded [join]{.title-ref} function when some additional [boost/algorithm]{.title-ref} headers are included.
- Add fuse_loss pkg with plugin-based loss functions (#118)
- Validate partial measurements (#125)
- Don't read pose_target_frame if differential (#126) If differential is true, the pose_target_frame is not used.
- Only allow exact timestamp transformations (#123)
- Benchmark unicycle_2d state cost function (#121) The benchmark targets are now only build if CATKIN_ENABLE_TESTING is ON, which means that benchmark is now a test_depend and not a depend. However, the benchmarks are NOT gtests, so they are built directly on catkin build, i.e. there is no need to run make run_tests after. For this reason, the find_package on benchmark is no longer REQUIRED, but QUIET instead. The benchmark is built only if the benchmark package is FOUND.
- Removed the explicit '-std=c++14' compile flag
(#119)
- Removed the explicit '-std=c++14' compile flag
- Changed the CXX_STANDARD setting to be per-target instead of global
- Added the CXX_STANDARD_REQUIRED setting to all targets
- Predict jacobians per parameter block (#115)
- fix compilation in Kinetic (#112)
- Wait for reset service existence (#116)
- Publish odometry with timer and allow to predict it (#109)
- Use measurement stamps for transformed variables (#113)
- [RST-2149] Added the configured device_id to the log message (#110)
- [RST-2438] Make ceres params loaders reusable
(#104)
- Moved the Ceres loadFromROS functions into reusable functions in fuse_core
- Load solver parameters for the batch optimizer
- Expose Ceres Solver, Problem and Covariance Options as ROS parameters (#78)
- [RST-2427] Added a 'source' field to the constraints. This is an API-breaking change. (#101)
- [RST-2340] Add serialization support to fuse (#98)
- RST-2390 Renaming unicycle_2d
(#90)
- Renaming unicycle_2d
- Renaming twist_2d (#89)
- Renaming pose_2d (#88)
- Renaming odometry_2d (#87)
- Renaming imu_2d (#86)
- RST-2390 Renaming acceleration_2d
(#85)
- Renaming acceleration_2d
- Renaming package to fuse_models
- Preparing for move
- Contributors: Davide Faconti, Enrique Fernandez Perdomo, Stephen Williams, Tom Moore, sjphilli
0.4.0 (2019-08-14)
0.3.0 (2019-08-14)
0.2.0 (2019-07-12)
- Get predict_to_current_time ROS param (#17)
- [RST-2202] Catch potential errors when computing the covariances
(#18)
- Clear the covariance on error
- Remove angles header not used (#16)
- Default to private ~reset and ~set_pose names (#14)
- Depend on sensor_msgs and nav_msgs (#15)
- Depend on libceres-dev instead of ceres-solver
(#11)
- Depend on libceres-dev instead of ceres-solver
- Add missed depend on angles
- Resolve names before subscribing (#10)
- Linter/style changes
- Use std::bind instead of std::bind2nd std::bind2nd is marked as deprecated in C++11 Co-Authored-By: Stephen Williams <<stephen.vincent.williams@gmail.com>>
- Add sensor_proc test Only for:
- mergeIndices
- appendPartialMeasurement
- Fix appendPartialMeasurement by merging indices Position and orientation indices are merged together into a single std::vector<size_t> of indices, applying the appropriate offset to the orientation indices. This is passed to appendPartialMeasurement, which should be called only once. It doesn't need the base_index and offset args anymore.
- [RST-2128] fuse rl ignition sensor (#6)
- [RST-2144] Updated macro calls on all objects to support proper Eigen memory alignment (#8)
- Bug in motion model history (#7)
- Use linear indices for linear velocity (#5) Not angular indices, which is wrong and produces a crash at runtime because an assert fails.
- Fix appendPartialMeasurement assignments (#4)
- Store ros::Subscriber in sensor model attribute (#3) Store ros::Subscriber in sensor model attribute
- Tailor: Creating Jenkinsfile
- Adding base_link_output_frame_id to the 2D odom publisher (#1)
- Contributors: Enrique Fernandez, Enrique Fernandez Perdomo, Enrique Fernández Perdomo, Stephen Williams, Tom Moore, locus-services
0.1.0 (2019-03-18)
- [RST-1625] Use the stamped variable synchronizer (#13)
- Tailor: Updating Jenkinsfile
- Tailor: Updating Jenkinsfile
- Tailor: Updating Jenkinsfile
- Updated package for changes to fuse_core::Transaction (#11)
- Tailor: Creating Jenkinsfile
- Simplifying
- Just using rotation
- Adding tf2 overloads for twist and acceleration
- Updated derived sensors for recent change to the sensor API
- Adding 2D odometry publisher
- Adding 2D IMU sensor model
- Feature/pedantic style change
(#7)
- White spaaaaaaaaaaaaaaaaaaaaaaace
- Moar whitespace
- PR feedback
- Adding support for partial measurements
- Adding 2D odometry sensor
- Enabling partial measurements for fuse_rl
- PR feedback
- PR feedback
- Adding 2d pose sensor
- Adding 2D odometry sensor
- Adding 2D acceleration sensor
- Adding 2D twist sensor
- More comments
- Removing comment
- Using Jacobians to rotate covariances
- PR feedback
- PR feedback
- Adding ability to transform poses
- Adding 2d pose sensor
- Update README.md
- Adding 2D kinematic constraint
- Adding README
- Contributors: David V. Lu!!, Stephen Williams, Tom Moore, locus-services
Wiki Tutorials
Package Dependencies
System Dependencies
Name |
---|
benchmark |
boost |
libceres-dev |
eigen |
Dependant Packages
Name | Deps |
---|---|
fuse | |
fuse_optimizers | |
fuse_tutorials |