senseAndAvoid_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 """@package
6 communication middleware between ros and non-ros modules
7 
8 Designed for kerrigan object originally
9 """
10 
11 import sys
12 import rospy
13 #import cv2
14 from nav_msgs.msg import Odometry
15 import nav_msgs
16 import std_msgs.msg
17 import geometry_msgs.msg
18 from rospy_message_converter import json_message_converter
19 import json
20 import socket
21 import math
22 import nus_msgs
23 import std_srvs.srv
24 import time
25 from nus_msgs.msg import StateWithCovarianceStamped
26 import common_msgs.msg
27 from sensor_msgs.msg import NavSatFix
28 import tf.transformations
29 # from std_msgs import Bool
30 from tf.transformations import quaternion_from_euler, euler_from_quaternion
31 from geometry_msgs.msg import Quaternion, Point, TwistStamped, PoseStamped, PointStamped, Vector3Stamped, Polygon
32 from std_srvs.srv import Trigger, TriggerRequest
33 import threading
34 import numpy as np
35 
36 
38  def readFile(self, filename):
39  """read from file"""
40  file = open(filename, 'r')
41  fileText = file.read()
42  file.close()
43  return fileText
44 
45 
46  def writeFile(self, filename, text):
47  """write to file"""
48 
49  file = open(filename, 'w')
50  file.write(text)
51  return
52 
53  def UDPServerSetup(self, ip_addr = "127.0.0.1", port = 1234):
54  """ Set up a UDP server"""
55  self.UDPSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
56  listen_addr = (ip_addr, port)
57  self.UDPSock.bind(listen_addr)
58  return
59 
60  def sendToRemote(self,text):
61  """send text to remote machine """
62  UDP_IP = "127.0.0.1" # remote ip
63  UDP_PORT = 4866
64  #print "UDP target IP:", UDP_IP
65  #print "UDP target port:", UDP_PORT
66  sock = socket.socket(socket.AF_INET, # Internet
67  socket.SOCK_DGRAM) # UDP
68  #print(text)
69  sock.sendto(text, (UDP_IP, UDP_PORT))
70 
71  def __init__(self):
72  self.preSep = 0
73  self.curSeq = 0
74  self.localIPAddress = "127.0.0.1" # own ip address
75  self.localPort = 9028
76  self.vCmdPub = rospy.Publisher('/velTgtFromSwarm', common_msgs.msg.target, queue_size=1)
77  self.pCmdPub = rospy.Publisher('/posTgtFromSwarm', common_msgs.msg.target, queue_size=1)
78  self.approachPub = rospy.Publisher('/swarm/approach', std_msgs.msg.Bool, queue_size=1)
79  self.onlinePub = rospy.Publisher('/swarm/online', std_msgs.msg.Bool, queue_size=1)
80  # for simulation
81  # rospy.Subscriber("/hil/state/ground_truth", StateWithCovarianceStamped, self.uav_state_CB)
82  # for flight testing
83  rospy.Subscriber("/mavros/local_position/velocity_local", TwistStamped, self.VelCb)
84  rospy.Subscriber("/task_manager/position_nwu", PoseStamped, self.PoseCb)
85  rospy.Subscriber("/mavros/global_position/global", NavSatFix, self.gpsPosCb)
86  rospy.Subscriber("/task_manager/swarm", std_msgs.msg.Bool, self.swarmCb)
87  rospy.Subscriber("/detector/result", std_msgs.msg.Float32MultiArray, self.senseCb)
88  # rospy.Subscriber("/engage_cmd",Bool, self.typeTrigger)
89  self.UDPServerSetup(self.localIPAddress, self.localPort)
90  self.takeoff_srv = rospy.Service('/takeoffdone', Trigger, self.trigger_response)
91  self.response = std_srvs.srv.TriggerResponse()
92  self.response.success = False
93  # self.takeoff = False
94 
95  self.jsonSwarmDic = {}
96  self.file = open("/media/nvidia/SD/catkin_ws/data/detection_result", "w")
97  self.file.write('x_body, y_body, z_body, x_global, y_global, z_global, roll, pitch, yaw\n')
98  self.jsonDic = {"sense":False, "type": "SenseAvoid" }
99  self.q = [0,0,0,1]
100  self.sendOtherUAVInfo()
101 
102 
103 
104  def sendOtherUAVInfo(self):
105  """ send other uav's info with detection result """
106  # print "got other uav info"
107  sending_thread = threading.Timer(0.05, self.sendOtherUAVInfo)
108  jsonSendStr = json.dumps(self.jsonDic)
109  # print(jsonSendStr)
110  # self.file.write(jsonSendStr)
111  self.sendToRemote(jsonSendStr)
112  sending_thread.start()
113 
114  def __enter__(self):
115  return self
116 
117  def __exit__(self, type, value, traceback):
118  self.UDPSock.close()
119  return self
120 
121  def swarmCb(self, data):
122  """get swarm control info from /task_manager/swarm """
123 
124  data = json_message_converter.convert_ros_message_to_json(data)
125  swarmDic = json.loads(data.strip())
126  print("Send swarm to CA: ", swarmDic["data"])
127  self.jsonSwarmDic['type'] = "swarm"
128  self.jsonSwarmDic['flag'] = swarmDic["data"]
129  # self.jsonSwarmDic['time'] = int(round(time.time() * 1000))
130  jsonSendStr = json.dumps(self.jsonSwarmDic)
131  self.sendToRemote(jsonSendStr)
132  return
133 
134  def senseCb(self, data):
135  """get detection result from /detector/result"""
136 
137  index = 0
138  target_num = len(data.data)/4
139  data = json_message_converter.convert_ros_message_to_json(data)
140 
141  droneDic = json.loads(data.strip())
142 
143  for index in range(target_num):
144  # self.jsonDic['other_x'] = droneDic["data"][index+1]
145  # self.jsonDic['other_y'] = droneDic["data"][index+2]
146  # self.jsonDic['other_z'] = droneDic["data"][index+3]
147  self.jsonDic['sense'] = bool(droneDic["data"][index])
148  # print('flag: ', self.jsonDic['sense'])
149  if np.isinf(droneDic["data"][index+1]) or np.isinf(droneDic["data"][index+2]) or np.isinf(droneDic["data"][index+3]):
150  return
151  other_body = [droneDic["data"][index+3], -droneDic["data"][index+1], -droneDic["data"][index+2],0]
152  # print('other_body: ', other_body)
153  # print('q: ', self.q)
154  other_global = self.qv_mult(self.q, other_body)
155  # print('other_global: ', other_global)
156 
157  self.jsonDic['other_body_x'] = other_body[0]
158  self.jsonDic['other_body_y'] = other_body[1]
159  self.jsonDic['other_body_z'] = other_body[2]
160 
161  self.jsonDic['other_x'] = other_global[0]
162  self.jsonDic['other_y'] = other_global[1]
163  self.jsonDic['other_z'] = other_global[2]
164  self.jsonDic['h_pixel_dist'] = droneDic["data"][index+4]
165  # print(self.jsonDic)
166  # json.dumps(self.jsonDic, self.file)
167  self.file.write('%s, %s, %s, %s, %s, %s, %s, %s, %s\n' %(other_body[0], other_body[1], other_body[2],other_global[0], other_global[1], other_global[2],self.jsonDic['roll'], self.jsonDic['pitch'] ,self.jsonDic['yaw'] ))
168 
169  return
170 
171  def PoseCb(self, data):
172  """ get position from /task_manager/position_nwu"""
173  data = json_message_converter.convert_ros_message_to_json(data)
174  uavStateDic = json.loads(data.strip())
175  self.q = [uavStateDic["pose"]["orientation"]["x"],
176  uavStateDic["pose"]["orientation"]["y"],
177  uavStateDic["pose"]["orientation"]["z"],
178  uavStateDic["pose"]["orientation"]["w"]]
179  euler = euler_from_quaternion(self.q)
180  self.jsonDic['roll'] = euler[0]
181  self.jsonDic['pitch'] = euler[1]
182  self.jsonDic['yaw'] = euler[2]
183  # print(self.jsonDic)
184  return
185 
186  def VelCb(self, data):
187  """get velocity from /mavros/local_position/velocity_local"""
188  data = json_message_converter.convert_ros_message_to_json(data)
189  uavStateDic = json.loads(data.strip())
190 
191  self.jsonDic['u'] = uavStateDic["twist"]["linear"]["y"]
192  self.jsonDic['v'] = -uavStateDic["twist"]["linear"]["x"]
193  self.jsonDic['w'] = uavStateDic["twist"]["linear"]["z"]
194  self.jsonDic['time'] = int(round(time.time() * 1000)) #uavStateDic["header"]["seq"]
195  # print(len(self.jsonDic))
196  return
197 
198  def qv_mult(self, q1, v1):
199  """transform vector v1 through q1"""
200  # v1 = tf.transformations.unit_vector(v1)
201  # q2 = list(v1)
202  # q2.append(0.0)
203  return tf.transformations.quaternion_multiply(
204  tf.transformations.quaternion_multiply(q1, v1),
205  tf.transformations.quaternion_conjugate(q1)
206  )[:3]
207 
208  def gpsPosCb(self, data):
209  """get global pose from /mavros/global_position/global"""
210  data = json_message_converter.convert_ros_message_to_json(data)
211  uavStateDic = json.loads(data.strip())
212 
213  self.jsonDic['latitude'] = uavStateDic["latitude"]
214  self.jsonDic['longitude'] = uavStateDic["longitude"]
215  self.jsonDic['altitude'] = uavStateDic["altitude"]
216  self.jsonDic['time'] = int(round(time.time() * 1000))
217  return
218 
219  def publishNavMessage(self, jsonMsg):
220  """sent all the reqired info to non-ros CA module"""
221  if 'time' in jsonMsg:
222  if self.preSep == 0:
223  self.preSep = int(jsonMsg["time"])
224  self.curSeq = int(jsonMsg["time"])
225  if self.curSeq < self.preSep:
226  return
227  self.preSep = self.curSeq
228 
229  # cmdMsg = geometry_msgs.msg.Point()
230  cmdMsg = common_msgs.msg.target()
231 
232  if jsonMsg['type'] == 'velocity':
233  cmdMsg.controller = True
234  cmdMsg.tgt.x = float(jsonMsg["u"])
235  cmdMsg.tgt.y = float(jsonMsg["v"])
236  cmdMsg.tgt.z = float(jsonMsg["w"])
237  cmdMsg.yaw_tgt = float(jsonMsg["yaw"])
238  self.vCmdPub.publish(cmdMsg)
239  # print("pub traj once!")
240  if jsonMsg['type'] == 'position':
241  cmdMsg.controller = False
242  cmdMsg.tgt.x = float(jsonMsg["latitude"])
243  cmdMsg.tgt.y = float(jsonMsg["longitude"])
244  cmdMsg.tgt.z = float(jsonMsg["altitude"])
245  cmdMsg.yaw_tgt = float(jsonMsg["yaw"])
246  self.pCmdPub.publish(cmdMsg)
247 
248  if jsonMsg['type'] == 'approach':
249  approachMsg = std_msgs.msg.Bool()
250  approachMsg.data = jsonMsg["flag"]
251  print("approach flag:", approachMsg.data)
252  if approachMsg.data:
253  self.approachPub.publish(approachMsg)
254 
255  if jsonMsg['type'] == 'online':
256  onlineMsg = std_msgs.msg.Bool()
257  onlineMsg.data = jsonMsg["flag"]
258  #print("online flag:", onlineMsg.data)
259  if not onlineMsg.data:
260  self.onlinePub.publish(onlineMsg)
261 
262  else:
263  return
264 
265  def trigger_response(self, request):
266  """get notified of taking off status through /takeoffdone"""
267  self.response.success = True
268  self.response.message = "take off done"
269  return self.response
270 
271 
273  """Info receving and sending"""
274  rospy.init_node('SwarmSocket', log_level= rospy.DEBUG)
275  while not rospy.is_shutdown():
276  data, addr = self.UDPSock.recvfrom(self.localPort)
277  receivedJSONMessage = json.loads(data.strip()) # convert json string to a dictionary
278  # print(receivedJSONMessage)
279  self.publishNavMessage(receivedJSONMessage)
280  #unityROSMessage = json_message_converter.convert_json_to_ros_message("nav_msgs/Odometry", receivedJSONMessage)
281  #rospy.sleep(5.)
282  return
283 
284 def main(args):
285  swarm_socket = SwarmSocket()
286  swarm_socket.remoteInterfaceModule()
287 
288 if __name__ == '__main__':
289  main(sys.argv)
senseAndAvoid_json.SwarmSocket.sendToRemote
def sendToRemote(self, text)
Definition: senseAndAvoid_json.py:60
senseAndAvoid_json.SwarmSocket.qv_mult
def qv_mult(self, q1, v1)
Definition: senseAndAvoid_json.py:198
senseAndAvoid_json.SwarmSocket.sendOtherUAVInfo
def sendOtherUAVInfo(self)
Definition: senseAndAvoid_json.py:104
senseAndAvoid_json.SwarmSocket.preSep
preSep
Definition: senseAndAvoid_json.py:72
senseAndAvoid_json.SwarmSocket.VelCb
def VelCb(self, data)
Definition: senseAndAvoid_json.py:186
senseAndAvoid_json.SwarmSocket.onlinePub
onlinePub
Definition: senseAndAvoid_json.py:79
senseAndAvoid_json.SwarmSocket.__exit__
def __exit__(self, type, value, traceback)
Definition: senseAndAvoid_json.py:117
senseAndAvoid_json.SwarmSocket.__init__
def __init__(self)
Definition: senseAndAvoid_json.py:71
senseAndAvoid_json.SwarmSocket.__enter__
def __enter__(self)
Definition: senseAndAvoid_json.py:114
senseAndAvoid_json.SwarmSocket.gpsPosCb
def gpsPosCb(self, data)
Definition: senseAndAvoid_json.py:208
senseAndAvoid_json.SwarmSocket
Definition: senseAndAvoid_json.py:37
senseAndAvoid_json.SwarmSocket.senseCb
def senseCb(self, data)
Definition: senseAndAvoid_json.py:134
senseAndAvoid_json.SwarmSocket.approachPub
approachPub
Definition: senseAndAvoid_json.py:78
senseAndAvoid_json.main
def main(args)
Definition: senseAndAvoid_json.py:284
senseAndAvoid_json.SwarmSocket.swarmCb
def swarmCb(self, data)
Definition: senseAndAvoid_json.py:121
senseAndAvoid_json.SwarmSocket.localIPAddress
localIPAddress
Definition: senseAndAvoid_json.py:74
senseAndAvoid_json.SwarmSocket.takeoff_srv
takeoff_srv
Definition: senseAndAvoid_json.py:90
senseAndAvoid_json.SwarmSocket.writeFile
def writeFile(self, filename, text)
Definition: senseAndAvoid_json.py:46
senseAndAvoid_json.SwarmSocket.jsonDic
jsonDic
Definition: senseAndAvoid_json.py:98
senseAndAvoid_json.SwarmSocket.q
q
Definition: senseAndAvoid_json.py:99
senseAndAvoid_json.SwarmSocket.remoteInterfaceModule
def remoteInterfaceModule(self)
Definition: senseAndAvoid_json.py:272
senseAndAvoid_json.SwarmSocket.curSeq
curSeq
Definition: senseAndAvoid_json.py:73
senseAndAvoid_json.SwarmSocket.jsonSwarmDic
jsonSwarmDic
Definition: senseAndAvoid_json.py:95
senseAndAvoid_json.SwarmSocket.vCmdPub
vCmdPub
Definition: senseAndAvoid_json.py:76
senseAndAvoid_json.SwarmSocket.readFile
def readFile(self, filename)
Definition: senseAndAvoid_json.py:38
senseAndAvoid_json.SwarmSocket.localPort
localPort
Definition: senseAndAvoid_json.py:75
senseAndAvoid_json.SwarmSocket.pCmdPub
pCmdPub
Definition: senseAndAvoid_json.py:77
senseAndAvoid_json.SwarmSocket.file
file
Definition: senseAndAvoid_json.py:96
senseAndAvoid_json.SwarmSocket.UDPSock
UDPSock
Definition: senseAndAvoid_json.py:55
senseAndAvoid_json.SwarmSocket.PoseCb
def PoseCb(self, data)
Definition: senseAndAvoid_json.py:171
senseAndAvoid_json.SwarmSocket.UDPServerSetup
def UDPServerSetup(self, ip_addr="127.0.0.1", port=1234)
Definition: senseAndAvoid_json.py:53
senseAndAvoid_json.SwarmSocket.response
response
Definition: senseAndAvoid_json.py:91
senseAndAvoid_json.SwarmSocket.trigger_response
def trigger_response(self, request)
Definition: senseAndAvoid_json.py:265
senseAndAvoid_json.SwarmSocket.publishNavMessage
def publishNavMessage(self, jsonMsg)
Definition: senseAndAvoid_json.py:219


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