libmove3d-planners
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Friends Macros Groups Pages
stompOptimizer.hpp
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 the 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 
37 #ifndef STOMP_OPTIMIZER_H_
38 #define STOMP_OPTIMIZER_H_
39 
40 #include "stompParameters.hpp"
41 
42 #include "planner/TrajectoryOptim/Chomp/chompPlanningGroup.hpp"
43 #include "planner/TrajectoryOptim/Chomp/chompTrajectory.hpp"
44 #include "planner/TrajectoryOptim/Chomp/chompCost.hpp"
45 #include "planner/TrajectoryOptim/Chomp/chompMultivariateGaussian.hpp"
46 #include "planner/TrajectoryOptim/Classic/smoothing.hpp"
47 #include "planner/Greedy/CollisionSpace.hpp"
48 
49 #include <boost/shared_ptr.hpp>
50 
51 #include "task.hpp"
52 #include "covariant_trajectory_policy.hpp"
53 #include "policy_improvement_loop.hpp"
54 #include "stompStatistics.hpp"
55 
56 class ConfGenerator;
57 
58 //#include <motion_planning_msgs/Constraints.h>
59 //#include "constraint_evaluator.hpp"
60 //#include <stomp_motion_planner/STOMPStatistics.h>
61 
62 #include <Eigen/Core>
63 
64 #include <vector>
65 //#include <kdl/frames.hpp>
66 //#include <kdl/chainidsolver_recursive_newton_euler.hpp>
67 
68 namespace stomp_motion_planner
69 {
70 
71 class StompOptimizer: public Task
72 {
73 public:
74  StompOptimizer(ChompTrajectory *trajectory,
75  const StompParameters *parameters,
76  const ChompPlanningGroup *planning_group,
77  const CollisionSpace *collision_space);
78 
79 // StompOptimizer(StompTrajectory *trajectory, const StompRobotModel *robot_model,
80 // const StompRobotModel::StompPlanningGroup *planning_group, const StompParameters *parameters,
81 // const ros::Publisher& vis_marker_array_publisher,
82 // const ros::Publisher& vis_marker_publisher,
83 // const ros::Publisher& stats_publisher,
84 // StompCollisionSpace *collision_space,
85 // const motion_planning_msgs::Constraints& constraints);
86 
87  virtual ~StompOptimizer();
88 
95  void runDeformation( int nbIteration , int idRun=0 );
96 
100  void setUseOtp(bool use_otp) { use_handover_config_generator_= use_otp; }
101 
106  void setUseTimeLimit(bool use_limit) { use_time_limit_ = use_limit; }
107 
112  void setTimeLimit(double time) { time_limit_ = time; }
113 
117  void setPassiveDofs( std::vector<confPtr_t> passive_dofs ) { passive_dofs_ = passive_dofs; }
118 
123  void generateNoisyTrajectory(const API::Trajectory& traj, std::vector< std::vector<confPtr_t> >& noisy_trajectory);
124 
128  void setSharedPtr(boost::shared_ptr<StompOptimizer>& ptr);
129  void resetSharedPtr();
130 
135 
140 
144  void getTrajectoryCost( std::vector<double>& cost, double step );
145 
149  int getJointLimitViolations() { return joint_limits_violation_; }
150  bool getJointLimitViolationSuccess() { return succeded_joint_limits_; }
151 
152  // stuff derived from Task:
158  bool initialize(/*ros::NodeHandle& node_handle,*/ int num_time_steps);
159 
164 
168  void initHandover();
169 
176  bool execute(std::vector<Eigen::VectorXd>& parameters, Eigen::VectorXd& costs, const int iteration_number, bool resample =false);
177 
183  bool getPolicy(boost::shared_ptr<stomp_motion_planner::Policy>& policy);
184 
190  bool setPolicy(const boost::shared_ptr<stomp_motion_planner::Policy> policy);
191 
197  bool getControlCostWeight(double& control_cost_weight);
198 
202  const ChompPlanningGroup* getPlanningGroup() const { return planning_group_; }
203 
207  Robot* getRobot() { return robot_model_; }
208 
212  void draw();
213 
217  void setSource(confPtr_t q) { source_ = q; }
218  void setTarget(confPtr_t q) { target_ = q; }
219  confPtr_t getSource();
220  confPtr_t getTarget();
221 
225  API::Trajectory getBestTraj() { return best_traj_; }
226 
227  bool humanHasMoved();
228 
229 private:
230  Robot* robot_model_;
231  Robot* human_model_;
232 
233  double time_;
234 
235  API::Trajectory move3d_traj_;
236  API::Trajectory best_traj_;
237 
238  int num_joints_;
239  int num_vars_free_;
240  int num_vars_all_;
241  int num_collision_points_;
242  int free_vars_start_;
243  int free_vars_end_;
244  int iteration_;
245  int collision_free_iteration_;
246 
247  bool succeded_joint_limits_;
248  int joint_limits_violation_;
249 
250  bool recompute_handover_once_;
251  bool handover_has_been_recomputed_;
252  bool use_human_sliders_;
253  bool use_handover_config_generator_;
254  bool use_handover_config_list_;
255  bool use_handover_auto_;
256  bool recompute_handover_cell_list_;
257  ConfGenerator* handoverGenerator_;
258 
259  double last_move3d_cost_;
260 
261  bool use_time_limit_;
262  double time_limit_;
263 
264  std::vector<confPtr_t> passive_dofs_;
265 
266  ChompTrajectory *full_trajectory_;
267  const ChompPlanningGroup *planning_group_;
268  const StompParameters *stomp_parameters_;
269  const CollisionSpace *collision_space_;
270  ChompTrajectory group_trajectory_;
271  std::vector<ChompCost> joint_costs_;
272 
273  boost::shared_ptr<stomp_motion_planner::CovariantTrajectoryPolicy> policy_;
274  std::vector<Eigen::VectorXd> policy_parameters_;
275  boost::shared_ptr<StompOptimizer> this_shared_ptr_;
276 
277  std::vector<int> planner_p3d_joints_;
278  std::vector<int> group_joint_to_move3d_joint_index_;
279 
280 // std::vector<std::vector<KDL::Vector> > joint_axis_;
281 // std::vector<std::vector<KDL::Vector> > joint_pos_;
282 // std::vector<std::vector<KDL::Frame> > segment_frames_;
283 // std::vector<std::vector<KDL::Vector> > collision_point_pos_;
284 // std::vector<std::vector<KDL::Vector> > collision_point_vel_;
285 // std::vector<std::vector<KDL::Vector> > collision_point_acc_;
286 
287  std::vector<std::vector<std::vector<double> > > segment_frames_;
288  std::vector<std::vector<Eigen::Vector3d> > joint_axis_eigen_;
289  std::vector<std::vector<Eigen::Vector3d> > joint_pos_eigen_;
290  std::vector<std::vector<Eigen::Vector3d> > collision_point_pos_eigen_;
291  std::vector<std::vector<Eigen::Vector3d> > collision_point_vel_eigen_;
292  std::vector<std::vector<Eigen::Vector3d> > collision_point_acc_eigen_;
293 
294  Eigen::VectorXd general_cost_potential_;
295 
296  Eigen::MatrixXd collision_point_potential_;
297  Eigen::MatrixXd collision_point_vel_mag_;
298  std::vector<std::vector<Eigen::Vector3d> > collision_point_potential_gradient_;
299  Eigen::MatrixXd group_trajectory_backup_;
300  Eigen::MatrixXd best_group_trajectory_;
301  double best_group_trajectory_cost_;
302  double last_trajectory_cost_;
303  bool last_trajectory_collision_free_;
304  bool last_trajectory_constraints_satisfied_;
305  int last_improvement_iteration_;
306  int best_iteration_;
307 
308  // HMC stuff:
309  Eigen::MatrixXd momentum_;
310  Eigen::MatrixXd random_momentum_;
311  Eigen::VectorXd random_joint_momentum_; //temporary variable
312  std::vector<MultivariateGaussian> multivariate_gaussian_;
313  double stochasticity_factor_;
314 
315  std::vector<int> state_is_in_collision_;
316  std::vector<std::vector<int> > point_is_in_collision_;
317  bool is_collision_free_;
318  double worst_collision_cost_state_;
319 
320  Eigen::MatrixXd smoothness_increments_;
321  Eigen::MatrixXd collision_increments_;
322  Eigen::MatrixXd final_increments_;
323 
324  // temporary variables for all functions:
325  Eigen::VectorXd smoothness_derivative_;
326 // KDL::JntArray kdl_joint_array_;
327 // KDL::JntArray kdl_vel_joint_array_;
328 // KDL::JntArray kdl_acc_joint_array_;
329 //
330 // KDL::JntArray kdl_group_joint_array_;
331 // KDL::JntArray kdl_group_vel_joint_array_;
332 // KDL::JntArray kdl_group_acc_joint_array_;
333 // KDL::JntArray kdl_group_torque_joint_array_;
334 
335  //Eigen::VectorXd
336  Eigen::MatrixXd jacobian_;
337  Eigen::MatrixXd jacobian_pseudo_inverse_;
338  Eigen::MatrixXd jacobian_jacobian_tranpose_;
339  Eigen::VectorXd random_state_;
340  Eigen::VectorXd joint_state_velocities_;
341  Eigen::VectorXd joint_state_accelerations_;
342  Eigen::VectorXd full_joint_state_velocities_;
343  Eigen::VectorXd full_joint_state_accelerations_;
344 
345  bool human_has_moved_;
346  std::vector<double> last_human_pos_;
347  bool reset_reused_rollouts_;
348 
349  confPtr_t source_;
350  confPtr_t target_;
351  confPtr_t target_new_;
352 
353 // ros::Publisher vis_marker_array_pub_;
354 // ros::Publisher vis_marker_pub_;
355 // ros::Publisher stats_pub_;
356  int animate_endeffector_segment_number_;
357 
358 // motion_planning_msgs::Constraints constraints_;
359 // std::vector<boost::shared_ptr<ConstraintEvaluator> > constraint_evaluators_;
360  boost::shared_ptr<StompStatistics> stomp_statistics_;
361 
362  void initialize();
363  void initPolicy();
364  void calculateSmoothnessIncrements();
365  void calculateCollisionIncrements();
366  void calculateTotalIncrements();
367  void getFrames(int segment, const Eigen::VectorXd& joint_array, Configuration& q);
368  bool getConfigObstacleCost(int segment, int dof, Configuration& q);
369  bool performForwardKinematics();
370  void addIncrementsToTrajectory();
371  void updateFullTrajectory();
372  void debugCost();
373  void eigenMapTest();
374  bool handleJointLimits();
375  void animatePath();
376  void animateEndeffector(bool print_cost = false);
377  void animateTrajectoryPolicy();
378  void visualizeState(int index);
379  double getTrajectoryCost();
380  double getSmoothnessCost();
381  double getCollisionCost();
382  void perturbTrajectory();
383  void getRandomMomentum();
384  void updateMomentum();
385  void updatePositionFromMomentum();
386  void calculatePseudoInverse();
387 
388  void doChompOptimization();
389 
390  void copyPolicyToGroupTrajectory();
391  void copyGroupTrajectoryToPolicy();
392  void clearAnimations();
393 
394  //----------------------------------------------------------------------------
395  // Jim functions
396  //----------------------------------------------------------------------------
397  void setGroupTrajectoryFromVectorConfig(const std::vector<confPtr_t>& traj);
398  void setGroupTrajectoryToVectorConfig(std::vector<confPtr_t>& traj);
399  void setGroupTrajectoryToApiTraj(API::Trajectory& traj);
400 
401  bool replaceEndWithNewConfiguration();
402  bool getManipulationHandOver();
403  bool getMobileManipHandOver();
404  bool getNewTargetFromHandOver();
405  double resampleParameters(std::vector<Eigen::VectorXd>& parameters);
406  double computeMove3DCost();
407  confPtr_t getConfigurationOnGroupTraj(int ith);
408 
409  void saveTrajectoryCostStats();
410  void saveCostFromConvergenceTraj();
411  void saveOptimToFile(std::string fileName);
412 
413 // void getTorques(int index, std::vector<double>& torques, const std::vector<KDL::Wrench>& wrenches);
414 };
415 
416 }
417 
418 extern boost::shared_ptr<stomp_motion_planner::StompOptimizer> optimizer;
419 
420 #endif /* STOMP_OPTIMIZER_H_ */
void setSharedPtr(boost::shared_ptr< StompOptimizer > &ptr)
Functions to set the shared pointer.
Definition: stompOptimizer.cpp:2122
Contains information about a planning group.
Definition: chompPlanningGroup.hpp:38
void setTimeLimit(double time)
Set the maximal time for optimization in second.
Definition: stompOptimizer.hpp:112
Robot * getRobot()
Get the robot.
Definition: stompOptimizer.hpp:207
bool getPolicy(boost::shared_ptr< stomp_motion_planner::Policy > &policy)
Get the Policy object of this Task.
Definition: stompOptimizer.cpp:2062
void initHandover()
Initializes the handover generator.
Definition: stompOptimizer.cpp:296
void testMultiVariateGaussianSampler()
Test the noisy trajectory sampler.
Definition: stompOptimizer.cpp:1741
void draw()
Draw function to be called outside.
Definition: stompOptimizer.cpp:1722
Definition: stompParameters.hpp:47
bool setPolicy(const boost::shared_ptr< stomp_motion_planner::Policy > policy)
Sets the Policy object of this Task.
Definition: stompOptimizer.cpp:2068
void setPassiveDofs(std::vector< confPtr_t > passive_dofs)
Set the passive Dofs.
Definition: stompOptimizer.hpp:117
Definition: stompOptimizer.hpp:71
bool getControlCostWeight(double &control_cost_weight)
Gets the weight of the control cost.
Definition: stompOptimizer.cpp:2073
Represents a discretized joint-space trajectory for CHOMP.
Definition: chompTrajectory.hpp:60
This class holds a the robot represented by a kinematic chain.
Definition: robot.hpp:42
bool execute(std::vector< Eigen::VectorXd > &parameters, Eigen::VectorXd &costs, const int iteration_number, bool resample=false)
Executes the task for the given policy parameters, and returns the costs per timestep.
Definition: stompOptimizer.cpp:1898
int getJointLimitViolations()
Get the current joint violation.
Definition: stompOptimizer.hpp:149
void setUseOtp(bool use_otp)
Set compute handover position.
Definition: stompOptimizer.hpp:100
const ChompPlanningGroup * getPlanningGroup() const
Returns the planning group of the optimizer.
Definition: stompOptimizer.hpp:202
void generateNoisyTrajectory(const API::Trajectory &traj, std::vector< std::vector< confPtr_t > > &noisy_trajectory)
Generate the noisy trajectories.
Definition: stompOptimizer.cpp:689
void setSource(confPtr_t q)
Retreive source and target.
Definition: stompOptimizer.hpp:217
Definition: task.hpp:50
Definition: CollisionSpace.hpp:27
bool initializeFromNewTrajectory(const API::Trajectory &traj)
Initializes from a new trajectory.
Definition: stompOptimizer.cpp:251
Definition: trajectory.hpp:40
double getCollisionSpaceCost(Configuration &q)
Get the current configuration collision cost.
Definition: stompOptimizer.cpp:1029
void setUseTimeLimit(bool use_limit)
Set the use of a time limit.
Definition: stompOptimizer.hpp:106
Classe représentant une Configuration d'un Robot.
Definition: configuration.hpp:25
Definition: ConfGenerator.h:51
void runDeformation(int nbIteration, int idRun=0)
Main optimizer function.
Definition: stompOptimizer.cpp:415
API::Trajectory getBestTraj()
Retreive best trajectory.
Definition: stompOptimizer.hpp:225