load_carrier.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 # Copyright 2021 Roboception GmbH
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions are met:
7 #
8 # * Redistributions of source code must retain the above copyright
9 # notice, this list of conditions and the following disclaimer.
10 #
11 # * Redistributions in binary form must reproduce the above copyright
12 # notice, this list of conditions and the following disclaimer in the
13 # documentation and/or other materials provided with the distribution.
14 #
15 # * Neither the name of the {copyright_holder} nor the names of its
16 # contributors may be used to endorse or promote products derived from
17 # this software without specific prior written permission.
18 #
19 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 # POSSIBILITY OF SUCH DAMAGE.
30 
31 from __future__ import absolute_import
32 
33 import rospy
34 
35 from tf2_msgs.msg import TFMessage
36 from geometry_msgs.msg import TransformStamped
37 
38 from rc_reason_msgs.srv import SetLoadCarrier, GetLoadCarriers, DeleteLoadCarriers
39 from rc_reason_msgs.srv import DetectLoadCarriers, DetectFillingLevel
40 from rc_reason_msgs.srv import GetRegionsOfInterest3D, SetRegionOfInterest3D, DeleteRegionsOfInterest3D
41 from rc_reason_msgs.srv import GetRegionsOfInterest2D, SetRegionOfInterest2D, DeleteRegionsOfInterest2D
42 
43 from visualization_msgs.msg import Marker, MarkerArray
44 from std_msgs.msg import ColorRGBA
45 
46 from .rest_client import RestClient
47 from .transform_helpers import lc_to_marker, load_carrier_to_tf
48 
49 
51 
52  def __init__(self):
53  super(LoadCarrierClient, self).__init__('rc_load_carrier')
54 
55  # client only parameters
56  self.publish_tf = rospy.get_param("~publish_tf", True)
57  self.publish_markers = rospy.get_param("~publish_markers", True)
58 
59  self.pub_tf = rospy.Publisher('/tf', TFMessage, queue_size=10)
60  self.pub_markers = rospy.Publisher('visualization_marker_array', MarkerArray, queue_size=10)
61 
62  self.lc_markers = []
63 
64  self.add_rest_service(DetectLoadCarriers, 'detect_load_carriers', self.lc_cb)
65  self.add_rest_service(DetectFillingLevel, 'detect_filling_level', self.lc_cb)
66  self.add_rest_service(SetLoadCarrier, 'set_load_carrier', self.generic_cb)
67  self.add_rest_service(GetLoadCarriers, 'get_load_carriers', self.generic_cb)
68  self.add_rest_service(DeleteLoadCarriers, 'delete_load_carriers', self.generic_cb)
69  self.add_rest_service(SetRegionOfInterest3D, 'set_region_of_interest', self.generic_cb)
70  self.add_rest_service(GetRegionsOfInterest3D, 'get_regions_of_interest', self.generic_cb)
71  self.add_rest_service(DeleteRegionsOfInterest3D, 'delete_regions_of_interest', self.generic_cb)
72  self.add_rest_service(GetRegionsOfInterest2D, 'get_regions_of_interest_2d', self.generic_cb)
73  self.add_rest_service(SetRegionOfInterest2D, 'set_region_of_interest_2d', self.generic_cb)
74  self.add_rest_service(DeleteRegionsOfInterest2D, 'delete_regions_of_interest_2d', self.generic_cb)
75 
76  def generic_cb(self, srv_name, srv_type, request):
77  response = self.call_rest_service(srv_name, srv_type, request)
78  return response
79 
80  def lc_cb(self, srv_name, srv_type, request):
81  response = self.call_rest_service(srv_name, srv_type, request)
82  self.publish_lcs(response.load_carriers)
83  return response
84 
85  def publish_lcs(self, lcs):
86  if lcs and self.publish_tf:
87  transforms = [load_carrier_to_tf(lc, i) for i, lc in enumerate(lcs)]
88  self.pub_tf.publish(TFMessage(transforms=transforms))
89  if self.publish_markers:
90  self.publish_lc_markers(lcs)
91 
92  def publish_lc_markers(self, lcs):
93  new_markers = []
94  for i, lc in enumerate(lcs):
95  m = lc_to_marker(lc, i, self.rest_name + "_lcs")
96  if i < len(self.lc_markers):
97  self.lc_markers[i] = m
98  else:
99  self.lc_markers.append(m)
100  new_markers.append(m)
101  for i in range(len(lcs), len(self.lc_markers)):
102  # delete old markers
103  self.lc_markers[i].action = Marker.DELETE
104  self.pub_markers.publish(MarkerArray(markers=self.lc_markers))
105  self.lc_markers = new_markers
106 
107 
108 def main():
109  client = LoadCarrierClient()
110 
111  try:
112  rospy.spin()
113  except KeyboardInterrupt:
114  pass
115 
116 
117 if __name__ == '__main__':
118  main()
rc_reason_clients.load_carrier.LoadCarrierClient.pub_markers
pub_markers
Definition: load_carrier.py:60
rc_reason_clients.transform_helpers.lc_to_marker
def lc_to_marker(lc, lc_no, ns)
Definition: transform_helpers.py:47
rc_reason_clients.load_carrier.LoadCarrierClient.__init__
def __init__(self)
Definition: load_carrier.py:52
rc_reason_clients.load_carrier.LoadCarrierClient.generic_cb
def generic_cb(self, srv_name, srv_type, request)
Definition: load_carrier.py:76
rc_reason_clients.rest_client.RestClient.add_rest_service
def add_rest_service(self, srv_type, srv_name, callback)
Definition: rest_client.py:193
rc_reason_clients.load_carrier.LoadCarrierClient.publish_lc_markers
def publish_lc_markers(self, lcs)
Definition: load_carrier.py:92
rc_reason_clients.load_carrier.LoadCarrierClient.lc_markers
lc_markers
Definition: load_carrier.py:62
rc_reason_clients.transform_helpers.load_carrier_to_tf
def load_carrier_to_tf(lc, postfix)
Definition: transform_helpers.py:35
rc_reason_clients.load_carrier.LoadCarrierClient.publish_tf
publish_tf
Definition: load_carrier.py:56
rc_reason_clients.load_carrier.LoadCarrierClient.publish_lcs
def publish_lcs(self, lcs)
Definition: load_carrier.py:85
rc_reason_clients.rest_client.RestClient
Definition: rest_client.py:70
rc_reason_clients.load_carrier.LoadCarrierClient.pub_tf
pub_tf
Definition: load_carrier.py:59
rc_reason_clients.load_carrier.LoadCarrierClient.lc_cb
def lc_cb(self, srv_name, srv_type, request)
Definition: load_carrier.py:80
rc_reason_clients.load_carrier.LoadCarrierClient
Definition: load_carrier.py:50
rc_reason_clients.rest_client.RestClient.call_rest_service
def call_rest_service(self, name, srv_type=None, request=None)
Definition: rest_client.py:162
rc_reason_clients.load_carrier.main
def main()
Definition: load_carrier.py:108
rc_reason_clients.load_carrier.LoadCarrierClient.publish_markers
publish_markers
Definition: load_carrier.py:57
rc_reason_clients.rest_client.RestClient.rest_name
rest_name
Definition: rest_client.py:73


rc_reason_clients
Author(s):
autogenerated on Sat Nov 23 2024 03:19:24