44 from numpy
import matrix, reshape, array, zeros, diag, real
46 import roslib; roslib.load_manifest(
'calibration_estimation')
49 from sensor_msgs.msg
import JointState
53 Tool used to generate a list of CameraChain sensors from a single calibration sample message 62 - M_robot: A calibration sample of type calibration_msgs/RobotMeasurement 64 - sensors: A list of CameraChainSensor objects that corresponds to all camera chain sensors found 65 in the calibration message that was passed in. 69 if cur_config[
"sensor_id"]
in [ x.camera_id
for x
in M_robot.M_cam ]:
70 if "chain_id" in cur_config.keys()
and cur_config[
"chain_id"] !=
None and cur_config[
"chain_id"] !=
"NONE":
71 if cur_config[
"chain_id"]
in [ x.chain_id
for x
in M_robot.M_chain ] :
72 M_cam = M_robot.M_cam [ [ x.camera_id
for x
in M_robot.M_cam ].index(cur_config[
"sensor_id"])]
73 M_chain = M_robot.M_chain[ [ x.chain_id
for x
in M_robot.M_chain ].index(cur_config[
"chain_id"]) ]
74 if cur_config[
"frame_id"] != M_cam.cam_info.header.frame_id:
75 rospy.logwarn(
'WARNING frame_id of cam_info.header.frame_id({}) from bag file'.format(M_cam.cam_info.header.frame_id))
76 rospy.logwarn(
' and sensors.rectified_cams.{}.frame_id({}) of system.yaml differ'.format(cur_config[
"chain_id"],cur_config[
"frame_id"]))
80 M_cam = M_robot.M_cam [ [ x.camera_id
for x
in M_robot.M_cam ].index(cur_config[
"sensor_id"])]
82 cur_config[
"chain_id"] =
None 84 sensors.append(cur_sensor)
86 rospy.logdebug(
" Didn't find block")
90 def __init__(self, config_dict, M_cam, M_chain):
92 Generates a single sensor block for a single configuration 94 - config_dict: The configuration for this specific sensor. This looks exactly like 95 a single element from the valid_configs list passed into CameraChainBundler.__init__ 96 - M_cam: The camera measurement of type calibration_msgs/CameraMeasurement 97 - M_chain: The chain measurement of type calibration_msgs/ChainMeasurement 109 if "baseline_rgbd" in config_dict.keys():
114 On each optimization cycle the set of system parameters that we're optimizing over will change. Thus, 115 after each change in parameters we must call update_config to ensure that our calculated residual reflects 116 the newest set of system parameters. 120 self._full_chain.update_config(robot_params)
124 Computes the measurement residual for the current set of system parameters and target points 126 - target_pts: 4XN matrix, storing features point locations in world cartesian homogenous coordinates. 128 - r: terms_per_sample*N long vector, storing pixel residuals for the target points in the form of 129 [u1, v1, u2, v2, ..., uN, vN] or [u1, v1, u'1, u2....] 133 r = array(reshape(h_mat - z_mat, [-1,1]))[:,0]
138 Computes the residual, and then scales it by sqrt(Gamma), where Gamma 139 is the information matrix for this measurement (Cov^-1). 143 r_scaled = gamma_sqrt * matrix(r).T
144 return array(r_scaled.T)[0]
148 Calculates the square root of the information matrix for the measurement of the 149 current set of system parameters at the passed in set of target points. 153 gamma = matrix(zeros(cov.shape))
156 for k
in range(num_pts):
159 sub_cov = matrix(cov[first:last, first:last])
160 sub_gamma_sqrt_full = matrix(scipy.linalg.sqrtm(sub_cov.I))
161 sub_gamma_sqrt = real(sub_gamma_sqrt_full)
162 assert(scipy.linalg.norm(sub_gamma_sqrt_full - sub_gamma_sqrt) < 1e-6)
163 gamma[first:last, first:last] = sub_gamma_sqrt
171 Get the target's pixel coordinates as measured by the actual sensor 174 return numpy.matrix([[pt.x, pt.y]
for pt
in self._M_cam.image_points])
176 return numpy.matrix([[pt.x, pt.y, self._camera.get_disparity(self._M_cam.cam_info.P, pt.z)]
for pt
in self._M_cam.image_points])
180 Compute the expected pixel coordinates for a set of target points. 181 target_pts: 4xN matrix, storing feature points of the target, in homogeneous coords 182 Returns: target points projected into pixel coordinates, in a Nx2 matrix 190 Compute what measurement we would expect to see, based on the current system parameters 191 and the specified target point locations. 194 - chain_state: The joint angles of this sensor's chain of type sensor_msgs/JointState. 195 - target_pts: 4XN matrix, storing features point locations in world cartesian homogenous coordinates. 197 Returns: target points projected into pixel coordinates, in a Nx2 matrix 200 camera_pose_root = self._full_chain.calc_block.fk(chain_state)
201 cam_frame_pts = camera_pose_root.I * target_pts
203 pixel_pts = self._camera.project(self._M_cam.cam_info.P, cam_frame_pts)
208 The output Jacobian J shows how moving target_pts in cartesian space affects 209 the expected measurement in (u,v) camera coordinates. 210 For n points in target_pts, J is a 2nx3n matrix 211 Note: This doesn't seem to be used anywhere, except maybe in some drawing code 214 N = len(self._M_cam.image_points)
219 x = target_pts[:,k].copy()
224 sub_Jt[i,:] = array((fTest - f0) / epsilon)
231 Computes the measurement covariance in pixel coordinates for the given 232 set of target points (target_pts) 234 - target_pts: 4xN matrix, storing N feature points of the target, in homogeneous coords 239 var_u = self._camera._cov_dict[
'u'] * self._camera._cov_dict['u'] 240 var_v = self._camera._cov_dict['v'] * self._camera._cov_dict[
'v']
254 num_joints = len(self._M_chain.chain_state.position)
258 x.position = self._M_chain.chain_state.position[:]
262 for i
in range(num_joints):
263 x.position = [cur_pos
for cur_pos
in self._M_chain.chain_state.position]
264 x.position[i] += epsilon
266 Jt[i] = (fTest - f0)/epsilon
267 cov_angles = [x*x
for x
in self._full_chain.calc_block._chain._cov_dict[
'joint_angles']]
270 return matrix(Jt).T * matrix(diag(cov_angles)) * matrix(Jt)
274 Build a dictionary that defines which parameters will in fact affect this measurement. 276 Returned dictionary should be of the following form: 278 my_transformA: [1, 1, 1, 1, 1, 1] 279 my_transformB: [1, 1, 1, 1, 1, 1] 282 gearing: [1, 1, ---, 1] 290 sparsity = self._full_chain.build_sparsity_dict()
291 sparsity[
'rectified_cams'] = {}
292 sparsity[
'rectified_cams'][self.
sensor_id] = dict( [(x,1)
for x
in self._camera.get_param_names()] )
def compute_residual_scaled(self, target_pts)
def __init__(self, valid_configs)
def _compute_expected(self, chain_state, target_pts)
def compute_marginal_gamma_sqrt(self, target_pts)
def compute_expected(self, target_pts)
def update_config(self, robot_params)
def build_blocks(self, M_robot)
def compute_cov(self, target_pts)
def get_chain_cov(self, target_pts, epsilon=1e-8)
def get_residual_length(self)
def __init__(self, config_dict, M_cam, M_chain)
def compute_expected_J(self, target_pts)
def build_sparsity_dict(self)
def get_measurement(self)
def compute_residual(self, target_pts)