Skip to content

Commit

Permalink
visualization client: Create client, implement ComputeRobotConfigsFor…
Browse files Browse the repository at this point in the history
…GraspVisualization

visualization client: Add GetTranslationForShadowTarget

visualization-manager: Migrate ClearPackingStateVisualization() and VisualizePackFormationResult() from binpicking
  • Loading branch information
Tan Li Boon committed Jun 29, 2022
1 parent 00f85e2 commit f9de692
Show file tree
Hide file tree
Showing 6 changed files with 219 additions and 53 deletions.
21 changes: 0 additions & 21 deletions python/mujincontrollerclient/binpickingcontrollerclient.py
Original file line number Diff line number Diff line change
Expand Up @@ -522,17 +522,6 @@ def VisualizePackingState(self, timeout=10, usewebapi=None, fireandforget=False,
taskparameters.update(kwargs)
return self.ExecuteCommand(taskparameters, timeout=timeout, usewebapi=usewebapi, fireandforget=fireandforget)

def VisualizePackFormationResult(self, timeout=10, usewebapi=None, fireandforget=False, **kwargs):
"""stops the packing computation thread thread started with StartPackFormationComputationThread
:param initializeCameraPosition: bool. reset camera position
"""

taskparameters = {
'command': 'VisualizePackFormationResult',
}
taskparameters.update(kwargs)
return self.ExecuteCommand(taskparameters, timeout=timeout, usewebapi=usewebapi, fireandforget=fireandforget)


def GetPackFormationSolution(self, timeout=10, usewebapi=None, fireandforget=False, **kwargs):
"""stops the packing computation thread thread started with StartPackFormationComputationThread
Expand Down Expand Up @@ -562,16 +551,6 @@ def GetLatestPackFormationResultList(self, timeout=10, usewebapi=None, fireandfo
taskparameters.update(kwargs)
return self.ExecuteCommand(taskparameters, timeout=timeout, usewebapi=usewebapi, fireandforget=fireandforget)

def ClearPackingStateVisualization(self, timeout=10, usewebapi=None, fireandforget=False, **kwargs):
"""
Clear packing visualization
"""
taskparameters = {
'command': 'ClearPackingStateVisualization',
}
taskparameters.update(kwargs)
return self.ExecuteCommand(taskparameters, timeout=timeout, usewebapi=usewebapi, fireandforget=fireandforget)

def ValidatePackFormationResultList(self, packFormationResultList, timeout=10, usewebapi=None, fireandforget=False, **kwargs):
"""
Validates pack formation result list and compute info (fillRatio, packageDimensions, packedItemsInfo, etc) about it .
Expand Down
2 changes: 1 addition & 1 deletion python/mujincontrollerclient/planningclient.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ def _RunHeartbeatMonitorThread(self, reinitializetimeout=10.0):
except zmq.ZMQError as e:
log.exception('failed to receive from publisher: %s', e)
if self._isokheartbeat:
log.warn('%f secs since last heartbeat from controller' % (GetMonotonicTime() - lastheartbeatts))
log.warn('%f secs since last heartbeat from controller %s' % (GetMonotonicTime() - lastheartbeatts, self._slaverequestid))

def GetPublishedTaskState(self):
"""Return most recent published state. If publishing is disabled, then will return None
Expand Down
9 changes: 0 additions & 9 deletions python/mujincontrollerclient/realtimeitlplanning3client.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,15 +95,6 @@ def ComputeRobotConfigsForCommandVisualization(self, executiongraph, commandinde
taskparameters.update(kwargs)
return self.ExecuteCommand(taskparameters, usewebapi=usewebapi, timeout=timeout, fireandforget=fireandforget)

def ComputeRobotJointValuesForCommandVisualization(self, program, commandindex=0, usewebapi=True, timeout=2, fireandforget=False, **kwargs):
taskparameters = {
'command': 'ComputeRobotJointValuesForCommandVisualization',
'program': program,
'commandindex': commandindex,
}
taskparameters.update(kwargs)
return self.ExecuteCommand(taskparameters, usewebapi=usewebapi, timeout=timeout, fireandforget=fireandforget)

def PlotProgramWaypoints(self, usewebapi=False, timeout=1, fireandforget=True, **kwargs):
taskparameters = {
'command': 'PlotProgramWaypoints',
Expand Down
116 changes: 116 additions & 0 deletions python/mujincontrollerclient/realtimeitlplanningclient.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
# -*- coding: utf-8 -*-
# Copyright (C) 2013-2015 MUJIN Inc.
# Mujin controller client for bin picking task

# mujin imports
from . import realtimerobotclient

# logging
import logging
log = logging.getLogger(__name__)


class RealtimeITLPlanningControllerClient(realtimerobotclient.RealtimeRobotControllerClient):
"""Mujin controller client for realtimeitlplanning task
"""

def __init__(self, **kwargs):
"""Logs into the mujin controller, initializes realtimeitlplanning task, and sets up parameters
:param controllerurl: URL of the mujin controller, e.g. http://controller13
:param controllerusername: Username of the mujin controller, e.g. testuser
:param controllerpassword: Password of the mujin controller
:param taskzmqport: Port of the realtimeitlplanning task's zmq server, e.g. 7110
:param taskheartbeatport: Port of the realtimeitlplanning task's zmq server's heartbeat publisher, e.g. 7111
:param taskheartbeattimeout: Seconds until reinitializing realtimeitlplanning task's zmq server if no heartbeat is received, e.g. 7
:param scenepk: Primary key (pk) of the bin picking task scene, e.g. komatsu_ntc.mujin.dae
:param robotname: Name of the robot, e.g. VP-5243I
:param robotspeed: Speed of the robot, e.g. 0.4
:param regionname: Name of the bin, e.g. container1
:param targetname: Name of the target, e.g. plasticnut-center
:param toolname: Name of the manipulator, e.g. 2BaseZ
:param envclearance: Environment clearance in millimeters, e.g. 20
:param usewebapi: Whether to use webapi for controller commands
:param robotaccelmult: Optional multiplier for forcing the acceleration
"""
super(RealtimeITLPlanningControllerClient, self).__init__(tasktype='realtimeitlplanning', **kwargs)

def SetJointValues(self, jointvalues, robotname=None, timeout=10, usewebapi=True, **kwargs):
taskparameters = {
'command': 'SetJointValues',
'jointvalues': jointvalues,
}
taskparameters.update(kwargs)
return self.ExecuteCommand(taskparameters, robotname=robotname, timeout=timeout, usewebapi=usewebapi)

def GetITLState(self, robotname=None, timeout=10, usewebapi=True, fireandforget=False, **kwargs):
taskparameters = {'command': 'GetITLState'}
taskparameters.update(kwargs)
return self.ExecuteCommand(taskparameters, robotname=robotname, timeout=timeout, usewebapi=usewebapi, fireandforget=fireandforget)

def MoveToCommand(self, program, commandindex=0, envclearance=15, robotspeed=None, robotaccelmult=None, usewebapi=True, timeout=10, fireandforget=False):
taskparameters = {
'command': 'MoveToCommand',
'program': program,
'commandindex': commandindex,
'envclearance': envclearance,
}
if robotspeed is not None:
taskparameters['robotspeed'] = robotspeed
if robotaccelmult is not None:
taskparameters['robotaccelmult'] = robotaccelmult
return self.ExecuteCommand(taskparameters, usewebapi=usewebapi, timeout=timeout, fireandforget=fireandforget)

def ExecuteTrajectory(self, identifier, trajectories, statevalues=None, stepping=False, istep=None, cycles=1, restorevalues=None, envclearance=15, robotspeed=None, robotaccelmult=None, usewebapi=True, timeout=10, fireandforget=False):
taskparameters = {
'command': 'ExecuteTrajectory',
'identifier': identifier,
'trajectories': trajectories,
'statevalues': statevalues,
'stepping': stepping,
'envclearance': envclearance,
'cycles': cycles,
}
if istep is not None:
taskparameters['istep'] = istep
if restorevalues is not None:
taskparameters['restorevalues'] = restorevalues
if robotspeed is not None:
taskparameters['robotspeed'] = robotspeed
if robotaccelmult is not None:
taskparameters['robotaccelmult'] = robotaccelmult
return self.ExecuteCommand(taskparameters, usewebapi=usewebapi, timeout=timeout, fireandforget=fireandforget)

def ExecuteTrajectoryStep(self, reverse=False, envclearance=15, robotspeed=None, robotaccelmult=None, usewebapi=True, timeout=10, fireandforget=False):
taskparameters = {
'command': 'ExecuteTrajectoryStep',
'reverse': reverse,
}
if robotspeed is not None:
taskparameters['robotspeed'] = robotspeed
if robotaccelmult is not None:
taskparameters['robotaccelmult'] = robotaccelmult
return self.ExecuteCommand(taskparameters, usewebapi=usewebapi, timeout=timeout, fireandforget=fireandforget)

def CancelExecuteTrajectoryStep(self, envclearance=15, robotspeed=None, robotaccelmult=None, usewebapi=True, timeout=10, fireandforget=False):
taskparameters = {'command': 'CancelExecuteTrajectoryStep'}
if robotspeed is not None:
taskparameters['robotspeed'] = robotspeed
if robotaccelmult is not None:
taskparameters['robotaccelmult'] = robotaccelmult
return self.ExecuteCommand(taskparameters, usewebapi=usewebapi, timeout=timeout, fireandforget=fireandforget)

def SetPauseExecuteTrajectory(self, envclearance=15, robotspeed=None, robotaccelmult=None, usewebapi=True, timeout=10, fireandforget=False):
taskparameters = {'command': 'SetPauseExecuteTrajectory'}
if robotspeed is not None:
taskparameters['robotspeed'] = robotspeed
if robotaccelmult is not None:
taskparameters['robotaccelmult'] = robotaccelmult
return self.ExecuteCommand(taskparameters, usewebapi=usewebapi, timeout=timeout, fireandforget=fireandforget)

def ResumeExecuteTrajectory(self, envclearance=15, robotspeed=None, robotaccelmult=None, usewebapi=True, timeout=10, fireandforget=False):
taskparameters = {'command': 'ResumeExecuteTrajectory'}
if robotspeed is not None:
taskparameters['robotspeed'] = robotspeed
if robotaccelmult is not None:
taskparameters['robotaccelmult'] = robotaccelmult
return self.ExecuteCommand(taskparameters, usewebapi=usewebapi, timeout=timeout, fireandforget=fireandforget)
22 changes: 0 additions & 22 deletions python/mujincontrollerclient/realtimerobotclient.py
Original file line number Diff line number Diff line change
Expand Up @@ -1052,28 +1052,6 @@ def GetDynamicObjects(self, usewebapi=False, timeout=1, **kwargs):
taskparameters.update(kwargs)
return self.ExecuteCommand(taskparameters, usewebapi=usewebapi, timeout=timeout)

def ComputeRobotConfigsForGraspVisualization(self, targetname, graspname, robotname=None, toolname=None, unit='mm', usewebapi=False, timeout=10, **kwargs):
"""Returns robot configs for grasp visualization
Args:
targetname (str):
graspname (str):
robotname (str, optional): Name of the robot
toolname (str, optional): Name of the manipulator. Default: self.toolname
unit (str, optional): (Default: 'mm')
usewebapi (bool, optional): If True, send command through Web API. Otherwise, through ZMQ. (Default: False)
timeout (float, optional): (Default: 10)
"""
taskparameters = {
'command': 'ComputeRobotConfigsForGraspVisualization',
'targetname': targetname,
'graspname': graspname
}
if unit is not None:
taskparameters['unit'] = unit
taskparameters.update(kwargs)
return self.ExecuteCommand(taskparameters, robotname=robotname, toolname=toolname, usewebapi=usewebapi, timeout=timeout)

def ResetCacheTemplates(self, usewebapi=False, timeout=1, fireandforget=False, **kwargs):
"""Resets any cached templates
Expand Down
102 changes: 102 additions & 0 deletions python/mujincontrollerclient/visualizationclient.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# -*- coding: utf-8 -*-
# Copyright (C) 2022 MUJIN Inc.
# Mujin controller client for visualization task

from . import realtimerobotclient

# logging
import logging
log = logging.getLogger(__name__)

class VisualizationClient(realtimerobotclient.RealtimeRobotControllerClient):
"""Mujin controller client for visualization tasks
"""
tasktype = 'visualization'

def __init__(self, **kwargs):
"""Logs into the mujin controller, initializes realtimeitlplanning3 task, and sets up parameters
:param controllerurl: URL of the mujin controller, e.g. http://controller13
:param controllerusername: Username of the mujin controller, e.g. testuser
:param controllerpassword: Password of the mujin controller
:param taskzmqport: Port of the realtimeitlplanning3 task's zmq server, e.g. 7110
:param taskheartbeatport: Port of the realtimeitlplanning3 task's zmq server's heartbeat publisher, e.g. 7111
:param taskheartbeattimeout: Seconds until reinitializing realtimeitlplanning3 task's zmq server if no heartbeat is received, e.g. 7
:param scenepk: Primary key (pk) of the bin picking task scene, e.g. komatsu_ntc.mujin.dae
:param robotname: Name of the robot, e.g. VP-5243I
:param robotspeed: Speed of the robot, e.g. 0.4
:param regionname: Name of the bin, e.g. container1
:param targetname: Name of the target, e.g. plasticnut-center
:param toolname: Name of the manipulator, e.g. 2BaseZ
:param envclearance: Environment clearance in millimeters, e.g. 20
:param usewebapi: Whether to use webapi for controller commands
:param robotaccelmult: Optional multiplier for forcing the acceleration
"""
super(VisualizationClient, self).__init__(tasktype=self.tasktype, **kwargs)

def SetVisualizationState(self, visualizationState, timeout=10, fireandforget=False, **kwargs):
# type: (dict, int, bool, dict) -> dict | None
taskparameters = {
'command': 'SetVisualizationState',
'visualizationState': visualizationState,
}
taskparameters.update(kwargs)
return self.ExecuteCommand(taskparameters, usewebapi=False, timeout=timeout, fireandforget=fireandforget)

def ComputeRobotConfigsForGraspVisualization(self, targetname, graspname, robotname=None, toolname=None, unit='mm', usewebapi=False, timeout=10, **kwargs):
"""Returns robot configs for grasp visualization
Args:
targetname (str):
graspname (str):
robotname (str, optional): Name of the robot
toolname (str, optional): Name of the manipulator. Default: self.toolname
unit (str, optional): (Default: 'mm')
usewebapi (bool, optional): If True, send command through Web API. Otherwise, through ZMQ. (Default: False)
timeout (float, optional): (Default: 10)
"""
taskparameters = {
'command': 'ComputeRobotConfigsForGraspVisualization',
'targetname': targetname,
'graspname': graspname
}
if unit is not None:
taskparameters['unit'] = unit
taskparameters.update(kwargs)
return self.ExecuteCommand(taskparameters, robotname=robotname, toolname=toolname, usewebapi=usewebapi, timeout=timeout)

def GetTranslationForShadowTarget(self, ikparammeta=None, uri=None, localTargetDir=None, timeout=10, **kwargs):
taskparameters = {
'command': 'GetTranslationForShadowTarget',
'uri': uri,
'ikparammeta': ikparammeta,
}
if localTargetDir:
taskparameters['localTargetDir'] = localTargetDir
taskparameters.update(kwargs)
return self.ExecuteCommand(taskparameters, usewebapi=False, timeout=timeout)

#SetCameraTransforms, SetViewerParameters inherited from PlanningControllerClient

#
# From binpickingui yet
#

def ClearPackingStateVisualization(self, timeout=10, usewebapi=None, fireandforget=False, **kwargs):
"""
Clear packing visualization
"""
taskparameters = {
'command': 'ClearPackingStateVisualization',
}
taskparameters.update(kwargs)
return self.ExecuteCommand(taskparameters, timeout=timeout, usewebapi=usewebapi, fireandforget=fireandforget)

def VisualizePackFormationResult(self, timeout=10, usewebapi=None, fireandforget=False, **kwargs):
"""stops the packing computation thread thread started with StartPackFormationComputationThread
:param initializeCameraPosition: bool. reset camera position
"""
taskparameters = {
'command': 'VisualizePackFormationResult',
}
taskparameters.update(kwargs)
return self.ExecuteCommand(taskparameters, timeout=timeout, usewebapi=usewebapi, fireandforget=fireandforget)

0 comments on commit f9de692

Please sign in to comment.