|
| 1 | +#!/usr/bin/env python2 |
| 2 | +from socket import * |
| 3 | +import rospy |
| 4 | +import jason_ros_msgs.msg |
| 5 | +import gazebo_msgs.srv |
| 6 | + |
| 7 | + |
| 8 | +class GzModelDistances: |
| 9 | + def __init__(self, my_name): |
| 10 | + self.my_name = my_name |
| 11 | + |
| 12 | + rospy.wait_for_service('/gazebo/get_model_state') |
| 13 | + self.service_proxy = rospy.ServiceProxy('/gazebo/get_model_state', |
| 14 | + gazebo_msgs.srv.GetModelState) |
| 15 | + try: |
| 16 | + node_namespace = rospy.get_namespace() |
| 17 | + self.comm_range = rospy.get_param(node_namespace + '/comm_range') |
| 18 | + except KeyError: |
| 19 | + self.comm_range = 10 |
| 20 | + |
| 21 | + def inCommRange(self, model_name): |
| 22 | + self.myStateRes = self.service_proxy(self.my_name, '') |
| 23 | + modelStateRes = self.service_proxy(model_name, '') |
| 24 | + |
| 25 | + dist = ((self.myStateRes.pose.position.x |
| 26 | + - modelStateRes.pose.position.x)**2 |
| 27 | + + (self.myStateRes.pose.position.y |
| 28 | + - modelStateRes.pose.position.y)**2)**0.5 |
| 29 | + print("my_name: {} model_name: {} dist: {} comm_range: {}".format( |
| 30 | + self.my_name, model_name, dist, self.comm_range)) |
| 31 | + |
| 32 | + return (dist <= self.comm_range) |
| 33 | + |
| 34 | + |
| 35 | +def send_msg(msg, agents_ip): |
| 36 | + data = msg.data |
| 37 | + receiver = data.split(',')[3] |
| 38 | + s = socket(AF_INET, SOCK_DGRAM) |
| 39 | + |
| 40 | + node_namespace = rospy.get_namespace() |
| 41 | + agent_name = rospy.get_param(node_namespace + 'jason/agent_name') |
| 42 | + |
| 43 | + modelDists = GzModelDistances(agent_name) |
| 44 | + |
| 45 | + agent_sent = [agent_name] |
| 46 | + if receiver == "null": |
| 47 | + for addr in agents_ip.iteritems(): |
| 48 | + if addr[0] != "null" and addr[0] not in agent_sent \ |
| 49 | + and modelDists.inCommRange(addr[0]): |
| 50 | + s.sendto(data, (addr[1][0], addr[1][1])) |
| 51 | + agent_sent.append(addr[0]) |
| 52 | + elif modelDists.inCommRange(receiver): |
| 53 | + IP = agents_ip[receiver][0] |
| 54 | + PORT = agents_ip[receiver][1] |
| 55 | + s.sendto(data, (IP, PORT)) |
| 56 | + |
| 57 | + s.close() |
| 58 | + # print(agent_name + " Sending: " + data) |
| 59 | + |
| 60 | + |
| 61 | +def main(): |
| 62 | + print("Starting Communication node.") |
| 63 | + rospy.init_node('jason_comm') |
| 64 | + node_namespace = rospy.get_namespace() |
| 65 | + node_name = rospy.get_name() |
| 66 | + |
| 67 | + param_names = rospy.get_param_names() |
| 68 | + agents_ip = {name[len(node_name + '/address_'):]: rospy.get_param(name) |
| 69 | + for name in param_names |
| 70 | + if name.startswith(node_name + '/address_')} |
| 71 | + |
| 72 | + send_msg_sub = rospy.Subscriber( |
| 73 | + node_namespace + 'jason/send_msg', |
| 74 | + jason_ros_msgs.msg.Message, |
| 75 | + send_msg, agents_ip) |
| 76 | + |
| 77 | + comm_message_pub = rospy.Publisher( |
| 78 | + node_namespace + 'jason/receive_msg', |
| 79 | + jason_ros_msgs.msg.Message, |
| 80 | + queue_size=1, |
| 81 | + latch=False) |
| 82 | + |
| 83 | + while not rospy.is_shutdown(): |
| 84 | + if rospy.has_param(node_namespace + 'jason/agent_name'): |
| 85 | + agent_name = rospy.get_param(node_namespace + 'jason/agent_name') |
| 86 | + IP = agents_ip[agent_name][0] |
| 87 | + PORT = agents_ip[agent_name][1] |
| 88 | + try: |
| 89 | + s = socket(AF_INET, SOCK_DGRAM) |
| 90 | + s.bind((IP, PORT)) |
| 91 | + m = s.recvfrom(1024) |
| 92 | + s.close() |
| 93 | + if m[1][0]: |
| 94 | + message = jason_ros_msgs.msg.Message() |
| 95 | + message.data = m[0] |
| 96 | + # print(agent_name + " Received " + message.data) |
| 97 | + comm_message_pub.publish(message) |
| 98 | + except timeout: |
| 99 | + s.close() |
| 100 | + |
| 101 | + rospy.spin() |
| 102 | + |
| 103 | + |
| 104 | +if __name__ == '__main__': |
| 105 | + main() |
0 commit comments