Beispiel #1
0
def parseBoxes(data):
	global lidar_array
	global filter_box = BoundingBoxArray()
	data_ped = BoundingBoxArray()
	data_car = BoundingBoxArray()
	data_follow = BoundingBoxArray()
	counterp = 0
	counterc = 0
	data_ped.header = data.header
	data_car.header = data.header
	data_follow.header = data.header
	lidar_array = Multi_targets()

	for i in range(len(data.boxes)):
		lidar_target = target()
		x = data.boxes[i].pose.position.x
		y = data.boxes[i].pose.position.y
		height = data.boxes[i].dimensions.z
		length = data.boxes[i].dimensions.x
		width = data.boxes[i].dimensions.y
		lidar_target.pos_x = x
		lidar_target.pos_y = y

		if (y<50 and y>0) and (x<2.5 and x>-2.5):
			data_follow.boxes.append(data.boxes[i])
		if (y<20 and y>-10) and (x<8 and x>-8):
			height = data.boxes[i].dimensions.z
			length = data.boxes[i].dimensions.x
			width = data.boxes[i].dimensions.y
			# Pedstrian
			if (height < 1.8 and height > 0.5) and (length < 1.5 and length > 0) and (width < 1.5 and width > 0):
				data_ped.boxes.append(data.boxes[i])
				# lidar_target.category = 0
				# lidar_target.counter = .1
			# Vehicle
			elif (height < 5 and height > 0.5) and (length < 10 and length > 0) and (width < 10 and width > 0):
				data_car.boxes.append(data.boxes[i])
				# lidar_target.category = 1
				# lidar_target.counter = .1
			lidar_array.data.append(lidar_target)
			filter_box.boxes.append(data.boxes[i])

    # pub_ly_fuse.publish(ly_array)
	pub_car.publish(data_car)
	pub_follow.publish(data_follow)
Beispiel #2
0
def parseYoloBoxes(msg):
	global img, img_lock, lidar_array, fx, cx
	ly_array = Multi_targets()
	ly_array.data = lidar_array.data[:]
	#global yolobox
	#print 2
	#print data.obj.x
	#pubbox.publish(yolo_box)
	if len(msg.obj) > 0:
		# print msg.header.stamp.secs + 1e-9 * msg.header.stamp.nsecs

		img_local = None
		# copy the image, get the lock
		if (img is not None) and (img_lock == False):
			img_lock = True
			img_local = np.copy(img)
			img_lock = False
		else:
			print 'Waiting for image.'


		# overlay the boxes on the image and publish
		if img_local is not None:
			color = (0,0,0)
		 	if msg.type == 'person':
				color = (255,0,0)
			else:
				color = (0,0,255)

			for obj in msg.obj:
				yolo_t = target()
				x = obj.x
				y = obj.y
				w = obj.width
				h = obj.height
				s = obj.score
				# yolo_t.pos_x = x
				# yolo_t.pos_y = y
				# yolo_t.counter = s
				# if msg.type == 'person':
				# 	yolo_t.category = 0
				# else:
				# 	yolo_t.category = 1

				#calculate yolo angle
				yolo_angle = np.arctan(fx/((x+w/2)-cx))
				if yolo_angle < 0:
					yolo_angle = yolo_angle + 3.1415
				ly_angles = []

				#find the angle diff with every object in ly_array
				for i in range(len(ly_array.data)):
					ly_x = ly_array.data[i].pos_x
					ly_y = ly_array.data[i].pos_y
					ly_angle = np.arctan(ly_y/ly_x)
					if ly_angle < 0:
						ly_angle = ly_angle + 3.1415
					ly_angles.append(ly_angle)
				ly_angle_diff = [abs(angle - yolo_angle) for angle in ly_angles]

				# replace label for nearest object within 3 degrees and counter less that .25
				# update score
				obj_i = ly_angle_diff.index(min(ly_angle_diff))
				if (min(ly_angle_diff)<0.1):
					if msg.type=='person':
						ly_array.data[obj_i].category = 1
					# else:
					# 	lidar_array.data[obj_i].category = 2
						ly_array.data[obj_i].counter = s

				# print 'type: %s, x: %d, y: %d, h: %d, w: %d, score: %f\n' % (msg.type,x,y,h,w,s)
				cv2.rectangle(img_local, (x,y), (x+w, y+h), color = color)
			img_msg = CvBridge().cv2_to_imgmsg(img_local, encoding="bgr8")
			pub_img_proc.publish(img_msg)
		# pub_ped.publish(data_ped)
		pub_ly_fuse.publish(ly_array)
def parseBoxes(data):
	global lidar_array
	global filter_boxes
	filter_boxes = BoundingBoxArray()
	data_ped = BoundingBoxArray()
	data_car = BoundingBoxArray()
	data_follow = BoundingBoxArray()

	data_ped.header = data.header
	data_car.header = data.header
	data_follow.header = data.header
	filter_boxes.header = data.header
	lidar_array = Multi_targets()

	minl = 1000;
	minr = 1000;
	minf = 1000;

	for i in range(len(data.boxes)):
		lidar_target = target()
		x = data.boxes[i].pose.position.x
		y = data.boxes[i].pose.position.y
		height = data.boxes[i].dimensions.z
		length = data.boxes[i].dimensions.x
		width = data.boxes[i].dimensions.y
		lidar_target.pos_x = x
		lidar_target.pos_y = y

		if (y<50 and y>0) and (x<2.5 and x>-2.5):
			data_follow.boxes.append(data.boxes[i])
		if (y<50 and y>-10) and (x<8 and x>-12):
			height = data.boxes[i].dimensions.z
			length = data.boxes[i].dimensions.x
			width = data.boxes[i].dimensions.y
			# Pedstrian
			if (height < 1.8 and height > 0.5) and (length < 1.5 and length > 0) and (width < 1.5 and width > 0):
				data_ped.boxes.append(data.boxes[i])
				# lidar_target.category = 0
				# lidar_target.counter = .1
			# Vehicle
			elif (height < 5 and height > 0.5) and (length < 10 and length > 0) and (width < 10 and width > 0):
				data_car.boxes.append(data.boxes[i])
				# lidar_target.category = 1
				# lidar_target.counter = .1
			lidar_array.data.append(lidar_target)
			filter_boxes.boxes.append(data.boxes[i])

		if x>0 and x<minr and y<10 and y>-10:
			minr = x
		if x<0 and abs(x)<minl and y<10 and y>-10:
			minl = abs(x)
		if y>0 and y<minf and x<10 and x>10:
			minf = y

	if minf < 5:
		front_pub.publish(1)
	elif minf < 10:
		front_pub.publish(2)
	else:
		front_pub.publish(3)
	if minl < 5:
		left_pub.publish(1)
	elif minl < 10:
		left_pub.publish(2)
	else:
		left_pub.publish(3)
	if minr < 5:
		right_pub.publish(1)
	elif minr < 10:
		right_pub.publish(2)
	else:
		right_pub.publish(3)

	pub_ped.publish(data_ped)
	pub_car.publish(data_car)
	pub_follow.publish(data_follow)
def main():
    global camera_list_targets, radar_list_targets, previous_camera_list_targets, previous_radar_list_targets
    rospy.init_node('listener')

    rospy.Subscriber("radar_targets", Float32MultiArray, callback_radar)
    rospy.Subscriber("camera_targets", Float32MultiArray, callback_camera)

    rospy.Subscriber("/vehicle/wheel_speeds", WheelSpeedReport, callback_wheel)

    # ------------------------------------------------------------
    # Initialize the figure
    # f, ax = plt.subplots(1)
    # plt.ion()

    # ------------------------------------------------------------

    rate = rospy.Rate(20)
    while not rospy.is_shutdown():

        # Refresh plot
        # ax.clear()

        # ------------------------------------------------------------
        # If no targets detected, the global variables are not updated so
        # they stay equal to they previous value. So if that happens, we set
        # them to None. Maybe better to do an empty tuple instead.

        if camera_list_targets == previous_camera_list_targets:
            camera_list_targets = None

        if radar_list_targets == previous_radar_list_targets:
            radar_list_targets = None

        # ------------------------------------------------------------
        # Reshape the lists to make it easier to work.
        # We only reshape if it's not a None, of course
        # We change the name (ex: radar_list_targets_matrix to still be able to compare with previous value at the end of the main

        radar_list_targets_matrix = []
        camera_list_targets_matrix = []

        if radar_list_targets != None:
            radar_list_targets_matrix = np.array(radar_list_targets).reshape(
                len(radar_list_targets) / 4,
                4)  # Number of rows and columns (x,y,speed,label)

        if camera_list_targets != None:
            camera_list_targets_matrix = np.array(camera_list_targets).reshape(
                len(camera_list_targets) / 6, 6
            )  # Number of rows and columns (x,y,speed). 6 is the number of info from camera we have (x,y, speed, label, age, lane)

        # ------------------------------------------------------------
        # Here we do the fusion. We go through all the points and:
        # -> Calculate the distance between all the camera points with the radar points
        #   -> If they are close, we do an average
        #   -> If not close, we keep them both
        # We append everything in a new matrix

        # LABEL: 1.0 = Car
        #        2.0 = Unknown

        all_targets = []
        min_distance = 1.0  #Min distance between two points to be considered the same points

        # Create an object of type Multi_targets() -> Will store all the detected targets (of type target)
        target_array = Multi_targets()
        targets_cars = Multi_targets()

        global iteration
        global list_cam_speed
        global list_radar_speed
        global list_wheel_speed

        global previous_v_avg
        previous_v_avg = 0  # Maybe change that if we start with an initial velocity very different from zero

        for i in range(0,
                       len(camera_list_targets_matrix)):  #camera targets loop
            #print 'i = ', i

            close_points = []
            x_cam = camera_list_targets_matrix[i][0]
            y_cam = camera_list_targets_matrix[i][1]
            v_cam = camera_list_targets_matrix[i][2]  #Speed
            label_cam = camera_list_targets_matrix[i][3]
            age_cam = camera_list_targets_matrix[i][4]
            lane_cam = camera_list_targets_matrix[i][5]

            close_points = np.append(close_points, [x_cam, y_cam, v_cam])

            if lane_cam == 0:

                for j in range(
                        0,
                        len(radar_list_targets_matrix)):  #radar targets loop

                    x_radar = radar_list_targets_matrix[j][0]
                    y_radar = radar_list_targets_matrix[j][1]
                    v_radar = radar_list_targets_matrix[j][2]  #Speed
                    label_radar = radar_list_targets_matrix[j][3]

                    distance = np.sqrt((x_radar - x_cam)**2 +
                                       (y_radar - y_cam)**2)

                    if distance < min_distance:

                        close_points = np.append(close_points,
                                                 [x_radar, y_radar, v_radar])

                        # ---------------
                        # Plots for debugging
                        #list_cam_speed = list_cam_speed + [v_cam]
                        #list_radar_speed = list_radar_speed + [v_radar]
                        #plt.plot(list_cam_speed,'b')
                        #plt.plot(list_radar_speed,'r')
                        #plt.pause(0.001)

                    elif distance > min_distance:
                        #print 'No Fusion !'

                        # We add the label (1.0 = car, 2.0 = unknown)
                        b = np.append(radar_list_targets_matrix[j], 2.0)

                        all_targets.append(list(b))

                        target_far = target()
                        target_far.pos_x = x_radar
                        target_far.pos_y = y_radar
                        target_far.speed = v_radar
                        target_far.category = 2
                        target_far.counter = j

                        target_array.data.append(target_far)

                matrix_close_points = np.reshape(close_points,
                                                 (len(close_points) / 3, 3))
                x_avg = np.mean(matrix_close_points[:, 0])
                y_avg = np.mean(matrix_close_points[:, 1])
                v_avg = np.mean(matrix_close_points[:, 2])

                # ---------------------
                # This is for publishing
                target_avg = target()
                target_avg.pos_x = x_avg
                target_avg.pos_y = y_avg
                target_avg.category = 1
                target_avg.counter = i  # Not relevant to put i

                #print 'speed diff = ', abs(v_avg - previous_v_avg)

                # Remove incoherent points
                if (abs(v_avg - previous_v_avg) < 10):
                    target_avg.speed = v_avg
                    previous_v_avg = v_avg
                else:
                    target_avg.speedd = previous_v_avg

                # Put that in the array of detected cars
                targets_cars.data.append(target_avg)

                # Append the avg point (the points close to car) in the target array
                target_array.data.append(target_avg)

                # ---------------------
                # This is for plotting
                # We average and add the label (1.0 = car)
                point_average = [x_avg, y_avg, v_avg, 1.0]
                all_targets.append(point_average)

                # --------------------
                # Debugging plot
                # NAME IS WRONG BUT WE ACTUALLY PLOT THE SPEED FOR ACC (AVG SPEED)
                #list_cam_speed = list_cam_speed + [target_avg.speed]
                #plt.plot(list_cam_speed,'b')
                #plt.pause(0.001) # Do I need this ?
                # --------------------

        # Publish for ACC
        pub_acc.publish(targets_cars)
        pub_all_targets.publish(target_array)

        # ------------------------------------------------------------
        # Here we plot the targets
        # Change the indexes !
        #print type(all_targets)
        #print all_targets
        #print ' '
        #column_of_x = [i[0] for i in all_targets]
        #column_of_y = [i[1] for i in all_targets]

        #ax.scatter(column_of_x, column_of_y,color='green', marker='.')

        # ------------------------------------------------------------
        # Plot test
        # for i in range(len(all_targets)):
        # 	if all_targets[i][3] == 1.0:
        # 		ax.scatter(all_targets[i][0], all_targets[i][1], color = 'green', marker = 'o')
        #  	else:
        #  		ax.scatter(all_targets[i][0], all_targets[i][1], color = 'red', marker = 'o')

        # End plot test
        # ------------------------------------------------------------

        # plt.xlim([-20,20])
        # plt.ylim([-1,40])
        # plt.grid()
        # f.canvas.draw()  # Do I need this ?
        # plt.legend(loc='upper left')
        plt.grid()
        # plt.pause(0.001) # Do I need this ?

        # ------------------------------------------------------------
        # Update the new previous global variables
        previous_camera_list_targets = camera_list_targets
        previous_radar_list_targets = radar_list_targets
        # ------------------------------------------------------------

        rate.sleep()

    rospy.spin()
		for j in range(len(previous_targets)):
			x_previous = previous_targets.boxes[j].pose.position.x
			y_previous = previous_targets.boxes[j].pose.position.y

			distance = math.sqrt( (x - x_previous)**2 +  (y - y_previous)**2 )

			# WE CAN ALSO COMPARE THE BOX SIZE

			if distance < 0.25:
				 = data_copy.boxes[i].header.stamp.secs




for i in range(len(data.boxes)):
		lidar_target = target()
		x = data.boxes[i].pose.position.x
		y = data.boxes[i].pose.position.y
		height = data.boxes[i].dimensions.z
		length = data.boxes[i].dimensions.x
		width = data.boxes[i].dimensions.y
		lidar_target.pos_x = x
		lidar_target.pos_y = y

		print data.boxes[i]


		# If the target is in front of the car
		if (y<50 and y>0) and (x<2.5 and x>-2.5):
			data_follow.boxes.append(data.boxes[i])