Esempio n. 1
0
    def cmd_callback(self, data):
        rospy.logdebug("convert...")
        steering = self.convert_trans_rot_vel_to_steering_angle(data.linear.x,
                                                                data.angular.z)

        if TYPE_ACKERMANN == self.message_type:
            msg = AckermannDrive()
            msg.steering_angle = steering                   # in rad
            msg.speed = data.linear.x                       # in m/s
            msg.acceleration = data.linear.x                # in m/s^2

        else:
            msg = AckermannDriveStamped()
            msg.header.stamp = rospy.Time.now()
            msg.header.frame_id = self.frame_id
            msg.drive.steering_angle = steering             # in rad
            msg.drive.steering_angle_velocity = steering    # in rad/s
            msg.drive.speed = data.linear.x                 # in m/s
            msg.drive.acceleration = data.linear.x          # in m/s^2
            
        self.pub.publish(msg)
Esempio n. 2
0
 def __init__(self):
     self.driving = AckermannDriveStamped()
     self.driving.header.stamp = rospy.Time.now()
     self.driving.drive.speed = 3
     self.ddes = 1  #1.0 #1.55
     self.prev_times = collections.deque([time.clock() for _ in range(10)])
     self.prev_errors = collections.deque([0 for _ in range(4)])
     self.kp = .6  #.75--right  #.5--OG
     self.ki = 0  #.1--right   # .05--OG
     self.kd = .02  #.05  # .025--right   #.1--OG
     self.mult = 1  # right
     self.start_ind = 80  # right
     self.end_ind = 280  #500  # right
     #self.side_sub = rospy.Subscriber("/racecar/JoyLRSelec", Bool, self.side_callback)
     self.pid_pub = rospy.Publisher(
         "vesc/ackermann_cmd_mux/input/navigation",
         AckermannDriveStamped,
         queue_size=1)
     self.scan_sub = rospy.Subscriber("scan", LaserScan, self.pid_callback)
     #rospy.Subscriber("blob_color", String, self.color_callback)
     rospy.Subscriber("/wall", Bool, self.side_callback)
Esempio n. 3
0
def auto_drive(pid):
    global car_run_speed
    w = 0
    if -0.065 < pid and pid < 0.065:
        w = 1
    else:
        w = 0.3

    if car_run_speed < 1.0 * w:
        car_run_speed += 0.002 * 10
    else:
        car_run_speed -= 0.003 * 10

    ack_msg = AckermannDriveStamped()
    ack_msg.header.stamp = rospy.Time.now()
    ack_msg.header.frame_id = ''
    ack_msg.drive.steering_angle = pid
    ack_msg.drive.speed = car_run_speed
    ack_publisher.publish(ack_msg)
    print 'speed: '
    print car_run_speed
Esempio n. 4
0
    def safe(self, data):
        pushback = self.pathnav_pushback + self.wallnav_pushback
        turn = self.pathnav_turn + self.wallnav_turn

        self.send = AckermannDriveStamped()

        self.send.drive.speed = self.drive_constant * pushback  #sets net force equal to backforce - pushback
        if self.send.drive.speed > self.max_speed:
            self.send.drive.speed = self.max_speed
        elif self.send.drive.speed < -self.max_speed:
            self.send.drive.speed = -self.max_speed
        self.send.drive.steering_angle = self.turn_constant * turn  #sets net force = turn* a constant that scales $
        if self.send.drive.speed < 0:  #Checks if the speed is negative
            self.send.drive.steering_angle = -self.send.drive.steering_angle  #reverses steering angle to turn around while i$
            #positive because left is positive but cos(angl$

        #safety controller
        if data.data == False:
            self.send.drive.speed = -.2

        self.pub.publish(self.send)
Esempio n. 5
0
    def __init__(self):
        #"""initalize the node"""
        rospy.init_node("driveStop")
        self.pub = rospy.Publisher(DRIVE_TOPIC,
                                   AckermannDriveStamped,
                                   queue_size=1)
        self.sub_scan = rospy.Subscriber(self.SCAN_TOPIC,
                                         LaserScan,
                                         callback=self.scan_callback)
        rospy.Subscriber("scan", LaserScan, self.driveStop_car_callback)
        #""" initialize the box dimensions"""
        self.flag_box = ((0, 0), (0, 0))
        #"""driving code"""

        self.size = 0
        self.cmd = AckermannDriveStamped()
        self.cmd.drive.speed = 0
        self.cmd.drive.steering_angle = 0
        #"""get the camera data from the class Zed_converter in Zed"""
        self.camera_data = Zed_converter(False, save_image=False)
        self.min_value = 0
Esempio n. 6
0
    def publishAckermann(self, speed, angle):

        angleScaled = self._map_range(angle, -1.0, 1.0, -1.0, 1.0)
        speedScaled = self._map_range(speed, -1.0, 1.0, -MAX_SPEED, MAX_SPEED)

        self.current_angle = angleScaled
        self.current_speed = speedScaled
        self.current_ackermann_timestamp = rospy.Time.now().to_nsec()

        if self.noise_enabled:
            if self.current_noise_peak == 0:
                rand = (random.random() * 2 - 1)
                pos = 1 if rand > 0 else -1
                self.current_noise_peak = (MAX_NOISE * rand) + MIN_NOISE * pos
                self.noise_add = self.current_noise_peak / 10
                self.current_noise = 0
                # print("Current noise peak: " + str(self.current_noise_peak))

            self.current_noise += self.noise_add
            if abs(self.current_noise - self.current_noise_peak) < abs(
                    self.current_noise_peak) * 0.01:
                self.noise_add *= -1

            if 0.005 > self.current_noise > -0.005:
                self.current_noise_peak = 0
                self.nosie_add = 0

        # print("Current noise: " + str(self.current_noise))

        self.current_angle_with_noise = angle + self.current_noise

        msg = AckermannDriveStamped()
        msg.header.stamp = rospy.Time.now()
        msg.header.frame_id = frame_id
        msg.drive.steering_angle = self.current_angle_with_noise
        msg.drive.speed = speedScaled
        msg.drive.acceleration = max_accel_x
        msg.drive.jerk = max_jerk_x

        self.ackermannPub.publish(msg)
Esempio n. 7
0
  def callback(self, msg):
    ##################################################
    # TODO >>>
    # Make the robot move, but don't let it get too
    # close to obstacles!
    ##################################################

    filtered_ranges = [360 for i in range(180)] + list(msg.ranges[180:900]) + [360 for i in range(900, len(msg.ranges))]
    right_dist = sum(filtered_ranges[180:260]) / 80
    right_dist = min(right_dist, 1)
    left_dist = sum(filtered_ranges[820:900]) / 80
    error = right_dist - left_dist
    min_dist = min(filtered_ranges[480:600])
    print('Min dist:', min_dist, '| Right dist:', right_dist, '| Left dist:', left_dist)
    
    max_angle = 0.34
    max_angle_dist = 0.6
    k_p = 1 / max_angle_dist
    k_d = 5
    
    drive = AckermannDriveStamped()
    if min_dist < 0.4:
        drive.drive.speed = -1
        drive.drive.steering_angle = 0
    else:
        drive.drive.speed = 1
        if left_dist > 2:
            drive.drive.steering_angle = max_angle
        elif error >= -max_angle_dist and error <= max_angle_dist:
            drive.drive.steering_angle = -max_angle*k_p*error-max_angle*k_d*(error-self.prev_error)
            self.prev_error = error
        elif error > max_angle_dist: 
            drive.drive.steering_angle = -max_angle-max_angle*k_d*(error-self.prev_error)
        elif error < -max_angle_dist:
            drive.drive.steering_angle = max_angle-max_angle*k_d*(error-self.prev_error)
    
    '''
    #drive.drive.steering_angle = 0.5*math.sin(time.time())
    #print(drive.drive.steering_angle)
    self.drive_pub.publish(drive)
Esempio n. 8
0
        def ackermann_cmd_input_callback(self, msg):
                self.currentSpeed = msg.drive.speed
                if self.SAFE:
                        self.FRONT_DISTANCE = 0.5 * (1.794144**self.currentOdom.twist.twist.linear.x) + 0.1
                elif self.currentOdom.twist.twist.linear.x < 0.01:
                        self.FRONT_DISTANCE = 0.5 * (1.794144**self.currentOdom.twist.twist.linear.x) + 0.1
                if self.currentOdom.twist.twist.linear.x < 0 :
                        self.FRONT_DISTANCE = .5
        #rospy.loginfo(self.currentSpeed)
        #rospy.loginfo(self.currentOdom.twist.twist.linear.x)
        #self.currentAngleOffset = msg.drive.steering_angle
        #rospy.loginfo(self.FRONT_DISTANCE)
                #print("ackermann_callback")
                #print(self.SAFE)
                if self.SAFE :
                        self.cmd_pub.publish(msg)
                else:
                        back_up_msg = AckermannDriveStamped()

                        back_up_msg.drive.speed = 0

                        if msg.drive.speed != 0 and self.currentOdom.twist.twist.linear.x < 0.01 :
                                back_up_msg.drive.speed = -0.5
                                if self.currentStep > 540 :
                                        back_up_msg.drive.steering_angle = 3
                                else  :
                                        back_up_msg.drive.steering_angle = -3

                        if self.currentOdom.twist.twist.linear.x > 0:
                                if self.currentStep > 540 :
                                        back_up_msg.drive.steering_angle = -3
                                else  :
                                        back_up_msg.drive.steering_angle = 3




                        #back_up_msg.drive.steering_angle = 0
                        back_up_msg.header.stamp = rospy.Time.now()
                        self.cmd_pub.publish(back_up_msg)
Esempio n. 9
0
def disparity_extender_callback(data):

    dis = []
    # 获取前向180°的测量距离
    for angle in range(-90, 91):
        dis.append(get_range(data, angle))

    disparities = []
    for i in range(len(dis)):
        if i == len(dis) - 1:
            continue
        # 超过阈值则认为可能发生碰撞
        if abs(dis[i] - dis[i + 1]) > DISPARITY_DIF:
            min_dis = min(dis[i], dis[i + 1]) # 计算可能碰撞最小距离
            angle_range = math.ceil(
                math.degrees(math.atan(CAR_WIDTH / 2 / min_dis))) # 根据小车宽度计算不会碰撞的最小角度
            angle_range += 15 # 添加容差
            # 需要裁剪的激光数据范围
            side_range = range(int(i - angle_range + 1), i + 1) if dis[i + 1] == min_dis else range(i + 1, int(i + 1 + angle_range))
            disparities.append((min_dis, side_range))

    # 裁剪激光数据
    for min_dis, side_range in disparities:
        for i in side_range:
            if i >= 0 and i < len(dis):
                dis[i] = min(dis[i], min_dis)

    max_index = np.argmax(dis) # 得到最可行距离的角度
    max_dis = dis[max_index]

    # 对角度进行限制,主要是避免激光数据抖动产生的影响
    angle = max_index - 90 if abs(max_index - 90) > 15 else 0
    angle = angle * np.pi / 180
    # speed = 3.5
    speed = speed_param - P_param * abs(angle)
    
    drive_msg = AckermannDriveStamped()
    drive_msg.drive.steering_angle=angle
    drive_msg.drive.speed=speed
    drive_pub.publish(drive_msg)
Esempio n. 10
0
    def __init__(self):
        """initalize the node"""
        rospy.init_node("driveStop")
        self.pub = rospy.Publisher(DRIVE_TOPIC,
                                   AckermannDriveStamped,
                                   queue_size=1)
        rospy.Subscriber("scan", LaserScan, self.driveStop_car_callback)

        self.joy_sub = rospy.Subscriber("vesc/joy", Joy, self.joy_callback)

        self.img_pub = rospy.Subscriber
        """ initialize the box dimensions"""
        """driving code"""
        self.cmd = AckermannDriveStamped()
        self.cmd.drive.speed = 0
        self.cmd.drive.steering_angle = 0
        """get the camera data from the class Zed_converter in Zed"""

        self.bridge = CvBridge()

        self.camera_data = Zed_converter(False, save_image=False)

        self.min_value = 0

        self.img_pub = rospy.Publisher('/zed/zed_node/boxes', Image)
        self.msg = Image

        self.factor = 0
        self.cone_width = 0

        self.input_data = []
        self.label_data = []

        self.map = None
        self.l_data = None

        self.lower_ind = 180
        self.upper_ind = 900

        self.joy_data = None
Esempio n. 11
0
def pursuitToWaypoint(waypoint):
    print waypoint
    global rear_axle_center, rear_axle_theta, rear_axle_velocity, cmd_pub
    rospy.wait_for_message("/ackermann_vehicle/ground_truth/state", Odometry,
                           5)
    dx = waypoint[0] - rear_axle_center.position.x
    dy = waypoint[1] - rear_axle_center.position.y
    target_distance = math.sqrt(dx * dx + dy * dy)

    cmd = AckermannDriveStamped()
    cmd.header.stamp = rospy.Time.now()
    cmd.header.frame_id = "base_link"
    cmd.drive.speed = rear_axle_velocity.linear.x
    cmd.drive.acceleration = max_acc
    while target_distance > waypoint_tol:

        dx = waypoint[0] - rear_axle_center.position.x
        dy = waypoint[1] - rear_axle_center.position.y
        lookahead_dist = np.sqrt(dx * dx + dy * dy)
        lookahead_theta = math.atan2(dy, dx)
        alpha = shortest_angular_distance(rear_axle_theta, lookahead_theta)

        cmd.header.stamp = rospy.Time.now()
        cmd.header.frame_id = "base_link"
        # Publishing constant speed of 1m/s
        cmd.drive.speed = 1

        # Reactive steering
        if alpha < 0:
            st_ang = max(-max_steering_angle, alpha)
        else:
            st_ang = min(max_steering_angle, alpha)

        cmd.drive.steering_angle = st_ang

        target_distance = math.sqrt(dx * dx + dy * dy)

        cmd_pub.publish(cmd)
        rospy.wait_for_message("/ackermann_vehicle/ground_truth/state",
                               Odometry, 5)
Esempio n. 12
0
    def PID(self, maxSpeed, kp, ki, kd, mode):
        dir = 1
        if  mode == 'Right':
            error = self.averageR - self.idealDis
            dir = -1 
        elif mode == 'Left':
            error = self.averageL - self.idealDis
            print(error)
        elif mode == 'LR':
            error = (((self.averageL + self.averageR) / 2) - self.idealDis)

        self.maxSpeed = maxSpeed
        # Improve and future
        
        self.current_time = time.time()

        #P
        prop = kp * error

        #I
        integ = ki * ((error + self.prev_error) * (self.current_time - self.prev_time))

        #D
        deriv = kd * ((error - self.prev_error) / (self.current_time - self.prev_time))

        self.prev_error = error
        self.prev_time = self.current_time
        
        self.output = (prop + integ + deriv ) * dir

        if abs(self.output) >= 0.34:
            self.velCoeff = 0.8

        elif abs(self.output) >= 0.25:
            self.velCoeff = 0.9

        else:
            self.velCoeff = 1

        self.ackermann_cmd_input_callback(AckermannDriveStamped())
Esempio n. 13
0
def callback(stuff):
    global count
    if count == 1:
        global x
        global y
        input1 = int(
            input(
                "Choose the starting angle to take into account in degrees "))
        input2 = int(
            input("Choose the ending angle to take into account in degrees "))
        x = int(((input1 * np.pi) / 180) / stuff.angle_increment)
        y = int(((input2 * np.pi) / 180) / stuff.angle_increment)
    ##choose 80
    global z
    msg = AckermannDriveStamped()
    msg.drive.speed = z
    pub.publish(msg)
    count = 0
    distance = .8
    space = sum(stuff.ranges[x:y]) / (y - x)
    error = space - distance
    integral.append(error)
    u = -error
    a = stuff.ranges[135]
    b = 10
    c = sqrt(a**2 + b**2)
    theta = np.arccos((a**2 + b**2 - c**2) / (2 * a * b))
    if sum(integral) < 1800:
        nice = sum(integral)
    print nice
    if error < 0:
        msg.drive.steering_angle = msg.drive.steering_angle - (
            1 / 10) * theta + ((u / z) * np.absolute(error)) - (1 / 50) * nice
        pub.publish(msg)
    if error > 0:
        msg.drive.steering_angle = msg.drive.steering_angle - (
            (1 / 10) * theta * np.absolute(error)) + (
                (u / z) * np.absolute(error)) - (
                    (1 / 50) * nice * np.absolute(error))
        pub.publish(msg)
Esempio n. 14
0
def callback(stuff):
    global count
    if count == 1:
        global x
        global y
        input1 = int(
            input(
                "Choose the starting angle to take into account in degrees "))
        input2 = int(
            input("Choose the ending angle to take into account in degrees "))
        x = int(((input1 * np.pi) / 180) / stuff.angle_increment)
        y = int(((input2 * np.pi) / 180) / stuff.angle_increment)
    count = 0
    safe = 0.5
    safespace = sum(stuff.ranges[x:y]) / (y - x)
    print safespace
    print stuff.ranges[x:y]
    if safespace < safe:
        msg = AckermannDriveStamped()
        msg.drive.speed = 0
        msg.drive.acceleration = 0
        pub.publish(msg)
Esempio n. 15
0
    def pid_control(self, error, velocity):

        # update PID parameters
        now = rospy.Time.now()

        if self.prev_time is not None:
            # Differential update
            self.diff = error - self.prev_error

            # Integral update
            interval_err = error * (now - self.prev_time).to_sec()
            self.integral = self.integral + interval_err
            self.cumulative_squared_error += interval_err * interval_err

            # calculate the angle to respond to the measured error -- simple first implementation
            # just multiply the error by the combination of P + I + D
            angle = clamp(
                self.p[kp] * error + self.p[ki] * self.integral +
                self.p[kd] * self.diff, min_steering_angle, max_steering_angle)
            if abs(angle) <= high_speed_limit:
                velocity = high_speed
            elif abs(angle) <= med_speed_limit:
                velocity = med_speed
            else:
                velocity = low_speed

            # if self.count % 5 == 0:
            #    rospy.loginfo( "Error: %f, Velocity: %f, Angle: %f", error, velocity, angle )

            drive_msg = AckermannDriveStamped()
            drive_msg.header.stamp = rospy.Time.now()
            drive_msg.header.frame_id = "laser"
            drive_msg.drive.steering_angle = angle * self.direction
            drive_msg.drive.speed = velocity * self.direction
            self.drive_pub.publish(drive_msg)

        # update the internal state variables
        self.prev_error = error
        self.prev_time = now
Esempio n. 16
0
    def camera_callback(self, data):
        start = datetime.now()
        try:
            cv_image = self.bridge_object.imgmsg_to_cv2(
                data, desired_encoding="bgr8")
        except CvBridgeError as e:
            print(e)

        h = cv_image.shape[0]
        w = cv_image.shape[1]

        cropped_bgr_img = cv_image[int(h * 0.5):, int(w * 0.2):int(w * 0.8)]
        lane_img = lane_utils.find_yellow_lanes(cropped_bgr_img)
        centroid_img, (cX, cY) = lane_utils.find_n_largest_contours(lane_img)
        cv2.imshow("Image", cropped_bgr_img)
        cv2.imshow("Centroid", centroid_img)
        cv2.waitKey(1)

        h = cropped_bgr_img.shape[0]
        w = cropped_bgr_img.shape[1]

        # if cX > h*0.6:
        #     my_steering_angle = -np.arctan(cY-w/0.3)
        #     temp_percent = cX/h
        # elif cX > h*0.45:
        #     my_steering_angle = -np.arctan((cY-w/2)/2)

        if cX > w / 2:
            my_steering_angle = -0.7  #-np.arctan((cY-w/2) / (h-cX+1e-20))
        else:
            my_steering_angle = 0.7

        acker_object = AckermannDriveStamped()
        acker_object.drive.steering_angle = my_steering_angle
        print(cY, w / 2)
        acker_object.drive.steering_angle_velocity = my_steering_angle / 200
        acker_object.drive.speed = 0.5

        self.drivecar_object.move_robot(acker_object)
Esempio n. 17
0
    def __init__(self):
        #Topics & Subs, Pubs
        lidarscan_topic = '/scan'
        drive_topic = '/drive'
        teleop_topic = '/turtle1/cmd_vel'

        self.lidar_sub = rospy.Subscriber(lidarscan_topic, LaserScan, self.lidar_callback) #TODO: Subscribe to LIDAR
        self.drive_pub = rospy.Publisher(drive_topic, AckermannDriveStamped) #TODO: Publish to drive
        self.teleop_sub = rospy.Subscriber(teleop_topic, Twist, self.teleop_callback) # Subscribe to /keyboard from teleop_key

        # Parameters
        self.D = 1.0 # default D
        self.window_size = 10 # to compute a, b as mean values
        self.theta = math.radians(30.0) # theta, your choice
        self.theta_comp = math.pi/2 - self.theta # the complement angle of theta

        # PID CONTROL PARAMS
        self.kp = 10.0
        self.ki = 0.0
        self.kd = 0.5
        self.prev_error = 0.0
        self.error = 0.0
        self.integral = 0.0

        self.min_angle = -0.4
        self.max_angle = 0.4
        self.servo_offset = 0.0 # offset of the car
        self.angle = 0 # initial steering angle
        self.velocity = 1 # initial velocity
        self.freq = 10 # control frequency

        ## Driving msg
        self.drive_msg = AckermannDriveStamped()
        self.drive_msg.header.stamp = rospy.Time.now()
        self.drive_msg.header.frame_id = "laser"
        self.drive_msg.drive.steering_angle = 0.0
        self.drive_msg.drive.speed = 0.0

        self.start = 0
Esempio n. 18
0
def callback(data):
    global speed
    global steering_angle
    global distance_set
    global acceleration

    distance_set = [get_range(data, i) for i in range(90, -91, -1)]
    steering_angle = 0.0
    acceleration = 0.0
    perception(data)

    if simulator_mode == True:
        drive_msg = AckermannDrive(steering_angle=steering_angle,
                                   speed=speed,
                                   acceleration=acceleration)
        drive_st_msg = AckermannDriveStamped(drive=drive_msg)
        drive_pub_simulator.publish(drive_st_msg)
    else:
        drive_msg = AckermannDrive(steering_angle=steering_angle,
                                   speed=speed,
                                   acceleration=acceleration)
        drive_pub.publish(drive_msg)
Esempio n. 19
0
    def __init__(self):
        # node setup
        rospy.init_node("person_follower", anonymous=True)
        # state from subscribers
        self.tracker = PersonTracker()
        self.right_bumper = False

        self.last_bounding_box_timestamp = 0
        self.last_speed = 0
        self.last_angle = 0
        # subscriber setup
        sub = message_filters.Subscriber('/darknet_ros/bounding_boxes',
                                         BoundingBoxes)
        depth_sub = rospy.Subscriber('/camera/depth/image_rect_raw', Image,
                                     self.tracker.depth_cb)
        joy_sub = rospy.Subscriber('/vesc/joy', Joy, self.right_bump)

        img_sub = message_filters.Subscriber('/camera/color/image_raw', Image)
        ts = message_filters.ApproximateTimeSynchronizer([sub, img_sub], 10,
                                                         0.1)
        sub.registerCallback(self.tracker.bounding_box_cb)
        ts.registerCallback(self.tracker.img_cb)
        # publisher setup
        pub = rospy.Publisher('/vesc/low_level/ackermann_cmd_mux/input/teleop',
                              AckermannDriveStamped,
                              queue_size=10)
        seq = 0
        rate = rospy.Rate(30)
        while not rospy.is_shutdown():
            seq += 1
            header = Header(seq=seq, stamp=rospy.Time.now())
            angle, speed = self.get_steering_direction()
            if self.right_bumper and angle and speed:
                pub.publish(
                    AckermannDriveStamped(
                        header,
                        AckermannDrive(steering_angle=angle, speed=speed)))
            rate.sleep()
        rospy.spin()
def cmd_callback(data):
  global wheelbase
  global ackermann_cmd_topic
  global frame_id
  global pub
  global cmd_angle_instead_rotvel
  
  v = data.linear.x
  # if cmd_angle_instead_rotvel is true, the rotational velocity is already converted in the C++ node
  # in this case this script only needs to do the msg conversion from twist to Ackermann drive
  if cmd_angle_instead_rotvel:
    steering = data.angular.z
  else:
    steering = convert_trans_rot_vel_to_steering_angle(v, data.angular.z, wheelbase)
  
  msg = AckermannDriveStamped()
  msg.header.stamp = rospy.Time.now()
  msg.header.frame_id = frame_id
  msg.drive.steering_angle = steering
  msg.drive.speed = v
  
  pub.publish(msg)
Esempio n. 21
0
def servo_commands():
    #print("Car is at :",pos[0],pos[1])
    #print("Enter Waypoints:")
    #time.sleep(2)
    global x_des
    global y_des
    global sub
    global count
    #count +=1
    df.columns = df.columns.str.strip()

    #print("Car is at :",pos[0],pos[1])
    #x_des = float(input())
    #y_des = float(input())
    #ix_des = (df.X[count])
    #y_des = (df.Y[count])
    #print("Navigating to:",x_des, y_des)
    count += 1
    #rospy.init_node('servo_commands', anonymous=True)
    msg = AckermannDriveStamped()
    #rospy.Subscriber("/progress", Progress, set_throttle_steer)
    sub = rospy.Subscriber("/gazebo/model_states", ModelStates, set_position)

    while not (rospy.is_shutdown()):
        """
        print("====position=====",pos[0],pos[1])
        speed_control = PID_control.PID(0.000001,0,0.000001)
        err = math.sqrt((x_des-pos[0])**2+(y_des-pos[1])**2)
        throttle = speed_control.Update(err)
        print("distance:", err)
        print("throttle:",throttle)
        """

    #msg.drive.speed = 0.0
    #x_pub.publish(msg)
    time.sleep(0.1)

    # spin() simply keeps python from exiting until this node is stopped
    rospy.spin()
Esempio n. 22
0
def cmd_callback(data):
    global wheelbase
    global ackermann_cmd_topic
    global frame_id
    global pub

    # v = data.linear.x
    # steering = convert_trans_rot_vel_to_steering_angle(v, data.angular.z, wheelbase)

    v = math.sqrt(data.linear.x**2 + data.linear.y**2)
    steering = math.atan2(wheelbase * data.angular.z, v)

    msg = AckermannDriveStamped()
    msg.header.stamp = rospy.Time.now()
    msg.header.frame_id = frame_id
    msg.drive.steering_angle = data.angular.z
    msg.drive.speed = v
    msg.drive.acceleration = 1
    msg.drive.jerk = 1
    msg.drive.steering_angle_velocity = 1
    print msg
    pub.publish(msg)
    def controller(self, error, pub_cmd):
        """
        Applies prorpotional steering gain (self.Kp)
        Caps steering angle at +/- self.steering_saturation
        Issues drive message with arbitrary drive speed and calculated 
        steering angle.
        """

        cmd_msg = AckermannDriveStamped()
        cmd_msg.drive.speed = self.drive_speed

        # apply proportional controller gain (self.Kp)
        raw_steering_angle = error * self.Kp 

        # cap steering angle at self.steering_saturation
        if abs(raw_steering_angle) > self.steering_saturation:
            steering_angle = math.copysign(self.steering_saturation, 
                    raw_steering_angle)

        # insert steering angle and issue drive command
        cmd_msg.drive.steering_angle = steering_angle
        pub_cmd.publish(cmd_msg)
Esempio n. 24
0
    def pose_cb(self, msg):
        cur_pose = np.array([msg.pose.position.x,
                             msg.pose.position.y,
                             utils.quaternion_to_angle(msg.pose.orientation)])
        success, error = self.compute_error(cur_pose)

        if not success:
          # We have reached our goal
          self.pose_sub = None # Kill the subscriber
          self.speed = 0.0 # Set speed to zero so car stops

        delta = self.compute_steering_angle(error)

        # Setup the control message
        ads = AckermannDriveStamped()
        ads.header.frame_id = '/map'
        ads.header.stamp = rospy.Time.now()
        ads.drive.steering_angle = delta
        ads.drive.speed = self.speed

        # Send the control message
        self.cmd_pub.publish(ads)
Esempio n. 25
0
	def __init__(self):
		"""initalize the node"""
		rospy.init_node("driveStop")
		self.pub = rospy.Publisher(DRIVE_TOPIC, AckermannDriveStamped, queue_size = 1)
		rospy.Subscriber("scan", LaserScan, self.driveStop_car_callback)

		""" initialize the box dimensions"""




                """driving code"""
		self.cmd = AckermannDriveStamped()
		self.cmd.drive.speed = 0.5
		self.cmd.drive.steering_angle = 0
                self.center1 = (309, 158)
                self.center2 = (347, 219)
                self.signTrack = True
		"""get the camera data from the class Zed_converter in Zed"""
                self.camera_data = Zed_converter(False, save_image = False)

		self.min_value=0
Esempio n. 26
0
    def __init__(self):
        """initalize the node"""
        rospy.init_node("driveStop")
        self.pub = rospy.Publisher(DRIVE_TOPIC,
                                   AckermannDriveStamped,
                                   queue_size=1)
        self.image_pub = rospy.Publisher(IMAGE_TOPIC, Image, queue_size=2)
        rospy.Subscriber("scan", LaserScan, self.driveStop_car_callback)
        """ initialize the box dimensions"""
        self.flag_box = ((0, 0), (0, 0))
        self.flag_center = (0, 0)
        self.flag_size = 0
        """driving stuff"""
        self.cmd = AckermannDriveStamped()
        self.cmd.drive.speed = 0
        self.cmd.drive.steering_angle = 0
        """get the camera data from the class Zed_converter in Zed"""
        self.camera_data = Zed_converter(False, save_image=False)
        self.imagePush = None

        self.bridge = CvBridge()
        self.min_value = 0
Esempio n. 27
0
    def drive_callback(self, data):
        # Get point and transform into
        data.header.stamp = self.listener.getLatestCommonTime(
            self.base_frame, data.header.frame_id)
        dest = self.listener.transformPoint(self.base_frame, data)
        x = dest.point.x
        y = dest.point.y

        # Computer dist and theta
        distance = math.pow(math.pow(x, 2) + math.pow(y, 2), 0.5)
        theta = math.atan2(y, x)

        # Prepare to Publish Drive Msg
        msg = AckermannDriveStamped()
        msg.header.stamp = rospy.Time.now()
        msg.header.frame_id = "base_link"

        # if obj too close, drive backwards, else calc speed and theta
        # tested for points ahead/left, ahead/right, ahead, behind, and current loc
        if x <= 0.2:
            msg.drive.steering_angle = theta
            msg.drive.speed = -0.3
        else:
            self.distanceI = self.distanceI + distance
            dp = self.kp * distance
            di = self.kd * (distance - self.lastDistance)
            dd = self.ki * (self.distanceI)
            self.lastDistance = distance
            msg.drive.speed = max(0.1, min(self.max_speed, dp + di + dd))

            self.thetaI = self.thetaI + theta
            tp = self.k_steer * theta
            ti = self.ki * (self.thetaI)
            td = self.kd * (theta - self.lastTheta)
            msg.drive.steering_angle = max(min(self.max_steering_angle, theta),
                                           -1 * self.max_steering_angle)
            self.lastTheta = theta
        print(msg.drive.speed, msg.drive.steering_angle)
        self.drive_pub.publish(msg)
Esempio n. 28
0
def control_car(t1, pos, yaw, prev_err, prev_head):

    msg = AckermannDriveStamped()

    ### PID for throttle control ###
    speed_control = PID_control.PID(0.5, 0, 0.8)
    err = math.sqrt((x_des - pos[0])**2 + (y_des - pos[1])**2)
    dt = time.time() - t1
    throttle = speed_control.Update(dt, prev_err, err)

    ### PID for steer control ###
    steer_control = PID_control.PID(0.5, 0, 0)
    head = math.atan((y_des - pos[1]) / (x_des - pos[0] + 0.01))
    steer = steer_control.Update(dt, prev_head - yaw, head - yaw)

    ### Publish the control signals to Ackermann control topic ###
    msg.drive.speed = throttle
    msg.drive.steering_angle = steer
    x_pub.publish(msg)

    # Store previous error
    prev_err = err
Esempio n. 29
0
    def __init__(self):
        #Topics & Subs, Pubs
        lidarscan_topic = '/scan'
        drive_topic = '/vesc/high_level/ackermann_cmd_mux/input/nav_0'

        self.lidar_sub = rospy.Subscriber(lidarscan_topic, LaserScan, self.lidar_callback) # Subscribe to LIDAR
        self.drive_pub = rospy.Publisher(drive_topic, AckermannDriveStamped) # Publish to drive

        # Parameters
        self.D = 1.0 # default D
        self.window_size = 5 # to compute a, b as mean values
        self.theta = math.radians(10.0) # theta, your choice
        self.theta_comp = math.pi/2 - self.theta # the complement angle of theta
        self.a_l = 0.0
        self.b_l = 0.0
        self.a_r = 0.0
        self.b_r = 0.0

        # PID CONTROL PARAMS
        self.kp = 5.0
        self.ki = 0.
        self.kd = 0.1
        self.prev_error = 0.0
        self.error = 0.0
        self.integral = 0.0

        self.min_angle = -0.4
        self.max_angle = 0.4
        self.servo_offset = 0.0 # offset of the car
        self.angle = 0 # initial steering angle
        self.velocity = 1 # initial velocity
        self.freq = 5 # control frequency

        ## Driving msg
        self.drive_msg = AckermannDriveStamped()
        self.drive_msg.header.stamp = rospy.Time.now()
        self.drive_msg.header.frame_id = "laser"
        self.drive_msg.drive.steering_angle = 0.0
        self.drive_msg.drive.speed = 0.0
Esempio n. 30
0
    def drive(self):
        while not rospy.is_shutdown():
            if self.received_data is None or self.parsed_data is None:
                rospy.sleep(0.5)
                continue

            if np.any(self.parsed_data['front'][:, 0] < MIN_FRONT_DIST):
                rospy.loginfo("stoping!")
                # this is overkill to specify the message, but it doesn't hurt
                # to be overly explicit
                drive_msg_stamped = AckermannDriveStamped()
                drive_msg = AckermannDrive()
                drive_msg.speed = 0.0
                drive_msg.steering_angle = 0.0
                drive_msg.acceleration = 0
                drive_msg.jerk = 0
                drive_msg.steering_angle_velocity = 0
                drive_msg_stamped.drive = drive_msg
                self.pub.publish(drive_msg_stamped)

            # don't spin too fast
            rospy.sleep(.1)