Skip to content

Commit be9d782

Browse files
committed
Merge pull request #156 from personalrobotics/feature/generic_object_tsr
Added generic-object TSRs.
2 parents 0fe6933 + 2a34cd4 commit be9d782

File tree

3 files changed

+38
-30
lines changed

3 files changed

+38
-30
lines changed

src/prpy/base/mobilebase.py

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -85,41 +85,35 @@ def Forward(self, meters, execute=True, direction=None, **kw_args):
8585
if abs(numpy.linalg.norm(direction) - 1.0) > 1e-3:
8686
raise ValueError('Direction must be a unit vector.')
8787

88-
if self.simulated:
89-
with self.robot.GetEnv():
90-
start_pose = self.robot.GetTransform()
91-
offset_pose = numpy.eye(4)
92-
offset_pose[0:3, 3] = meters * direction
93-
goal_pose = numpy.dot(start_pose, offset_pose)
94-
95-
path = create_affine_trajectory(self.robot, [ start_pose, goal_pose ])
96-
if execute:
97-
return self.robot.ExecutePath(path, **kw_args)
98-
else:
99-
return path
88+
with self.robot.GetEnv():
89+
start_pose = self.robot.GetTransform()
90+
offset_pose = numpy.eye(4)
91+
offset_pose[0:3, 3] = meters * direction
92+
goal_pose = numpy.dot(start_pose, offset_pose)
93+
94+
path = create_affine_trajectory(self.robot, [ start_pose, goal_pose ])
95+
if execute:
96+
return self.robot.ExecutePath(path, **kw_args)
10097
else:
101-
raise NotImplementedError('DriveForward is not implemented')
98+
return path
10299

103100
def Rotate(self, angle_rad, execute=True, **kw_args):
104101
"""
105102
Rotates the robot the desired distance
106103
@param angle_rad the number of radians to rotate
107104
@param timeout duration to wait for execution
108105
"""
109-
if self.simulated:
110-
with self.robot.GetEnv():
111-
start_pose = self.robot.GetTransform()
112-
106+
with self.robot.GetEnv():
107+
start_pose = self.robot.GetTransform()
108+
113109
relative_pose = openravepy.matrixFromAxisAngle([ 0., 0., angle_rad ])
114110
goal_pose = numpy.dot(start_pose, relative_pose)
115111

116-
path = create_affine_trajectory(self.robot, [ start_pose, goal_pose ])
117-
if execute:
118-
return self.robot.ExecutePath(path, **kw_args)
119-
else:
120-
return path
112+
path = create_affine_trajectory(self.robot, [ start_pose, goal_pose ])
113+
if execute:
114+
return self.robot.ExecutePath(path, **kw_args)
121115
else:
122-
raise NotImplementedError('Rotate is not implemented')
116+
return path
123117

124118
def DriveStraightUntilForce(self, direction, velocity=0.1, force_threshold=3.0,
125119
max_distance=None, timeout=None, left_arm=True, right_arm=True):

src/prpy/base/robot.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@ def wrapper_method(*args, **kw_args):
110110

111111
delegate_method = self.actions.get_action(name)
112112
@functools.wraps(delegate_method)
113-
def wrapper_method(obj, *args, **kw_args):
114-
return delegate_method(self, obj, *args, **kw_args)
113+
def wrapper_method(*args, **kw_args):
114+
return delegate_method(self, *args, **kw_args)
115115
return wrapper_method
116116

117117
raise AttributeError('{0:s} is missing method "{1:s}".'.format(repr(self), name))

src/prpy/tsr/tsrlibrary.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ def wrapped_func(robot, kinbody, *args, **kw_args):
5555

5656
class TSRLibrary(object):
5757
all_factories = collections.defaultdict(lambda: collections.defaultdict(dict))
58+
generic_kinbody_key = "_*" # Something that is unlikely to be an actual kinbody name
5859

5960
def __init__(self, robot, robot_name=None):
6061
"""
@@ -80,18 +81,28 @@ def __call__(self, kinbody, action_name, *args, **kw_args):
8081
@return list of TSRChains
8182
"""
8283
kinbody_name = kw_args.get('kinbody_name', None)
83-
if kinbody_name is None:
84+
if kinbody_name is None and kinbody is not None:
8485
kinbody_name = self.get_object_type(kinbody)
8586
logger.debug('Inferred KinBody name "%s" for TSR.', kinbody_name)
8687

88+
f = None
8789
try:
8890
f = self.all_factories[self.robot_name][kinbody_name][action_name]
8991
except KeyError:
90-
raise KeyError('There is no TSR factory registered for action "{:s}"'
91-
' with robot "{:s}" and object "{:s}".'.format(
92-
action_name, self.robot_name, kinbody_name))
92+
pass
9393

94-
return f(self.robot, kinbody, *args, **kw_args)
94+
if f is None:
95+
try:
96+
f = self.all_factories[self.robot_name][self.generic_kinbody_key][action_name]
97+
except KeyError:
98+
raise KeyError('There is no TSR factory registered for action "{:s}"'
99+
' with robot "{:s}" and object "{:s}".'.format(
100+
action_name, self.robot_name, kinbody_name))
101+
102+
if kinbody is None:
103+
return f(self.robot, *args, **kw_args)
104+
else:
105+
return f(self.robot, kinbody, *args, **kw_args)
95106

96107
def load_yaml(self, yaml_file):
97108
"""
@@ -167,6 +178,9 @@ def add_factory(cls, func, robot_name, object_name, action_name):
167178
logger.debug('Adding TSRLibrary factory for robot "%s", object "%s", action "%s".',
168179
robot_name, object_name, action_name)
169180

181+
if object_name is None:
182+
object_name = cls.generic_kinbody_key
183+
170184
if action_name in cls.all_factories[robot_name][object_name]:
171185
logger.warning('Overwriting duplicate TSR factory for action "%s"'
172186
' with robot "%s" and object "%s"',

0 commit comments

Comments
 (0)