Skip to content

Commit 5258bd2

Browse files
committed
✨ add com_udp_gz_dist node
1 parent f4b8f31 commit 5258bd2

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed
+105
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
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

Comments
 (0)