Example #1
0
 def __init__(self, dof, sig, num_dyn_factors, batch_size=1, use_cuda=False):
   self.use_cuda = torch.cuda.is_available() if use_cuda else False
   self.device = torch.device('cuda') if self.use_cuda else torch.device('cpu') 
   self.dof = dof
   self.num_dyn_factors = num_dyn_factors
   self.cov = mat_utils.isotropic_matrix(torch.pow(sig,2.0), 1, self.device).unsqueeze(0).repeat(self.num_dyn_factors,1,1)
   self.inv_cov = mat_utils.isotropic_matrix(1.0/torch.pow(sig,2.0), 1,self.device).unsqueeze(0).repeat(self.num_dyn_factors,1,1)
Example #2
0
    def __init__(self, ndims, sig, batch_size=1, use_cuda=False):
        self.use_cuda = torch.cuda.is_available() if use_cuda else False
        self.device = torch.device('cuda') if self.use_cuda else torch.device(
            'cpu')

        self.ndims = torch.tensor(ndims, device=self.device)
        self.cov = mat_utils.isotropic_matrix(torch.pow(sig, 2.0), self.ndims,
                                              self.device)
Example #3
0
 def __init__(self,
              ndims,
              num_vel_factors,
              sig,
              batch_size=1,
              use_cuda=False):
     self.use_cuda = torch.cuda.is_available() if use_cuda else False
     self.device = torch.device('cuda') if self.use_cuda else torch.device(
         'cpu')
     self.num_vel_factors = num_vel_factors
     self.ndims = torch.tensor(ndims, device=self.device)
     self.cov = mat_utils.isotropic_matrix(torch.pow(sig, 2.0), self.ndims,
                                           self.device)
     self.batch_size = batch_size
     self.inv_cov = mat_utils.isotropic_matrix(
         1.0 / torch.pow(sig, 2.0), self.ndims / 2,
         self.device).unsqueeze(0).repeat(self.num_vel_factors, 1, 1)
Example #4
0
    def __init__(self,
                 gp_params,
                 obs_params,
                 planner_params,
                 env_params,
                 robot,
                 use_cuda=False):
        """
      The GPMP2 Planner class
      
    """
        self.use_cuda = torch.cuda.is_available() if use_cuda else False
        self.device = torch.device('cuda') if self.use_cuda else torch.device(
            'cpu')

        # self.env = env
        self.robot = robot
        self.gp_params = gp_params
        self.obs_params = obs_params
        self.env_params = env_params
        self.dof = planner_params['dof']
        self.state_dim = planner_params['state_dim']
        self.total_time_sec = planner_params['total_time_sec']
        self.total_time_step = planner_params[
            'total_time_step']  #Number of states in the trajectory
        self.total_check_step = planner_params['total_check_step']
        self.use_gp_inter = planner_params['use_gp_inter']
        self.num_traj_states = self.total_time_step + 1  #+1 for goal at the end
        self.dt = self.total_time_sec * 1.0 / self.total_time_step * 1.0
        self.check_inter = (self.total_check_step / self.total_time_step) - 1.0

        #Dimensions of the linear system
        self.num_gp_factors = self.num_traj_states - 1
        self.num_prior_factors = 2  #Prior on start and goal
        if self.use_gp_inter:
            self.num_obs_factors = self.num_traj_states + self.num_traj_states * self.total_check_step
        else:
            self.num_obs_factors = self.num_traj_states
        self.nlinks = self.robot.nlinks
        self.M = self.state_dim * (self.num_gp_factors + self.num_prior_factors
                                   ) + self.num_obs_factors * self.nlinks
        self.N = self.state_dim * self.num_traj_states

        qc_inv = self.gp_params['Q_c_inv']
        qc_inv_traj = torch.zeros(self.num_gp_factors,
                                  self.dof,
                                  self.dof,
                                  device=self.device)
        qc_inv_traj = qc_inv_traj + qc_inv
        inv_cov = mat_utils.isotropic_matrix(
            1.0 / torch.pow(self.obs_params['cost_sigma'], 2.0),
            self.robot.nlinks, self.device)
        inv_obscov_traj = torch.zeros(self.num_traj_states,
                                      self.robot.nlinks,
                                      self.robot.nlinks,
                                      device=self.device)
        inv_obscov_traj = inv_obscov_traj + inv_cov

        self.gp_prior = GPFactor(self.dof, self.dt, self.num_gp_factors,
                                 self.use_cuda)
        self.start_prior = PriorFactor(self.state_dim, self.gp_params['K_s'])
        self.goal_prior = PriorFactor(self.state_dim, self.gp_params['K_g'])
        self.obs_factor = ObstacleFactor(self.state_dim, self.num_obs_factors,
                                         self.obs_params['epsilon_dist'],
                                         self.env_params, self.robot,
                                         self.use_cuda)
        self.gp_prior.set_Q_c_inv(qc_inv_traj)
        self.obs_factor.set_inv_cov(inv_obscov_traj)
Example #5
0
    def __init__(self,
                 gp_params,
                 obs_params,
                 planner_params,
                 optim_params,
                 env_params,
                 robot_model,
                 learn_params=None,
                 batch_size=1,
                 use_cuda=False):
        super(PlanLayer, self).__init__()
        self.use_cuda = torch.cuda.is_available() if use_cuda else False
        self.device = torch.device('cuda') if self.use_cuda else torch.device(
            'cpu')
        self.gp_params = gp_params
        self.obs_params = obs_params
        self.planner_params = planner_params
        self.optim_params = optim_params
        self.env_params = env_params
        self.robot_model = robot_model
        self.learn_params = learn_params
        self.batch_size = batch_size
        self.dof = planner_params['dof']
        self.state_dim = planner_params['state_dim']
        self.total_time_sec = planner_params['total_time_sec']
        self.total_time_step = planner_params[
            'total_time_step']  #Number of states in the trajectory
        self.num_traj_states = self.total_time_step + 1  #+1 for goal at the end
        self.dt = self.total_time_sec * 1.0 / self.total_time_step * 1.0
        self.non_holonomic = planner_params[
            'non_holonomic'] if 'non_holonomic' in planner_params else False
        if self.non_holonomic: self.num_dynamics_factors = self.num_traj_states
        self.use_vel_limits = planner_params[
            'use_vel_limits'] if 'use_vel_limits' in planner_params else False
        if self.use_vel_limits:
            self.num_vel_factors = self.num_traj_states

        #Dimensions of the linear system
        self.num_gp_factors = self.num_traj_states - 1
        self.num_prior_factors = 2  #Prior on start and goal
        self.num_obs_factors = self.num_traj_states
        self.nlinks = self.robot_model.nlinks
        self.M = self.state_dim * (self.num_gp_factors + self.num_prior_factors
                                   ) + self.num_obs_factors * self.nlinks
        if self.non_holonomic: self.M = self.M + self.num_dynamics_factors
        if self.use_vel_limits:
            self.M = self.M + self.dof * self.num_vel_factors
        self.N = self.state_dim * self.num_traj_states
        if self.state_dim == 4:
            self.env = Env2D(self.env_params, self.use_cuda)
        #Create masks for forming A,b,K
        self.create_factor_masks()
        #Create factor objects
        self.gp_prior = GPFactor(self.dof,
                                 self.dt,
                                 self.num_gp_factors,
                                 batch_size=self.batch_size,
                                 use_cuda=self.use_cuda)
        self.start_prior = PriorFactor(self.state_dim,
                                       self.gp_params['K_s'],
                                       batch_size=self.batch_size,
                                       use_cuda=self.use_cuda)
        self.goal_prior = PriorFactor(self.state_dim,
                                      self.gp_params['K_g'],
                                      batch_size=self.batch_size,
                                      use_cuda=self.use_cuda)
        self.obs_factor = ObstacleFactor(self.state_dim, self.num_obs_factors,
                                         self.obs_params['epsilon_dist'],
                                         self.env_params, self.robot_model,
                                         self.batch_size, self.use_cuda)
        if self.non_holonomic:
            self.dyn_factor = NonHolonomicFactor(self.dof,
                                                 self.gp_params['K_d'],
                                                 self.num_dynamics_factors,
                                                 self.batch_size,
                                                 self.use_cuda)
        if self.use_vel_limits:
            self.vel_factor = VelocityLimitFactor(self.state_dim,
                                                  self.num_vel_factors,
                                                  self.gp_params['K_v'],
                                                  self.batch_size,
                                                  self.use_cuda)
            vx = torch.tensor(gp_params['v_x'], device=self.device)
            vy = torch.tensor(gp_params['v_y'], device=self.device)
            vx_traj = vx.unsqueeze(0).expand(self.num_vel_factors, 1)
            vy_traj = vy.unsqueeze(0).expand(self.num_vel_factors, 1)
            self.vel_factor.set_v_traj(vx_traj, vy_traj)
        K_s_batch = mat_utils.isotropic_matrix(
            1.0 / torch.pow(self.gp_params['K_s'], 2.0), self.state_dim,
            self.device).unsqueeze(0).repeat(self.batch_size, 1, 1)
        K_g_batch = mat_utils.isotropic_matrix(
            1.0 / torch.pow(self.gp_params['K_g'], 2.0), self.state_dim,
            self.device).unsqueeze(0).repeat(self.batch_size, 1, 1)

        self.start_prior.set_inv_cov(K_s_batch)
        self.goal_prior.set_inv_cov(K_g_batch)
        #External cost function used to measure trajectory quality
        qc_inv = self.gp_params['Q_c_inv']
        sigma = self.obs_params['cost_sigma']
        self.qc_inv_traj_fix = torch.zeros(self.batch_size,
                                           self.num_gp_factors,
                                           self.dof,
                                           self.dof,
                                           device=self.device)
        self.qc_inv_traj_fix = self.qc_inv_traj_fix + qc_inv
        inv_cov = mat_utils.isotropic_matrix(1.0 / torch.pow(sigma, 2.0),
                                             self.robot_model.nlinks,
                                             self.device)
        self.obscov_inv_traj_fix = torch.zeros(self.batch_size,
                                               self.num_traj_states,
                                               self.robot_model.nlinks,
                                               self.robot_model.nlinks,
                                               device=self.device)
        self.obscov_inv_traj_fix = self.obscov_inv_traj_fix + inv_cov

        self.gp_prior_fix = GPFactor(self.dof,
                                     self.dt,
                                     self.num_gp_factors,
                                     batch_size=self.batch_size,
                                     use_cuda=self.use_cuda)
        self.obs_factor_fix = ObstacleFactor(self.state_dim,
                                             self.num_obs_factors,
                                             self.obs_params['epsilon_dist'],
                                             self.env_params, self.robot_model,
                                             self.batch_size, self.use_cuda)
        self.gp_prior_fix.set_Q_c_inv(self.qc_inv_traj_fix)
        self.obs_factor_fix.set_inv_cov(self.obscov_inv_traj_fix)

        if self.learn_params is not None:
            self.dynamics_mode = self.learn_params['dgpmp2']['dynamics_mode']
Example #6
0
 def __init__(self, gp_params, obs_params, planner_params, optim_params, env_params, robot_model, learn_params=None, batch_size=1, use_cuda=False):
   super(DiffGPMP2Planner, self).__init__()
   self.use_cuda = torch.cuda.is_available() if use_cuda else False
   self.device = torch.device('cuda') if self.use_cuda else torch.device('cpu')
   self.dof = planner_params['dof']
   self.state_dim = planner_params['state_dim']
   self.total_time_sec = planner_params['total_time_sec']   
   self.total_time_step = planner_params['total_time_step']   #Number of states in the trajectory 
   self.num_traj_states = self.total_time_step + 1  #+1 for goal at the end
   self.num_gp_factors = self.num_traj_states - 1
   self.num_obs_factors = self.num_traj_states   
   self.optim_params = optim_params
   self.gp_params = gp_params
   self.obs_params = obs_params
   self.robot_model = robot_model
   self.env_params = env_params
   self.learn_params = learn_params
   self.model_type = 'feed_forward'
   self.non_holonomic = planner_params['non_holonomic'] if 'non_holonomic' in planner_params else False
   self.use_vel_limits = planner_params['use_vel_limits'] if 'use_vel_limits' in planner_params else False
   if self.non_holonomic: self.num_dynamics_factors = self.num_traj_states  
   if self.use_vel_limits:
     self.num_vel_factors = self.num_traj_states
   self.batch_size=batch_size
   if learn_params is None:
     qc_inv = self.gp_params['Q_c_inv']
     sigma = self.obs_params['cost_sigma']
     eps = self.obs_params['epsilon_dist']
     inv_cov      = mat_utils.isotropic_matrix(1.0/torch.pow(sigma,2.0), self.robot_model.nlinks, self.device)
     self.qc_inv_traj = torch.zeros(self.num_gp_factors, self.dof, self.dof, device=self.device)
     self.qc_inv_traj = self.qc_inv_traj + qc_inv 
     self.obscov_inv_traj = torch.zeros(self.num_traj_states, self.robot_model.nlinks, 1, device=self.device)
     self.obscov_inv_traj = self.obscov_inv_traj + inv_cov
     self.eps_traj = torch.zeros(self.num_traj_states, self.robot_model.nlinks, 1, device=self.device)
     self.eps_traj = self.eps_traj + eps
     self.learn_module_conv = None          
     self.learn_module_fcn  = None          
   else:
     self.model_type  = self.learn_params['model']['type'] if 'type' in self.learn_params['model'] else False 
     self.learn_eps   = self.learn_params['dgpmp2']['learn_eps'] if 'learn_eps' in self.learn_params['dgpmp2'] else False
     self.sdf_predict = self.learn_params['dgpmp2']['sdf_predict']
     self.use_dtheta  = self.learn_params['dgpmp2']['dtheta_predict'] if 'dtheta_predict' in self.learn_params['dgpmp2'] else False 
     self.res = (self.env_params['x_lims'][1] - self.env_params['x_lims'][0])/(self.learn_params['data']['im_size']*1.0)
     
     learn_params['num_traj_states'] = self.num_traj_states
     learn_params['state_dim'] = self.state_dim
     if self.use_dtheta: learn_params['num_traj_states'] = 2 * self.num_traj_states
     self.dynamics_mode = learn_params['dgpmp2']['dynamics_mode'] 
     if  self.dynamics_mode == 'fix_dynamics':
       learn_params['out_dim'] = self.num_obs_factors*self.robot_model.nlinks
       qc_inv = self.gp_params['Q_c_inv']
       self.qc_inv_traj = torch.zeros(self.num_gp_factors, self.dof, self.dof, device=self.device)
       self.qc_inv_traj = self.qc_inv_traj + qc_inv  
     elif self.dynamics_mode == 'diag_identity':
       learn_params['out_dim'] = self.num_gp_factors + self.num_obs_factors*self.robot_model.nlinks
     elif self.dynamics_mode == 'diag':
       learn_params['out_dim'] = self.num_gp_factors* self.dof + self.num_obs_factors*self.robot_model.nlinks
     elif self.dynamics_mode == 'qc_full':
       learn_params['out_dim'] = self.num_gp_factors* self.dof + self.num_obs_factors*self.robot_model.nlinks 
     elif self.dynamics_mode == 'q_full':
       learn_params['out_dim'] = self.num_gp_factors* self.state_dim + self.num_obs_factors*self.robot_model.nlinks 
     #if not learning epsilon, set it to user defined
     if self.learn_eps:
       learn_params['out_dim'] = learn_params['out_dim'] + self.num_obs_factors*self.robot_model.nlinks
     else:
       self.eps = self.obs_params['epsilon_dist']
       self.eps_traj = torch.zeros(self.num_traj_states, self.robot_model.nlinks, 1, device=self.device)
       self.eps_traj = self.eps_traj + self.eps
     
     self.fixed_conv = learn_params['dgpmp2']['fixed_conv'] if 'fixed_conv' in learn_params['dgpmp2'] else False
     # self.learn_module_conv = None
     self.learn_module_conv = LearnModuleConv(learn_params, env_params, robot_model, use_cuda=self.use_cuda)  
     self.learn_module_fcn = LearnModuleFCN(learn_params, env_params, obs_params, robot_model, use_cuda=self.use_cuda)
   
   self.plan_layer = PlanLayer(gp_params, obs_params, planner_params, optim_params, env_params, robot_model,learn_params,self.batch_size, self.use_cuda)