From 5dbb9ba05167deb321071fab30b9fbc12c9699a3 Mon Sep 17 00:00:00 2001 From: pFernbach <pierre.fernbach@gmail.com> Date: Mon, 25 Feb 2019 18:16:31 +0100 Subject: [PATCH] [effector] update tsid script to use new bezier reference --- .../wholebody/tsid_invdyn.py | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/scripts/hpp_wholebody_motion/wholebody/tsid_invdyn.py b/scripts/hpp_wholebody_motion/wholebody/tsid_invdyn.py index 042ebe8..3617d0c 100644 --- a/scripts/hpp_wholebody_motion/wholebody/tsid_invdyn.py +++ b/scripts/hpp_wholebody_motion/wholebody/tsid_invdyn.py @@ -16,7 +16,9 @@ import hpp_wholebody_motion.end_effector.bezier_predef as EETraj import hpp_wholebody_motion.viewer.display_tools as display_tools import math if cfg.USE_LIMB_RRT: - import hpp_wholebody_motion.end_effector.limb_rrt as limbrrt + import hpp_wholebody_motion.end_effector.limb_rrt as limb_rrt +if cfg.USE_CONSTRAINED_BEZIER: + import hpp_wholebody_motion.end_effector.bezier_constrained as bezier_constrained def SE3toVec(M): @@ -207,18 +209,18 @@ def generateEEReferenceTraj(robot,robotData,t,phase,phase_next,eeName,viewer = N display_tools.displaySE3Traj(ref_traj,viewer,eeName+"_traj",cfg.Robot.dict_limb_color_traj[eeName] ,time_interval ,cfg.Robot.dict_offset[eeName]) return ref_traj -def generateEEReferenceTrajCollisionFree(fullBody,robot,robotData,t,phase_previous,phase,phase_next,q_init,q_end,eeName,phaseId,viewer = None): +def generateEEReferenceTrajCollisionFree(fullBody,robot,robotData,t,phase_previous,phase,phase_next,q_t,predefTraj,eeName,phaseId,viewer = None): time_interval = [t, phase.time_trajectory[-1]] placements = [] placement_init = robot.position(robotData, robot.model().getJointId(eeName)) placement_end = JointPatchForEffector(phase_next,eeName).placement placements.append(placement_init) placements.append(placement_end) - if cfg.EFF_CHECK_COLLISION : - ref_traj = limbrrt.generateLimbRRTPath(time_interval,placement_init,placement_end,q_init,q_end,phase_previous,phase,phase_next,fullBody,phaseId,eeName,viewer) + ref_traj = bezier_constrained.generateConstrainedBezierTraj(time_interval,placement_init,placement_end,q_t,predefTraj,phase_previous,phase,phase_next,fullBody,phaseId,eeName,viewer) - #if viewer and cfg.DISPLAY_FEET_TRAJ : - # display_tools.displaySE3Traj(ref_traj,viewer,eeName+"_traj",cfg.Robot.dict_limb_color_traj[eeName] ,time_interval ,cfg.Robot.dict_offset[eeName]) + if viewer and cfg.DISPLAY_FEET_TRAJ : + display_tools.displaySE3Traj(ref_traj,viewer,eeName+"_trajNoColl",cfg.Robot.dict_limb_color_traj[eeName] ,time_interval ,SE3.Identity())#,cfg.Robot.dict_offset[eeName]) + return ref_traj def generateWholeBodyMotion(cs,viewer=None,fullBody=None): if not viewer : @@ -365,17 +367,22 @@ def generateWholeBodyMotion(cs,viewer=None,fullBody=None): raw_input('start simulation') # loop with increasing time for this phase : t_begin = t - q_begin = q + q_begin = q.copy() + v_begin = v.copy() phaseValid = False swingPhase = False # will be true if an effector move during this phase iter_for_phase = -1 while not phaseValid : - t = t_begin - q = q_begin + if iter_for_phase >=0 : + t = t_begin + q = q_begin.copy() + v = v_begin.copy() q_t_phase = [] iter_for_phase += 1 if cfg.WB_VERBOSE: print "Start simulation for phase "+str(pid)+", try number : "+str(iter_for_phase) + print "t begin = ",t_begin + print "current t = ",t while t < phase.time_trajectory[-1] - dt : # set traj reference for current time : # com @@ -434,12 +441,12 @@ def generateWholeBodyMotion(cs,viewer=None,fullBody=None): print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" print "/!\ ABORT : controler unstable at t = "+str(t)+" /!\ " print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - return q_t + return q_t+q_t_phase if math.isnan(norm(dv)) or math.isnan(norm(v)) : print "!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" print "/!\ ABORT : nan at t = "+str(t)+" /!\ " print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - return q_t + return q_t+q_t_phase # end while t \in phase t if swingPhase and cfg.EFF_CHECK_COLLISION : phaseValid = iter_for_phase >= 1 #TODO : check collision here instead for this debug code @@ -448,12 +455,14 @@ def generateWholeBodyMotion(cs,viewer=None,fullBody=None): print "Phase "+str(pid)+" not valid, try new end effector trajectory." for eeName,oldTraj in dic_effectors_trajs.iteritems(): if oldTraj: # update the traj in the map - ref_traj = generateEEReferenceTrajCollisionFree(fullBody,robot,invdyn.data(),t,phase_prev,phase,phase_next,q_t_phase[0],q_t_phase[-1],eeName,pid,viewer) - dic_effectors_trajs.update({eeName:ref_traj}) + ref_traj = generateEEReferenceTrajCollisionFree(fullBody,robot,invdyn.data(),t_begin,phase_prev,phase,phase_next,q_t_phase,oldTraj,eeName,pid,viewer) + #dic_effectors_trajs.update({eeName:ref_traj}) else : phaseValid = True if cfg.WB_VERBOSE : print "Phase "+str(pid)+" valid." + if phaseValid: + q_t += q_t_phase #end while not phaseValid time_end = time.time() - time_start print "Whole body motion generated in : "+str(time_end)+" s." -- GitLab