fix(experement): leave the dock even when the axial retreat is rejected
The tool is already docked before the retreat, so a rejected axial move can fall through to a graded +Y exit at a lower height instead of aborting the route.
This commit is contained in:
@@ -451,29 +451,44 @@ class ReferenceOperations:
|
|||||||
rack_pose,
|
rack_pose,
|
||||||
)
|
)
|
||||||
self._require_synchronized()
|
self._require_synchronized()
|
||||||
self._retreat(goal, f'dock_tool({tool_name})')
|
try:
|
||||||
|
self._retreat(goal, f'dock_tool({tool_name})')
|
||||||
|
except OperationError as error:
|
||||||
|
# The axial retreat can be rejected from the socket branch.
|
||||||
|
# The tool is already docked, so stepping out is still safe.
|
||||||
|
if 'Планирование' not in str(error):
|
||||||
|
raise
|
||||||
|
self.motion.reset_stop()
|
||||||
# Step out of the rack along +Y before any joint-space move; the
|
# Step out of the rack along +Y before any joint-space move; the
|
||||||
# axial retreat alone can leave the wrist against its limit.
|
# axial retreat alone can leave the wrist against its limit. Use a
|
||||||
transfer = self._above(goal, self.geometry.transfer_gap)
|
# lower height if the full retreat was rejected.
|
||||||
for offset in (0.10, 0.06, 0.03):
|
for gap in (
|
||||||
exit_pose = Transform.from_xyz_rpy(
|
self.geometry.transfer_gap, 0.05, 0.02,
|
||||||
[0.0, offset, 0.0], [0.0, 0.0, 0.0],
|
):
|
||||||
parent='world', child='rack_exit_offset',
|
base = self._above(goal, gap)
|
||||||
).compose_relaxed(transfer)
|
reached = False
|
||||||
label = (
|
for offset in (0.10, 0.06, 0.03):
|
||||||
f'dock_tool({tool_name}):exit' if offset == 0.10
|
exit_pose = Transform.from_xyz_rpy(
|
||||||
else f'dock_tool({tool_name}):exit:{offset:.2f}'
|
[0.0, offset, 0.0], [0.0, 0.0, 0.0],
|
||||||
)
|
parent='world', child='rack_exit_offset',
|
||||||
try:
|
).compose_relaxed(base)
|
||||||
self._move(
|
label = (
|
||||||
exit_pose, 'lin', self.geometry.speeds['transfer'],
|
f'dock_tool({tool_name}):exit' if offset == 0.10
|
||||||
label,
|
else f'dock_tool({tool_name}):exit:{offset:.2f}'
|
||||||
)
|
)
|
||||||
|
try:
|
||||||
|
self._move(
|
||||||
|
exit_pose, 'lin',
|
||||||
|
self.geometry.speeds['transfer'], label,
|
||||||
|
)
|
||||||
|
reached = True
|
||||||
|
break
|
||||||
|
except OperationError as error:
|
||||||
|
if 'Планирование' not in str(error):
|
||||||
|
raise
|
||||||
|
self.motion.reset_stop()
|
||||||
|
if reached:
|
||||||
break
|
break
|
||||||
except OperationError as error:
|
|
||||||
if 'Планирование' not in str(error):
|
|
||||||
raise
|
|
||||||
self.motion.reset_stop()
|
|
||||||
self._emit('dock_tool', object=tool_name, phase='done')
|
self._emit('dock_tool', object=tool_name, phase='done')
|
||||||
return OperationResult(True, 'dock_tool', f'{tool_name} docked', tuple(self.events))
|
return OperationResult(True, 'dock_tool', f'{tool_name} docked', tuple(self.events))
|
||||||
except Exception as error:
|
except Exception as error:
|
||||||
|
|||||||
Reference in New Issue
Block a user