55 SharedGaussian model_;
58 GTSAM_CONCEPT_LIE_TYPE(T)
59 GTSAM_CONCEPT_TESTABLE_TYPE(T)
64 typedef typename std::shared_ptr<TransformBtwRobotsUnaryFactor>
shared_ptr;
72 const SharedGaussian& model) :
73 Base(
KeyVector{key}), key_(key), measured_(measured), keyA_(keyA), keyB_(keyB),
84 gtsam::NonlinearFactor::shared_ptr
clone()
const override {
return std::make_shared<This>(*this); }
90 void print(
const std::string& s,
const KeyFormatter& keyFormatter = DefaultKeyFormatter)
const override {
91 std::cout << s <<
"TransformBtwRobotsUnaryFactor(" 92 << keyFormatter(key_) <<
")\n";
93 std::cout <<
"MR between factor keys: " 94 << keyFormatter(keyA_) <<
"," 95 << keyFormatter(keyB_) <<
"\n";
96 measured_.print(
" measured: ");
97 model_->print(
" noise model: ");
103 const This *t =
dynamic_cast<const This*
> (&f);
106 return key_ == t->key_ && measured_.
equals(t->measured_);
116 throw(
"something is wrong!");
132 return whitenedError(x).squaredNorm();
145 return std::shared_ptr<gtsam::JacobianFactor>();
149 std::vector<gtsam::Matrix> A(this->
size());
150 gtsam::Vector b = -whitenedError(x, A);
161 T orgA_T_currA = valA_.
at<T>(keyA_);
162 T orgB_T_currB = valB_.
at<T>(keyB_);
163 T orgA_T_orgB = x.
at<T>(key_);
165 T currA_T_currB_pred;
167 Matrix H_compose, H_between1;
168 T orgA_T_currB = orgA_T_orgB.compose(orgB_T_currB, H_compose, {});
169 currA_T_currB_pred = orgA_T_currA.between(orgA_T_currB, {}, H_between1);
170 (*H)[0] = H_compose * H_between1;
173 T orgA_T_currB = orgA_T_orgB.compose(orgB_T_currB);
174 currA_T_currB_pred = orgA_T_currA.between(orgA_T_currB);
177 const T& currA_T_currB_msr = measured_;
178 Vector error = currA_T_currB_msr.localCoordinates(currA_T_currB_pred);
181 model_->WhitenSystem(*H, error);
183 model_->whitenInPlace(error);
193 return whitenedError(x, &H);
198 gtsam::Vector unwhitenedError(
const gtsam::Values& x)
const {
200 T orgA_T_currA = valA_.
at<T>(keyA_);
201 T orgB_T_currB = valB_.
at<T>(keyB_);
202 T orgA_T_orgB = x.
at<T>(key_);
204 T orgA_T_currB = orgA_T_orgB.compose(orgB_T_currB);
205 T currA_T_currB_pred = orgA_T_currA.between(orgA_T_currB);
207 T currA_T_currB_msr = measured_;
208 return currA_T_currB_msr.localCoordinates(currA_T_currB_pred);
213 size_t dim()
const override {
214 return model_->R().rows() + model_->R().cols();
219 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION 221 friend class boost::serialization::access;
222 template<
class ARCHIVE>
223 void serialize(ARCHIVE & ar,
const unsigned int ) {
224 ar & boost::serialization::make_nvp(
"NonlinearFactor",
225 boost::serialization::base_object<Base>(*
this));
232 template<
class VALUE>
234 public Testable<TransformBtwRobotsUnaryFactor<VALUE> > {
std::vector< Matrix > * OptionalMatrixVecType
Definition: NonlinearFactor.h:61
Concept check for values that can be used in unit tests.
std::string serialize(const T &input)
serializes to a string
Definition: serialization.h:113
const ValueType at(Key j) const
Definition: Values-inl.h:204
size_t size() const
Definition: Factor.h:159
Definition: Testable.h:152
virtual bool equals(const NonlinearFactor &f, double tol=1e-9) const
A factor with a quadratic error function - a Gaussian.
Definition: NonlinearFactor.h:68
static shared_ptr Create(size_t dim)
Definition: NoiseModel.h:610
std::function< std::string(Key)> KeyFormatter
Typedef for a function to format a key, i.e. to convert it to a string.
Definition: Key.h:35
Base class and basic functions for Lie types.
Definition: JacobianFactor.h:91
std::shared_ptr< This > shared_ptr
shared_ptr to this class
Definition: GaussianFactor.h:42
Definition: chartTesting.h:28
FastVector< Key > KeyVector
Define collection type once and for all - also used in wrappers.
Definition: Key.h:86
Non-linear factor base classes.
virtual bool active(const Values &) const
Definition: NonlinearFactor.h:141
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:102
bool equals(const This &other, double tol=1e-9) const
check equality