Пример #1
0
    def update(self):
        xy_dist = G.euclid_distance(self.pos[:2], self._current_line[1][:2])
        z_dist = np.abs(self.pos[2] - self._current_line[1][2])
        if xy_dist <= config.LINE_END_XY_THRESHOLD and z_dist <= config.LINE_END_Z_THRESHOLD:
            config.pprint('LINE CHANGED')
            # reached the target, request to follow the next line
            self._wps = self._wps[1:]
            try:
                self._current_line = [self._wps[0], self._wps[1]]
            except IndexError:
                config.pprint('Out of waypoints!')
                sys.exit()

        # create a Path message with whatever frame we received the localisation in
        path = Path()
        path.header.frame_id = self._frame_id

        # Path.poses is a PoseStamped list
        # so we have to create these objects
        ps1 = PoseStamped()
        ps1.header.frame_id = self._frame_id
        ps1.pose.position.x = self._current_line[0][0]
        ps1.pose.position.y = self._current_line[0][1]
        ps1.pose.position.z = self._current_line[0][2]
        path.poses.append(ps1)

        ps2 = PoseStamped()
        ps2.header.frame_id = self._frame_id
        ps2.pose.position.x = self._current_line[1][0]
        ps2.pose.position.y = self._current_line[1][1]
        ps2.pose.position.z = self._current_line[1][2]
        path.poses.append(ps2)

        self.publisher.publish(path)
Пример #2
0
    def _observe(self):
        pos = self.auv.get_position()
        dist = G.euclid_distance(pos, self.target_point)
        heading = self.auv.get_heading()
        angle = G.directed_angle([1, 0], pos)
        prox = self.auv.get_proximity()
        angvel = self.auv.get_angular_velocity()

        return dist, heading, angle, angvel, prox
Пример #3
0
    def update_curve(self, data):
        # data should contain Path, with multiple,  that represent a discretized curve
        # we will only use the x,y component for now

        points = []
        for p in data.poses:
            points.append(p.pose.position)

        if len(points) < 1:
            print('No curve received')
            return

        line = None
        # the segment intersects a circle of radius r if
        # the first point is closer than r and the second is further
        # we also want the 'last' one that intersects, not the first
        # that particular segment is 'forward'.
        # p1 inside, p2 outside should not happen for more than 1 point
        selfpos = self.pos[:2]
        for i in range(len(points) - 1, 0, -1):
            p1 = (points[i - 1].x, points[i - 1].y, points[i - 1].z)
            p2 = (points[i].x, points[i].y, points[i].z)

            p1d = G.euclid_distance(selfpos, p1[:2])
            p2d = G.euclid_distance(selfpos, p2[:2])
            #print(p1d, p2d)
            if p1d > config.LOOK_AHEAD_R:
                print('p1d:', p1d, 'p2d:', p2d)
                # the first point is inside, check the second one
                if p2d < config.LOOK_AHEAD_R:
                    # we are intersecting!
                    line = (p1, p2)

        if line is None:
            print('No segment in range, using first segment')
            p1 = (points[0].x, points[0].y, points[0].z)
            p2 = (points[1].x, points[1].y, points[1].z)
            line = (p1, p2)

        p1, p2 = line
        p1 = list(p1)
        #p1[0] += 3
        #p1[1] += 3
        line = [p1, p2]

        # set these to be used later
        self._current_line = line
        # self._frame_id = data.header.frame_id

        # elongate the line for visualization purposes
        x1, y1, z1 = line[0]
        x2, y2, z2 = line[1]
        slope = (y2 - y1) / (x2 - x1)
        d = -5
        x2 += d
        y2 += d * slope
        x1 -= d
        y1 -= d * slope

        # publish the current line
        pose1 = Pose()
        pose1.position.x = x1
        pose1.position.y = y1
        pose1.position.z = z1
        stamped1 = PoseStamped()
        stamped1.pose = pose1

        pose2 = Pose()
        pose2.position.x = x2
        pose2.position.y = y2
        pose2.position.z = z2
        stamped2 = PoseStamped()
        stamped2.pose = pose2

        path = Path()
        path.poses = [stamped1, stamped2]
        path.header.frame_id = self._frame_id

        self.debug_line_pub.publish(path)