void Trajectory::overwriteTrajectory(const trajectory_msgs::JointTrajectory& traj) {
  for(unsigned int i = 1; i <= traj.points.size(); i++) {
    for(unsigned int j = 0; j < traj.joint_names.size(); j++) {
      trajectory_(i,j) = traj.points[i-1].positions[j];
    }
  }  
}
Trajectory::Trajectory(const planning_models::KinematicModel* robot_model,
                                 const std::string& planning_group,
                                 const trajectory_msgs::JointTrajectory& traj) :
  planning_group_name_(planning_group)
{
  std::map<std::string, planning_models::KinematicModel::JointModelGroup*> groupMap = robot_model->getJointModelGroupMap();
  const planning_models::KinematicModel::JointModelGroup* modelGroup = groupMap[planning_group_name_];
  num_joints_ = modelGroup->getJointModels().size();
  double discretization = (traj.points[1].time_from_start-traj.points[0].time_from_start).toSec();

  double discretization2 = (traj.points[2].time_from_start-traj.points[1].time_from_start).toSec();

  if(fabs(discretization2-discretization) > .001) {
    ROS_WARN_STREAM("Trajectory Discretization not constant " << discretization << " " << discretization2);
  }
  discretization_ = discretization;

  num_points_ = traj.points.size()+1;
  duration_ = (traj.points.back().time_from_start-traj.points[0].time_from_start).toSec();
  
  start_index_ = 1;
  end_index_ = num_points_-2;

  init();

  for(int i = 0; i < num_points_; i++) {
    for(int j = 0; j < num_joints_; j++) {
      trajectory_(i,j) = 0.0;
    }
  }
  overwriteTrajectory(traj);
}
StompTrajectory::StompTrajectory(const StompRobotModel* robot_model,
                                 const StompRobotModel::StompPlanningGroup* planning_group, 
                                 const trajectory_msgs::JointTrajectory& traj) :
  robot_model_(robot_model),
  planning_group_(planning_group),
  num_joints_(robot_model_->getNumKDLJoints())
{
  double discretization = (traj.points[1].time_from_start-traj.points[0].time_from_start).toSec();

  double discretization2 = (traj.points[2].time_from_start-traj.points[1].time_from_start).toSec();

  if(fabs(discretization2-discretization) > .001) {
    ROS_WARN_STREAM("Trajectory Discretization not constant " << discretization << " " << discretization2);
  }
  discretization_ = discretization;

  num_points_ = traj.points.size()+1;
  duration_ = (traj.points.back().time_from_start-traj.points[0].time_from_start).toSec();
  
  start_index_ = 1;
  end_index_ = num_points_-2;

  init();

  for(int i = 0; i < num_points_; i++) {
    for(int j = 0; j < num_joints_; j++) {
      trajectory_(i,j) = 0.0;
    }
  }
  overwriteTrajectory(traj);
}
StompTrajectory::StompTrajectory(const StompRobotModel* robot_model,
                                 const StompRobotModel::StompPlanningGroup* planning_group, 
                                 const trajectory_msgs::JointTrajectory& traj) :
  robot_model_(robot_model),
  planning_group_(planning_group),
  num_joints_(robot_model_->getNumKDLJoints())
{
  double discretization = (traj.points[1].time_from_start-traj.points[0].time_from_start).toSec();

  double discretization2 = (traj.points[2].time_from_start-traj.points[1].time_from_start).toSec();

  if(fabs(discretization2-discretization) > .001) {
    ROS_WARN_STREAM("Trajectory Discretization not constant " << discretization << " " << discretization2);
  }
  discretization_ = discretization;

  ROS_INFO_STREAM("Num planning joints " << planning_group_->num_joints_ << " num trajectory joints " << traj.joint_names.size());
  
  num_points_ = traj.points.size();
  duration_ = (traj.points.back().time_from_start-traj.points[0].time_from_start).toSec();
  
  start_index_ = 1;
  end_index_ = num_points_-2;

  init();

  for(int i = 0; i < num_points_; i++) {
    for(int j = 0; j < num_joints_; j++) {
      trajectory_(i,j) = 0.0;
    }
  }

  std::vector<int> ind;
  for(unsigned int j = 0; j < traj.joint_names.size(); j++) {
    int kdl_number = robot_model_->urdfNameToKdlNumber(traj.joint_names[j]);
    if(kdl_number == 0) {
      ROS_WARN_STREAM("Can't find kdl index for joint " << traj.joint_names[j]);
    }
    ind.push_back(kdl_number);
  }

  for(unsigned int i = 0; i < traj.points.size(); i++) {
    for(unsigned int j = 0; j < traj.joint_names.size(); j++) {
      trajectory_(i,ind[j]) = traj.points[i].positions[j];
    }
  }  
}
void StompTrajectory::overwriteTrajectory(const trajectory_msgs::JointTrajectory& traj)
{
  std::vector<int> ind;
  for(unsigned int j = 0; j < traj.joint_names.size(); j++) {
    int kdl_number = robot_model_->urdfNameToKdlNumber(traj.joint_names[j]);
    if(kdl_number == 0) {
      ROS_WARN_STREAM("Can't find kdl index for joint " << traj.joint_names[j]);
    }
    ind.push_back(kdl_number);
  }

  for(unsigned int i = 1; i <= traj.points.size(); i++) {
    for(unsigned int j = 0; j < traj.joint_names.size(); j++) {
      trajectory_(i,ind[j]) = traj.points[i-1].positions[j];
    }
  }
}