speak_when_label_found.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 from __future__ import division
4 
5 import os
6 import shutil
7 import tempfile
8 
9 import cv_bridge
10 from jsk_gui_msgs.msg import SlackMessage
11 import message_filters
12 import rospy
13 from sensor_msgs.msg import Image
14 from sound_play.libsoundplay import SoundClient
15 from std_msgs.msg import String
16 
17 
19 
20  def __init__(self):
21  self.tmpdir = tempfile.mkdtemp()
22 
23  self.pub_str = rospy.Publisher('~output/string', String, queue_size=1)
24  self.pub_slack = rospy.Publisher(
25  '~output/slack_msg', SlackMessage, queue_size=1)
26 
27  self.sound = None
28  if rospy.get_param('~sound', True):
29  self.sound = SoundClient(blocking=True)
30  rospy.sleep(1)
31 
32  # Get target label id and label_names
33  self.label_names = rospy.get_param('~label_names')
34  self.target_labels = rospy.get_param('~target_labels', None)
35  if self.target_labels is None:
36  self.target_labels = []
37  target_label_names = rospy.get_param('~target_label_names')
38  for lname in target_label_names:
39  self.target_labels.append(self.label_names.index(lname))
40  self.min_label_region = rospy.get_param('~min_label_region', 0.1)
41 
43  '~input/image', Image, queue_size=1)
45  '~input/label', Image, queue_size=1)
46  queue_size = rospy.get_param('~queue_size', 100)
47  if rospy.get_param('~approximate_sync', False):
49  [self.sub_img, self.sub_label], queue_size=queue_size)
50  else:
51  slop = rospy.get_param('~slop', 0.1)
52  self.sync = message_filters.ApproximateTimeSynchronizer(
53  [self.sub_img, self.sub_label], queue_size=queue_size, slop=slop)
54  self.sync.registerCallback(self.input_cb)
55 
56  def __del__(self):
57  if os.path.exists(self.tmpdir):
58  shutil.rmtree(self.tmpdir)
59 
60  def input_cb(self, imgmsg, label_msg):
61  bridge = cv_bridge.CvBridge()
62  label = bridge.imgmsg_to_cv2(label_msg)
63  found_labels = []
64  for lval in self.target_labels:
65  label_region = (label == lval).sum() / label.size
66  if label_region >= self.min_label_region:
67  found_labels.append(lval)
68 
69  if not found_labels:
70  rospy.loginfo('No label is found')
71  return
72 
73  text = ' and '.join(self.label_names[lval] for lval in found_labels)
74  text += ' is found'
75  rospy.loginfo(text)
76  self.pub_str.publish(String(data=text))
77  if self.sound:
78  self.sound.say(text)
79 
80  if self.pub_slack.get_num_connections() > 0:
81  slack_msg = SlackMessage(text=text)
82  if imgmsg:
83  slack_msg.image = imgmsg
84  self.pub_slack.publish(slack_msg)
85 
86 
87 if __name__ == '__main__':
88  rospy.init_node('speak_when_label_found')
90  rospy.spin()


jsk_perception
Author(s): Manabu Saito, Ryohei Ueda
autogenerated on Mon May 3 2021 03:03:27