예제 #1
0
 def shutdown(self):
     print("shutdown!")
     self.shutdown_ = True
     msg = NormalizedSpeedCommand()
     msg.value = 0
     self.pub_speed.publish(msg)
     rospy.sleep(1)
예제 #2
0
def initialize():
    pub = rospy.Publisher('/control/command/normalized_wanted_speed', NormalizedSpeedCommand, queue_size=1)
    steering = rospy.Publisher('/control/command/normalized_wanted_steering', NormalizedSteeringCommand, queue_size=1)
    rospy.Subscriber("/carstate/steering", NormalizedSteeringCommand, queue_size=1)
    rospy.Subscriber("/carstate/speed", Speed, callback)
    rospy.Timer(5.0, timer)
    h = Header()
    h.stamp = rospy.Time.now()
    mensaje = NormalizedSpeedCommand()
    mensaje.header = h
    mensaje.value = -0.45
    pub.publish(mensaje)
예제 #3
0
    def simple_parking(self):
        if self.net_image == []:
            return

    #  rospy.sleep(1.0)

        self.network.load_weights(
            '/home/alvarado/catkin_emiliano/src/assigment_publisher_subscriber/src/net1.h5'
        )

        gray = cv2.cvtColor(self.net_image, cv2.COLOR_BGR2GRAY)
        #bi_gray_max = 255
        #bi_gray_min = 70
        #ret,thresh1=cv2.threshold(gray, bi_gray_min, bi_gray_max, cv2.THRESH_BINARY)
        ret2, thresh1 = cv2.threshold(gray, 0, 255,
                                      cv2.THRESH_BINARY + cv2.THRESH_OTSU)

        test_images = thresh1
        print("Tamanio imagen: {}".format(test_images.shape))
        test_images = cv2.resize(
            test_images, (56, 56), interpolation=cv2.INTER_AREA
        )  #esto es lo que se cambia para el tamamio de la imagen

        try:
            ros_img = self.bridge.cv2_to_imgmsg(test_images)
            self.img_pub.publish(ros_img)
        except CvBridgeError as e:
            print(e)

        test_images = test_images[0:28, 28:56]

        ############
        imagenes_NN = test_images.reshape((1, 28 * 28))
        imagenes_NN = imagenes_NN.astype('float32') / 255

        resultado = self.network.predict_classes(imagenes_NN)
        ###########
        print("Resultado: {}".format(resultado))
        return

        velocidad = NormalizedSpeedCommand()

        if resultado == 5:
            velocidad.value = 0.0
        self.vel_pub.publish(velocidad)
        if resultado == 4:
            velocidad.value = 0.2
        self.vel_pub.publish(velocidad)
        if resultado == 0:
            velocidad.value = velocidad.value
        self.vel_pub.publish(velocidad)
예제 #4
0
    def simple_parking(self):
        if self.net_image == []:
            return
        #here are the uploadings of the weights
        self.classifier.load_weights(
            '/home/alvarado/catkin_emiliano/src/assigment_publisher_subscriber/src/net4.h5'
        )
        #here the image is being converted into black and white
        gray = cv2.cvtColor(self.net_image, cv2.COLOR_BGR2GRAY)
        ret2, thresh1 = cv2.threshold(gray, 0, 255,
                                      cv2.THRESH_BINARY + cv2.THRESH_OTSU)

        test_images = thresh1
        print("Tamanio imagen: {}".format(test_images.shape))
        test_images = cv2.resize(test_images, (56, 56),
                                 interpolation=cv2.INTER_AREA)
        test_images = test_images[
            0:28, 28:
            56]  #here image is being resizedinto something the computer can reads

        try:
            ros_img = self.bridge.cv2_to_imgmsg(test_images)
            self.img_pub.publish(ros_img)
        except CvBridgeError as e:
            print(e)


############
        imagenes_NN = test_images.reshape((1, 28, 28, 1))
        imagenes_NN = imagenes_NN.astype('float32') / 255

        resultado = self.classifier.predict_classes(imagenes_NN)
        ###########
        print("Resultado: {}".format(resultado))
        #return
        #here are set up the conditions for the numbers the net sees.
        velocidad = NormalizedSpeedCommand()

        if resultado == 5:
            velocidad.value = 0.5
        self.vel_pub.publish(velocidad)
        if resultado == 4:
            velocidad.value = 0.0

        self.vel_pub.publish(velocidad)
        if resultado == 0:
            velocidad.value = 0.3
        self.vel_pub.publish(velocidad)
예제 #5
0
 def shutdown(self):
     #set speed to 0
     print("shutdown!")
     self.publishing = True
     msgs = NormalizedSpeedCommand()
     self.vel_pub.publish(msgs)
     rospy.sleep(1)
예제 #6
0
 def shutdown(self):
     #set speed to 0
     print("shutdown!")
     self.publishing = True
     msgs = NormalizedSpeedCommand()
     self.vel_pub.publish(msgs)
     rospy.sleep(1)
     np.savetxt('test_new_39.txt', self.test_data)
예제 #7
0
def backwards_right(data, date):
    rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.value)
    pub = rospy.Publisher('/control/command/normalized_wanted_speed', NormalizedSpeedCommand, queue_size=10)
    steering = rospy.Publisher('/control/command/normalized_wanted_steering', NormalizedSteeringCommand, queue_size=10)
    h = std_msgs.msg.Header()
    h.stamp = rospy.Time.now()
    mensaje = NormalizedSpeedCommand()
    mensaje.header = h
    mensaje.value  = data.value

    j = std_msgs.msg.Header()
    j.stamp = rospy.Time.now()
    mensaje2 = NormalizedSteeringCommand()
    mensaje2.header = j
    mensaje2.value = date.value

    if date.value > 0:
       mensaje.vlaue = date.value * -1
    pub.publish(mensaje)
예제 #8
0
def callback(data):
    pub = rospy.Publisher('/control/command/normalized_wanted_speed',
                          NormalizedSpeedCommand,
                          queue_size=10)
    h = std_msgs.msg.Header()
    h.stamp = rospy.Time.now()
    mensaje = NormalizedSpeedCommand()
    mensaje.header = h
    mensaje.value = data.value

    if data.value < 0:
        mensaje.value = data.value * -1
    if data.value > 0:
        mensaje.value = data.value * -1

    pub.publish(mensaje)
예제 #9
0
    def simple_parking(self):
        # here comes the values I will asign to the topics
        # definition of message for speed
        velocidad = NormalizedSpeedCommand()

        # definition of message for steering
        direccion = NormalizedSteeringCommand()

        rospy.sleep(1.0)
        #here are the values assigned to speed amd steering
        # first values
        velocidad.value = -0.2
        direccion.value = 0.7
        self.vel_pub.publish(velocidad)
        self.dir_pub.publish(direccion)
        # use this values for this period of time
        rospy.sleep(2.0)
        # second values
        velocidad.value = -0.2
        direccion.value = -0.7
        self.vel_pub.publish(velocidad)
        self.dir_pub.publish(direccion)
        # use this values for this period of time
        rospy.sleep(1.5)
        #third values
        velocidad.value = 0.2
        direccion.value = 0.2
        self.vel_pub.publish(velocidad)
        self.dir_pub.publish(direccion)
        rospy.sleep(1.0)

        # for stop, in this program the stop was by using ctrl+c
        velocidad.value = 0.0
        direccion.value = 0.0
        self.vel_pub.publish(velocidad)
        self.dir_pub.publish(direccion)
        rospy.sleep(10.0)
예제 #10
0
#!/usr/bin/env python

import rospy
import time
import math
import numpy as np

from autominy_msgs.msg import NormalizedSpeedCommand, NormalizedSteeringCommand, SteeringFeedback, Speed
from nav_msgs.msg import Odometry
from geometry_msgs.msg import PoseWithCovariance, Pose, Point, PointStamped
from visualization_msgs.msg import Marker
from std_msgs.msg import Header

speed = 0.1
speed_cmd = NormalizedSpeedCommand()
steering_cmd = NormalizedSteeringCommand()
speed_cmd.value = speed
punkt = Odometry()
close = Marker()
clicked = Marker()
lookahead = Marker()
isactiv = False
steeringvalue = 0.0
gewollterWinkel = 0.0
lastgewollterWinkel = 0.0
kurvenverlangsamung = 1.0 #Muss noch angepasst werden, konnte aber empierisch nicht getan werden, da das gps aus war
kp = 4.0
ki = 0.1
kd = 0.2
lasterror = 0.0
ierror = 0.0
예제 #11
0
    def PID_steering(self, raw_msgs):

        #retrieving values from message
        x = raw_msgs.pose.pose.position.x
        y = raw_msgs.pose.pose.position.y
        orientation = raw_msgs.pose.pose.orientation
        orientation_array = [
            orientation.x, orientation.y, orientation.z, orientation.w
        ]

        #change the read-out data from Euler to Rad
        #(roll, pitch, yaw) = (orientation_array)
        orientation_in_Rad = tf.transformations.euler_from_quaternion(
            orientation_array)
        self.yaw = orientation_in_Rad[2]
        x_ind = np.int(x * (100.0 / self.resolution))
        y_ind = np.int(y * (100.0 / self.resolution))

        #if abroad, car virtually set on the map
        if x_ind < 0:
            x_ind = 0
        if x_ind > self.map_size_x / self.resolution - 1:
            x_ind = self.map_size_x / self.resolution - 1

        if y_ind < 0:
            y_ind = 0
        if y_ind > self.map_size_y / self.resolution - 1:
            y_ind = self.map_size_y / self.resolution - 1

        x_map, y_map = self.matrix[x_ind, y_ind]

        x_car = np.cos(self.yaw) * x_map + np.sin(self.yaw) * y_map
        y_car = -np.sin(self.yaw) * x_map + np.cos(self.yaw) * y_map

        #hyperparameters for PID
        Kp = 3.0
        Ki = 0.0
        Kd = 0.0

        #so the error is the steepness of the correction anlge
        error = np.arctan2(y_car, x_car)
        #print(x_ind, y_ind, x_car, y_car)

        #pseudo integral memory in borders
        self.aq_error = self.aq_error + error
        if self.aq_error > 10:
            self.aq_error = 10
        elif self.aq_error < -10:
            self.aq_error = -10

        #time between measurements for delta t
        current_time = rospy.Time.now()
        dif_time = (current_time - self.last_time).to_sec()
        #if dif_time == 0.0:
        #   return

        #error manipulation with PID
        PID = Kp * error + Ki * self.aq_error * dif_time + Kd * (
            error - self.last_error) / dif_time
        #print(PID)

        self.last_time = current_time
        self.last_error = error

        #detect min dist direction

        vel = NormalizedSpeedCommand()

        excep = False
        if self.distance > 200 or self.distance < 0:  #dis= 400
            vel.value = self.speed_value
            print('No Control')

        else:
            try:
                self.PID_speed()
                print("Distace Control")
                print("delta speed is:", self.delta_speed)
                print("delta_distance is :", self.delta_dis)
                print("acceleration is :", self.acc)
                #vel.value = (self.ego_speed / 1.95  + self.acc *0 )
                #vel.value = (self.ego_speed / 3 + self.acc / 50 + 0.1) #acc/100
                vel.value = (self.ego_speed / 7 + self.acc / 10 + 0.04)

                #print("tar speed is:" , self.tar_speed)
                #print("ego speed :" , self.ego_speed)
                print("new speed is :", vel.value)
            except:
                print("Exception")
                excep = True

        if vel.value > 0.19:
            vel.value = 0.19

        if PID > 1:
            PID = 1
        elif PID < -1:
            PID = -1

        str_val = NormalizedSteeringCommand()
        str_val.value = PID

        #dont start acceleration after shutdown
        if not self.publishing:
            self.str_pub.publish(str_val)
            if not excep:
                self.vel_pub.publish(vel)
예제 #12
0
    def call_back(self, raw_msgs):

        #retrieving values from message
        x = raw_msgs.pose.pose.position.x
        y = raw_msgs.pose.pose.position.y
        #self.position.append((x,y))

        orientation = raw_msgs.pose.pose.orientation
        orientation_array = [
            orientation.x, orientation.y, orientation.z, orientation.w
        ]

        #change the read-out data from Euler to Rad
        orientation_in_Rad = tf.transformations.euler_from_quaternion(
            orientation_array)

        self.yaw = orientation_in_Rad[2]
        x_ind = np.int(x * (100.0 / self.resolution))
        y_ind = np.int(y * (100.0 / self.resolution))

        #if abroad, car virtually set on the map
        if x_ind < 0:
            x_ind = 0
        if x_ind > self.map_size_x / self.resolution - 1:
            x_ind = self.map_size_x / self.resolution - 1

        if y_ind < 0:
            y_ind = 0
        if y_ind > self.map_size_y / self.resolution - 1:
            y_ind = self.map_size_y / self.resolution - 1

        x_map, y_map = self.matrix[x_ind, y_ind]
        #print(x_ind,y_ind)
        #if we imagine the odometry as polar coordinates
        #we have some radius r and a angle phi
        #so now we combine the steering angle given from the force field alpha and phi
        #with x = r * (cos(alpha-phi)) and y = (sin(alpha-phi))
        #maybe it was phi - alpha in both i wrote it on a paper
        #formula was given on the assignment sheet

        x_car = np.cos(self.yaw) * x_map + np.sin(self.yaw) * y_map
        y_car = -np.sin(self.yaw) * x_map + np.cos(self.yaw) * y_map

        #hyperparameters for PID
        Kp = 4.2
        Ki = 0.001
        Kd = 0.0

        #so the error is the steepness of the correction anlge
        error = np.arctan2(y_car, x_car)
        #print(x_ind, y_ind, x_car, y_car)

        #pseudo integral memory in borders
        self.aq_error = self.aq_error + error
        if self.aq_error > 10:
            self.aq_error = 10.0
        elif self.aq_error < -10:
            self.aq_error = -10.0

        #time between measurements for delta t
        current_time = rospy.Time.now()
        dif_time = (current_time - self.last_time).to_sec()

        if dif_time == 0.0:
            return

        #error manipulation with PI
        PID = Kp * error + Ki * self.aq_error * dif_time + Kd * (
            error - self.last_error) / dif_time
        #print(PID)

        self.last_time = current_time
        self.last_error = error

        #detect min dist direction
        vel = NormalizedSpeedCommand()
        if (x_car < 0):
            vel.value = -self.speed_value
        else:
            vel.value = self.speed_value
        #if x_car > 0:

        #reduce speed based on steering
        #vel.value = max(self.speed_value, vel.value * ((np.pi/3.0)/(abs(PID)+1.0)))

        #valid steering angle -100<=alpha<=80

        if PID > 1:
            PID = 1.0
        elif PID < -1:
            PID = -1.0

        #offset 100 == straight ahead
        #PID = 180 - (90 + PID)

        #print("yaw: {0}, vff_angle: {1}".format(np.rad2deg(self.yaw), np.rad2deg(np.arctan(y_map / x_map))))
        #print(np.rad2deg(error),UInt8(PID))
        str_val = NormalizedSteeringCommand()
        str_val.value = PID

        #dont start acceleration after shutdown
        if not self.publishing:
            self.str_pub.publish(str_val)
            self.vel_pub.publish(vel)
예제 #13
0
def scan_callback(scan_msg):
    global initial_line, wall_angle, add_pi, last_theta, speed, speed_value, max_y, target_angle, steering_angle_feedback, invert_sign_gamma

    radius = np.asarray(scan_msg.ranges)
    angles = np.arange(scan_msg.angle_min,
                       scan_msg.angle_max + scan_msg.angle_increment / 2,
                       scan_msg.angle_increment)

    mask_fin = np.isfinite(radius)  # only consider finite radii

    if mask_angles:
        if (abs(target_angle - wall_angle) < np.pi / 4):
            target_angle = wall_angle  # right side of the car
        angle_spread = np.pi / 4  # size of cone to consider
        #if Lidar installed inversed!
        #mask_angle = np.logical_or((-np.pi+target_angle + angle_spread) > angles, angles > (np.pi+target_angle - angle_spread))
        #if Lidar installed direct!
        mask_angle = np.logical_or((target_angle + angle_spread) > angles,
                                   angles > (target_angle - angle_spread))

        mask = np.logical_and(mask_fin, mask_angle)
    else:
        mask = mask_fin

    masked_angles = angles[mask]
    masked_radius = radius[mask]

    # calculate coordinates of our masked values
    x = np.cos(masked_angles) * masked_radius
    y = np.sin(masked_angles) * masked_radius

    X = np.ones((np.size(x), 3))
    X[:, 0] = x
    X[:, 2] = y

    points = np.column_stack((x, y))

    slope, intercept = find_best_params(
        points)  # detect a line in these coordinates
    # slope, intercept = np.linalg.lstsq(X[:,0:2],X[:,2], rcond=-1)[0]

    # wall_dist = get_distance((0, 0), slope, intercept)  # shortest distance from current position to the wall
    wall_angle = np.arctan(slope)  # angle of the wall
    if ((wall_angle > 0) and (wall_angle < np.pi / 2)):
        wall_angle = wall_angle - np.pi / 2
    else:
        wall_angle += np.pi / 2
    wall_dist = abs(intercept) / pow(
        pow(slope, 2) + 1.0,
        0.5)  # shortest distance from current position to the wall

    if initial_line is None or scan_msg.header.stamp < initial_line.stamp:
        initial_line = LineParams(slope, intercept, wall_dist, wall_angle,
                                  scan_msg.header.stamp)
        del turn_radii[:]

        print 'starting to drive: wall_dist: %.3f, wall_angle: %.1f ' % (
            wall_dist, np.rad2deg(wall_angle))
        if not manual_mode:
            steer_msg = SteeringCommand()
            steer_msg.value = steering_angle
            pub_steering.publish(steer_msg)
            rospy.sleep(2.0)
            speed_msg = NormalizedSpeedCommand()
            speed = -speed_value
            speed_msg.value = speed
            pub_speed.publish(speed_msg)
    else:
        theta = angle_diff(initial_line.wall_angle, wall_angle)
        dist_diff = initial_line.wall_dist - wall_dist
        abs_theta = abs(theta)
        t = abs(dist_diff) / np.cos((initial_line.wall_angle + wall_angle) / 2)
        phi = (np.pi - abs_theta) / 2

        time_diff = scan_msg.header.stamp - initial_line.stamp

        if (abs_theta > 0.06) and (abs_theta < 1.2) and (speed < 0):
            if (theta < 0):
                invert_sign_gamma = True
            else:
                invert_sign_gamma = False

            last_theta = theta
            turn_radius = t * np.sin(phi) / np.sin(abs_theta)
            time_offset = time_diff.secs + time_diff.nsecs * 1e-9

            # reset turn_radii plot if rosbag loops
            if len(turn_radii) and time_offset < turn_radii[-1][0]:
                del turn_radii[:]

            turn_radii.append([theta, turn_radius])
            servo_feedback.append(steering_angle_feedback)

            print(
                'current wall dist: %.3f, dist diff: %.3f, angle diff: %.1f, current angle: %.1f, start angle: %.1f, turn radius: %.3f'
                % (wall_dist, dist_diff, np.rad2deg(theta),
                   np.rad2deg(wall_angle), np.rad2deg(
                       initial_line.wall_angle), turn_radius))
        else:
            turn_radius = np.NAN  # dividing by such a small value leads very unexpected results

        # check if we have been driving long enough:
        if not manual_mode and time_diff.secs >= drive_duration_max:
            # pub_speed.publish(0)

            # np.savez_compressed('angle-%03d-%s.txt' % (steering_angle, strftime('%H-%M-%S', localtime())), turn_radii)
            #
            speed = speed_value
            speed_msg = NormalizedSpeedCommand()
            speed_msg.value = speed
            pub_speed.publish(speed_msg)

            print(steering_angle)
            if (900 > steering_angle and steering_angle > 2350):
                if wall_dist < 1.2:
                    if len(turn_radii) > 0:
                        average_r = 0
                        for r in turn_radii:
                            average_r += r[1]
                        average_r = average_r / float(len(turn_radii))
                        feedback = np.average(servo_feedback)
                        print('average turn radius: %.3f' % average_r)
                        l = 0.26  # 26cm
                        gamma = np.arcsin(l / average_r)
                        if (invert_sign_gamma == True):
                            gamma = -gamma
                        save_xml(int(steering_angle), average_r, gamma,
                                 feedback)
                    else:
                        print "turn radius is nan!!"
                    stop_driving()
            elif (abs(wall_angle) < 0.1):

                if (len(turn_radii) > 0):
                    average_r = 0
                    for r in turn_radii:
                        average_r += r[1]
                    average_r = average_r / float(len(turn_radii))
                    feedback = np.average(servo_feedback)
                    print('average turn radius: %.3f' % average_r)
                    l = 0.26  # 26cm
                    gamma = np.arcsin(l / average_r)
                    if (invert_sign_gamma == True):
                        gamma = -gamma
                    save_xml(int(steering_angle), average_r, gamma, feedback)
                else:
                    print "turn radius is nan!!"
                stop_driving()

    if plotting:
        ax_a.cla()
        ax_a.set_title('Scatter plot of laser scan data')

        # plot inliers detected by ransac
        inlier_mask = get_inliers(points, slope, intercept)
        ax_a.scatter(*points[np.where(inlier_mask)].T, color='r')
        ax_a.scatter(*points[np.where(np.logical_not(inlier_mask))].T,
                     color='b')

        # plot any filtered points
        inv_mask = np.logical_not(mask)
        other_x = np.cos(angles[inv_mask]) * radius[inv_mask]
        other_y = np.sin(angles[inv_mask]) * radius[inv_mask]
        ax_a.scatter(other_x, other_y, color='k')

        # how many meters to plot in each direction
        plt_window = 3.5
        ax_a.set_xlim([-plt_window, plt_window])
        ax_a.set_ylim([-plt_window, plt_window])

        line_x = np.linspace(-plt_window, plt_window, 10)
        line_y = intercept + line_x * slope
        ax_a.plot(line_x, line_y, color='b')

        # draw coordinate system
        ax_a.axvline(0, color='k')
        ax_a.axhline(0, color='k')

        ax_b.cla()
        ax_b.set_title('turn radius over the difference angle')
        ax_b.plot(*np.array(turn_radii).T, marker='o')
        # ax_b.plot(*np.array(radius_theta).T, marker='o')
        if len(turn_radii) > 0 and (max_y < turn_radii[-1][1]):
            max_y = turn_radii[-1][1]
        ax_b.set_ylim([0, max_y])  # cut off very large outliers
        plt.show(block=False)
        rospy.sleep(0.1)  # sleep to avoid threading issues with plotting
예제 #14
0
    def PID_call_back(self, raw_msgs):
        #retrieving values from message
        x = raw_msgs.pose.pose.position.x
        y = raw_msgs.pose.pose.position.y
        orientation = raw_msgs.pose.pose.orientation
        orientation_array = [
            orientation.x, orientation.y, orientation.z, orientation.w
        ]

        #change the read-out data from Euler to Rad
        #(roll, pitch, yaw) = (orientation_array)
        orientation_in_Rad = tf.transformations.euler_from_quaternion(
            orientation_array)
        self.yaw = orientation_in_Rad[2]
        x_ind = np.int(x * (100.0 / self.resolution))
        y_ind = np.int(y * (100.0 / self.resolution))

        #if abroad, car virtually set on the map
        if x_ind < 0:
            x_ind = 0
        if x_ind > self.map_size_x / self.resolution - 1:
            x_ind = self.map_size_x / self.resolution - 1

        if y_ind < 0:
            y_ind = 0
        if y_ind > self.map_size_y / self.resolution - 1:
            y_ind = self.map_size_y / self.resolution - 1

        x_map, y_map = self.matrix[x_ind, y_ind]

        x_car = np.cos(self.yaw) * x_map + np.sin(self.yaw) * y_map
        y_car = -np.sin(self.yaw) * x_map + np.cos(self.yaw) * y_map

        #hyperparameters for PID
        Kp = 3.0
        Ki = 0.00001
        Kd = 0.0003

        #so the error is the steepness of the correction anlge
        error = np.arctan2(y_car, x_car)
        #print(x_ind, y_ind, x_car, y_car)

        #pseudo integral memory in borders
        self.aq_error = self.aq_error + error
        if self.aq_error > 10:
            self.aq_error = 10
        elif self.aq_error < -10:
            self.aq_error = -10

        #time between measurements for delta t
        current_time = rospy.Time.now()
        dif_time = (current_time - self.last_time).to_sec()
        #if dif_time == 0.0:
        #   return

        #error manipulation with PID
        PID = Kp * error + Ki * self.aq_error * dif_time + Kd * (
            error - self.last_error) / dif_time

        self.last_time = current_time
        self.last_error = error

        #detect min dist direction
        vel = NormalizedSpeedCommand()

        excep = False
        if self.distance > 200 or self.distance < 0:  #dis= 400
            vel.value = self.speed_value

        else:
            try:
                self.fuzzy_controller()
                print("ACC is active")
                print("delta speed is:", self.delta_speed)
                print("delta_distance is :", self.delta_dis)
                print("acceleration is :", self.acc)
                #vel.value = (self.ego_speed / 1.95  + self.acc *0 )

                # low level control
                self.ACC_speed_x = (self.ego_speed / 6.75 + self.acc / 7 +
                                    0.058)
                self.ACC_speeds.append(self.ACC_speed_x)
                self.ACC_speed = 0.0
                for speed in self.ACC_speeds:
                    self.ACC_speed += speed / float(len(self.ACC_speeds))

                vel.value = self.ACC_speed

                #print("tar speed is:" , self.tar_speed)
                #print("ego speed :" , self.ego_speed)
                print("new speed is :", vel.value)
            except:
                print("Exception")
                excep = True

        if vel.value > 0.19:
            vel.value = 0.19

        #if vel.value < 0.09:
        #   vel.value = 0.1

        #if x_car > 0:
        #reduce speed based on steering
        #vel.value = max(self.speed_value, vel.value * ((np.pi/3.0)/(abs(PID)+1.0)))

        #valid steering angle -100<=alpha<=80

        if PID > 1:
            PID = 1
        elif PID < -1:
            PID = -1

        str_val = NormalizedSteeringCommand()
        str_val.value = PID

        #dont start acceleration after shutdown
        if not self.publishing:
            self.str_pub.publish(str_val)
            if not excep:
                self.vel_pub.publish(vel)
# pub_forward = rospy.Publisher(
#     "simple_drive_control/forward",
#     Float32,
#     queue_size=10)
# rospy.loginfo('Publisher(simple_drive_control/forward')
# rospy.sleep(1.0)
# publisher_steering.publish(norm_steering_left)
# publisher_speed.publish(move_speed)

positions_and_ticks = []
steering_angles = []

steering_angles.append(steering_angle_power)

drive_command = NormalizedSpeedCommand()
drive_command.value = 0.067

stop_command = NormalizedSpeedCommand()
stop_command.value = 0.0

steering_cmd = NormalizedSteeringCommand()
steering_cmd.value = 1.0

# publisher_steering.publish()

publisher_steering.publish(steering_cmd)
rospy.loginfo('publisher_steering.publish(steering_cmd={})'.format(
    steering_cmd.value))
rospy.sleep(0.5)
예제 #16
0
    def call_back(self, raw_msgs):

        #retrieving values from message
        x = raw_msgs.pose.pose.position.x
        y = raw_msgs.pose.pose.position.y
        orientation = raw_msgs.pose.pose.orientation
        orientation_array = [
            orientation.x, orientation.y, orientation.z, orientation.w
        ]

        #change the read-out data from Euler to Rad
        #(roll, pitch, yaw) = (orientation_array)
        orientation_in_Rad = tf.transformations.euler_from_quaternion(
            orientation_array)
        self.yaw = orientation_in_Rad[2]
        x_ind = np.int(x * (100.0 / self.resolution))
        y_ind = np.int(y * (100.0 / self.resolution))

        #if abroad, car virtually set on the map
        if x_ind < 0:
            x_ind = 0
        if x_ind > self.map_size_x / self.resolution - 1:
            x_ind = self.map_size_x / self.resolution - 1

        if y_ind < 0:
            y_ind = 0
        if y_ind > self.map_size_y / self.resolution - 1:
            y_ind = self.map_size_y / self.resolution - 1

        x_map, y_map = self.matrix[x_ind, y_ind]

        x_car = np.cos(self.yaw) * x_map + np.sin(self.yaw) * y_map
        y_car = -np.sin(self.yaw) * x_map + np.cos(self.yaw) * y_map

        #hyperparameters for PID
        Kp = 3.0
        Ki = 0.0
        Kd = 0.0

        #so the error is the steepness of the correction anlge
        error = np.arctan2(y_car, x_car)
        #print(x_ind, y_ind, x_car, y_car)

        #pseudo integral memory in borders
        self.aq_error = self.aq_error + error
        if self.aq_error > 10:
            self.aq_error = 10
        elif self.aq_error < -10:
            self.aq_error = -10

        #time between measurements for delta t
        current_time = rospy.Time.now()
        dif_time = (current_time - self.last_time).to_sec()
        if dif_time == 0.0:
            return

        #error manipulation with PID
        PID = Kp * error + Ki * self.aq_error * dif_time + Kd * (
            error - self.last_error) / dif_time
        #print(PID)

        self.last_time = current_time
        self.last_error = error

        #detect min dist direction
        vel = NormalizedSpeedCommand()
        if (x_car < 0):
            vel.value = self.speed_value
        else:
            vel.value = -self.speed_value
        if x_car > 0:

            #reduce speed based on steering
            vel.value = max(self.speed_value,
                            vel.value * ((np.pi / 3.0) / (abs(PID) + 1.0)))

            #valid steering angle -100<=alpha<=80

        if PID > 1:
            PID = 1
        elif PID < -1:
            PID = -1

        str_val = NormalizedSteeringCommand()
        str_val.value = PID

        #dont start acceleration after shutdown
        if not self.publishing:
            self.str_pub.publish(str_val)
            self.vel_pub.publish(vel)
예제 #17
0
    def callback(self, data):
        dt = (data.header.stamp - self.last_time).to_sec()
        # 25hz
        if dt < 0.04:
            return

        self.last_time = data.header.stamp
        x = data.pose.pose.position.x
        y = data.pose.pose.position.y
        orientation_q = data.pose.pose.orientation
        orientation_list = [
            orientation_q.x, orientation_q.y, orientation_q.z, orientation_q.w
        ]
        (roll, pitch, yaw) = euler_from_quaternion(orientation_list)

        x_index_floor = int(math.floor(x * (100.0 / self.resolution)))
        y_index_floor = int(math.floor(y * (100.0 / self.resolution)))

        x_index_ceil = x_index_floor + 1
        y_index_ceil = y_index_floor + 1

        ceil_ratio_x = x * (100.0 / self.resolution) - x_index_floor
        ceil_ratio_y = y * (100.0 / self.resolution) - y_index_floor

        if x_index_floor < 0:
            x_index_floor = 0
        if x_index_floor > self.map_size_x / self.resolution - 1:
            x_index_floor = self.map_size_x / self.resolution - 1

        if y_index_floor < 0:
            y_index_floor = 0
        if y_index_floor > self.map_size_y / self.resolution - 1:
            y_index_floor = self.map_size_y / self.resolution - 1

        if x_index_ceil < 0:
            x_index_ceil = 0
        if x_index_ceil > self.map_size_x / self.resolution - 1:
            x_index_ceil = self.map_size_x / self.resolution - 1

        if y_index_ceil < 0:
            y_index_ceil = 0
        if y_index_ceil > self.map_size_y / self.resolution - 1:
            y_index_ceil = self.map_size_y / self.resolution - 1

        x3_floor, y3_floor = self.matrix[x_index_floor, y_index_floor, :]
        x3_ceil, y3_ceil = self.matrix[x_index_ceil, y_index_ceil, :]
        x3 = x3_floor * (1.0 - ceil_ratio_x) + x3_ceil * ceil_ratio_x
        y3 = y3_floor * (1.0 - ceil_ratio_y) + y3_ceil * ceil_ratio_y
        f_x = np.cos(yaw) * x3 + np.sin(yaw) * y3
        f_y = -np.sin(yaw) * x3 + np.cos(yaw) * y3

        angle = np.arctan2(f_y, f_x)

        self.integral_error = self.integral_error + angle * dt
        steering = self.Kp * angle + self.Kd * (
            (angle - self.last_angle) / dt) + self.Ki * self.integral_error
        self.last_angle = angle

        if f_x > 0:
            speed = -self.speed_value
        else:
            speed = self.speed_value

        if steering > 1:
            steering = 1

        if steering < -1:
            steering = -1
        if f_x > 0:
            speed = max(self.speed_value,
                        speed * ((np.pi / 3) / (abs(steering) + 1)))

        steerMsg = NormalizedSteeringCommand()
        steerMsg.value = steering
        steerMsg.header.stamp = rospy.Time.now()
        self.pub.publish(steerMsg)

        if not self.shutdown_:
            msg = NormalizedSpeedCommand()
            msg.value = speed
            msg.header.stamp = rospy.Time.now()
            self.pub_speed.publish(msg)
예제 #18
0
def stop_driving():
    pub_speed.publish(NormalizedSpeedCommand())
    rospy.sleep(1)
    rospy.signal_shutdown('stop')
    print('stop driving')
    print('close the plot to stop the program!')