Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Jason Chemin
hpp-rbprm-corba
Commits
ddb8acf2
Commit
ddb8acf2
authored
Nov 16, 2016
by
Steve Tonneau
Browse files
[BUG FIX]: contact projection made from octree root of limb
parent
e13ba644
Changes
4
Hide whitespace changes
Inline
Side-by-side
idl/hpp/corbaserver/rbprm/rbprmbuilder.idl
View file @
ddb8acf2
...
...
@@ -195,6 +195,15 @@ module hpp
/// \return transformed configuration for which all possible contacts have been created
floatSeq getContactSamplesIds(in string name, in floatSeq dofArray, in floatSeq direction) raises (Error);
/// Given a configuration and a limb, returns the id of all samples potentially in contact with the
/// environment, ordered by their efficiency
/// \param name name of the considered limb
/// \param dofArray considered configuration of the robot
/// \param direction desired direction of motion for the robot
/// \return transformed configuration for which all possible contacts have been created
floatSeqSeq getContactSamplesProjected(in string name, in floatSeq dofArray, in floatSeq direction,
in unsigned short numSamples) raises (Error);
/// get Ids of limb in an octree cell
/// \param name name of the considered limb
/// \param octreeNodeId considered configuration of the robot
...
...
script/scenarios/demos/ground_crouch_hyq_interp_bridge.py
0 → 100644
View file @
ddb8acf2
import
matplotlib
#~ matplotlib.use('Agg')
import
matplotlib.pyplot
as
plt
from
hpp.corbaserver.rbprm.rbprmbuilder
import
Builder
from
hpp.corbaserver.rbprm.rbprmfullbody
import
FullBody
from
hpp.corbaserver.rbprm.problem_solver
import
ProblemSolver
from
hpp.gepetto
import
Viewer
from
os
import
environ
ins_dir
=
environ
[
'DEVEL_DIR'
]
db_dir
=
ins_dir
+
"/install/share/hyq-rbprm/database/hyq_"
import
ground_crouch_hyq_path_bridge
as
tp
#~ import ground_crouch_hyq_path_bridge as tp
packageName
=
"hyq_description"
meshPackageName
=
"hyq_description"
rootJointType
=
"freeflyer"
##
# Information to retrieve urdf and srdf files.
urdfName
=
"hyq"
urdfSuffix
=
""
srdfSuffix
=
""
fullBody
=
FullBody
()
fullBody
.
loadFullBodyModel
(
urdfName
,
rootJointType
,
meshPackageName
,
packageName
,
urdfSuffix
,
srdfSuffix
)
fullBody
.
setJointBounds
(
"base_joint_xyz"
,
[
-
6
,
5
,
-
4
,
4
,
0.6
,
2
])
from
hpp.corbaserver.rbprm.problem_solver
import
ProblemSolver
nbSamples
=
20000
ps
=
tp
.
ProblemSolver
(
fullBody
)
r
=
tp
.
Viewer
(
ps
)
rootName
=
'base_joint_xyz'
# Creating limbs
# cType is "_3_DOF": positional constraint, but no rotation (contacts are punctual)
cType
=
"_3_DOF"
# string identifying the limb
rLegId
=
'rfleg'
# First joint of the limb, as in urdf file
rLeg
=
'rf_haa_joint'
# Last joint of the limb, as in urdf file
rfoot
=
'rf_foot_joint'
# Specifying the distance between last joint and contact surface
offset
=
[
0.
,
-
0.021
,
0.
]
# Specifying the contact surface direction when the limb is in rest pose
normal
=
[
0
,
1
,
0
]
# Specifying the rectangular contact surface length
legx
=
0.02
;
legy
=
0.02
# remaining parameters are the chosen heuristic (here, manipulability), and the resolution of the octree (here, 10 cm).
def
addLimbDb
(
limbId
,
heuristicName
,
loadValues
=
True
,
disableEffectorCollision
=
False
):
fullBody
.
addLimbDatabase
(
str
(
db_dir
+
limbId
+
'.db'
),
limbId
,
heuristicName
,
loadValues
,
disableEffectorCollision
)
fullBody
.
addLimb
(
rLegId
,
rLeg
,
rfoot
,
offset
,
normal
,
legx
,
legy
,
nbSamples
,
"forward"
,
0.1
,
cType
)
lLegId
=
'lhleg'
lLeg
=
'lh_haa_joint'
lfoot
=
'lh_foot_joint'
fullBody
.
addLimb
(
lLegId
,
lLeg
,
lfoot
,
offset
,
normal
,
legx
,
legy
,
nbSamples
,
"backward"
,
0.05
,
cType
)
rarmId
=
'rhleg'
rarm
=
'rh_haa_joint'
rHand
=
'rh_foot_joint'
fullBody
.
addLimb
(
rarmId
,
rarm
,
rHand
,
offset
,
normal
,
legx
,
legy
,
nbSamples
,
"backward"
,
0.05
,
cType
)
#~
larmId
=
'lfleg'
larm
=
'lf_haa_joint'
lHand
=
'lf_foot_joint'
fullBody
.
addLimb
(
larmId
,
larm
,
lHand
,
offset
,
normal
,
legx
,
legy
,
nbSamples
,
"forward"
,
0.05
,
cType
)
fullBody
.
runLimbSampleAnalysis
(
rLegId
,
"jointLimitsDistance"
,
True
)
fullBody
.
runLimbSampleAnalysis
(
rarmId
,
"jointLimitsDistance"
,
True
)
fullBody
.
runLimbSampleAnalysis
(
larmId
,
"jointLimitsDistance"
,
True
)
fullBody
.
runLimbSampleAnalysis
(
lLegId
,
"jointLimitsDistance"
,
True
)
q_0
=
fullBody
.
getCurrentConfig
();
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
=
fullBody
.
generateContacts
(
q_init
,
[
0
,
0
,
1
])
q_0
=
fullBody
.
getCurrentConfig
();
fullBody
.
setCurrentConfig
(
q_goal
)
q_goal
=
fullBody
.
generateContacts
(
q_goal
,
[
0
,
0
,
1
])
fullBody
.
setStartState
(
q_init
,[])
fullBody
.
setEndState
(
q_goal
,[
rLegId
,
lLegId
,
rarmId
,
larmId
])
r
(
q_init
)
configs
=
[]
#~ configs = fullBody.interpolate(0.08,1,5) # bridge
from
hpp.gepetto
import
PathPlayer
pp
=
PathPlayer
(
fullBody
.
client
.
basic
,
r
)
from
hpp.corbaserver.rbprm.tools.cwc_trajectory_helper
import
step
,
clean
,
stats
,
saveAllData
,
play_traj
limbsCOMConstraints
=
{
rLegId
:
{
'file'
:
"hyq/"
+
rLegId
+
"_com.ineq"
,
'effector'
:
rfoot
},
lLegId
:
{
'file'
:
"hyq/"
+
lLegId
+
"_com.ineq"
,
'effector'
:
lfoot
},
rarmId
:
{
'file'
:
"hyq/"
+
rarmId
+
"_com.ineq"
,
'effector'
:
rHand
},
larmId
:
{
'file'
:
"hyq/"
+
larmId
+
"_com.ineq"
,
'effector'
:
lHand
}
}
def
act
(
i
,
numOptim
=
0
,
use_window
=
0
,
friction
=
0.5
,
optim_effectors
=
True
,
time_scale
=
20
,
verbose
=
False
,
draw
=
False
,
trackedEffectors
=
[]):
return
step
(
fullBody
,
configs
,
i
,
numOptim
,
pp
,
limbsCOMConstraints
,
friction
,
optim_effectors
=
optim_effectors
,
time_scale
=
time_scale
,
useCOMConstraints
=
False
,
use_window
=
use_window
,
verbose
=
verbose
,
draw
=
draw
,
trackedEffectors
=
trackedEffectors
)
#~ for i in range(6,25):
#~ act(i, 60, optim_effectors = True)
import
time
#DEMO METHODS
def
initConfig
():
r
.
client
.
gui
.
setVisibility
(
"hyq"
,
"ON"
)
tp
.
cl
.
problem
.
selectProblem
(
"default"
)
tp
.
r
.
client
.
gui
.
setVisibility
(
"toto"
,
"OFF"
)
tp
.
r
.
client
.
gui
.
setVisibility
(
"hyq_trunk"
,
"OFF"
)
r
(
q_init
)
def
endConfig
():
r
.
client
.
gui
.
setVisibility
(
"hyq"
,
"ON"
)
tp
.
cl
.
problem
.
selectProblem
(
"default"
)
tp
.
r
.
client
.
gui
.
setVisibility
(
"toto"
,
"OFF"
)
tp
.
r
.
client
.
gui
.
setVisibility
(
"hyq_trunk"
,
"OFF"
)
r
(
q_goal
)
def
rootPath
():
r
.
client
.
gui
.
setVisibility
(
"hyq"
,
"OFF"
)
tp
.
cl
.
problem
.
selectProblem
(
"rbprm_path"
)
tp
.
r
.
client
.
gui
.
setVisibility
(
"toto"
,
"OFF"
)
r
.
client
.
gui
.
setVisibility
(
"hyq"
,
"OFF"
)
r
.
client
.
gui
.
setVisibility
(
"hyq_trunk"
,
"ON"
)
tp
.
pp
(
0
)
r
.
client
.
gui
.
setVisibility
(
"hyq_trunk"
,
"OFF"
)
r
.
client
.
gui
.
setVisibility
(
"hyq"
,
"ON"
)
tp
.
cl
.
problem
.
selectProblem
(
"default"
)
def
genPlan
():
r
.
client
.
gui
.
setVisibility
(
"hyq"
,
"ON"
)
tp
.
cl
.
problem
.
selectProblem
(
"default"
)
tp
.
r
.
client
.
gui
.
setVisibility
(
"toto"
,
"OFF"
)
tp
.
r
.
client
.
gui
.
setVisibility
(
"hyq_trunk"
,
"OFF"
)
global
configs
start
=
time
.
clock
()
configs
=
fullBody
.
interpolate
(
0.12
,
10
,
10
,
True
)
end
=
time
.
clock
()
print
"Contact plan generated in "
+
str
(
end
-
start
)
+
"seconds"
def
contactPlan
():
tp
.
cl
.
problem
.
selectProblem
(
"default"
)
r
.
client
.
gui
.
setVisibility
(
"hyq"
,
"ON"
)
tp
.
r
.
client
.
gui
.
setVisibility
(
"toto"
,
"OFF"
)
tp
.
r
.
client
.
gui
.
setVisibility
(
"hyq_trunk"
,
"OFF"
)
for
i
in
range
(
1
,
len
(
configs
)):
r
(
configs
[
i
]);
time
.
sleep
(
0.5
)
def
interpolate
():
tp
.
cl
.
problem
.
selectProblem
(
"default"
)
r
.
client
.
gui
.
setVisibility
(
"hyq"
,
"ON"
)
tp
.
r
.
client
.
gui
.
setVisibility
(
"toto"
,
"OFF"
)
tp
.
r
.
client
.
gui
.
setVisibility
(
"hyq_trunk"
,
"OFF"
)
for
i
in
range
(
7
,
20
):
act
(
i
,
1
,
optim_effectors
=
True
)
def
play
(
frame_rate
=
1.
/
24.
):
play_traj
(
fullBody
,
pp
,
frame_rate
)
def
a
():
print
"initial configuration"
initConfig
()
def
b
():
print
"end configuration"
endConfig
()
def
c
():
print
"displaying root path"
rootPath
()
def
d
():
print
"computing contact plan"
genPlan
()
def
e
():
print
"displaying contact plan"
contactPlan
()
def
f
():
print
"computing feasible com trajectory"
interpolate
()
def
g
():
print
"playing feasible trajectory"
play
()
print
"Root path generated in "
+
str
(
tp
.
t
)
+
" ms."
script/scenarios/demos/ground_crouch_hyq_path_bridge.py
0 → 100644
View file @
ddb8acf2
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
=
'hyq_trunk_large'
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
=
'hyq_trunk'
urdfNameRom
=
[
'hyq_lhleg_rom'
,
'hyq_lfleg_rom'
,
'hyq_rfleg_rom'
,
'hyq_rhleg_rom'
]
urdfSuffix
=
""
srdfSuffix
=
""
rbprmBuilder
=
Builder
()
rbprmBuilder
.
loadModel
(
urdfName
,
urdfNameRom
,
rootJointType
,
meshPackageName
,
packageName
,
urdfSuffix
,
srdfSuffix
)
rbprmBuilder
.
setJointBounds
(
"base_joint_xyz"
,
[
-
6
,
5
,
-
4
,
4
,
0.6
,
2
])
rbprmBuilder
.
setFilter
([
'hyq_rhleg_rom'
,
'hyq_lfleg_rom'
,
'hyq_rfleg_rom'
,
'hyq_lhleg_rom'
])
rbprmBuilder
.
setAffordanceFilter
(
'hyq_rhleg_rom'
,
[
'Support'
])
rbprmBuilder
.
setAffordanceFilter
(
'hyq_rfleg_rom'
,
[
'Support'
,])
rbprmBuilder
.
setAffordanceFilter
(
'hyq_lhleg_rom'
,
[
'Support'
])
rbprmBuilder
.
setAffordanceFilter
(
'hyq_lfleg_rom'
,
[
'Support'
,])
rbprmBuilder
.
boundSO3
([
-
0.1
,
0.1
,
-
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 [0:3] = [-5, 0, 0.63]; rbprmBuilder.setCurrentConfig (q_init); r (q_init)
q_init
[
0
:
3
]
=
[
-
2
,
0.47
,
0.63
];
rbprmBuilder
.
setCurrentConfig
(
q_init
);
r
(
q_init
)
q_goal
=
q_init
[::]
#~ q_goal [0:3] = [5, 0, 0.63]; r (q_goal)
q_goal
[
0
:
3
]
=
[
3
,
0.47
,
0.63
];
r
(
q_goal
)
ps
.
addPathOptimizer
(
"RandomShortcut"
)
ps
.
setInitialConfig
(
q_init
)
ps
.
addGoalConfig
(
q_goal
)
from
hpp.corbaserver.affordance.affordance
import
AffordanceTool
afftool
=
AffordanceTool
()
afftool
.
loadObstacleModel
(
packageName
,
"groundcrouch"
,
"planning"
,
r
)
afftool
.
visualiseAffordances
(
'Support'
,
r
,
[
0.25
,
0.5
,
0.5
])
# Choosing RBPRM shooter and path validation methods.
# Note that the standard RRT algorithm is used.
ps
.
client
.
problem
.
selectConFigurationShooter
(
"RbprmShooter"
)
ps
.
client
.
problem
.
selectPathValidation
(
"RbprmPathValidation"
,
0.05
)
#~ r.loadObstacleModel (packageName, "groundcrouch", "planning")
#~ ps.solve ()
t
=
ps
.
solve
()
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
()
#~ rbprmBuilder.exportPath (r, ps.client.problem, 1, 0.1, "obstacle_hyq_robust_10_path.txt")
from
hpp.gepetto
import
PathPlayer
pp
=
PathPlayer
(
rbprmBuilder
.
client
.
basic
,
r
)
#~ pp (0)
#~ pp (1)
r
(
q_init
)
q_far
=
q_init
[::]
q_far
[
0
:
3
]
=
[
-
2
,
-
3
,
0.63
];
r
(
q_far
)
for
i
in
range
(
1
,
10
):
rbprmBuilder
.
client
.
basic
.
problem
.
optimizePath
(
i
)
cl
=
Client
()
cl
.
problem
.
selectProblem
(
"rbprm_path"
)
rbprmBuilder2
=
Robot
(
"toto"
)
ps2
=
ProblemSolver
(
rbprmBuilder2
)
cl
.
problem
.
selectProblem
(
"default"
)
cl
.
problem
.
movePathToProblem
(
3
,
"rbprm_path"
,
rbprmBuilder
.
getAllJointNames
())
r2
=
Viewer
(
ps2
)
r2
(
q_far
)
src/rbprmbuilder.impl.cc
View file @
ddb8acf2
...
...
@@ -838,13 +838,22 @@ namespace hpp {
+
std
::
string
(
limbname
)
+
" to robot; limb not defined."
);
}
const
RbPrmLimbPtr_t
&
limb
=
lit
->
second
;
fcl
::
Transform3f
transform
=
limb
->
limb_
->
robot
()
->
rootJoint
()
->
childJoint
(
0
)
->
currentTransformation
();
// get root transform from configuration
fcl
::
Transform3f
transform
=
limb
->
octreeRoot
();
// get root transform from configuration
// TODO fix as in rbprm-fullbody.cc!!
std
::
vector
<
sampling
::
T_OctreeReport
>
reports
(
problemSolver_
->
collisionObstacles
().
size
());
const
affMap_t
&
affMap
=
problemSolver_
->
map
<
std
::
vector
<
boost
::
shared_ptr
<
model
::
CollisionObject
>
>
>
();
if
(
affMap
.
empty
())
{
throw
hpp
::
Error
(
"No affordances found. Unable to interpolate."
);
}
const
model
::
ObjectVector_t
objects
=
getAffObjectsForLimb
(
std
::
string
(
limbname
),
affMap
,
bindShooter_
.
affFilter_
);
std
::
vector
<
sampling
::
T_OctreeReport
>
reports
(
objects
.
size
());
std
::
size_t
i
(
0
);
//#pragma omp parallel for
for
(
model
::
ObjectVector_t
::
const_iterator
oit
=
problemSolver_
->
collisionObstacles
()
.
begin
();
oit
!=
problemSolver_
->
collisionObstacles
()
.
end
();
++
oit
,
++
i
)
for
(
model
::
ObjectVector_t
::
const_iterator
oit
=
objects
.
begin
();
oit
!=
objects
.
end
();
++
oit
,
++
i
)
{
sampling
::
GetCandidates
(
limb
->
sampleContainer_
,
transform
,
*
oit
,
dir
,
reports
[
i
]);
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment