Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00040 #include <graph_slam/constraints/fake_loop_closure.h>
00041 #include <graph_slam/constraints/odom.h>
00042 #include <graph_slam/constraints/karto_laser_constraints.h>
00043 #include <pose_graph/exception.h>
00044 #include <ros/ros.h>
00045
00046
00047 namespace graph_slam
00048 {
00049
00050 using std::string;
00051 using ros::NodeHandle;
00052 using XmlRpc::XmlRpcValue;
00053 using boost::format;
00054
00055 template <class T>
00056 T getPrivateParam (const ros::NodeHandle& nh, const string& name, const T& default_val)
00057 {
00058 T val;
00059 nh.param(name, val, default_val);
00060 ROS_DEBUG_STREAM_NAMED ("init", "Looked up param " << name << " with value "
00061 << val << " (default was " << default_val << ")");
00062 return val;
00063 }
00064
00065
00066 ConstraintGenPtr createConstraintGenerator (const ros::NodeHandle& nh)
00067 {
00068 std::string gen_type;
00069 if (!nh.getParam("type", gen_type))
00070 throw pg::NonexistentParamException(nh.getNamespace() + "/type");
00071 ROS_DEBUG_STREAM_NAMED ("init", "Initializing constraint of type " << gen_type);
00072 if (gen_type == "odometry") {
00073 return ConstraintGenPtr(new OdomConstraintGenerator());
00074 }
00075 else if (gen_type == "fake_loop_closure") {
00076 const double proximity_threshold = getPrivateParam(nh, "proximity_threshold", 0.5);
00077
00078 return ConstraintGenPtr(new FakeLoopClosureGenerator(proximity_threshold));
00079 }
00080 else if (gen_type == "scan_odometry") {
00081 const double max_link_length = getPrivateParam(nh, "max_link_length", 10.0);
00082 const unsigned min_chain_length = getPrivateParam(nh, "min_chain_length", 5);
00083 const double min_response = getPrivateParam(nh, "min_response", 0.8);
00084 const double min_loop_closure_response = getPrivateParam(nh, "min_loop_closure_response", 0.7);
00085 const double max_loop_link_length = getPrivateParam(nh, "max_loop_link_length", 5.0);
00086 const double min_loop_chain_length = getPrivateParam(nh, "min_loop_chain_length", 10);
00087 const bool use_covariances = getPrivateParam(nh, "use_covariances", true);
00088 return ConstraintGenPtr(new KartoLaserConstraints(max_link_length, min_chain_length,
00089 min_response, max_loop_link_length,
00090 min_loop_chain_length, min_loop_closure_response,
00091 use_covariances));
00092 }
00093 else {
00094 throw pg::PoseGraphException(format("Constraint type %1% not known") % gen_type);
00095 }
00096 }
00097
00098
00099 }