From d72e761859211404647a8ab7ea86d079eacdfa40 Mon Sep 17 00:00:00 2001 From: t steve <pro@stevetonneau.fr> Date: Fri, 12 May 2017 16:24:44 +0200 Subject: [PATCH] grasping --- CMakeLists.txt | 3 + data/meshes/siggraph_asia/grasp.stl | Bin 0 -> 1284 bytes data/srdf/siggraph_asia/grasp.srdf | 3 + data/urdf/siggraph_asia/grasp.urdf | 19 + idl/hpp/corbaserver/rbprm/rbprmbuilder.idl | 5 +- .../demos/siggraph_asia/grasp_hrp2_interp.py | 397 ++++++++++++++++++ .../demos/siggraph_asia/grasp_hrp2_path.py | 116 +++++ script/scenarios/demos/siggraph_asia/log.txt | 99 +++++ .../demos/siggraph_asia/plane_hrp2_interp.py | 4 +- .../demos/siggraph_asia/scale_hrp2_interp.py | 8 +- .../demos/siggraph_asia/scale_hrp2_path.py | 8 +- src/hpp/corbaserver/rbprm/rbprmfullbody.py | 14 +- src/rbprmbuilder.impl.cc | 9 +- src/rbprmbuilder.impl.hh | 4 +- 14 files changed, 670 insertions(+), 19 deletions(-) create mode 100644 data/meshes/siggraph_asia/grasp.stl create mode 100644 data/srdf/siggraph_asia/grasp.srdf create mode 100644 data/urdf/siggraph_asia/grasp.urdf create mode 100644 script/scenarios/demos/siggraph_asia/grasp_hrp2_interp.py create mode 100644 script/scenarios/demos/siggraph_asia/grasp_hrp2_path.py diff --git a/CMakeLists.txt b/CMakeLists.txt index e32b7d7..dede5ec 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -94,6 +94,7 @@ install(FILES data/urdf/polaris.urdf data/urdf/siggraph_asia/down.urdf data/urdf/siggraph_asia/scale.urdf + data/urdf/siggraph_asia/grasp.urdf #~ data/urdf/scene2.urdf DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/urdf ) @@ -127,6 +128,7 @@ install(FILES data/srdf/polaris.srdf data/srdf/siggraph_asia/down.srdf data/srdf/siggraph_asia/scale.srdf + data/srdf/siggraph_asia/grasp.srdf #~ data/srdf/scene2.srdf DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/srdf ) @@ -166,6 +168,7 @@ install(FILES data/meshes/polaris_reduced.stl data/meshes/siggraph_asia/down.stl data/meshes/siggraph_asia/scale.stl + data/meshes/siggraph_asia/grasp.stl DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/meshes ) install(FILES diff --git a/data/meshes/siggraph_asia/grasp.stl b/data/meshes/siggraph_asia/grasp.stl new file mode 100644 index 0000000000000000000000000000000000000000..ba16412c6a2678de742dfcbac2c9c8a4bb43e47a GIT binary patch literal 1284 zcmb7?u}TC%5Jbn^572Bw4HUf#OwL;r`~g7_QH106Ku}Ls1rwqD0Rz84b0aShL|70* zBmEz7YUXOJbs{&pg09!qJ=a@TXXE;!8Wy8^d{S&4SEs|OUg|8bb&G}b%R#ZS=>GN1 zMYlO;CFI7zZU1}kvHx-O-W$!#XZmgSdOadj!stSUv}$w$Vdeev!vsoQJ)gI|`q{jA zn))>(v_cwvsasPu$RL5f`+g5*P&31spA3X)g*05$=!DMJ_&vH%+#HiAO`Q{3A&uFo z`Bu(N4sSZh(h9eQi&LdN5}_65!KIxreaLw786{o%A3!tj_jUbLfzS&3!lj);grPqa ziJiOMl7#B7au9s*1|r=RDx_6|j_$vA1s7jIbxzQQ3NuuLMh3ocCF!nE;kK%ok>3?6 znn%ry{H{PSLv>Ejg$iF+b($)!B6o#~ZqBJ%gkgKFFb^)~wFtadnjMpnhGri0bfEBK MtqS|X#k@%T0NJ{yhX4Qo literal 0 HcmV?d00001 diff --git a/data/srdf/siggraph_asia/grasp.srdf b/data/srdf/siggraph_asia/grasp.srdf new file mode 100644 index 0000000..94553c6 --- /dev/null +++ b/data/srdf/siggraph_asia/grasp.srdf @@ -0,0 +1,3 @@ +<?xml version="1.0"?> +<robot name="grasp"> +</robot> diff --git a/data/urdf/siggraph_asia/grasp.urdf b/data/urdf/siggraph_asia/grasp.urdf new file mode 100644 index 0000000..5e59557 --- /dev/null +++ b/data/urdf/siggraph_asia/grasp.urdf @@ -0,0 +1,19 @@ +<robot name="grasp"> + <link name="base_link"> + <visual> + <origin xyz="0 0 0" rpy="0 0 0" /> + <geometry> + <mesh filename="package://hpp-rbprm-corba/meshes/grasp.stl"/> + </geometry> + <material name="white"> + <color rgba="1 1 1 1"/> + </material> + </visual> + <collision> + <origin xyz="0 0 0" rpy="0 0 0" /> + <geometry> + <mesh filename="package://hpp-rbprm-corba/meshes/grasp.stl"/> + </geometry> + </collision> + </link> +</robot> diff --git a/idl/hpp/corbaserver/rbprm/rbprmbuilder.idl b/idl/hpp/corbaserver/rbprm/rbprmbuilder.idl index 3da7d88..de1e702 100755 --- a/idl/hpp/corbaserver/rbprm/rbprmbuilder.idl +++ b/idl/hpp/corbaserver/rbprm/rbprmbuilder.idl @@ -226,7 +226,8 @@ module hpp /// \param disableEffectorCollision whether collision detection should be disabled for the end effector bones void addLimb(in string id, in string limb, in string effector, in floatSeq offset, in floatSeq normal, in double x, in double y, in unsigned short samples, in string heuristicName, - in double resolution, in string contactType, in double disableEffectorCollision) raises (Error); + in double resolution, in string contactType, in double disableEffectorCollision, + in double grasp) raises (Error); /// Specifies a subchain of the robot as a limb, which can be used to create contacts. /// A limb must consist in a simple kinematic chain, where every node has only one child @@ -236,7 +237,7 @@ module hpp /// \param loadValues whether other values computed for the limb database should be loaded /// \param disableEffectorCollision whether collision detection should be disabled for the end effector bones void addLimbDatabase(in string databasepath, in string id, in string heuristicName, in double loadValues, - in double disableEffectorCollision) raises (Error); + in double disableEffectorCollision,in double grasp) raises (Error); /// Set the start state of a contact generation problem /// environment, ordered by their efficiency diff --git a/script/scenarios/demos/siggraph_asia/grasp_hrp2_interp.py b/script/scenarios/demos/siggraph_asia/grasp_hrp2_interp.py new file mode 100644 index 0000000..7c0d59d --- /dev/null +++ b/script/scenarios/demos/siggraph_asia/grasp_hrp2_interp.py @@ -0,0 +1,397 @@ +from hpp.corbaserver.rbprm.rbprmbuilder import Builder +from hpp.corbaserver.rbprm.rbprmfullbody import FullBody +from hpp.gepetto import Viewer + +import grasp_hrp2_path as tp +import time + + + +packageName = "hrp2_14_description" +meshPackageName = "hrp2_14_description" +rootJointType = "freeflyer" +## +# Information to retrieve urdf and srdf files. +urdfName = "hrp2_14" +urdfSuffix = "_reduced" +srdfSuffix = "" + +fullBody = FullBody () + +fullBody.loadFullBodyModel(urdfName, rootJointType, meshPackageName, packageName, urdfSuffix, srdfSuffix) +fullBody.setJointBounds ("base_joint_xyz", [-3,3, -2, 2, 0, 1]) + + +ps = tp.ProblemSolver( fullBody ) +r = tp.Viewer (ps, viewerClient=tp.r.client) + +#~ AFTER loading obstacles +rLegId = 'hrp2_rleg_rom' +rLeg = 'RLEG_JOINT0' +rLegOffset = [0,-0.105,0,] +rLegNormal = [0,1,0] +rLegx = 0.09; rLegy = 0.05 +fullBody.addLimb(rLegId,rLeg,'',rLegOffset,rLegNormal, rLegx, rLegy, 10000, "manipulability", 0.1) + +lLegId = 'hrp2_lleg_rom' +lLeg = 'LLEG_JOINT0' +lLegOffset = [0,-0.105,0] +lLegNormal = [0,1,0] +lLegx = 0.09; lLegy = 0.05 +fullBody.addLimb(lLegId,lLeg,'',lLegOffset,rLegNormal, lLegx, lLegy, 10000, "manipulability", 0.1) + + + +#~ AFTER loading obstacles +larmId = 'hrp2_larm_rom' +larm = 'LARM_JOINT0' +lHand = 'LARM_JOINT5' +lArmOffset = [-0.05,-0.050,-0.050] +lArmNormal = [1,0,0] +lArmOffset = [0,0,-0.105] +lArmNormal = [0,0,1] +lArmx = 0.024; lArmy = 0.024 +fullBody.addLimb(larmId,larm,lHand,lArmOffset,lArmNormal, lArmx, lArmy, 10000, "manipulability", 0.1, "_6_DOF", True,grasp = True) +#~ fullBody.addLimb(larmId,larm,lHand,lArmOffset,lArmNormal, lArmx, lArmy, 10000, "manipulability", 0.1, "_6_DOF", True) +#~ fullBody.addLimb(larmId,larm,lHand,lArmOffset,lArmNormal, lArmx, lArmy, 10000, 0.05) + + +rarmId = 'hrp2_rarm_rom' +rarm = 'RARM_JOINT0' +rHand = 'RARM_JOINT5' +rArmOffset = [0,0,-0.105] +rArmNormal = [0,0,1] +rArmx = 0.024; rArmy = 0.024 +#disabling collision for hook +fullBody.addLimb(rarmId,rarm,rHand,rArmOffset,rArmNormal, rArmx, rArmy, 10000, "manipulability", 0.1, "_6_DOF", True,grasp = True) +#~ fullBody.addLimb(rarmId,rarm,rHand,rArmOffset,rArmNormal, rArmx, rArmy, 10000, "manipulability", 0.1, "_6_DOF", True) + +rKneeId = '0RKnee' +rLeg = 'RLEG_JOINT0' +rKnee = 'RLEG_JOINT3' +rLegOffset = [0.105,0.055,0.017] +rLegNormal = [-1,0,0] +rLegx = 0.05; rLegy = 0.05 +#~ fullBody.addLimb(rKneeId, rLeg,rKnee,rLegOffset,rLegNormal, rLegx, rLegy, 10000, 0.01) +#~ +lKneeId = '1LKnee' +lLeg = 'LLEG_JOINT0' +lKnee = 'LLEG_JOINT3' +lLegOffset = [0.105,0.055,0.017] +lLegNormal = [-1,0,0] +lLegx = 0.05; lLegy = 0.05 +#~ fullBody.addLimb(lKneeId,lLeg,lKnee,lLegOffset,lLegNormal, lLegx, lLegy, 10000, 0.01) + #~ +#~ +fullBody.runLimbSampleAnalysis(rLegId, "jointLimitsDistance", True) +fullBody.runLimbSampleAnalysis(lLegId, "jointLimitsDistance", True) +#~ fullBody.runLimbSampleAnalysis(larmId, "jointLimitsDistance", True) +#~ fullBody.runLimbSampleAnalysis(rarmId, "jointLimitsDistance", True) + +#~ fullBody.client.basic.robot.setJointConfig('LARM_JOINT0',[1]) +#~ fullBody.client.basic.robot.setJointConfig('RARM_JOINT0',[-1]) + +q_0 = fullBody.getCurrentConfig(); +#~ fullBody.createOctreeBoxes(r.client.gui, 1, rarmId, q_0,) +q_init = fullBody.getCurrentConfig(); q_init[0:7] = tp.q_init[0:7] +q_goal = fullBody.getCurrentConfig(); q_goal[0:7] = tp.q_goal[0:7] + + +fullBody.setCurrentConfig (q_init) +q_init = [ + -0.05, -1.12, 0.5, 1.0, 0.0 , 0.0, 0.0, # Free flyer 0-6 + 0.0, 0.0, 0.0, 0.0, # CHEST HEAD 7-10 + 0.261799388, 0.174532925, 0.0, -0.523598776, 0.0, 0.0, 0.17, # LARM 11-17 + 0.261799388, -0.174532925, 0.0, -0.523598776, 0.0, 0.0, 0.17, # RARM 18-24 + 0.0, 0.0, -0.453785606, 0.872664626, -0.41887902, 0.0, # LLEG 25-30 + 0.0, 0.0, -0.453785606, 0.872664626, -0.41887902, 0.0, # RLEG 31-36 + ]; r (q_init) + +fullBody.setCurrentConfig (q_goal) +#~ r(q_goal) +q_goal = fullBody.generateContacts(q_goal, [0,0,1]) +q_init = fullBody.generateContacts(q_init, [0,0,1]) +#~ r(q_goal) + +fullBody.setStartState(q_init,[rLegId,lLegId,larmId]) #,rarmId,larmId]) +#~ fullBody.setStartState(q_init,[rLegId,lLegId]) #,rarmId,larmId]) +fullBody.setEndState(q_goal,[rLegId,lLegId])#,rarmId,larmId]) +#~ +#~ configs = fullBody.interpolate(0.1) +#~ configs = fullBody.interpolate(0.15) +i = 0; +configs = [] + + +limbsCOMConstraints = { rLegId : {'file': "hrp2/RL_com.ineq", 'effector' : 'RLEG_JOINT5'}, + lLegId : {'file': "hrp2/LL_com.ineq", 'effector' : 'LLEG_JOINT5'}, + rarmId : {'file': "hrp2/RA_com.ineq", 'effector' : rHand} , + larmId : {'file': "hrp2/LA_com.ineq", 'effector' : lHand} } + +#~ fullBody.limbRRTFromRootPath(0,len(configs)-1,0,2) +from hpp.corbaserver.rbprm.tools.cwc_trajectory_helper import step, clean,stats, saveAllData, play_traj +from hpp.gepetto import PathPlayer +pp = PathPlayer (fullBody.client.basic, r) + +def act(i, numOptim = 0, use_window = 0, friction = 0.5, optim_effectors = True, verbose = False, draw = False): + return step(fullBody, configs, i, numOptim, pp, limbsCOMConstraints, 0.4, optim_effectors = optim_effectors, time_scale = 20., useCOMConstraints = True, use_window = use_window, + verbose = verbose, draw = draw) + +def play(frame_rate = 1./24.): + play_traj(fullBody,pp,frame_rate) + +def saveAll(name): + saveAllData(fullBody, r, name) + + +def initConfig(): + r.client.gui.setVisibility("hrp2_14", "ON") + tp.cl.problem.selectProblem("default") + tp.r.client.gui.setVisibility("toto", "OFF") + tp.r.client.gui.setVisibility("hrp2_trunk_flexible", "OFF") + r(q_init) + +def endConfig(): + r.client.gui.setVisibility("hrp2_14", "ON") + tp.cl.problem.selectProblem("default") + tp.r.client.gui.setVisibility("toto", "OFF") + tp.r.client.gui.setVisibility("hrp2_trunk_flexible", "OFF") + r(q_goal) + + +def rootPath(): + tp.cl.problem.selectProblem("rbprm_path") + r.client.gui.setVisibility("hrp2_14", "OFF") + tp.r.client.gui.setVisibility("toto", "OFF") + r.client.gui.setVisibility("hyq", "OFF") + r.client.gui.setVisibility("hrp2_trunk_flexible", "ON") + tp.pp(0) + r.client.gui.setVisibility("hrp2_trunk_flexible", "OFF") + r.client.gui.setVisibility("hyq", "ON") + tp.cl.problem.selectProblem("default") + +def genPlan(stepsize=0.1): + r.client.gui.setVisibility("hrp2_14", "ON") + tp.cl.problem.selectProblem("default") + tp.r.client.gui.setVisibility("toto", "OFF") + tp.r.client.gui.setVisibility("hrp2_trunk_flexible", "OFF") + global configs + start = time.clock() + print "BEFORE" + configs = fullBody.interpolate(stepsize, 0, 0, True) + print "AFTER" + end = time.clock() + print "Contact plan generated in " + str(end-start) + "seconds" + +def contactPlan(step = 0.5): + r.client.gui.setVisibility("hrp2_14", "ON") + tp.cl.problem.selectProblem("default") + tp.r.client.gui.setVisibility("toto", "OFF") + tp.r.client.gui.setVisibility("hrp2_trunk_flexible", "OFF") + for i in range(0,len(configs)): + r(configs[i]); + time.sleep(step) + + +def a(): + print "initial configuration" + initConfig() + +def b(): + print "end configuration" + endConfig() + +def c(): + print "displaying root path" + rootPath() + +def d(step=0.1): + print "computing contact plan" + genPlan(step) + +def e(step = 0.5): + print "displaying contact plan" + contactPlan(step) + +print "Root path WXXSD in " + str(tp.t) + " ms." + +d(0.005); e() + +print "Root path SDDSD in " + str(tp.t) + " ms." + +#~ from gen_data_from_rbprm import * +#~ +#~ for config in configs: + #~ r(config) + #~ print(fullBody.client.basic.robot.getComPosition()) +#~ + +#~ gen_and_save(fullBody,configs, "stair_bauzil_contacts_data") +#~ main() + +from gen_data_from_rbprm import * + +from hpp.corbaserver.rbprm.tools.com_constraints import get_com_constraint + +#computing com bounds 0 and 1 +def __get_com(robot, config): + save = robot.getCurrentConfig() + robot.setCurrentConfig(config) + com = robot.getCenterOfMass() + robot.setCurrentConfig(save) + return com + +from numpy import matrix, asarray +from numpy.linalg import norm +from spline import bezier + + +def __curveToWps(curve): + return asarray(curve.waypoints().transpose()).tolist() + + +def __Bezier(wps, init_acc = [0.,0.,0.], end_acc = [0.,0.,0.], init_vel = [0.,0.,0.], end_vel = [0.,0.,0.]): + c = curve_constraints(); + c.init_vel = matrix(init_vel); + c.end_vel = matrix(end_vel); + c.init_acc = matrix(init_acc); + c.end_acc = matrix(end_acc); + matrix_bezier = matrix(wps).transpose() + curve = bezier(matrix_bezier, c) + return __curveToWps(curve), curve + #~ return __curveToWps(bezier(matrix_bezier)) + +allpaths = [] + +def play_all_paths(): + for _, pid in enumerate(allpaths): + pp(pid) + +def play_all_paths_smooth(): + for i, pid in enumerate(allpaths): + if i % 2 == 1 : + pp(pid) + +def play_all_paths_qs(): + for i, pid in enumerate(allpaths): + if i % 2 == 0 : + pp(pid) + +def test(stateid = 1, path = False, use_rand = False, just_one_curve = False, num_optim = 0) : + com_1 = __get_com(fullBody, configs[stateid]) + com_2 = __get_com(fullBody, configs[stateid+1]) + data = gen_sequence_data_from_state(fullBody,stateid,configs, mu = 0.8) + c_bounds_1 = get_com_constraint(fullBody, stateid, configs[stateid], limbsCOMConstraints, interm = False) + c_bounds_mid = get_com_constraint(fullBody, stateid, configs[stateid], limbsCOMConstraints, interm = True) + c_bounds_2 = get_com_constraint(fullBody, stateid, configs[stateid+1], limbsCOMConstraints, interm = False) + success, c_mid_1, c_mid_2 = solve_quasi_static(data, c_bounds = [c_bounds_1, c_bounds_2, c_bounds_mid], use_rand = use_rand, mu = 0.8) + #~ success, c_mid_1, c_mid_2 = solve_dyn(data, c_bounds = [c_bounds_1, c_bounds_2, c_bounds_mid], use_rand = use_rand) + #~ success, c_mid_1, c_mid_2 = solve_dyn(data, c_bounds = [c_bounds_1, c_bounds_2]) + + paths_ids = [] + if path and success: + #~ fullBody.straightPath([c_mid_1[0].tolist(),c_mid_2[0].tolist()]) + #~ fullBody.straightPath([c_mid_2[0].tolist(),com_2]) + if just_one_curve: + print "just one curve" + bezier_0, curve = __Bezier([com_1,c_mid_1[0].tolist(),c_mid_2[0].tolist(),com_2]) + + partions = [0.,0.1,0.9,1.] + p0 = fullBody.generateCurveTrajParts(bezier_0,partions) + #testing intermediary configurations + print 'wtf', partions[1], " " + com_interm1 = curve(partions[1]) + com_interm2 = curve(partions[2]) + print "com_1", com_1 + success_proj1 = project_com_colfree(fullBody, stateid , asarray((com_interm1).transpose()).tolist()[0]) + success_proj2 = project_com_colfree(fullBody, stateid+1, asarray((com_interm2).transpose()).tolist()[0]) + + if not success_proj1: + print "proj 1 failed" + return False, c_mid_1, c_mid_2, paths_ids + + if not success_proj2: + print "proj 2 failed" + return False, c_mid_1, c_mid_2, paths_ids + + print "p0", p0 + #~ pp.displayPath(p0+1) + #~ pp.displayPath(p0+2) + pp.displayPath(p0) + paths_ids = [int(el) for el in fullBody.comRRTFromPos(stateid,p0+1,p0+2,p0+3,num_optim)] + else: + print "just all curve" + bezier_0, curve = __Bezier([com_1,c_mid_1[0].tolist()] , end_acc = c_mid_1[1].tolist() , end_vel = [0.,0.,0.]) + bezier_1, curve = __Bezier([c_mid_1[0].tolist(),c_mid_2[0].tolist()], end_acc = c_mid_2[1].tolist(), init_acc = c_mid_1[1].tolist(), init_vel = [0.,0.,0.], end_vel = [0.,0.,0.]) + bezier_2, curve = __Bezier([c_mid_2[0].tolist(),com_2] , init_acc = c_mid_2[1].tolist(), init_vel = [0.,0.,0.]) + + p0 = fullBody.generateCurveTraj(bezier_0) + print "p0", p0 + fullBody.generateCurveTraj(bezier_1) + fullBody.generateCurveTraj(bezier_2) + pp.displayPath(p0) + pp.displayPath(p0+1) + pp.displayPath(p0+2) + paths_ids = [int(el) for el in fullBody.comRRTFromPos(stateid,p0,p0+1,p0+2,num_optim)] + #~ paths_ids = [] + global allpaths + allpaths += paths_ids[:-1] + #~ allpaths += [paths_ids[-1]] + #~ pp(paths_ids[-1]) + + #~ return success, paths_ids, c_mid_1, c_mid_2 + return success, c_mid_1, c_mid_2, paths_ids +#~ data = gen_sequence_data_from_state(fullBody,3,configs) + + + +def prepare_whole_interp(stateid, stateid_end): + all_points = [] + allSuc = True + for i in range(stateid, stateid_end): + com_1 = __get_com(fullBody, configs[stateid]) + success, c_mid_1, c_mid_2, paths_ids = test(i, False, True, False) + allSuc = success and allSuc + if not success: + break + all_points = all_points + [com_1, c_mid_1[0].tolist(), c_mid_2[0].tolist()] + all_points = all_points + [__get_com(fullBody, configs[stateid_end])] + if allSuc: + bezier_0 = __Bezier(all_points) + p0 = fullBody.generateCurveTraj(bezier_0) + pp.displayPath(p0) + num_paths = stateid_end - stateid + num_sub_paths = num_paths * 3 + increment = 1. / float(num_paths) + partitions = [0.] + for i in range(0, num_paths): + dec = increment * float(i) + partitions += [dec + 0.01 * increment, dec + 0.99 * increment,dec + 1. * increment] + print "partitions", partitions, len(partitions) + p0 = fullBody.generateCurveTrajParts(bezier_0,partitions) +1 + paths_ids = [] + for i in range(0, num_paths): + print "***************************3i", p0+3*i + paths_ids += [int(el) for el in fullBody.comRRTFromPos(stateid + i,p0+3*i,p0+3*i+1,p0+3*i+2)] + #~ paths_ids = [] + global allpaths + allpaths += paths_ids[:-1] + #~ pp(paths_ids[-1]) +#~ success, paths_ids, c_mid_1, c_mid_2 = test(0, True, True, False) +#~ prepare_whole_interp(1, 2) + +#~ pp(29),pp(9),pp(17) +from hpp.corbaserver.rbprm.tools.path_to_trajectory import * + +def gen(len_con = 10, num_optim = 0, ine_curve =True): + for i in range (len_con): + if not test(i, True, False, ine_curve,num_optim): + for j in range(10): + found = test(i, True, True, ine_curve, num_optim) + if found: + break + a = gen_trajectory_to_play(fullBody, pp, allpaths, flatten([[0.3, 0.6, 0.1] for _ in range(len(allpaths) / 3)])) + return a + +#~ pp(29),pp(9),pp(17) +#~ gen(True) diff --git a/script/scenarios/demos/siggraph_asia/grasp_hrp2_path.py b/script/scenarios/demos/siggraph_asia/grasp_hrp2_path.py new file mode 100644 index 0000000..cce1ab6 --- /dev/null +++ b/script/scenarios/demos/siggraph_asia/grasp_hrp2_path.py @@ -0,0 +1,116 @@ +from hpp.corbaserver.rbprm.rbprmbuilder import Builder +from hpp.gepetto import Viewer +from hpp.corbaserver import Client +from hpp.corbaserver.robot import Robot as Parent + +class Robot (Parent): + rootJointType = 'freeflyer' + packageName = 'hpp-rbprm-corba' + meshPackageName = 'hpp-rbprm-corba' + # URDF file describing the trunk of the robot HyQ + urdfName = 'hrp2_trunk_flexible' + urdfSuffix = "" + srdfSuffix = "" + def __init__ (self, robotName, load = True): + Parent.__init__ (self, robotName, self.rootJointType, load) + self.tf_root = "base_footprint" + self.client.basic = Client () + self.load = load + + +rootJointType = 'freeflyer' +packageName = 'hpp-rbprm-corba' +meshPackageName = 'hpp-rbprm-corba' +urdfName = 'hrp2_trunk_flexible' +urdfNameRoms = ['hrp2_larm_rom','hrp2_rarm_rom','hrp2_lleg_rom','hrp2_rleg_rom'] +urdfSuffix = "" +srdfSuffix = "" + +rbprmBuilder = Builder () + +rbprmBuilder.loadModel(urdfName, urdfNameRoms, rootJointType, meshPackageName, packageName, urdfSuffix, srdfSuffix) +rbprmBuilder.setJointBounds ("base_joint_xyz", [-3,3, -2, 2, 0, 1]) +#~ rbprmBuilder.setFilter(['hrp2_larm_rom','hrp2_rarm_rom','hrp2_lleg_rom','hrp2_rleg_rom']) +#~ rbprmBuilder.setFilter(['hrp2_lleg_rom','hrp2_rleg_rom']) +#~ rbprmBuilder.setAffordanceFilter('hrp2_rarm_rom', ['Support','Lean']) +#~ rbprmBuilder.setAffordanceFilter('hrp2_larm_rom', ['Support','Lean']) +#~ rbprmBuilder.setAffordanceFilter('hrp2_rarm_rom', ['Support']) +#~ rbprmBuilder.setAffordanceFilter('hrp2_larm_rom', ['Support']) +rbprmBuilder.setAffordanceFilter('hrp2_rarm_rom', ['Lean']) +rbprmBuilder.setAffordanceFilter('hrp2_larm_rom', ['Lean']) +rbprmBuilder.setAffordanceFilter('hrp2_lleg_rom', ['Support',]) +rbprmBuilder.setAffordanceFilter('hrp2_rleg_rom', ['Support']) +#~ rbprmBuilder.setNormalFilter('hrp2_rarm_rom', [0,0,1], 0.5) +#~ rbprmBuilder.setNormalFilter('hrp2_lleg_rom', [0,0,1], 0.9) +#~ rbprmBuilder.setNormalFilter('hrp2_rleg_rom', [0,0,1], 0.9) +#~ rbprmBuilder.setNormalFilter('hyq_rhleg_rom', [0,0,1], 0.9) +rbprmBuilder.boundSO3([-0.,0,-1,1,-1,1]) + +#~ from hpp.corbaserver.rbprm. import ProblemSolver +from hpp.corbaserver.rbprm.problem_solver import ProblemSolver + +ps = ProblemSolver( rbprmBuilder ) + +r = Viewer (ps) + + +q_init = rbprmBuilder.getCurrentConfig (); +#~ q_init [3:7] = [ 0.98877108, 0. , 0.14943813, 0. ] +q_init [0:3] = [-0.05, -1.12, 0.5]; rbprmBuilder.setCurrentConfig (q_init); r (q_init) +#~ q_init [0:3] = [0.1, -0.82, 0.648702]; rbprmBuilder.setCurrentConfig (q_init); r (q_init) +#~ q_init [0:3] = [0, -0.63, 0.6]; rbprmBuilder.setCurrentConfig (q_init); r (q_init) +#~ q_init [3:7] = [ 0.98877108, 0. , 0.14943813, 0. ] + +q_goal = q_init [::] +#~ q_goal [3:7] = [ 0.98877108, 0. , 0.14943813, 0. ] +q_goal [0:3] = [-0.05, -0.12, 0.5]; r (q_goal) +#~ q_goal [0:3] = [1.2, -0.65, 1.1]; r (q_goal) + +#~ ps.addPathOptimizer("GradientBased") +ps.addPathOptimizer("RandomShortcut") +ps.setInitialConfig (q_init) +ps.addGoalConfig (q_goal) + +from hpp.corbaserver.affordance.affordance import AffordanceTool +afftool = AffordanceTool () +afftool.setAffordanceConfig('Support', [0.000005, 0.000005, 0.00005]) +afftool.setAffordanceConfig('Lean', [0.00005, 0.000005, 0.00005]) +afftool.loadObstacleModel (packageName, "grasp", "planning", r) +#~ afftool.analyseAll() +afftool.visualiseAffordances('Support', r, [0.25, 0.5, 0.5]) +afftool.visualiseAffordances('Lean', r, [0, 0, 0.9]) + +ps.client.problem.selectConFigurationShooter("RbprmShooter") +ps.client.problem.selectPathValidation("RbprmPathValidation",0.05) +#~ ps.solve () +t = ps.solve () + +print t; +if isinstance(t, list): + t = t[0]* 3600000 + t[1] * 60000 + t[2] * 1000 + t[3] +f = open('log.txt', 'a') +f.write("path computation " + str(t) + "\n") +f.close() + + +from hpp.gepetto import PathPlayer +pp = PathPlayer (rbprmBuilder.client.basic, r) +#~ pp.fromFile("/home/stonneau/dev/hpp/src/hpp-rbprm-corba/script/paths/stair.path") +#~ +#~ pp (2) +#~ pp (0) + +#~ pp (1) +#~ pp.toFile(1, "/home/stonneau/dev/hpp/src/hpp-rbprm-corba/script/paths/stair.path") +#~ rbprmBuilder.exportPath (r, ps.client.problem, 1, 0.01, "stair_bauzil_hrp2_path.txt") + +cl = Client() +cl.problem.selectProblem("rbprm_path") +rbprmBuilder2 = Robot ("toto") +ps2 = ProblemSolver( rbprmBuilder2 ) +cl.problem.selectProblem("default") +cl.problem.movePathToProblem(1,"rbprm_path",rbprmBuilder.getAllJointNames()) +r2 = Viewer (ps2, viewerClient=r.client) +r.client.gui.setVisibility("toto", "OFF") +r.client.gui.setVisibility("hrp2_trunk_flexible", "OFF") +#~ r2(q_far) diff --git a/script/scenarios/demos/siggraph_asia/log.txt b/script/scenarios/demos/siggraph_asia/log.txt index 7ae6fd8..ab23625 100644 --- a/script/scenarios/demos/siggraph_asia/log.txt +++ b/script/scenarios/demos/siggraph_asia/log.txt @@ -344,3 +344,102 @@ path computation 10 path computation 9 path computation 6 path computation 7 +path computation 21 +path computation 28 +path computation 3 +path computation 4 +path computation 22 +path computation 3 +path computation 3 +path computation 3 +path computation 3 +path computation 3 +path computation 1 +path computation 3 +path computation 1 +path computation 1 +path computation 2 +path computation 1 +path computation 1 +path computation 2 +path computation 2 +path computation 1 +path computation 3 +path computation 1 +path computation 3 +path computation 3 +path computation 3 +path computation 2 +path computation 3 +path computation 2 +path computation 2 +path computation 2 +path computation 4 +path computation 4 +path computation 3 +path computation 4 +path computation 2 +path computation 2 +path computation 2 +path computation 3 +path computation 3 +path computation 3 +path computation 2 +path computation 3 +path computation 3 +path computation 19 +path computation 2 +path computation 3 +path computation 3 +path computation 2 +path computation 5 +path computation 2 +path computation 2 +path computation 3 +path computation 3 +path computation 3 +path computation 3 +path computation 22 +path computation 2 +path computation 3 +path computation 10 +path computation 15 +path computation 15 +path computation 2 +path computation 3 +path computation 2 +path computation 2 +path computation 7 +path computation 3 +path computation 4 +path computation 3 +path computation 4 +path computation 3 +path computation 3 +path computation 3 +path computation 3 +path computation 4 +path computation 2 +path computation 17 +path computation 17 +path computation 3 +path computation 4 +path computation 2 +path computation 3 +path computation 3 +path computation 6 +path computation 3 +path computation 3 +path computation 3 +path computation 3 +path computation 4 +path computation 3 +path computation 2 +path computation 2 +path computation 1 +path computation 1 +path computation 1 +path computation 2 +path computation 1 +path computation 1 +path computation 1 diff --git a/script/scenarios/demos/siggraph_asia/plane_hrp2_interp.py b/script/scenarios/demos/siggraph_asia/plane_hrp2_interp.py index 80404b0..9f09189 100644 --- a/script/scenarios/demos/siggraph_asia/plane_hrp2_interp.py +++ b/script/scenarios/demos/siggraph_asia/plane_hrp2_interp.py @@ -30,13 +30,15 @@ rLegId = '0rLeg' rLeg = 'RLEG_JOINT0' rLegOffset = [0,-0.105,0,] rLegNormal = [0,1,0] +#~ rLegNormal = [0,0,1] rLegx = 0.09; rLegy = 0.05 fullBody.addLimb(rLegId,rLeg,'',rLegOffset,rLegNormal, rLegx, rLegy, 10000, "manipulability", 0.1) lLegId = '1lLeg' lLeg = 'LLEG_JOINT0' lLegOffset = [0,-0.105,0] -lLegNormal = [0,1,0] +lLegNormal = [0,1,0] +#~ lLegNormal = [0,0,1] lLegx = 0.09; lLegy = 0.05 fullBody.addLimb(lLegId,lLeg,'',lLegOffset,rLegNormal, lLegx, lLegy, 10000, "manipulability", 0.1) diff --git a/script/scenarios/demos/siggraph_asia/scale_hrp2_interp.py b/script/scenarios/demos/siggraph_asia/scale_hrp2_interp.py index 41fc17b..6885954 100644 --- a/script/scenarios/demos/siggraph_asia/scale_hrp2_interp.py +++ b/script/scenarios/demos/siggraph_asia/scale_hrp2_interp.py @@ -51,7 +51,8 @@ lArmNormal = [1,0,0] lArmOffset = [0,0,-0.105] lArmNormal = [0,0,1] lArmx = 0.024; lArmy = 0.024 -fullBody.addLimb(larmId,larm,lHand,lArmOffset,lArmNormal, lArmx, lArmy, 10000, "manipulability", 0.1, "_6_DOF", True) +fullBody.addLimb(larmId,larm,lHand,lArmOffset,lArmNormal, lArmx, lArmy, 10000, "manipulability", 0.1, "_6_DOF", True,grasp = True) +#~ fullBody.addLimb(larmId,larm,lHand,lArmOffset,lArmNormal, lArmx, lArmy, 10000, "manipulability", 0.1, "_6_DOF", True) #~ fullBody.addLimb(larmId,larm,lHand,lArmOffset,lArmNormal, lArmx, lArmy, 10000, 0.05) @@ -62,7 +63,8 @@ rArmOffset = [0,0,-0.105] rArmNormal = [0,0,1] rArmx = 0.024; rArmy = 0.024 #disabling collision for hook -fullBody.addLimb(rarmId,rarm,rHand,rArmOffset,rArmNormal, rArmx, rArmy, 10000, "manipulability", 0.1, "_6_DOF", True) +fullBody.addLimb(rarmId,rarm,rHand,rArmOffset,rArmNormal, rArmx, rArmy, 10000, "manipulability", 0.1, "_6_DOF", True,grasp = True) +#~ fullBody.addLimb(rarmId,rarm,rHand,rArmOffset,rArmNormal, rArmx, rArmy, 10000, "manipulability", 0.1, "_6_DOF", True) rKneeId = '0RKnee' rLeg = 'RLEG_JOINT0' @@ -176,7 +178,7 @@ def genPlan(stepsize=0.1): global configs start = time.clock() print "BEFORE" - configs = fullBody.interpolate(stepsize, 0, 2, True) + configs = fullBody.interpolate(stepsize, 0, 0, True) print "AFTER" end = time.clock() print "Contact plan generated in " + str(end-start) + "seconds" diff --git a/script/scenarios/demos/siggraph_asia/scale_hrp2_path.py b/script/scenarios/demos/siggraph_asia/scale_hrp2_path.py index 1ff7e83..2230b75 100644 --- a/script/scenarios/demos/siggraph_asia/scale_hrp2_path.py +++ b/script/scenarios/demos/siggraph_asia/scale_hrp2_path.py @@ -32,8 +32,10 @@ rbprmBuilder.loadModel(urdfName, urdfNameRoms, rootJointType, meshPackageName, p rbprmBuilder.setJointBounds ("base_joint_xyz", [-1,3, -1, 1, 0, 2.2]) #~ rbprmBuilder.setFilter(['hrp2_larm_rom','hrp2_rarm_rom','hrp2_lleg_rom','hrp2_rleg_rom']) #~ rbprmBuilder.setFilter(['hrp2_lleg_rom','hrp2_rleg_rom']) -rbprmBuilder.setAffordanceFilter('hrp2_rarm_rom', ['Support','Lean']) -rbprmBuilder.setAffordanceFilter('hrp2_larm_rom', ['Support','Lean']) +#~ rbprmBuilder.setAffordanceFilter('hrp2_rarm_rom', ['Support','Lean']) +#~ rbprmBuilder.setAffordanceFilter('hrp2_larm_rom', ['Support','Lean']) +rbprmBuilder.setAffordanceFilter('hrp2_rarm_rom', ['Support']) +rbprmBuilder.setAffordanceFilter('hrp2_larm_rom', ['Support']) #~ rbprmBuilder.setAffordanceFilter('hrp2_rarm_rom', ['Lean']) #~ rbprmBuilder.setAffordanceFilter('hrp2_larm_rom', ['Lean']) rbprmBuilder.setAffordanceFilter('hrp2_lleg_rom', ['Support',]) @@ -54,7 +56,7 @@ r = Viewer (ps) q_init = rbprmBuilder.getCurrentConfig (); q_init [3:7] = [ 0.98877108, 0. , 0.14943813, 0. ] -q_init [0:3] = [-0., -0.82, 0.50]; rbprmBuilder.setCurrentConfig (q_init); r (q_init) +q_init [0:3] = [-0.05, -0.82, 0.50]; rbprmBuilder.setCurrentConfig (q_init); r (q_init) #~ q_init [0:3] = [0.1, -0.82, 0.648702]; rbprmBuilder.setCurrentConfig (q_init); r (q_init) #~ q_init [0:3] = [0, -0.63, 0.6]; rbprmBuilder.setCurrentConfig (q_init); r (q_init) #~ q_init [3:7] = [ 0.98877108, 0. , 0.14943813, 0. ] diff --git a/src/hpp/corbaserver/rbprm/rbprmfullbody.py b/src/hpp/corbaserver/rbprm/rbprmfullbody.py index a25e474..4481d93 100755 --- a/src/hpp/corbaserver/rbprm/rbprmfullbody.py +++ b/src/hpp/corbaserver/rbprm/rbprmfullbody.py @@ -130,14 +130,17 @@ class FullBody (object): # \param heuristicName: name of the selected heuristic for configuration evaluation # \param loadValues: whether values computed, other than the static ones, should be loaded in memory # \param disableEffectorCollision: whether collision detection should be disabled for end effector bones - def addLimbDatabase(self, databasepath, limbId, heuristicName, loadValues = True, disableEffectorCollision = False): + def addLimbDatabase(self, databasepath, limbId, heuristicName, loadValues = True, disableEffectorCollision = False, grasp =False): boolVal = 0. boolValEff = 0. + graspv = 0. if(loadValues): boolVal = 1. if(disableEffectorCollision): boolValEff = 1. - self.client.rbprm.rbprm.addLimbDatabase(databasepath, limbId, heuristicName, boolVal,boolValEff) + if(grasp): + graspv = 1. + self.client.rbprm.rbprm.addLimbDatabase(databasepath, limbId, heuristicName, boolVal,boolValEff,graspv) ## Add a limb to the model # @@ -158,11 +161,14 @@ class FullBody (object): # This can be problematic in terms of performance. The default value is 3 cm. # \param contactType whether the contact is punctual ("_3_DOF") or surfacic ("_6_DOF") # \param disableEffectorCollision: whether collision detection should be disabled for end effector bones - def addLimb(self, limbId, name, effectorname, offset, normal, x, y, samples, heuristicName, resolution, contactType="_6_DOF",disableEffectorCollision = False): + def addLimb(self, limbId, name, effectorname, offset, normal, x, y, samples, heuristicName, resolution, contactType="_6_DOF",disableEffectorCollision = False, grasp =False): boolValEff = 0. if(disableEffectorCollision): boolValEff = 1. - self.client.rbprm.rbprm.addLimb(limbId, name, effectorname, offset, normal, x, y, samples, heuristicName, resolution,contactType, boolValEff) + graspv = 0. + if(grasp): + graspv = 1. + self.client.rbprm.rbprm.addLimb(limbId, name, effectorname, offset, normal, x, y, samples, heuristicName, resolution,contactType, boolValEff,graspv) ## Returns the configuration of a limb described by a sample # diff --git a/src/rbprmbuilder.impl.cc b/src/rbprmbuilder.impl.cc index 77d1d3c..9fb446f 100755 --- a/src/rbprmbuilder.impl.cc +++ b/src/rbprmbuilder.impl.cc @@ -955,7 +955,7 @@ namespace hpp { } void RbprmBuilder::addLimb(const char* id, const char* limb, const char* effector, const hpp::floatSeq& offset, const hpp::floatSeq& normal, double x, double y, - unsigned short samples, const char* heuristicName, double resolution, const char *contactType, double disableEffectorCollision) throw (hpp::Error) + unsigned short samples, const char* heuristicName, double resolution, const char *contactType, double disableEffectorCollision, double grasp) throw (hpp::Error) { if(!fullBodyLoaded_) throw Error ("No full body robot was loaded"); @@ -973,7 +973,7 @@ namespace hpp { cType = hpp::rbprm::_3_DOF; } fullBody_->AddLimb(std::string(id), std::string(limb), std::string(effector), off, norm, x, y, - problemSolver_->collisionObstacles(), samples,heuristicName,resolution,cType,disableEffectorCollision > 0.5); + problemSolver_->collisionObstacles(), samples,heuristicName,resolution,cType,disableEffectorCollision > 0.5, grasp > 0.5); } catch(std::runtime_error& e) { @@ -982,7 +982,7 @@ namespace hpp { } - void RbprmBuilder::addLimbDatabase(const char* databasePath, const char* id, const char* heuristicName, double loadValues, double disableEffectorCollision) throw (hpp::Error) + void RbprmBuilder::addLimbDatabase(const char* databasePath, const char* id, const char* heuristicName, double loadValues, double disableEffectorCollision, double grasp) throw (hpp::Error) { if(!fullBodyLoaded_) throw Error ("No full body robot was loaded"); @@ -990,7 +990,7 @@ namespace hpp { { std::string fileName(databasePath); fullBody_->AddLimb(fileName, std::string(id), problemSolver_->collisionObstacles(), heuristicName, loadValues > 0.5, - disableEffectorCollision > 0.5); + disableEffectorCollision > 0.5, grasp > 0.5); } catch(std::runtime_error& e) { @@ -1684,6 +1684,7 @@ assert(s2 == s1 +1); { bool success(false); core::Configuration_t res = rbprm::interpolation::projectOnCom(fulllBody, problem,state,targetCom, success); + std::cout << "no com " << targetCom << std::endl; if(!success) { throw std::runtime_error("could not project state on COM constraint"); diff --git a/src/rbprmbuilder.impl.hh b/src/rbprmbuilder.impl.hh index 6d7687a..4e5ad15 100755 --- a/src/rbprmbuilder.impl.hh +++ b/src/rbprmbuilder.impl.hh @@ -146,9 +146,9 @@ namespace hpp { virtual void addLimb(const char* id, const char* limb, const char* effector, const hpp::floatSeq& offset, const hpp::floatSeq& normal, double x, double y, unsigned short samples, const char *heuristicName, double resolution, const char *contactType, - double disableEffectorCollision) throw (hpp::Error); + double disableEffectorCollision, double grasp) throw (hpp::Error); virtual void addLimbDatabase(const char* databasePath, const char* id, const char* heuristicName, double loadValues, - double disableEffectorCollision) throw (hpp::Error); + double disableEffectorCollision, double grasp) throw (hpp::Error); virtual void setStartState(const hpp::floatSeq& configuration, const hpp::Names_t& contactLimbs) throw (hpp::Error); virtual void setEndState(const hpp::floatSeq& configuration, const hpp::Names_t& contactLimbs) throw (hpp::Error); -- GitLab