Source code for symforce.examples.custom_factor_generation.factor_residuals
# ----------------------------------------------------------------------------# SymForce - Copyright 2022, Skydio, Inc.# This source code is under the Apache 2.0 license found in the LICENSE file.# ----------------------------------------------------------------------------importsymforce.symbolicassffromsymforce.codegenimportgeo_factors_codegen
[docs]defcustom_between_factor_residual(nav_T_src:sf.Pose3,nav_T_target:sf.Pose3,target_T_src_prior:sf.Pose3,prior_weight:sf.Scalar,prior_sigmas:sf.Vector6,epsilon:sf.Scalar,)->sf.Vector6:""" Return the 6dof residual on the relative pose between the given two views. Compares the relative pose between the optimized poses to the relative pose between the priors. This is similar to geo_factors_codegen.between_factor, but it uses a weight and diagonal covariance instead of a sqrt information matrix Args: nav_T_src: Current pose of the src frame nav_T_target: Current pose of the target frame target_T_src_prior: Prior on the pose of src in the target frame prior_weight: The weight of the Gaussian prior prior_sigmas: The diagonal of the sqrt covariance matrix epsilon: Small positive value Outputs: res: The residual of the between factor """# Note: sqrt(weight) is safe and does not need to be pushed away from 0 by epsilon because# weight is a hyperparameter, so we don't need to differentiate with respect to weight or worry# about it being slightly negative. Plus, adding epsilon would break the weight==0 casesqrt_info=sf.sqrt(prior_weight)*sf.Matrix66.diag(prior_sigmas.applyfunc(lambdas:1/(s+epsilon)).to_flat_list())returnsf.Vector6(geo_factors_codegen.between_factor(nav_T_target,nav_T_src,target_T_src_prior,sqrt_info,epsilon))