00001 // Ceres Solver - A fast non-linear least squares minimizer 00002 // Copyright 2016 Google Inc. All rights reserved. 00003 // http://ceres-solver.org/ 00004 // 00005 // Redistribution and use in source and binary forms, with or without 00006 // modification, are permitted provided that the following conditions are met: 00007 // 00008 // * Redistributions of source code must retain the above copyright notice, 00009 // this list of conditions and the following disclaimer. 00010 // * Redistributions in binary form must reproduce the above copyright notice, 00011 // this list of conditions and the following disclaimer in the documentation 00012 // and/or other materials provided with the distribution. 00013 // * Neither the name of Google Inc. nor the names of its contributors may be 00014 // used to endorse or promote products derived from this software without 00015 // specific prior written permission. 00016 // 00017 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00018 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00019 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00020 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00021 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00022 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00023 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00024 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00025 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00026 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00027 // POSSIBILITY OF SUCH DAMAGE. 00028 // 00029 // Author: vitus@google.com (Michael Vitus) 00030 #ifndef CERES_EXAMPLES_POSE_GRAPH_2D_ANGLE_LOCAL_PARAMETERIZATION_H_ 00031 #define CERES_EXAMPLES_POSE_GRAPH_2D_ANGLE_LOCAL_PARAMETERIZATION_H_ 00032 #include "ceres/local_parameterization.h" 00033 #include "normalize_angle.h" 00034 namespace ceres { 00035 namespace examples { 00036 // Defines a local parameterization for updating the angle to be constrained in 00037 // [-pi to pi). 00038 class AngleLocalParameterization { 00039 public: 00040 template <typename T> 00041 bool operator()(const T* theta_radians, const T* delta_theta_radians, 00042 T* theta_radians_plus_delta) const { 00043 *theta_radians_plus_delta = 00044 NormalizeAngle(*theta_radians + *delta_theta_radians); 00045 return true; 00046 } 00047 static ceres::LocalParameterization* Create() { 00048 return (new ceres::AutoDiffLocalParameterization<AngleLocalParameterization, 00049 1, 1>); 00050 } 00051 }; 00052 } // namespace examples 00053 } // namespace ceres 00054 #endif // CERES_EXAMPLES_POSE_GRAPH_2D_ANGLE_LOCAL_PARAMETERIZATION_H_ 00055