kerrigan_json.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 # Author: Yu Zhou
4 # Date: Feb 22, 2019
5 
6 import sys
7 import rospy
8 #import cv2
9 from nav_msgs.msg import Odometry
10 import nav_msgs
11 import std_msgs.msg
12 import geometry_msgs.msg
13 from rospy_message_converter import json_message_converter
14 import json
15 import socket
16 import math
17 import nus_msgs
18 import std_srvs.srv
19 import time
20 from nus_msgs.msg import StateWithCovarianceStamped
21 from common_msgs.msg import target
22 from sensor_msgs.msg import NavSatFix
23 # from std_msgs import Bool
24 from tf.transformations import quaternion_from_euler, euler_from_quaternion
25 from geometry_msgs.msg import Quaternion, Point, PoseStamped, PointStamped, Vector3Stamped, Polygon
26 from std_srvs.srv import Trigger, TriggerRequest
27 
28 
29 
31  def readFile(self, filename):
32  file = open(filename, 'r')
33  fileText = file.read()
34  file.close()
35  return fileText
36 
37 
38  def writeFile(self, filename, text):
39  file = open(filename, 'w')
40  file.write(text)
41  return
42 
43  def UDPServerSetup(self, ip_addr = "127.0.0.1", port = 1234):
44  # Set up a UDP server
45  self.UDPSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
46  listen_addr = (ip_addr, port)
47  self.UDPSock.bind(listen_addr)
48  return
49 
50  def sendToRemote(self,text):
51  UDP_IP = "127.0.0.1" # remote ip
52  UDP_PORT = 4866
53  #print "UDP target IP:", UDP_IP
54  #print "UDP target port:", UDP_PORT
55  sock = socket.socket(socket.AF_INET, # Internet
56  socket.SOCK_DGRAM) # UDP
57  #print(text)
58  sock.sendto(text, (UDP_IP, UDP_PORT))
59 
60  def __init__(self):
61  self.preSep = 0
62  self.curSeq = 0
63  self.localIPAddress = "127.0.0.1" # own ip address
64  self.localPort = 9028
65  self.vCmdPub = rospy.Publisher('/velTgtFromSwarm', Point, queue_size=10)
66  self.pCmdPub = rospy.Publisher('/posTgtFromSwarm', Point, queue_size=10)
67  self.approachPub = rospy.Publisher('/swarm/approach', std_msgs.msg.Bool, queue_size=1)
68  self.onlinePub = rospy.Publisher('/swarm/online', std_msgs.msg.Bool, queue_size=1)
69  # for simulation
70  # rospy.Subscriber("/hil/state/ground_truth", StateWithCovarianceStamped, self.uav_state_CB)
71  # for flight testing
72  rospy.Subscriber("/mavros/position/local_state", StateWithCovarianceStamped, self.uav_state_CB)
73  rospy.Subscriber("/mavros/global_position/global", NavSatFix, self.gpsPosCb)
74  rospy.Subscriber("/task_manager/swarm", std_msgs.msg.Bool, self.swarmCb)
75  rospy.Subscriber("/car_tracking", std_msgs.msg.Float32MultiArray, self.carTrackingCb)
76  # rospy.Subscriber("/engage_cmd",Bool, self.typeTrigger)
77  self.UDPServerSetup(self.localIPAddress, self.localPort)
78  self.takeoff_srv = rospy.Service('/takeoffdone', Trigger, self.trigger_response)
79  self.response = std_srvs.srv.TriggerResponse()
80  self.response.success = False
81  # self.takeoff = False
82  self.jsonDic = {}
83  self.jsonSwarmDic = {}
84 
85 
86  def __enter__(self):
87  return self
88 
89  def __exit__(self, type, value, traceback):
90  self.UDPSock.close()
91  return self
92 
93  # def typeTrigger(self, data):
94  # self.takeoff = data.data
95  # return
96 
97  def swarmCb(self, data):
98  data = json_message_converter.convert_ros_message_to_json(data)
99  swarmDic = json.loads(data.strip())
100  print("Send swarm to CA: ", swarmDic["data"])
101  self.jsonSwarmDic['type'] = "swarm"
102  self.jsonSwarmDic['flag'] = swarmDic["data"]
103  # self.jsonSwarmDic['time'] = int(round(time.time() * 1000))
104  jsonSendStr = json.dumps(self.jsonSwarmDic)
105  self.sendToRemote(jsonSendStr)
106  return
107 
108  def carTrackingCb(self, data):
109  index = 0
110  target_num = len(data.data)/4
111  print("Car Number: ", target_num)
112  data = json_message_converter.convert_ros_message_to_json(data)
113  print(data)
114  jsonCarTrackDic = {}
115  carTrackDic = json.loads(data.strip())
116  jsonCarTrackDic['type'] = "targettrack"
117  jsonCarTrackDic['result']=[]
118  for index in range(target_num):
119  jsonCarTrackDic['result'].append({"class_id": int(carTrackDic["data"][index]), "confidence":carTrackDic["data"][index+1], "u": carTrackDic["data"][index+2], "v":carTrackDic["data"][index+3]})
120 
121  jsonSendStr = json.dumps(jsonCarTrackDic)
122  self.sendToRemote(jsonSendStr)
123  return
124 
125 
126  def uav_state_CB(self, data):
127  data = json_message_converter.convert_ros_message_to_json(data)
128  uavStateDic = json.loads(data.strip())
129  q = [uavStateDic["pose"]["pose"]["orientation"]["x"],
130  uavStateDic["pose"]["pose"]["orientation"]["y"],
131  uavStateDic["pose"]["pose"]["orientation"]["z"],
132  uavStateDic["pose"]["pose"]["orientation"]["w"]]
133  euler = euler_from_quaternion(q)
134  self.jsonDic['roll'] = euler[0]*57.3
135  self.jsonDic['pitch'] = euler[1]*57.3
136  self.jsonDic['yaw'] = euler[2]*57.3
137  # jsonDic['x'] = uavStateDic["pose"]["pose"]["position"]["x"]
138  # jsonDic['y'] = uavStateDic["pose"]["pose"]["position"]["y"]
139  # self.jsonDic['altitude'] = uavStateDic["pose"]["pose"]["position"]["z"]
140  self.jsonDic['u'] = uavStateDic["velocity"]["twist"]["linear"]["x"]
141  self.jsonDic['v'] = uavStateDic["velocity"]["twist"]["linear"]["y"]
142  self.jsonDic['w'] = uavStateDic["velocity"]["twist"]["linear"]["z"]
143  self.jsonDic['time'] = int(round(time.time() * 1000)) #uavStateDic["header"]["seq"]
144  # jsonSendStr = json.dumps(self.jsonDic)
145  # self.sendToRemote(jsonSendStr)
146  #print(jsonSendStr)
147  return
148 
149 
150  def gpsPosCb(self, data):
151  data = json_message_converter.convert_ros_message_to_json(data)
152  uavStateDic = json.loads(data.strip())
153 
154  self.jsonDic['latitude'] = uavStateDic["latitude"]
155  self.jsonDic['longitude'] = uavStateDic["longitude"]
156  self.jsonDic['altitude'] = uavStateDic["altitude"]
157  self.jsonDic['time'] = int(round(time.time() * 1000))
158  self.jsonDic['type'] = "UAVPosVel"
159 
160  jsonSendStr = json.dumps(self.jsonDic)
161  self.sendToRemote(jsonSendStr)
162  #print(jsonSendStr)
163  return
164 
165  def publishNavMessage(self, jsonMsg):
166  if 'time' in jsonMsg:
167  if self.preSep == 0:
168  self.preSep = int(jsonMsg["time"])
169  self.curSeq = int(jsonMsg["time"])
170  if self.curSeq < self.preSep:
171  return
172  self.preSep = self.curSeq
173 
174  cmdMsg = geometry_msgs.msg.Point()
175  if jsonMsg['type'] == 'velocity':
176  cmdMsg.x = float(jsonMsg["u"])
177  cmdMsg.y = float(jsonMsg["v"])
178  cmdMsg.z = float(jsonMsg["w"])
179  self.vCmdPub.publish(cmdMsg)
180  # print("pub traj once!")
181  if jsonMsg['type'] == 'position':
182  cmdMsg.x = float(jsonMsg["latitude"])
183  cmdMsg.y = float(jsonMsg["longitude"])
184  cmdMsg.z = float(jsonMsg["altitude"])
185  self.pCmdPub.publish(cmdMsg)
186 
187  if jsonMsg['type'] == 'approach':
188  approachMsg = std_msgs.msg.Bool()
189  approachMsg.data = jsonMsg["flag"]
190  print("approach flag:", approachMsg.data)
191  if approachMsg.data:
192  self.approachPub.publish(approachMsg)
193 
194  if jsonMsg['type'] == 'online':
195  onlineMsg = std_msgs.msg.Bool()
196  onlineMsg.data = jsonMsg["flag"]
197  #print("online flag:", onlineMsg.data)
198  if not onlineMsg.data:
199  self.onlinePub.publish(onlineMsg)
200 
201  else:
202  return
203 
204  def trigger_response(self, request):
205  self.response.success = True
206  self.response.message = "take off done"
207  return self.response
208 
209 
211  rospy.init_node('SwarmSocket', log_level= rospy.DEBUG)
212  while not rospy.is_shutdown():
213  data, addr = self.UDPSock.recvfrom(self.localPort)
214  receivedJSONMessage = json.loads(data.strip()) # convert json string to a dictionary
215  # print(receivedJSONMessage)
216  self.publishNavMessage(receivedJSONMessage)
217  #unityROSMessage = json_message_converter.convert_json_to_ros_message("nav_msgs/Odometry", receivedJSONMessage)
218  #rospy.sleep(5.)
219  return
220 
221 def main(args):
222  swarm_socket = SwarmSocket()
223  swarm_socket.remoteInterfaceModule()
224  #print('Destroying all the windows...')
225  #cv2.destroyAllWindows()
226 
227 if __name__ == '__main__':
228  main(sys.argv)
kerrigan_json.SwarmSocket.readFile
def readFile(self, filename)
Definition: kerrigan_json.py:31
kerrigan_json.SwarmSocket.pCmdPub
pCmdPub
Definition: kerrigan_json.py:66
kerrigan_json.SwarmSocket.sendToRemote
def sendToRemote(self, text)
Definition: kerrigan_json.py:50
kerrigan_json.SwarmSocket.jsonSwarmDic
jsonSwarmDic
Definition: kerrigan_json.py:83
kerrigan_json.SwarmSocket.UDPSock
UDPSock
Definition: kerrigan_json.py:45
kerrigan_json.SwarmSocket.jsonDic
jsonDic
Definition: kerrigan_json.py:82
kerrigan_json.SwarmSocket.preSep
preSep
Definition: kerrigan_json.py:61
kerrigan_json.SwarmSocket.approachPub
approachPub
Definition: kerrigan_json.py:67
kerrigan_json.SwarmSocket.vCmdPub
vCmdPub
Definition: kerrigan_json.py:65
kerrigan_json.SwarmSocket.publishNavMessage
def publishNavMessage(self, jsonMsg)
Definition: kerrigan_json.py:165
kerrigan_json.SwarmSocket.onlinePub
onlinePub
Definition: kerrigan_json.py:68
kerrigan_json.SwarmSocket.localPort
localPort
Definition: kerrigan_json.py:64
kerrigan_json.SwarmSocket.__exit__
def __exit__(self, type, value, traceback)
Definition: kerrigan_json.py:89
kerrigan_json.SwarmSocket.response
response
Definition: kerrigan_json.py:79
kerrigan_json.SwarmSocket.writeFile
def writeFile(self, filename, text)
Definition: kerrigan_json.py:38
kerrigan_json.main
def main(args)
Definition: kerrigan_json.py:221
kerrigan_json.SwarmSocket.__enter__
def __enter__(self)
Definition: kerrigan_json.py:86
kerrigan_json.SwarmSocket.remoteInterfaceModule
def remoteInterfaceModule(self)
Definition: kerrigan_json.py:210
kerrigan_json.SwarmSocket
Definition: kerrigan_json.py:30
kerrigan_json.SwarmSocket.UDPServerSetup
def UDPServerSetup(self, ip_addr="127.0.0.1", port=1234)
Definition: kerrigan_json.py:43
kerrigan_json.SwarmSocket.gpsPosCb
def gpsPosCb(self, data)
Definition: kerrigan_json.py:150
kerrigan_json.SwarmSocket.takeoff_srv
takeoff_srv
Definition: kerrigan_json.py:78
kerrigan_json.SwarmSocket.swarmCb
def swarmCb(self, data)
Definition: kerrigan_json.py:97
kerrigan_json.SwarmSocket.trigger_response
def trigger_response(self, request)
Definition: kerrigan_json.py:204
kerrigan_json.SwarmSocket.curSeq
curSeq
Definition: kerrigan_json.py:62
kerrigan_json.SwarmSocket.localIPAddress
localIPAddress
Definition: kerrigan_json.py:63
kerrigan_json.SwarmSocket.carTrackingCb
def carTrackingCb(self, data)
Definition: kerrigan_json.py:108
kerrigan_json.SwarmSocket.__init__
def __init__(self)
Definition: kerrigan_json.py:60
kerrigan_json.SwarmSocket.uav_state_CB
def uav_state_CB(self, data)
Definition: kerrigan_json.py:126


ddrone_task_manager
Author(s):
autogenerated on Thu Jul 30 2020 17:17:04