Go to the documentation of this file.00001 import roslib
00002 roslib.load_manifest('karto_scan_matcher')
00003
00004 import geometry_msgs.msg as gm
00005 import sensor_msgs.msg as sm
00006
00007 from karto_scan_matching import *
00008
00009
00010
00011
00012
00013 def make_matcher(init_scan, laser_pose, search_size, search_resolution):
00014 """
00015 @param init_scan: Initial scan used only to read parameters of laser scanner
00016 @type init_scan: sensor_msgs.msg.LaserScan
00017 @param laser_pose: Pose of laser wrt base frame
00018 @type laser_pose: Tuple of form (x, y, theta)
00019 @param search_size: Radius of square to do matching in (meters)
00020 @param search_resolution: Resolution of grid search (meters)
00021 @return Opaque object of type KartoScanMatcher, which can be used as an argument to repeated calls to match_scans.
00022 """
00023 scan = scan_from_ros(init_scan)
00024 pose = pose_from_tuple(p)
00025 return KartoScanMatcherCpp(scan, pose, search_size, search_resolution)
00026
00027
00028 def match_scans(matcher, scan, init_pose, ref_scans):
00029 """
00030 @param matcher: Object returned by make_matcher
00031 @param scan: Scan to match
00032 @type scan: sensor_msgs.msg.LaserScan
00033 @param init_pose: Initial pose estimate
00034 @type init_pose: Tuple of form (x, y, theta)
00035 @param ref_scans: Reference scans
00036 @type ref_scans: Vector of tuples ((x, y, theta), sensor_msgs.msg.LaserScan)
00037 @return Tuple (opt_pose, response)
00038 """
00039 res = matcher.scanMatch(scan_from_ros(scan), pose_from_tuple(init_pose),
00040 convert_ref_scans(ref_scans))
00041 return ((res.pose.x, res.pose.y, res.pose.theta), res.response)
00042
00043
00044
00045
00046
00047
00048
00049
00050 def scan_from_ros(s):
00051 scan = LaserScan()
00052 scan.header.frame_id = s.header.stamp.frame_id
00053 scan.range_min = s.range_min
00054 scan.range_max = s.range_max
00055 scan.angle_min = s.angle_min
00056 scan.angle_max = s.angle_max
00057 scan.angle_increment = s.angle_increment
00058 scan.ranges = s.ranges
00059 return scan
00060
00061 def pose_from_tuple(p):
00062 pose = Pose2D()
00063 pose.x = p[0]
00064 pose.y = p[1]
00065 pose.z = p[2]
00066 return pose
00067
00068 def convert_ref_scan(ref_scan):
00069 return ScanWithPose(ref_scan[1], pose_from_tuple(ref_scan[0]))
00070
00071 def convert_ref_scans(scans):
00072 return map(convert_ref_scan, scans)