Skip to content

Commit ee25c2e

Browse files
committed
Merge pull request start-jsk#1536 from knorth55/work-order-2016
[jsk_2016_01_baxter_apc] work_order modified to apply for apc2016 objects
2 parents 2777e3b + 7d6ba4e commit ee25c2e

File tree

3 files changed

+67
-25
lines changed

3 files changed

+67
-25
lines changed

jsk_2016_01_baxter_apc/launch/main.launch

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@
99

1010
<!-- work order data -->
1111
<node pkg="jsk_2016_01_baxter_apc" type="work_order.py" name="work_order" respawn="true">
12-
<param name="json" value="$(arg json)" />
12+
<rosparam>
13+
json: $(arg json)
14+
is_apc2016: false
15+
gripper: gripper2016
16+
</rosparam>
1317
</node>
1418

1519
<!-- parameter -->

jsk_2016_01_baxter_apc/node_scripts/work_order.py

Lines changed: 58 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,42 @@
55
import json
66
import rospy
77
from jsk_2015_05_baxter_apc.msg import WorkOrder, WorkOrderArray
8-
from jsk_apc2016_common import get_bin_contents, get_work_order
8+
import jsk_apc2016_common
9+
from jsk_topic_tools.log_utils import jsk_logwarn
910

11+
import numpy as np
1012

11-
def get_sorted_work_order(json_file):
13+
14+
def get_sorted_work_order(json_file, gripper, object_data):
1215
"""Sort work order to maximize the score"""
13-
bin_contents = get_bin_contents(json_file=json_file)
14-
bin_n_contents = dict(map(lambda (bin_, objects): (bin_, len(objects)), bin_contents.iteritems()))
15-
sorted_work_order = []
16-
work_order = get_work_order(json_file=json_file)
17-
for bin_, n_contents in sorted(bin_n_contents.items(), key=lambda x: x[1]):
18-
if n_contents > 5: # Level3
19-
continue
20-
sorted_work_order.append((bin_, work_order[bin_]))
16+
bin_contents = jsk_apc2016_common.get_bin_contents(json_file=json_file)
17+
work_order = jsk_apc2016_common.get_work_order(json_file=json_file)
18+
sorted_bin_list = bin_contents.keys()
19+
20+
if object_data is not None:
21+
if all(gripper in x for x in [d['graspability'].keys() for d in object_data]):
22+
def get_graspability(bin_):
23+
target_object = work_order[bin_]
24+
target_object_data = [data for data in object_data
25+
if data['name'] == target_object][0]
26+
graspability = target_object_data['graspability'][gripper]
27+
return graspability
28+
sorted_bin_list = sorted(sorted_bin_list, key=get_graspability)
29+
else:
30+
jsk_logwarn('Not sorted by graspability')
31+
jsk_logwarn('Not all object_data have graspability key: {gripper}'
32+
.format(gripper=gripper))
33+
sorted_bin_list = sorted(sorted_bin_list,
34+
key=lambda bin_: len(bin_contents[bin_]))
35+
sorted_work_order = [(bin_, work_order[bin_]) for bin_ in sorted_bin_list]
2136
return sorted_work_order
2237

2338

24-
def get_work_order_msg(json_file):
25-
work_order = get_sorted_work_order(json_file=json_file)
39+
def get_work_order_msg(json_file, gripper, max_weight, object_data=None):
40+
work_order = get_sorted_work_order(json_file, gripper, object_data)
41+
bin_contents = jsk_apc2016_common.get_bin_contents(json_file=json_file)
42+
if max_weight == -1:
43+
max_weight = np.inf
2644
msg = dict(left=WorkOrderArray(), right=WorkOrderArray())
2745
abandon_target_objects = [
2846
'genuine_joe_plastic_stir_sticks',
@@ -35,30 +53,47 @@ def get_work_order_msg(json_file):
3553
'rolodex_jumbo_pencil_cup',
3654
'oreo_mega_stuf'
3755
]
38-
bin_contents = get_bin_contents(json_file=json_file)
3956
for bin_, target_object in work_order:
40-
if target_object in abandon_target_objects:
41-
continue
42-
bin_contents_bool = False
43-
for bin_object in bin_contents[bin_]:
44-
if bin_object in abandon_bin_objects:
45-
bin_contents_bool = True
46-
if bin_contents_bool:
57+
if object_data is not None:
58+
target_object_data = [data for data in object_data
59+
if data['name'] == target_object][0]
60+
if target_object_data['weight'] > max_weight:
61+
jsk_logwarn('Skipping target {obj} in {bin_}: it exceeds max weight {weight} > {max_weight}'
62+
.format(obj=target_object_data['name'], bin_=bin_,
63+
weight=target_object_data['weight'], max_weight=max_weight))
64+
continue
65+
else:
66+
if target_object in abandon_target_objects:
67+
jsk_logwarn('Skipping target {obj} in {bin_}: it is listed as abandon target'
68+
.format(obj=target_object['name'], bin_=bin_))
69+
continue
70+
if any(bin_object in abandon_bin_objects for bin_object in bin_contents[bin_]):
71+
jsk_logwarn('Skipping {bin_}: this bin contains abandon objects'.format(bin_=bin_))
72+
continue
73+
if len(bin_contents[bin_]) > 5: # Level3
74+
jsk_logwarn('Skipping {bin_}: this bin contains more than 5 objects'.format(bin_=bin_))
4775
continue
76+
order = WorkOrder(bin=bin_, object=target_object)
4877
if bin_ in 'abdegj':
49-
msg['left'].array.append(WorkOrder(bin=bin_, object=target_object))
78+
msg['left'].array.append(order)
5079
elif bin_ in 'cfhikl':
51-
msg['right'].array.append(WorkOrder(bin=bin_, object=target_object))
80+
msg['right'].array.append(order)
5281
return msg
5382

5483

5584
def main():
5685
json_file = rospy.get_param('~json', None)
86+
is_apc2016 = rospy.get_param('~is_apc2016', True)
87+
gripper = rospy.get_param('~gripper', 'gripper2016')
88+
max_weight = rospy.get_param('~max_weight', -1)
5789
if json_file is None:
5890
rospy.logerr('must set json file path to ~json')
5991
return
92+
object_data = None
93+
if is_apc2016:
94+
object_data = jsk_apc2016_common.get_object_data()
6095

61-
msg = get_work_order_msg(json_file)
96+
msg = get_work_order_msg(json_file, gripper, max_weight, object_data)
6297

6398
pub_left = rospy.Publisher('~left_hand',
6499
WorkOrderArray,

jsk_2016_01_baxter_apc/test/work_order.test

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
<node pkg="jsk_2016_01_baxter_apc" name="work_order" type="work_order.py" >
33
<rosparam subst_value="True">
44
json: $(find jsk_apc2016_common)/json/pick_layout_1.json
5-
rate: 0.1
5+
rate: 10
6+
is_apc2016: true
7+
gripper: gripper2016
8+
max_weight: 5.0
69
</rosparam>
710
</node>
811

0 commit comments

Comments
 (0)