chomp_optimizer.h
Go to the documentation of this file.
1 /*********************************************************************
2  * Software License Agreement (BSD License)
3  *
4  * Copyright (c) 2009, Willow Garage, Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above
14  * copyright notice, this list of conditions and the following
15  * disclaimer in the documentation and/or other materials provided
16  * with the distribution.
17  * * Neither the name of Willow Garage nor the names of its
18  * contributors may be used to endorse or promote products derived
19  * from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *********************************************************************/
34 
35 /* Author: Mrinal Kalakrishnan */
36 
37 #pragma once
38 
46 
47 #include <Eigen/Core>
48 #include <Eigen/StdVector>
49 #include <vector>
50 
51 namespace chomp
52 {
53 class ChompOptimizer
54 {
55 public:
56  ChompOptimizer(ChompTrajectory* trajectory, const planning_scene::PlanningSceneConstPtr& planning_scene,
57  const std::string& planning_group, const ChompParameters* parameters,
58  const moveit::core::RobotState& start_state);
59 
60  virtual ~ChompOptimizer();
61 
66  bool optimize();
67 
68  inline void destroy()
69  {
70  // Nothing for now.
71  }
72 
73  bool isInitialized() const
74  {
75  return initialized_;
76  }
77 
78  bool isCollisionFree() const
79  {
80  return is_collision_free_;
81  }
82 
83 private:
84  inline double getPotential(double field_distance, double radius, double clearance)
85  {
86  double d = field_distance - radius;
87 
88  if (d >= clearance) // everything is fine
89  {
90  return 0.0;
91  }
92  else if (d >= 0.0) // transition phase, no collision yet
93  {
94  const double diff = (d - clearance);
95  const double gradient_magnitude = diff / clearance;
96  return 0.5 * gradient_magnitude * diff; // 0.5 * (d - clearance)^2 / clearance
97  }
98  else // d < 0.0: collision
99  {
100  return -d + 0.5 * clearance; // linearly increase, starting from 0.5 * clearance
101  }
102  }
103  template <typename Derived>
104  void getJacobian(int trajectoryPoint, Eigen::Vector3d& collision_point_pos, std::string& jointName,
105  Eigen::MatrixBase<Derived>& jacobian) const;
106 
107  // void getRandomState(const moveit::core::RobotState& currentState,
108  // const std::string& group_name,
109  // Eigen::VectorXd& state_vec);
110 
111  void setRobotStateFromPoint(ChompTrajectory& group_trajectory, int i);
112 
113  // collision_proximity::CollisionProximitySpace::TrajectorySafety checkCurrentIterValidity();
114 
115  int num_joints_;
116  int num_vars_free_;
117  int num_vars_all_;
119  int free_vars_start_;
120  int free_vars_end_;
121  int iteration_;
122  unsigned int collision_free_iteration_;
123 
125  const moveit::core::RobotModelConstPtr& robot_model_;
126  std::string planning_group_;
129  planning_scene::PlanningSceneConstPtr planning_scene_;
134 
135  std::vector<ChompCost> joint_costs_;
136  collision_detection::GroupStateRepresentationPtr gsr_;
138 
139  std::vector<std::vector<std::string> > collision_point_joint_names_;
140  std::vector<EigenSTL::vector_Vector3d> collision_point_pos_eigen_;
141  std::vector<EigenSTL::vector_Vector3d> collision_point_vel_eigen_;
142  std::vector<EigenSTL::vector_Vector3d> collision_point_acc_eigen_;
143  std::vector<std::vector<double> > collision_point_potential_;
144  std::vector<std::vector<double> > collision_point_vel_mag_;
145  std::vector<EigenSTL::vector_Vector3d> collision_point_potential_gradient_;
146  std::vector<EigenSTL::vector_Vector3d> joint_axes_;
147  std::vector<EigenSTL::vector_Vector3d> joint_positions_;
148  Eigen::MatrixXd group_trajectory_backup_;
149  Eigen::MatrixXd best_group_trajectory_;
152  unsigned int num_collision_free_iterations_;
153 
154  // HMC stuff:
155  Eigen::MatrixXd momentum_;
156  Eigen::MatrixXd random_momentum_;
157  Eigen::VectorXd random_joint_momentum_; // temporary variable
158  std::vector<MultivariateGaussian> multivariate_gaussian_;
159  double stochasticity_factor_;
160 
161  std::vector<int> state_is_in_collision_;
163  std::vector<std::vector<int> > point_is_in_collision_;
164  bool is_collision_free_;
166 
167  Eigen::MatrixXd smoothness_increments_;
168  Eigen::MatrixXd collision_increments_;
169  Eigen::MatrixXd final_increments_;
170 
171  // temporary variables for all functions:
172  Eigen::VectorXd smoothness_derivative_;
173  Eigen::MatrixXd jacobian_;
174  Eigen::MatrixXd jacobian_pseudo_inverse_;
175  Eigen::MatrixXd jacobian_jacobian_tranpose_;
176  Eigen::VectorXd random_state_;
177  Eigen::VectorXd joint_state_velocities_;
178 
179  std::vector<std::string> joint_names_;
180  std::map<std::string, std::map<std::string, bool> > joint_parent_map_;
181 
182  inline bool isParent(const std::string& childLink, const std::string& parentLink) const
183  {
184  if (childLink == parentLink)
185  {
186  return true;
187  }
188 
189  if (joint_parent_map_.find(childLink) == joint_parent_map_.end())
190  {
191  // ROS_ERROR("%s was not in joint parent map! for lookup of %s", childLink.c_str(), parentLink.c_str());
192  return false;
193  }
194  const std::map<std::string, bool>& parents = joint_parent_map_.at(childLink);
195  return (parents.find(parentLink) != parents.end() && parents.at(parentLink));
196  }
197 
198  void registerParents(const moveit::core::JointModel* model);
199  void initialize();
206  void debugCost();
216  void computeJointProperties(int trajectoryPoint);
218 };
219 } // namespace chomp
chomp::ChompTrajectory
Represents a discretized joint-space trajectory for CHOMP.
Definition: chomp_trajectory.h:86
chomp::ChompOptimizer::initialize
void initialize()
Definition: chomp_optimizer.cpp:124
robot_model.h
chomp_cost.h
chomp::ChompOptimizer::num_collision_free_iterations_
unsigned int num_collision_free_iterations_
Definition: chomp_optimizer.h:216
chomp::ChompOptimizer::random_state_
Eigen::VectorXd random_state_
Definition: chomp_optimizer.h:240
chomp::ChompOptimizer::jacobian_pseudo_inverse_
Eigen::MatrixXd jacobian_pseudo_inverse_
Definition: chomp_optimizer.h:238
chomp::ChompOptimizer::planning_group_
std::string planning_group_
Definition: chomp_optimizer.h:190
chomp_parameters.h
chomp::ChompOptimizer::getJacobian
void getJacobian(int trajectoryPoint, Eigen::Vector3d &collision_point_pos, std::string &jointName, Eigen::MatrixBase< Derived > &jacobian) const
Definition: chomp_optimizer.cpp:823
chomp::ChompOptimizer::parameters_
const ChompParameters * parameters_
Definition: chomp_optimizer.h:191
chomp::ChompOptimizer::addIncrementsToTrajectory
void addIncrementsToTrajectory()
Definition: chomp_optimizer.cpp:709
chomp::ChompOptimizer::multivariate_gaussian_
std::vector< MultivariateGaussian > multivariate_gaussian_
Definition: chomp_optimizer.h:222
chomp::ChompOptimizer::setRobotStateFromPoint
void setRobotStateFromPoint(ChompTrajectory &group_trajectory, int i)
Definition: chomp_optimizer.cpp:1024
chomp::ChompOptimizer::collision_free_iteration_
unsigned int collision_free_iteration_
Definition: chomp_optimizer.h:186
chomp::ChompOptimizer::gsr_
collision_detection::GroupStateRepresentationPtr gsr_
Definition: chomp_optimizer.h:200
chomp::ChompOptimizer::collision_point_joint_names_
std::vector< std::vector< std::string > > collision_point_joint_names_
Definition: chomp_optimizer.h:203
chomp::ChompOptimizer::joint_model_group_
const moveit::core::JointModelGroup * joint_model_group_
Definition: chomp_optimizer.h:196
chomp::ChompOptimizer::collision_point_acc_eigen_
std::vector< EigenSTL::vector_Vector3d > collision_point_acc_eigen_
Definition: chomp_optimizer.h:206
chomp::ChompOptimizer::best_group_trajectory_
Eigen::MatrixXd best_group_trajectory_
Definition: chomp_optimizer.h:213
chomp::ChompOptimizer::destroy
void destroy()
Definition: chomp_optimizer.h:132
chomp::ChompOptimizer::collision_point_potential_gradient_
std::vector< EigenSTL::vector_Vector3d > collision_point_potential_gradient_
Definition: chomp_optimizer.h:209
chomp::ChompOptimizer::num_collision_points_
int num_collision_points_
Definition: chomp_optimizer.h:182
chomp::ChompOptimizer::isCurrentTrajectoryMeshToMeshCollisionFree
bool isCurrentTrajectoryMeshToMeshCollisionFree() const
Definition: chomp_optimizer.cpp:552
chomp::ChompOptimizer::updatePositionFromMomentum
void updatePositionFromMomentum()
chomp::ChompOptimizer::smoothness_increments_
Eigen::MatrixXd smoothness_increments_
Definition: chomp_optimizer.h:231
chomp::ChompOptimizer::random_joint_momentum_
Eigen::VectorXd random_joint_momentum_
Definition: chomp_optimizer.h:221
chomp::ChompOptimizer::getPotential
double getPotential(double field_distance, double radius, double clearance)
Definition: chomp_optimizer.h:148
chomp::ChompOptimizer::calculateSmoothnessIncrements
void calculateSmoothnessIncrements()
Definition: chomp_optimizer.cpp:605
chomp::ChompOptimizer::jacobian_jacobian_tranpose_
Eigen::MatrixXd jacobian_jacobian_tranpose_
Definition: chomp_optimizer.h:239
chomp::ChompOptimizer::joint_parent_map_
std::map< std::string, std::map< std::string, bool > > joint_parent_map_
Definition: chomp_optimizer.h:244
chomp::ChompOptimizer::collision_point_vel_eigen_
std::vector< EigenSTL::vector_Vector3d > collision_point_vel_eigen_
Definition: chomp_optimizer.h:205
chomp::ChompOptimizer::random_momentum_
Eigen::MatrixXd random_momentum_
Definition: chomp_optimizer.h:220
chomp::ChompOptimizer::iteration_
int iteration_
Definition: chomp_optimizer.h:185
chomp::ChompOptimizer::joint_axes_
std::vector< EigenSTL::vector_Vector3d > joint_axes_
Definition: chomp_optimizer.h:210
chomp::ChompOptimizer::planning_scene_
planning_scene::PlanningSceneConstPtr planning_scene_
Definition: chomp_optimizer.h:193
chomp::ChompOptimizer::joint_names_
std::vector< std::string > joint_names_
Definition: chomp_optimizer.h:243
chomp::ChompOptimizer::group_trajectory_
ChompTrajectory group_trajectory_
Definition: chomp_optimizer.h:192
chomp::ChompOptimizer::hy_env_
const collision_detection::CollisionEnvHybrid * hy_env_
Definition: chomp_optimizer.h:197
chomp::ChompOptimizer::best_group_trajectory_cost_
double best_group_trajectory_cost_
Definition: chomp_optimizer.h:214
chomp::ChompOptimizer::state_is_in_collision_
std::vector< int > state_is_in_collision_
Definition: chomp_optimizer.h:225
chomp
Definition: chomp_cost.h:43
chomp::ChompOptimizer::last_improvement_iteration_
int last_improvement_iteration_
Definition: chomp_optimizer.h:215
moveit::core::RobotState
chomp::ChompOptimizer::calculateCollisionIncrements
void calculateCollisionIncrements()
Definition: chomp_optimizer.cpp:614
chomp::ChompOptimizer::ChompOptimizer
ChompOptimizer(ChompTrajectory *trajectory, const planning_scene::PlanningSceneConstPtr &planning_scene, const std::string &planning_group, const ChompParameters *parameters, const moveit::core::RobotState &start_state)
Definition: chomp_optimizer.cpp:89
chomp::ChompOptimizer::getCollisionCost
double getCollisionCost()
Definition: chomp_optimizer.cpp:757
chomp::ChompOptimizer::num_vars_all_
int num_vars_all_
Definition: chomp_optimizer.h:181
chomp::ChompOptimizer::free_vars_end_
int free_vars_end_
Definition: chomp_optimizer.h:184
chomp::ChompOptimizer::perturbTrajectory
void perturbTrajectory()
Definition: chomp_optimizer.cpp:1037
chomp::ChompOptimizer::updateMomentum
void updateMomentum()
chomp::ChompOptimizer::isParent
bool isParent(const std::string &childLink, const std::string &parentLink) const
Definition: chomp_optimizer.h:246
chomp::ChompOptimizer::robot_model_
const moveit::core::RobotModelConstPtr & robot_model_
Definition: chomp_optimizer.h:189
chomp::ChompOptimizer::full_trajectory_
ChompTrajectory * full_trajectory_
Definition: chomp_optimizer.h:188
chomp::ChompOptimizer::initialized_
bool initialized_
Definition: chomp_optimizer.h:201
chomp::ChompOptimizer::getTrajectoryCost
double getTrajectoryCost()
Definition: chomp_optimizer.cpp:742
chomp_trajectory.h
multivariate_gaussian.h
chomp::ChompOptimizer::num_vars_free_
int num_vars_free_
Definition: chomp_optimizer.h:180
chomp::ChompOptimizer::collision_increments_
Eigen::MatrixXd collision_increments_
Definition: chomp_optimizer.h:232
chomp::ChompOptimizer::collision_point_pos_eigen_
std::vector< EigenSTL::vector_Vector3d > collision_point_pos_eigen_
Definition: chomp_optimizer.h:204
chomp::ChompOptimizer::collision_point_potential_
std::vector< std::vector< double > > collision_point_potential_
Definition: chomp_optimizer.h:207
chomp::ChompOptimizer::optimize
bool optimize()
Definition: chomp_optimizer.cpp:325
chomp::ChompOptimizer::getRandomMomentum
void getRandomMomentum()
chomp::ChompOptimizer::isCollisionFree
bool isCollisionFree() const
Definition: chomp_optimizer.h:142
chomp::ChompOptimizer::calculateTotalIncrements
void calculateTotalIncrements()
Definition: chomp_optimizer.cpp:698
chomp::ChompOptimizer::point_is_in_collision_
std::vector< std::vector< int > > point_is_in_collision_
Definition: chomp_optimizer.h:227
chomp::ChompOptimizer::performForwardKinematics
void performForwardKinematics()
Definition: chomp_optimizer.cpp:928
d
d
chomp::ChompOptimizer::state_
moveit::core::RobotState state_
Definition: chomp_optimizer.h:194
chomp::ChompOptimizer::jacobian_
Eigen::MatrixXd jacobian_
Definition: chomp_optimizer.h:237
chomp::ChompOptimizer::group_trajectory_backup_
Eigen::MatrixXd group_trajectory_backup_
Definition: chomp_optimizer.h:212
chomp::ChompOptimizer::worst_collision_cost_state_
double worst_collision_cost_state_
Definition: chomp_optimizer.h:229
chomp::ChompOptimizer::is_collision_free_
bool is_collision_free_
Definition: chomp_optimizer.h:228
chomp::ChompOptimizer::updateFullTrajectory
void updateFullTrajectory()
Definition: chomp_optimizer.cpp:729
chomp::ChompParameters
Definition: chomp_parameters.h:75
planning_scene.h
chomp::ChompOptimizer::registerParents
void registerParents(const moveit::core::JointModel *model)
Definition: chomp_optimizer.cpp:286
chomp::ChompOptimizer::isInitialized
bool isInitialized() const
Definition: chomp_optimizer.h:137
chomp::ChompOptimizer::joint_positions_
std::vector< EigenSTL::vector_Vector3d > joint_positions_
Definition: chomp_optimizer.h:211
collision_detection::CollisionEnvHybrid
chomp::ChompOptimizer::num_joints_
int num_joints_
Definition: chomp_optimizer.h:179
moveit::core::JointModelGroup
chomp::ChompOptimizer::start_state_
moveit::core::RobotState start_state_
Definition: chomp_optimizer.h:195
chomp::ChompOptimizer::computeJointProperties
void computeJointProperties(int trajectoryPoint)
Definition: chomp_optimizer.cpp:783
chomp::ChompOptimizer::smoothness_derivative_
Eigen::VectorXd smoothness_derivative_
Definition: chomp_optimizer.h:236
chomp::ChompOptimizer::final_increments_
Eigen::MatrixXd final_increments_
Definition: chomp_optimizer.h:233
chomp::ChompOptimizer::stochasticity_factor_
double stochasticity_factor_
Definition: chomp_optimizer.h:223
collision_env_hybrid.h
planning_scene
chomp::ChompOptimizer::calculatePseudoInverse
void calculatePseudoInverse()
Definition: chomp_optimizer.cpp:691
chomp::ChompOptimizer::joint_state_velocities_
Eigen::VectorXd joint_state_velocities_
Definition: chomp_optimizer.h:241
chomp::ChompOptimizer::momentum_
Eigen::MatrixXd momentum_
Definition: chomp_optimizer.h:219
chomp::ChompOptimizer::getSmoothnessCost
double getSmoothnessCost()
Definition: chomp_optimizer.cpp:747
chomp::ChompOptimizer::handleJointLimits
void handleJointLimits()
Definition: chomp_optimizer.cpp:847
chomp::ChompOptimizer::~ChompOptimizer
virtual ~ChompOptimizer()
Definition: chomp_optimizer.cpp:281
moveit::core::JointModel
chomp::ChompOptimizer::debugCost
void debugCost()
Definition: chomp_optimizer.cpp:734
chomp::ChompOptimizer::joint_costs_
std::vector< ChompCost > joint_costs_
Definition: chomp_optimizer.h:199
chomp::ChompOptimizer::free_vars_start_
int free_vars_start_
Definition: chomp_optimizer.h:183
chomp::ChompOptimizer::collision_point_vel_mag_
std::vector< std::vector< double > > collision_point_vel_mag_
Definition: chomp_optimizer.h:208


chomp_motion_planner
Author(s): Gil Jones , Mrinal Kalakrishnan
autogenerated on Sat Mar 15 2025 02:26:05