-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathsupervisor.py
110 lines (94 loc) · 4.46 KB
/
supervisor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# Copyright 2021 CNRS - Airbus SAS
# Author: Florent Lamiraux, Joseph Mirabel
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# Theses variables are defined:
# - robot, a SoT device
# - simulateTorqueFeedbackForEndEffector, a boolean
import time
from agimus_sot.react import TaskFactory, localizeObjectOnLoopTransition
from agimus_sot.action import Action
from dynamic_graph.ros.ros_publish import RosPublish
Action.maxControlSqrNorm = 20
def wait():
print("Waiting 1 second")
time.sleep(1)
return True, ""
def makeSupervisorWithFactory(robot):
from agimus_sot import Supervisor
from agimus_sot.factory import Factory, Affordance
from agimus_sot.srdf_parser import parse_srdf, attach_all_to_link
import pinocchio
from rospkg import RosPack
rospack = RosPack()
if not hasattr(robot, "camera_frame"):
robot.camera_frame = "camera_color_optical_frame"
srdf = {}
# retrieve objects from ros param
robotDict = globalDemoDict["robots"]
if len(robotDict) != 1:
raise RuntimeError("One and only one robot is supported for now.")
objectDict = globalDemoDict["objects"]
objects = list(objectDict.keys())
# parse robot and object srdf files
srdfDict = dict()
for r, data in robotDict.items():
srdfDict[r] = parse_srdf(srdf = data["srdf"]["file"],
packageName = data["srdf"]["package"],
prefix=r)
for o, data in objectDict.items():
objectModel = pinocchio.buildModelFromUrdf\
(rospack.get_path(data["urdf"]["package"]) +
data["urdf"]["file"])
srdfDict[o] = parse_srdf(srdf = data["srdf"]["file"],
packageName = data["srdf"]["package"],
prefix=o)
attach_all_to_link(objectModel, "base_link", srdfDict[o])
grippers = list(globalDemoDict["grippers"])
handlesPerObjects = list()
contactPerObjects = list()
for o in objects:
handlesPerObjects.append(sorted(list(srdfDict[o]["handles"].keys())))
contactPerObjects.append(sorted(list(srdfDict[o]["contacts"].keys())))
for w in ["grippers", "handles","contacts"]:
srdf[w] = dict()
for k, data in srdfDict.items():
srdf[w].update(data[w])
supervisor = Supervisor(robot, prefix=list(robotDict.keys())[0])
factory = Factory(supervisor)
factory.tasks = TaskFactory(factory)
factory.parameters["period"] = 0.01 # TODO soon: robot.getTimeStep()
factory.parameters["simulateTorqueFeedback"] = simulateTorqueFeedbackForEndEffector
factory.parameters["addTracerToAdmittanceController"] = False
# factory.parameters["addTimerToSotControl"] = True
factory.setGrippers(grippers)
factory.setObjects(objects, handlesPerObjects, contactPerObjects)
from hpp.corbaserver.manipulation import Rule
factory.setupFrames(srdf["grippers"], srdf["handles"], robot)
for k in handlesPerObjects[0]:
factory.handleFrames[k].hasVisualTag = True
factory.generate()
supervisor.makeInitialSot()
return factory, supervisor
# Use service /agimus/sot/set_base_pose to set initial config
factory, supervisor = makeSupervisorWithFactory(robot)
supervisor.plugTopicsToRos()
supervisor.plugSot("")