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 
00032 import scipy.optimize as so
00033 
00034 import math, numpy as np
00035 import pylab as pl
00036 import sys, optparse, time
00037 import copy
00038 
00039 from enthought.mayavi import mlab
00040 
00041 import mekabot.hrl_robot as hr
00042 import mekabot.coord_frames as mcf
00043 import matplotlib_util.util as mpu
00044 
00045 
00046 import roslib; roslib.load_manifest('2010_icra_epc_pull')
00047 import hrl_lib.util as ut, hrl_lib.transforms as tr
00048 import hrl_tilting_hokuyo.display_3d_mayavi as d3m
00049 
00050 import segway_motion_calc as smc
00051 
00052 class JointTrajectory():
00053     ''' class to store joint trajectories.
00054         data only - use for pickling.
00055     '''
00056     def __init__(self):
00057         self.time_list = [] 
00058         self.q_list = [] 
00059         self.qdot_list = [] 
00060         self.qdotdot_list = [] 
00061 
00062 
00063 
00064 class PlanarTajectory():
00065     def __init__(self):
00066         self.time_list = [] 
00067         self.x_list = []
00068         self.y_list = []
00069         self.a_list = []
00070 
00071 class CartesianTajectory():
00072     ''' class to store trajectory of cartesian points.
00073         data only - use for pickling
00074     '''
00075     def __init__(self):
00076         self.time_list = [] 
00077         self.p_list = [] 
00078         self.v_list = [] 
00079 
00080 class ForceTrajectory():
00081     ''' class to store time evolution of the force at the end effector.
00082         data only - use for pickling
00083     '''
00084     def __init__(self):
00085         self.time_list = [] 
00086         self.f_list = [] 
00087 
00088 
00089 
00090 
00091 
00092 def joint_to_cartesian(traj):
00093     firenze = hr.M3HrlRobot(connect=False)
00094     pts = []
00095     cart_vel = []
00096     for i in range(len(traj.q_list)):
00097         q = traj.q_list[i]
00098         p = firenze.FK('right_arm', q)
00099         pts.append(p.A1.tolist())
00100 
00101         if traj.qdot_list != []:
00102             qdot = traj.qdot_list[i]
00103             jac = firenze.Jac('right_arm', q)
00104             vel = jac * np.matrix(qdot).T
00105             cart_vel.append(vel.A1[0:3].tolist())
00106 
00107     ct = CartesianTajectory()
00108     ct.time_list = copy.copy(traj.time_list)
00109     ct.p_list = copy.copy(pts)
00110     ct.v_list = copy.copy(cart_vel)
00111     
00112     return ct
00113 
00114 def plot_forces_quiver(pos_traj,force_traj,color='k'):
00115     import arm_trajectories as at
00116     
00117     if isinstance(pos_traj,at.JointTrajectory):
00118         pos_traj = joint_to_cartesian(pos_traj)
00119 
00120     pts = np.matrix(pos_traj.p_list).T
00121     label_list = ['X coord (m)', 'Y coord (m)', 'Z coord (m)']
00122     x = pts[0,:].A1.tolist()
00123     y = pts[1,:].A1.tolist()
00124 
00125     forces = np.matrix(force_traj.f_list).T
00126     u = (-1*forces[0,:]).A1.tolist()
00127     v = (-1*forces[1,:]).A1.tolist()
00128     pl.quiver(x,y,u,v,width=0.002,color=color,scale=100.0)
00129 
00130     pl.axis('equal')
00131 
00132 
00133 
00134 
00135 def plot_cartesian(traj, xaxis=None, yaxis=None, zaxis=None, color='b',label='_nolegend_',
00136                    linewidth=2, scatter_size=10, plot_velocity=False):
00137 
00138     import arm_trajectories as at
00139     
00140     if isinstance(traj,at.JointTrajectory):
00141         traj = joint_to_cartesian(traj)
00142 
00143     pts = np.matrix(traj.p_list).T
00144     label_list = ['X coord (m)', 'Y coord (m)', 'Z coord (m)']
00145     x = pts[xaxis,:].A1.tolist()
00146     y = pts[yaxis,:].A1.tolist()
00147 
00148     if plot_velocity:
00149         vels = np.matrix(traj.v_list).T
00150         xvel = vels[xaxis,:].A1.tolist()
00151         yvel = vels[yaxis,:].A1.tolist()
00152 
00153     if zaxis == None:
00154         mpu.plot_yx(y, x, color, linewidth, '-', scatter_size, label,
00155                     axis = 'equal', xlabel = label_list[xaxis],
00156                     ylabel = label_list[yaxis],)
00157         if plot_velocity:
00158             mpu.plot_quiver_yxv(y, x, np.matrix([xvel,yvel]),
00159                                 width = 0.001, scale = 1.)
00160         mpu.legend()
00161     else:
00162         from numpy import array
00163         from enthought.mayavi.api import Engine
00164         engine = Engine()
00165         engine.start()
00166         if len(engine.scenes) == 0:
00167             engine.new_scene()
00168 
00169         z = pts[zaxis,:].A1.tolist()
00170         time_list = [t-traj.time_list[0] for t in traj.time_list]
00171         mlab.plot3d(x,y,z,time_list,tube_radius=None,line_width=4)
00172         mlab.axes()
00173         mlab.xlabel(label_list[xaxis])
00174         mlab.ylabel(label_list[yaxis])
00175         mlab.zlabel(label_list[zaxis])
00176         mlab.colorbar(title='Time')
00177 
00178         
00179         axes = engine.scenes[0].children[0].children[0].children[1]
00180         axes.axes.position = array([ 0.,  0.])
00181         axes.axes.label_format = '%-#6.2g'
00182         axes.title_text_property.font_size=4
00183 
00184 
00185 
00186 
00187 
00188 
00189 
00190 def compute_forces(q_actual_traj,q_eq_traj,torque_traj,rel_stiffness_list):
00191     firenze = hr.M3HrlRobot(connect=False)
00192 
00193     d_gains_list_mN_deg_sec = [-100,-120,-15,-25,-1.25]
00194     d_gains_list = [180./1000.*s/math.pi for s in d_gains_list_mN_deg_sec]
00195 
00196     stiff_list_mNm_deg = [1800,1300,350,600,60]
00197     stiff_list_Nm_rad = [180./1000.*s/math.pi for s in stiff_list_mNm_deg]
00198 
00199 
00200     dia = np.array(rel_stiffness_list) * np.array(stiff_list_Nm_rad)
00201     k_q = np.matrix(np.diag(dia))
00202     dia_inv = 1./dia
00203     k_q_inv = np.matrix(np.diag(dia_inv))
00204 
00205     actual_cart = joint_to_cartesian(q_actual_traj)
00206     eq_cart = joint_to_cartesian(q_eq_traj)
00207     force_traj_jacinv = ForceTrajectory()
00208     force_traj_stiff = ForceTrajectory()
00209     force_traj_torque = ForceTrajectory()
00210 
00211     k_cart_list = []
00212 
00213     for q_actual,q_dot,q_eq,actual_pos,eq_pos,t,tau_m in zip(q_actual_traj.q_list,q_actual_traj.qdot_list,q_eq_traj.q_list,actual_cart.p_list,eq_cart.p_list,q_actual_traj.time_list,torque_traj.q_list):
00214         q_eq = firenze.clamp_to_physical_joint_limits('right_arm',q_eq)
00215         q_delta = np.matrix(q_actual).T - np.matrix(q_eq).T
00216         tau = k_q * q_delta[0:5,0] - np.matrix(np.array(d_gains_list)*np.array(q_dot)[0:5]).T
00217 
00218         x_delta = np.matrix(actual_pos).T - np.matrix(eq_pos).T
00219 
00220         jac_full = firenze.Jac('right_arm',q_actual)
00221         jac = jac_full[0:3,0:5]
00222 
00223         jac_full_eq = firenze.Jac('right_arm',q_eq)
00224         jac_eq = jac_full_eq[0:3,0:5]
00225         k_cart = np.linalg.inv((jac_eq*k_q_inv*jac_eq.T))    
00226         k_cart_list.append(k_cart)
00227 
00228         pseudo_inv_jac = np.linalg.inv(jac_full*jac_full.T)*jac_full
00229 
00230         tau_full = np.row_stack((tau,np.matrix(tau_m[5:7]).T))
00231         
00232         force = -1*pseudo_inv_jac[0:3,0:5]*tau
00233         force_traj_jacinv.f_list.append(force.A1.tolist())
00234         force_traj_stiff.f_list.append((k_cart*x_delta).A1.tolist())
00235         force_traj_torque.f_list.append((pseudo_inv_jac*np.matrix(tau_m).T)[0:3].A1.tolist())
00236 
00237     return force_traj_jacinv,force_traj_stiff,force_traj_torque,k_cart_list
00238 
00239 
00240 
00241 
00242 
00243 
00244 
00245 def compute_radial_tangential_forces(f_list,p_list,cx,cy):
00246     f_rad_l,f_tan_l = [],[]
00247     for f,p in zip(f_list,p_list):
00248         rad_vec = np.array([p[0]-cx,p[1]-cy])
00249         rad_vec = rad_vec/np.linalg.norm(rad_vec)
00250         f_vec = np.array([f[0],f[1]])
00251         f_rad_mag = np.dot(f_vec,rad_vec)
00252         f_tan_mag = np.linalg.norm(f_vec-rad_vec*f_rad_mag)
00253         f_rad_mag = abs(f_rad_mag)
00254         f_rad_l.append(f_rad_mag)
00255         f_tan_l.append(f_tan_mag)
00256 
00257     return f_rad_l,f_tan_l
00258         
00259 
00260 
00261 
00262 
00263 
00264 
00265 
00266 
00267 
00268 
00269 def fit_circle(rad_guess,x_guess,y_guess,pts,method,verbose=True):
00270     def error_function(params):
00271         center = np.matrix((params[0],params[1])).T
00272         rad = params[2]
00273         
00274         
00275         
00276         err = ut.norm(pts-center).A1 - rad
00277         res = np.dot(err,err)
00278         return res
00279 
00280     params_1 = [x_guess,y_guess,rad_guess]
00281     if method == 'fmin':
00282         r = so.fmin(error_function,params_1,xtol=0.0002,ftol=0.000001,full_output=1,disp=verbose)
00283         opt_params_1,fopt_1 = r[0],r[1]
00284     elif method == 'fmin_bfgs':
00285         r = so.fmin_bfgs(error_function, params_1, full_output=1,
00286                          disp = verbose, gtol=1e-5)
00287         opt_params_1,fopt_1 = r[0],r[1]
00288     else:
00289         raise RuntimeError('unknown method: '+method)
00290 
00291     params_2 = [x_guess,y_guess+2*rad_guess,rad_guess]
00292     if method == 'fmin':
00293         r = so.fmin(error_function,params_2,xtol=0.0002,ftol=0.000001,full_output=1,disp=verbose)
00294         opt_params_2,fopt_2 = r[0],r[1]
00295     elif method == 'fmin_bfgs':
00296         r = so.fmin_bfgs(error_function, params_2, full_output=1,
00297                          disp = verbose, gtol=1e-5)
00298         opt_params_2,fopt_2 = r[0],r[1]
00299     else:
00300         raise RuntimeError('unknown method: '+method)
00301 
00302     if fopt_2<fopt_1:
00303         return opt_params_2[2],opt_params_2[0],opt_params_2[1]
00304     else:
00305         return opt_params_1[2],opt_params_1[0],opt_params_1[1]
00306 
00307 
00308 
00309 
00310 
00311 
00312 
00313 
00314 def account_segway_motion(cart_traj,st):
00315     ct = CartesianTajectory()
00316     for i in range(len(cart_traj.p_list)):
00317         x,y,a = st.x_list[i], st.y_list[i], st.a_list[i]
00318         p_tl = np.matrix(cart_traj.p_list[i]).T
00319         p_ts = smc.tsTtl(p_tl, x, y, a)
00320         p = p_ts
00321         ct.p_list.append(p.A1.tolist())
00322 
00323         
00324         
00325         
00326         if cart_traj.v_list != []:
00327             v_tl = np.matrix(cart_traj.v_list[i]).T
00328             v_ts = smc.tsRtl(v_tl, a)
00329             ct.v_list.append(v_ts.A1.tolist())
00330 
00331     ct.time_list = copy.copy(cart_traj.time_list)
00332     return ct
00333 
00334 
00335 
00336 
00337 def account_zenithering(cart_traj, z_l):
00338     ct = CartesianTajectory()
00339     h_start = z_l[0]
00340     for i in range(len(cart_traj.p_list)):
00341         h = z_l[i]
00342         p = cart_traj.p_list[i]
00343         p[2] += h - h_start
00344         ct.p_list.append(p)
00345 
00346         
00347         
00348         
00349         if cart_traj.v_list != []:
00350             ct.v_list.append(cart_traj.v_list[i])
00351 
00352     ct.time_list = copy.copy(cart_traj.time_list)
00353     return ct
00354 
00355 
00356 
00357 
00358 
00359 def filter_cartesian_trajectory(ct):
00360     pts_list = ct.p_list
00361     ee_start_pos = pts_list[0]
00362     l = [pts_list[0]]
00363 
00364     for i, p in enumerate(pts_list[1:]):
00365         l.append(p)
00366         pts_2d = (np.matrix(l).T)[0:2,:]
00367         st_pt = pts_2d[:,0]
00368         end_pt = pts_2d[:,-1]
00369         dist_moved = np.linalg.norm(st_pt-end_pt)
00370         
00371         if dist_moved < 0.03:
00372             reject_idx = i
00373 
00374     pts_2d = pts_2d[:,reject_idx:]
00375     return pts_2d, reject_idx
00376 
00377 
00378 
00379 
00380 
00381 
00382 def filter_trajectory_force(ct, ft):
00383     vel_list = copy.copy(ct.v_list)
00384     pts_list = copy.copy(ct.p_list)
00385     time_list = copy.copy(ct.time_list)
00386     ft_list = copy.copy(ft.f_list)
00387     f_mag_list = ut.norm(np.matrix(ft.f_list).T).A1.tolist()
00388 
00389     if len(pts_list) != len(f_mag_list):
00390         print 'arm_trajectories.filter_trajectory_force: force and end effector lists are not of the same length.'
00391         print 'Exiting ...'
00392         sys.exit()
00393 
00394     n_pts = len(pts_list)
00395     i = n_pts - 1
00396     hook_slip_off_threshold = 1.5 
00397     while i > 0:
00398         if f_mag_list[i] < hook_slip_off_threshold:
00399             pts_list.pop()
00400             time_list.pop()
00401             ft_list.pop()
00402             if vel_list != []:
00403                 vel_list.pop()
00404         else:
00405             break
00406         i -= 1
00407 
00408     ct2 = CartesianTajectory()
00409     ct2.time_list = time_list
00410     ct2.p_list = pts_list
00411     ct2.v_list = vel_list
00412 
00413     ft2 = ForceTrajectory()
00414     ft2.time_list = copy.copy(time_list)
00415     ft2.f_list = ft_list
00416     return ct2, ft2
00417 
00418 
00419 if __name__ == '__main__':
00420     p = optparse.OptionParser()
00421     p.add_option('-f', action='store', type='string', dest='fname',
00422                  help='pkl file to use.', default='')
00423     p.add_option('--xy', action='store_true', dest='xy',
00424                  help='plot the x and y coordinates of the end effector.')
00425     p.add_option('--yz', action='store_true', dest='yz',
00426                  help='plot the y and z coordinates of the end effector.')
00427     p.add_option('--xz', action='store_true', dest='xz',
00428                  help='plot the x and z coordinates of the end effector.')
00429     p.add_option('--plot_ellipses', action='store_true', dest='plot_ellipses',
00430                  help='plot the stiffness ellipse in the x-y plane')
00431     p.add_option('--pfc', action='store_true', dest='pfc',
00432                  help='plot the radial and tangential components of the force.')
00433     p.add_option('--pmf', action='store_true', dest='pmf',
00434                  help='plot things with the mechanism alinged with the axes.')
00435     p.add_option('--pff', action='store_true', dest='pff',
00436                  help='plot the force field corresponding to a stiffness ellipse.')
00437     p.add_option('--pev', action='store_true', dest='pev',
00438                  help='plot the stiffness ellipses for different combinations of the rel stiffnesses.')
00439     p.add_option('--plot_forces', action='store_true', dest='plot_forces',
00440                  help='plot the force in the x-y plane')
00441     p.add_option('--plot_forces_error', action='store_true', dest='plot_forces_error',
00442                  help='plot the error between the computed and measured (ATI) forces in the x-y plane')
00443     p.add_option('--xyz', action='store_true', dest='xyz',
00444                  help='plot in 3d the coordinates of the end effector.')
00445     p.add_option('-r', action='store', type='float', dest='rad',
00446                  help='radius of the joint.', default=None)
00447     p.add_option('--noshow', action='store_true', dest='noshow',
00448                  help='do not display the figure (use while saving figures to disk)')
00449     p.add_option('--exptplot', action='store_true', dest='exptplot',
00450                  help='put all the graphs of an experiment as subplots.')
00451     p.add_option('--sturm', action='store_true', dest='sturm',
00452                  help='make log files to send to sturm')
00453     p.add_option('--icra_presentation_plot', action='store_true',
00454                  dest='icra_presentation_plot',
00455                  help='plot explaining CEP update.')
00456 
00457     opt, args = p.parse_args()
00458     fname = opt.fname
00459     xy_flag = opt.xy
00460     yz_flag = opt.yz
00461     xz_flag = opt.xz
00462     plot_forces_flag = opt.plot_forces
00463     plot_ellipses_flag = opt.plot_ellipses
00464     plot_forces_error_flag = opt.plot_forces_error
00465     plot_force_components_flag = opt.pfc
00466     plot_force_field_flag = opt.pff
00467     plot_mechanism_frame = opt.pmf
00468     xyz_flag = opt.xyz
00469     rad = opt.rad
00470     show_fig = not(opt.noshow)
00471     plot_ellipses_vary_flag = opt.pev
00472     expt_plot = opt.exptplot
00473     sturm_output = opt.sturm
00474 
00475 
00476     if plot_ellipses_vary_flag:
00477         show_fig=False
00478         i = 0
00479         ratio_list1 = [0.1,0.3,0.5,0.7,0.9] 
00480         ratio_list2 = [0.1,0.3,0.5,0.7,0.9] 
00481         ratio_list3 = [0.1,0.3,0.5,0.7,0.9] 
00482 
00483 
00484 
00485 
00486 
00487 
00488 
00489         inv_mean_list,std_list = [],[]
00490         x_l,y_l,z_l = [],[],[]
00491         s0 = 0.2
00492         
00493         for s1 in ratio_list1:
00494             for s2 in ratio_list2:
00495                 for s3 in ratio_list3:
00496                     i += 1
00497                     s_list = [s0,s1,s2,s3,0.8]
00498                     
00499                     print '################## s_list:', s_list
00500                     m,s = plot_stiff_ellipse_map(s_list,i)
00501                     inv_mean_list.append(1./m)
00502                     std_list.append(s)
00503                     x_l.append(s1)
00504                     y_l.append(s2)
00505                     z_l.append(s3)
00506 
00507         ut.save_pickle({'x_l':x_l,'y_l':y_l,'z_l':z_l,'inv_mean_list':inv_mean_list,'std_list':std_list},
00508                        'stiff_dict_'+ut.formatted_time()+'.pkl')
00509         d3m.plot_points(np.matrix([x_l,y_l,z_l]),scalar_list=inv_mean_list,mode='sphere')
00510         mlab.axes()
00511         d3m.show()
00512 
00513         sys.exit()
00514 
00515     if fname=='':
00516         print 'please specify a pkl file (-f option)'
00517         print 'Exiting...'
00518         sys.exit()
00519 
00520     d = ut.load_pickle(fname)
00521     actual_cartesian_tl = joint_to_cartesian(d['actual'])
00522     actual_cartesian = account_segway_motion(actual_cartesian_tl,d['segway'])
00523     if d.has_key('zenither_list'):
00524         actual_cartesian = account_zenithering(actual_cartesian,
00525                                                d['zenither_list'])
00526 
00527     eq_cartesian_tl = joint_to_cartesian(d['eq_pt'])
00528     eq_cartesian = account_segway_motion(eq_cartesian_tl, d['segway'])
00529     if d.has_key('zenither_list'):
00530         eq_cartesian = account_zenithering(eq_cartesian, d['zenither_list'])
00531 
00532     cartesian_force_clean, _ = filter_trajectory_force(actual_cartesian,
00533                                                        d['force'])
00534     pts_2d, reject_idx = filter_cartesian_trajectory(cartesian_force_clean)
00535 
00536     if rad != None:
00537         
00538         
00539         
00540         pts_list = actual_cartesian.p_list
00541         eq_pts_list = eq_cartesian.p_list
00542         ee_start_pos = pts_list[0]
00543         x_guess = ee_start_pos[0]
00544         y_guess = ee_start_pos[1] - rad
00545         print 'before call to fit_rotary_joint'
00546         force_list = d['force'].f_list
00547 
00548         if sturm_output:
00549             str_parts = fname.split('.')
00550             sturm_file_name = str_parts[0]+'_sturm.log'
00551             print 'Sturm file name:', sturm_file_name
00552             sturm_file = open(sturm_file_name,'w')
00553             sturm_pts = cartesian_force_clean.p_list
00554             print 'len(sturm_pts):', len(sturm_pts)
00555             print 'len(pts_list):', len(pts_list)
00556 
00557             for i,p in enumerate(sturm_pts[1:]):
00558                 sturm_file.write(" ".join(map(str,p)))
00559                 sturm_file.write('\n')
00560 
00561             sturm_file.write('\n')
00562             sturm_file.close()
00563 
00564         rad_guess = rad
00565         rad, cx, cy = fit_circle(rad_guess,x_guess,y_guess,pts_2d,
00566                                  method='fmin_bfgs',verbose=False)
00567         c_ts = np.matrix([cx, cy, 0.]).T
00568         start_angle = tr.angle_within_mod180(math.atan2(pts_2d[0,1]-cy,
00569                                pts_2d[0,0]-cx) - math.pi/2)
00570         end_angle = tr.angle_within_mod180(math.atan2(pts_2d[-1,1]-cy,
00571                                pts_2d[-1,0]-cx) - math.pi/2)
00572         mpu.plot_circle(cx, cy, rad, start_angle, end_angle,
00573                         label='Actual\_opt', color='r')
00574 
00575 
00576     if opt.icra_presentation_plot:
00577         mpu.set_figure_size(30,20)
00578         rad = 1.0
00579         x_guess = pts_2d[0,0]
00580         y_guess = pts_2d[1,0] - rad
00581 
00582         rad_guess = rad
00583         rad, cx, cy = fit_circle(rad_guess,x_guess,y_guess,pts_2d,
00584                                  method='fmin_bfgs',verbose=False)
00585         print 'Estimated rad, cx, cy:', rad, cx, cy
00586 
00587         start_angle = tr.angle_within_mod180(math.atan2(pts_2d[1,0]-cy,
00588                                pts_2d[0,0]-cx) - math.pi/2)
00589         end_angle = tr.angle_within_mod180(math.atan2(pts_2d[1,-1]-cy,
00590                                pts_2d[0,-1]-cx) - math.pi/2)
00591 
00592         subsample_ratio = 1
00593         pts_2d_s = pts_2d[:,::subsample_ratio]
00594 
00595         cep_force_clean, force_new = filter_trajectory_force(eq_cartesian,
00596                                                              d['force'])
00597         cep_2d = np.matrix(cep_force_clean.p_list).T[0:2,reject_idx:]
00598 
00599         
00600         mpu.figure()
00601         mpu.plot_yx(pts_2d_s[1,:].A1, pts_2d_s[0,:].A1, color='b',
00602                     label = 'FK', axis = 'equal', alpha = 1.0,
00603                     scatter_size=7, linewidth=0, marker='x',
00604                     marker_edge_width = 1.5)
00605 
00606         cep_2d_s = cep_2d[:,::subsample_ratio]
00607         mpu.plot_yx(cep_2d_s[1,:].A1, cep_2d_s[0,:].A1, color='g',
00608                     label = 'CEP', axis = 'equal', alpha = 1.0,
00609                     scatter_size=10, linewidth=0, marker='+',
00610                     marker_edge_width = 1.5)
00611 
00612         mpu.plot_circle(cx, cy, rad, start_angle, end_angle,
00613                         label='Estimated Kinematics', color='r',
00614                         alpha=0.7)
00615         mpu.plot_radii(cx, cy, rad, start_angle, end_angle,
00616                        interval=end_angle-start_angle, color='r',
00617                        alpha=0.7)
00618         mpu.legend()
00619         mpu.savefig('one.png')
00620 
00621         
00622         
00623         zoom_location = 10
00624         pts_2d_zoom = pts_2d[:,:zoom_location]
00625         cep_2d_zoom = cep_2d[:,:zoom_location]
00626 
00627         mpu.figure()
00628         mpu.plot_yx(pts_2d_zoom[1,:].A1, pts_2d_zoom[0,:].A1, color='b',
00629                     label = 'FK', axis = 'equal', alpha = 1.0,
00630                     scatter_size=7, linewidth=0, marker='x',
00631                     marker_edge_width = 1.5)
00632         mpu.plot_yx(cep_2d_zoom[1,:].A1, cep_2d_zoom[0,:].A1, color='g',
00633                     label = 'CEP', axis = 'equal', alpha = 1.0,
00634                     scatter_size=10, linewidth=0, marker='+',
00635                     marker_edge_width = 1.5)
00636         mpu.pl.xlim(0.28, 0.47)
00637         mpu.legend()
00638         mpu.savefig('two.png')
00639 
00640         rad, cx, cy = fit_circle(1.0,x_guess,y_guess,pts_2d_zoom,
00641                                  method='fmin_bfgs',verbose=False)
00642         print 'Estimated rad, cx, cy:', rad, cx, cy
00643         start_angle = tr.angle_within_mod180(math.atan2(pts_2d[1,0]-cy,
00644                                pts_2d[0,0]-cx) - math.pi/2)
00645         end_angle = tr.angle_within_mod180(math.atan2(pts_2d_zoom[1,-1]-cy,
00646                                pts_2d_zoom[0,-1]-cx) - math.pi/2)
00647         mpu.plot_circle(cx, cy, rad, start_angle, end_angle,
00648                         label='Estimated Kinematics', color='r',
00649                         alpha=0.7)
00650         mpu.pl.xlim(0.28, 0.47)
00651         mpu.legend()
00652         mpu.savefig('three.png')
00653 
00654         current_pos = pts_2d_zoom[:,-1]
00655         radial_vec = current_pos - np.matrix([cx,cy]).T
00656         radial_vec = radial_vec / np.linalg.norm(radial_vec)
00657         tangential_vec = np.matrix([[0,-1],[1,0]]) * radial_vec
00658         mpu.plot_quiver_yxv([pts_2d_zoom[1,-1]],
00659                             [pts_2d_zoom[0,-1]],
00660                             radial_vec, scale=10., width = 0.002)
00661         rad_text_loc = pts_2d_zoom[:,-1] + np.matrix([0.001,0.01]).T
00662         mpu.pl.text(rad_text_loc[0,0], rad_text_loc[1,0], '\huge{$\hat v_{rad}$}')
00663         mpu.plot_quiver_yxv([pts_2d_zoom[1,-1]],
00664                             [pts_2d_zoom[0,-1]],
00665                             tangential_vec, scale=10., width = 0.002)
00666 
00667         tan_text_loc = pts_2d_zoom[:,-1] + np.matrix([-0.012, -0.011]).T
00668         mpu.pl.text(tan_text_loc[0,0], tan_text_loc[1,0], s = '\huge{$\hat v_{tan}$}')
00669         mpu.pl.xlim(0.28, 0.47)
00670         mpu.legend()
00671         mpu.savefig('four.png')
00672 
00673         wrist_force = -np.matrix(force_new.f_list[zoom_location]).T
00674         frad = (wrist_force[0:2,:].T * radial_vec)[0,0] * radial_vec
00675         mpu.plot_quiver_yxv([pts_2d_zoom[1,-1]],
00676                             [pts_2d_zoom[0,-1]],
00677                             wrist_force, scale=50., width = 0.002,
00678                             color='y')
00679         wf_text = rad_text_loc + np.matrix([-0.05,0.015]).T
00680         mpu.pl.text(wf_text[0,0], wf_text[1,0], color='y',
00681                     fontsize = 15, s = 'Wrist Force')
00682 
00683         mpu.plot_quiver_yxv([pts_2d_zoom[1,-1]],
00684                             [pts_2d_zoom[0,-1]],
00685                             frad, scale=50., width = 0.002,
00686                             color='y')
00687         frad_text = rad_text_loc + np.matrix([0.,0.015]).T
00688         mpu.pl.text(frad_text[0,0], frad_text[1,0], color='y', s = '\huge{$\hat F_{rad}$}')
00689 
00690         mpu.pl.xlim(0.28, 0.47)
00691         mpu.legend()
00692         mpu.savefig('five.png')
00693 
00694         frad = (wrist_force[0:2,:].T * radial_vec)[0,0]
00695         hook_force_motion = -(frad - 5) * radial_vec * 0.001
00696         tangential_motion = 0.01 * tangential_vec
00697         total_cep_motion = hook_force_motion + tangential_motion
00698 
00699         mpu.plot_quiver_yxv([cep_2d_zoom[1,-1]],
00700                             [cep_2d_zoom[0,-1]],
00701                             hook_force_motion, scale=0.1, width = 0.002)
00702         hw_text = cep_2d_zoom[:,-1] + np.matrix([-0.002,-0.012]).T
00703         mpu.pl.text(hw_text[0,0], hw_text[1,0], color='k', fontsize=14,
00704                     s = '$h[t]$ = $0.1cm/N \cdot (|\hat{F}_{rad}|-5N) \cdot \hat{v}_{rad}$')
00705         mpu.pl.xlim(0.28, 0.47)
00706         mpu.legend()
00707         mpu.savefig('six.png')
00708 
00709         mpu.plot_quiver_yxv([cep_2d_zoom[1,-1]],
00710                             [cep_2d_zoom[0,-1]],
00711                             tangential_motion, scale=0.1, width = 0.002)
00712         mw_text = cep_2d_zoom[:,-1] + np.matrix([-0.038,0.001]).T
00713         mpu.pl.text(mw_text[0,0], mw_text[1,0], color='k', fontsize=14,
00714                     s = '$m[t]$ = $1cm \cdot \hat{v}_{tan}$')
00715         mpu.pl.xlim(0.28, 0.47)
00716         mpu.legend()
00717         mpu.savefig('seven.png')
00718 
00719         mpu.plot_quiver_yxv([cep_2d_zoom[1,-1]],
00720                             [cep_2d_zoom[0,-1]],
00721                             total_cep_motion, scale=0.1, width = 0.002)
00722         cep_text = cep_2d_zoom[:,-1] + np.matrix([-0.058,-0.013]).T
00723         mpu.pl.text(cep_text[0,0], cep_text[1,0], color='k', fontsize=14,
00724                     s = '$x_{eq}[t]$ = &x_{eq}[t-1] + m[t] + h[t]$')
00725         mpu.pl.xlim(0.28, 0.47)
00726         mpu.legend()
00727         mpu.savefig('eight.png')
00728 
00729         new_cep = cep_2d_zoom[:,-1] + total_cep_motion
00730         mpu.plot_yx(new_cep[1,:].A1, new_cep[0,:].A1, color='g',
00731                     axis = 'equal', alpha = 1.0,
00732                     scatter_size=10, linewidth=0, marker='+',
00733                     marker_edge_width = 1.5)
00734         mpu.pl.xlim(0.28, 0.47)
00735         mpu.legend()
00736         mpu.savefig('nine.png')
00737 
00738         
00739         
00740         
00741 
00742 
00743 
00744 
00745     if plot_mechanism_frame:
00746         if expt_plot:
00747             pl.subplot(231)
00748 
00749         
00750         start_pt = actual_cartesian.p_list[0]
00751         x_diff = start_pt[0] - cx
00752         y_diff = start_pt[1] - cy
00753         angle = math.atan2(y_diff,x_diff) - math.radians(90)
00754         rot_mat = tr.Rz(angle)[0:2,0:2]
00755         translation_mat = np.matrix([cx,cy]).T
00756 
00757         robot_width,robot_length = 0.1,0.2
00758         robot_x_list = [-robot_width/2,-robot_width/2,robot_width/2,robot_width/2,-robot_width/2]
00759         robot_y_list = [-robot_length/2,robot_length/2,robot_length/2,-robot_length/2,-robot_length/2]
00760         robot_mat = rot_mat*(np.matrix([robot_x_list,robot_y_list]) - translation_mat)
00761         mpu.plot_yx(robot_mat[1,:].A1,robot_mat[0,:].A1,linewidth=2,scatter_size=0,
00762                     color='k',label='torso', axis='equal')
00763 
00764         pts2d_actual = (np.matrix(actual_cartesian.p_list).T)[0:2]
00765         pts2d_actual_t = rot_mat *(pts2d_actual -  translation_mat)
00766         mpu.plot_yx(pts2d_actual_t[1,:].A1,pts2d_actual_t[0,:].A1,scatter_size=20,label='FK',
00767                     axis = 'equal')
00768 
00769         end_pt = pts2d_actual_t[:,-1]
00770         end_angle = tr.angle_within_mod180(math.atan2(end_pt[1,0],end_pt[0,0])-math.radians(90))
00771 
00772         mpu.plot_circle(0,0,rad,0.,end_angle,label='Actual_opt',color='r')
00773         mpu.plot_radii(0,0,rad,0.,end_angle,interval=math.radians(15),color='r')
00774         pl.legend(loc='best')
00775         pl.axis('equal')
00776 
00777         if not(expt_plot):
00778             str_parts = fname.split('.')
00779             fig_name = str_parts[0]+'_robot_pose.png'
00780             pl.savefig(fig_name)
00781             pl.figure()
00782         else:
00783             pl.subplot(232)
00784 
00785         pl.text(0.1,0.15,d['info'])
00786         pl.text(0.1,0.10,'control: '+d['strategy'])
00787         pl.text(0.1,0.05,'robot angle: %.2f'%math.degrees(angle))
00788         pl.text(0.1,0,'optimized radius: %.2f'%rad_opt)
00789         pl.text(0.1,-0.05,'radius used: %.2f'%rad)
00790         pl.text(0.1,-0.10,'opening angle: %.2f'%math.degrees(end_angle))
00791         s_list = d['stiffness'].stiffness_list
00792         s_scale = d['stiffness'].stiffness_scale
00793         sl = [min(s*s_scale,1.0) for s in s_list]
00794         pl.text(0.1,-0.15,'stiffness list: %.2f, %.2f, %.2f, %.2f'%(sl[0],sl[1],sl[2],sl[3]))
00795         pl.text(0.1,-0.20,'stop condition: '+d['result'])
00796         time_dict = d['time_dict']
00797         pl.text(0.1,-0.25,'time to hook: %.2f'%(time_dict['before_hook']-time_dict['before_pull']))
00798         pl.text(0.1,-0.30,'time to pull: %.2f'%(time_dict['before_pull']-time_dict['after_pull']))
00799 
00800         pl.ylim(-0.45,0.25)
00801         if not(expt_plot):
00802             pl.figure()
00803 
00804     if xy_flag:
00805         st_pt = pts_2d[:,0]
00806         end_pt = pts_2d[:,-1]
00807 
00808 
00809 
00810 
00811 
00812 
00813 
00814 
00815         if expt_plot:
00816             pl.subplot(233)
00817 
00818         plot_cartesian(actual_cartesian, xaxis=0, yaxis=1, color='b',
00819                        label='FK', plot_velocity=False)
00820         plot_cartesian(eq_cartesian, xaxis=0,yaxis=1,color='g',label='Eq Point')
00821         
00822         
00823 
00824     elif yz_flag:
00825         plot_cartesian(actual_cartesian,xaxis=1,yaxis=2,color='b',label='FK')
00826         plot_cartesian(eq_cartesian, xaxis=1,yaxis=2,color='g',label='Eq Point')
00827     elif xz_flag:
00828         plot_cartesian(actual_cartesian,xaxis=0,yaxis=2,color='b',label='FK')
00829         plot_cartesian(eq_cartesian, xaxis=0,yaxis=2,color='g',label='Eq Point')
00830 
00831 
00832     if plot_forces_flag or plot_forces_error_flag or plot_ellipses_flag or plot_force_components_flag or plot_force_field_flag:
00833         arm_stiffness_list = d['stiffness'].stiffness_list
00834         scale = d['stiffness'].stiffness_scale
00835         asl = [min(scale*s,1.0) for s in arm_stiffness_list]
00836         ftraj_jinv,ftraj_stiff,ftraj_torque,k_cart_list=compute_forces(d['actual'],d['eq_pt'],
00837                                                                        d['torque'],asl)
00838         if plot_forces_flag:
00839             plot_forces_quiver(actual_cartesian,d['force'],color='k')
00840             
00841             
00842 
00843         if plot_ellipses_flag:
00844             
00845             if expt_plot:
00846                 subplotnum=234
00847             else:
00848                 pl.figure()
00849                 subplotnum=111
00850             plot_stiff_ellipses(k_cart_list,eq_cartesian,subplotnum=subplotnum)
00851 
00852         if plot_forces_error_flag:
00853             plot_error_forces(d['force'].f_list,ftraj_jinv.f_list)
00854             
00855 
00856         if plot_force_components_flag:
00857             p_list = actual_cartesian.p_list
00858             cx = 45.
00859             cy = -0.3
00860             frad_list,ftan_list = compute_radial_tangential_forces(d['force'].f_list,p_list,cx,cy)
00861             if expt_plot:
00862                 pl.subplot(235)
00863             else:
00864                 pl.figure()
00865 
00866             time_list = d['force'].time_list
00867             time_list = [t-time_list[0] for t in time_list]
00868             x_coord_list = np.matrix(p_list)[:,0].A1.tolist()
00869             mpu.plot_yx(frad_list,x_coord_list,scatter_size=50,color=time_list,cb_label='time',axis=None)
00870             pl.xlabel('x coord of end effector (m)')
00871             pl.ylabel('magnitude of radial force (N)')
00872             pl.title(d['info'])
00873             if expt_plot:
00874                 pl.subplot(236)
00875             else:
00876                 pl.figure()
00877             mpu.plot_yx(ftan_list,x_coord_list,scatter_size=50,color=time_list,cb_label='time',axis=None)
00878             pl.xlabel('x coord of end effector (m)')
00879             pl.ylabel('magnitude of tangential force (N)')
00880             pl.title(d['info'])
00881 
00882         if plot_force_field_flag:
00883             plot_stiffness_field(k_cart_list[0],plottitle='start')
00884             plot_stiffness_field(k_cart_list[-1],plottitle='end')
00885 
00886 
00887     str_parts = fname.split('.')
00888     if d.has_key('strategy'):
00889         addon = ''
00890         if opt.xy:
00891             addon = '_xy'
00892         if opt.xz:
00893             addon = '_xz'
00894         fig_name = str_parts[0]+'_'+d['strategy']+addon+'.png'
00895     else:
00896         fig_name = str_parts[0]+'_res.png'
00897 
00898     if expt_plot:
00899         f = pl.gcf()
00900         curr_size = f.get_size_inches()
00901         f.set_size_inches(curr_size[0]*2,curr_size[1]*2)
00902         f.savefig(fig_name)
00903 
00904     if show_fig:
00905         pl.show()
00906     else:
00907         print '################################'
00908         print 'show_fig is FALSE'
00909         if not(expt_plot):
00910             pl.savefig(fig_name)
00911 
00912     if xyz_flag:
00913         plot_cartesian(traj, xaxis=0,yaxis=1,zaxis=2)
00914         mlab.show()
00915 
00916 
00917 
00918 
00919 
00920 
00921