Skip to content

Commit df5f2d9

Browse files
authored
Merge pull request #4 from gtrll/feature/savesdf
save gpmp2 sdf to bin file and an example
2 parents e56cc24 + e20d3ff commit df5f2d9

File tree

3 files changed

+95
-17
lines changed

3 files changed

+95
-17
lines changed

examples/save_sdf_pr2.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import atexit
2+
from openravepy import *
3+
import orgpmp2.orgpmp2
4+
import time
5+
import types
6+
import prpy.kin
7+
import prpy.rave
8+
import sys
9+
sys.path.append('data')
10+
import problemsets
11+
12+
# Initialize openrave logging
13+
from openravepy.misc import InitOpenRAVELogging
14+
InitOpenRAVELogging()
15+
16+
# Problemset
17+
problemset = 'industrial2'
18+
19+
# Start and end joint angles
20+
n_states, states = problemsets.states(problemset)
21+
start_joints = numpy.array(states[3])
22+
end_joints = numpy.array(states[1])
23+
24+
# Set up openrave and load env
25+
RaveInitialize(True, level=DebugLevel.Info)
26+
atexit.register(RaveDestroy)
27+
e = Environment()
28+
atexit.register(e.Destroy)
29+
e.Load(problemsets.env_file(problemset))
30+
e.Load('data/robots/pr2_gpmp2spheres.robot.xml')
31+
e.SetViewer('qtcoin')
32+
33+
# Set up robot
34+
r = e.GetRobots()[0]
35+
r.SetTransform(matrixFromPose(problemsets.default_base_pose(problemset)))
36+
rave_joint_names = [joint.GetName() for joint in r.GetJoints()]
37+
rave_inds, rave_values = [],[]
38+
for (name,val) in zip(problemsets.joint_names(problemset), problemsets.default_joint_values(problemset)):
39+
if name in rave_joint_names:
40+
i = rave_joint_names.index(name)
41+
rave_inds.append(i)
42+
rave_values.append(val)
43+
r.SetDOFValues(rave_values, rave_inds)
44+
active_joint_inds = [rave_joint_names.index(name) for name in problemsets.active_joints(problemset)]
45+
r.SetActiveDOFs(active_joint_inds, problemsets.active_affine(problemset))
46+
r.SetActiveDOFValues(start_joints)
47+
48+
# Calculate arm_pose
49+
l = r.GetLinks()
50+
for i in l:
51+
if (i.GetName() == "torso_lift_link"):
52+
lp1 = poseFromMatrix(i.GetTransform())
53+
if (i.GetName() == "r_shoulder_pan_link"):
54+
lp2 = poseFromMatrix(i.GetTransform())
55+
arm_pose = numpy.array([lp1[0], lp1[1], lp1[2], lp1[3], lp2[4], lp2[5], lp2[6]])
56+
arm_origin = numpy.array([lp2[4], lp2[5], lp2[6]])
57+
58+
# Load gpmp2
59+
m_gpmp2 = RaveCreateModule(e,'orgpmp2')
60+
orgpmp2.orgpmp2.bind(m_gpmp2)
61+
62+
# SDF
63+
# remove right arm links to calculate sdf
64+
l = r.GetLinks()
65+
right_arm_links = ['r_shoulder_pan_link', 'r_shoulder_lift_link',
66+
'r_upper_arm_roll_link', 'r_upper_arm_link', 'r_elbow_flex_link', 'r_forearm_roll_link',
67+
'r_forearm_cam_frame', 'r_forearm_cam_optical_frame', 'r_forearm_link', 'r_wrist_flex_link',
68+
'r_wrist_roll_link', 'r_gripper_palm_link', 'r_gripper_l_finger_link', 'r_gripper_l_finger_tip_link',
69+
'r_gripper_motor_slider_link', 'r_gripper_motor_screw_link', 'r_gripper_led_frame',
70+
'r_gripper_motor_accelerometer_link', 'r_gripper_r_finger_link', 'r_gripper_r_finger_tip_link',
71+
'r_gripper_l_finger_tip_frame', 'r_gripper_tool_frame']
72+
for i in l:
73+
if i.GetName() in right_arm_links:
74+
i.Enable(False)
75+
# Compute distance field for the env and remaining robot
76+
m_gpmp2.computedistancefield(cache_filename='sdf_env_'+problemset+'.dat',
77+
centroid=arm_origin,extents=numpy.array([1.2,1.2,1.2]),res=0.02,save_sdf=1)
78+
79+
raw_input()
80+
sys.exit()

pythonsrc/orgpmp2/orgpmp2.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def viewspheres(mod, robot=None, releasegil=False):
2626
return mod.SendCommand(cmd, releasegil)
2727

2828
def computedistancefield(mod, res=None, centroid=None, extents=None,
29-
cache_filename=None, releasegil=False):
29+
cache_filename=None, save_sdf=None, releasegil=False):
3030
cmd = 'computedistancefield'
3131
if res is not None:
3232
cmd += ' res %f' % res
@@ -36,6 +36,8 @@ def computedistancefield(mod, res=None, centroid=None, extents=None,
3636
cmd += ' extents %s' % shquot(' '.join([str(v) for v in extents]))
3737
if cache_filename is not None:
3838
cmd += ' cache_filename %s' % shquot(cache_filename)
39+
if save_sdf is not None:
40+
cmd += ' save_sdf %d' % save_sdf
3941
print 'cmd:', cmd
4042
return mod.SendCommand(cmd, releasegil)
4143

src/orgpmp2_mod.cpp

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include <time.h>
77
#include <cblas.h>
8+
#include <string>
89

910
extern "C" {
1011
#include "utils/grid.h"
@@ -252,6 +253,7 @@ int mod::computedistancefield(int argc, char * argv[], std::ostream& sout)
252253
struct timespec ticks_tic;
253254
struct timespec ticks_toc;
254255
int sdf_data_loaded;
256+
int save_sdf = 0;
255257

256258
// lock environment
257259
lockenv = OpenRAVE::EnvironmentMutex::scoped_lock(this->e->GetMutex());
@@ -289,6 +291,8 @@ int mod::computedistancefield(int argc, char * argv[], std::ostream& sout)
289291
res = atof(argv[++i]);
290292
else if (strcmp(argv[i],"cache_filename")==0 && i+1<argc)
291293
cache_filename = argv[++i];
294+
else if (strcmp(argv[i],"save_sdf")==0 && i+1<argc)
295+
save_sdf = atoi(argv[++i]);
292296
else {
293297
RAVELOG_ERROR("argument %s not known!\n", argv[i]);
294298
throw OpenRAVE::openrave_exception("Bad arguments!");
@@ -459,7 +463,7 @@ int mod::computedistancefield(int argc, char * argv[], std::ostream& sout)
459463
this->n_sdfs++;
460464

461465
// assign sdf to gtsam variable
462-
RAVELOG_INFO("Saving sdf to gtsam variable.\n");
466+
RAVELOG_INFO("Saving sdf to gpmp2 variable.\n");
463467

464468
{
465469
using namespace std;
@@ -482,22 +486,14 @@ int mod::computedistancefield(int argc, char * argv[], std::ostream& sout)
482486
Point3 gorigin(origin[0],origin[1],origin[2]);
483487

484488
this->gtsam_sdf = gpmp2::SignedDistanceField(gorigin, res, env_sdf);
485-
/*
486-
// save to text file
487-
std::ofstream myFile;
488-
myFile.open((std::string(getenv("HOME"))+"/Desktop/sdf.txt").c_str(), std::ios::app);
489-
for (k=0; k<gsize_z; k++) {
490-
for (i=0; i<gsize_y; i++) {
491-
for (j=0; j<gsize_x; j++) {
492-
myFile<<env_sdf[k](i,j)<<"\t";
493-
}
494-
myFile<<std::endl;
495-
}
496-
myFile<<std::endl;
497-
myFile<<std::endl;
489+
490+
if (save_sdf)
491+
{
492+
string save_file(cache_filename);
493+
save_file = save_file.substr(0,save_file.find_last_of('.'))+".bin";
494+
RAVELOG_INFO("Saving gpmp2 sdf to .bin file.\n");
495+
gtsam_sdf.saveSDF(save_file);
498496
}
499-
myFile.close();
500-
*/
501497
}
502498
return 0;
503499
}

0 commit comments

Comments
 (0)